只是一个PWM控制LED灯的小程序。我对于C语言的定时器修正值判断不清楚,这里的修正值13, 不知道从哪里开始数机械周期的 #include <reg52.h> sbit PWMOUT = P0^0; sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; unsigned char HReloadH = 0; //高电平重载值的高字节 unsigned char HReloadL = 0; //高电平重载值的低字节 unsigned char LReloadH = 0; //低电平重载值的高字节 unsigned char LReloadL = 0; //低电平重载值的低字节 void ConfigPWM(unsigned int fr, unsigned char dc); void ClosePWM(); void main () { unsigned int i; P0 = 0xFF; //P0口初始化 ADDR0 = 0; //选择独立LED ADDR1 = 1; ADDR2 = 1; ADDR3 = 1; ENLED = 0; //LED总使能 EA = 1; //开总中断
while(1) { ConfigPWM(100, 10); //频率100Hz,占空比10% for (i=0; i<40000; i++); ClosePWM(); ConfigPWM(100, 40); //频率100Hz,占空比40% for (i=0; i<40000; i++); ClosePWM(); ConfigPWM(100, 90); //频率100Hz,占空比90% for (i=0; i<40000; i++); ClosePWM(); for (i=0; i<40000; i++); } } void ConfigPWM(unsigned int fr, unsigned char dc) //PWM配置函数,fr-频率,dc-占空比 { unsigned int high, low; unsigned long tmp;
tmp = (11059200 / 12) / fr; //计算一个周期所需的计数值 high = (tmp * dc) / 100; //计算高电平所需的计数值 low = tmp - high; //计算低电平所需的计数值 high = 65536 - high + 13; //计算高电平的定时器重载值并修正 low = 65536 - low + 13; //计算低电平的定时器重载值并修正
HReloadH = (unsigned char)(high >> 8); //高电平重载值拆分为高低字节 HReloadL = (unsigned char)high; LReloadH = (unsigned char)(low >> 8); //低电平重载值拆分为高低字节 LReloadL = (unsigned char)low;
TMOD &= 0xF0; //清零T0的控制位 TMOD |= 0x01; //配置T0为模式1 TH0 = HReloadH; //加载T0重载值 TL0 = HReloadL; ET0 = 1; //使能T0中断 TR0 = 1; //启动T0 PWMOUT = 1; //输出高电平 } void ClosePWM() //关闭PWM { TR0 = 0; //停止定时器 ET0 = 0; PWMOUT = 1; //输出高电平 } void InterruptTimer0() interrupt 1 //T0中断服务函数 { if (PWMOUT == 1) //当前输出为高电平时,装载低电平值并输出低电平 { TH0 = LReloadH; TL0 = LReloadL; PWMOUT = 0; } else //当前输出为低电平时,装载高电平值并输出高电平 { TH0 = HReloadH; TL0 = HReloadL; PWMOUT = 1; }
|