HC89F0541,PWM3,按照数据手册说明,改变 PWM3P 的值应该是可以改变中断周期的,可是,下面的这个测试,改变 PWM3P 的值,LED的闪烁时间没有任何改变,不知道为什么
#define ALLOCATE_EXTERN
#include "HC89F0541.h"
#include "BIT.h"
unsigned int i;
void main(void)
{
//CLKCON = 0x00; //关闭外部晶振,关闭内部RC
CLKSWR = 0x00; //内部低频RC44K,低频RC没有分频选项,即 Fosc=44K
CLKDIV = 0x00; //CPU时钟=Fosc/分频0-255,0-1都是1分频
PWM3C B7H; //打开PWM3,8位
PWM3C B6H; //中断使能
PWM3C B5L; //中断标记清零
PWM3C B4H; //允许输出
PWM3C B3L; //占空比正比例,即比较值越大占空比就越大
PWM3C B2H; //Bit 2 1 0 是时钟设置,默认000=Fosc/1
PWM3C B1H; //001=Fosc/2,010=Fosc/4,011=Fosc/8
PWM3C B0H; //以此类推,最高 111=Fosc/128
PWM3_MAP=0x30; //PWM输出映射到P30
P3M0=0xC0; //推换输出
P1M5=0xC0; //P15推换输出驱动LED
PWM3P=0xFF; //数值越小PWM频率越高,但是占空比分辨率就越小
PWM3D=0x03; //调整占空比,该值不能大于计数周期PWM3P
EA=1; //打开总中断
while(1) WDTC |= 0x10; //看门狗默认开启,程序必须定时清零看门狗
}
void PWM_ISR(void) interrupt PWM_VECTOR //所有PWM共用壹个中断向量
{
if(i>1050)
{
P1_5 =~ P1_5; //P15翻转驱动LED
i=0;
}
PWM0C &=~ 0x40; //清除中断标志位
i++;
}
//为了直观和理解还是对寄存器的每个功能位分步操作比较好
//数据的某位写1或0
#ifndef __BIT_H__
#define __BIT_H__
#define B7H |= 0x80
#define B6H |= 0x40
#define B5H |= 0x20
#define B4H |= 0x10
#define B3H |= 0x08
#define B2H |= 0x04
#define B1H |= 0x02
#define B0H |= 0x01
#define B7L &= 0x7F
#define B6L &= 0xBF
#define B5L &= 0xDF
#define B4L &= 0xEF
#define B3L &= 0xF7
#define B2L &= 0xFB
#define B1L &= 0xFD
#define B0L &= 0xFE
#endif
|