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
|