|
发表于 2023-8-29 08:37:31
|
显示全部楼层
大神,帮忙看下这个程序为啥中断控制5000个脉冲,但实际输出了2W多个(用的是芯片 IAP15W4K61S4)
//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//若无特别说明,工作频率一般为11.0592MHz
#include "reg51.h"
#define CYCLE 0x10L //定义PWM周期
long count=0;
sfr PIN_SW2 = 0xba;
void pwm_isr() interrupt 22 using 1
{
static bit dir = 1;
static int val = 0;
if (PWMIF & 0x40)
{
PWMIF &= ~0x40;
}
count++;
if(count >5000)
{
PWMCR = 0x01; //关闭PWM信号输出
}
}
void main()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
P7M0 = 0x00;
P7M1 = 0x00;
PIN_SW2 |= 0x80; //使能访问XSFR
PWMCFG = 0x00; //配置PWM的输出初始电平为低电平
PWMCKS = 0x00; //选择PWM的时钟为Fosc/1
PWMC = CYCLE; //设置PWM周期
PWM2T1 = CYCLE/2; //设置PWM2第1次反转的PWM计数
PWM2T2 = CYCLE/2; //设置PWM2第2次反转的PWM计数
//占空比为(PWM2T2-PWM2T1)/PWMC
PWM2CR = 0x45; //选择PWM2输出到P3.7,不使能PWM2中断 T1翻转中断
PWMCR = 0x01; //使能IO口PWM信号输出
PWMCR |= 0x40; //使能PWM归零中断
PWM4CR = 0x45;
PIN_SW2 &= ~0x80;
EA = 1;
PWMCR |= 0x80; //开启计数
while (1);
}
|
|