1、#include“delay.h“#include“com.h“#include“key.h“#include“beep.h“sfr T2MOD = 0xC9; / 定时器 2#define WM_COUST 20 / PWM细分数volatile unsigned char PWM_H; / PWM占空比调节volatile unsigned char PWM_CNT = 0; / PWM自增值/* 定时器 2中断程序*/void Timer2(void) interrupt 5 using 1if (PWM_CNT = PWM_COUST) / PWM计数清零WM_CNT = 0;else
2、WM_CNT +; / 自增值加 1 /* 定时器 2初始化*/#define MSB_reload_value 0xDB / msb reload value exemple 高位重载值:延时10ms #define LSB_reload_value 0xF0 / lsb reload value exemple 低位重载值void Timer2Init(void)/ T2OE=0;定时器 2输出不允许 T2MOD = 0x01; / DCEN=1;可以设置为向上/下计数:此程序中为向上达到 0xff时溢出 T2CON = 0; / TF2 EXF2 RCLK TCLK EXEN2 TR2
3、C_T2 CP_RL2 / EXF2=0; reset flag 定时器 2外部标志位清除/ TCLK=0;RCLK=0; disable baud rate generator 不用于波特率发生器 / EXEN2=0; ignore events on T2EX 视 T2EX(P1.1)端信号无效/ C_T2=0; timer mode 定时模式 / CP_RL2=0; reload mode 重载模式 TH2 = MSB_reload_value; / Init msb_value 填入初始化值 TL2 = LSB_reload_value; / Init lsb_value RCAP2H
4、 = MSB_reload_value; / reload msb_value重载值 RCAP2L = LSB_reload_value; / reload lsb_value ET2 = 1; / enable timer2 interrupt 允许 T2中断/*系统初始化*/void InitSys(void)DelayMs(100); / 等待系统稳定0 = 0xFF; / 初始化 IO1 = 0xFF;2 = 0xFF;3 = 0xFF;InitSerial(); / 串口初始化Timer2Init(); / 定时器 2初始化EA = 1; / 开总中断WM_H = 5; / 初始占空
5、比 5PWM_CNT = 0; / 初始化 PWM自增值/*主函数*/ void main(void)unsigned char ucKey;InitSys(); / 初始化TR2 = 1; / 启动定时器 2while(1)ucKey = KeyScan(); / 读取键盘值if (ucKey != ValNull) / 如果不为空if (ucKey = ValKey16) / 如果等于 key16if (PWM_H = PWM_COUST) / 如果 PWM_H在 PWM范围内PWM_H +; / 增加 PWM_HelseBeepMs(5); / 等于最大值报警if (ucKey = ValKey15) / 如果等于 key2if (PWM_H) / 如果 PWM_H不等于 0PWM_H -; / 减少 PWM_HelseBeepMs(1); / 等于最小值报警SendByte(PWM_H); / 串口发送当前 PWM_H_CLRWDT_ / 清看门口这是我单片机学习板上利用定时器 2模拟 PWM控制 LED亮度变化的程序,你参考下吧