51系列单片机无PWM输出功能,可以采用定时器配合软件的方法输出。对精度要求不高的场合,非常实用。电路图见图一,采用了高速光隔(6N137)输出,并将PWM的信号倒相。
图一
用T0定时器完成PWM输出,脉宽固定:65536微妙。T0定时器设置成:16位定时器
PWM:
程序清单:(12MHz)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | PwmData0 ;T0定时t1所需的定时初值(字) PwmData1 ;T0定时t2所需的定时初值(字) PwmF ;PWM输出标志 ;********************************************************* setb tro ;启动T0 。。。。。。 T0Int: ;T0中断服务程序 JB PwmF, PwmOutH ;PWM输出未完成返回 Mov TH0,High(PwmData0) Mov TL0,Low(PwmData0) Setb tr0 Setb PwmF Clr p1.0 ;PWM输出脚 reti PwmOutH: Setb p1.0 Clr tr0 Mov TH0,High(PwmData1) Mov TL0,Low(PwmData1) Setb tr0 Clr PwmF reti |
说明:在主程序中计算PwmData0、PwmData1的值。
用T0定时器控制PWM的占空比,T1定时器控制脉宽(最大:65536微妙)。
T0、T1定时器设置成:16位定时器。
程序清单:(12MHz)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | PwmData0;T0定时t1所需的定时初值(字) PwmData1;T1定时T所需的定时初值(字) ;********************************************************* setb tro ;启动T0 setb tr1 。。。。。。 T0Int: ;T0中断服务程序 Clr tr0 setb p1.0 ;PWM输出脚 reti T1Int: ;T1中断服务程序 Clrp1.0 Clr tr0 Clr tr1 Mov TH0,High(PwmData0) Mov TL0,Low(PwmData0) Mov TH1,High(PwmData1) Mov TL1,Low(PwmData1) Setb tr1 Setb tr0 reti |
说明:在主程序中计算PwmData0、PwmData1的值。