今天回答了一个关于用汇编语言控制51单片机产生PWM波实现呼吸灯效果的问题。结果好久不写程序,一时手生,出了不少错误,索性记录一下,也为自己的知乎账号增加的内容。
要实现呼吸灯效果本质上是产生占空比可变的PWM波,大体思路如下:
- 用定时器1控制PWM的频率,我用的开发板板载晶振11.059MHz,近似为12MHz(因为51的定时频率是晶振的1/12,以12MHz计算比较容易),一个定时周期近似为1us,定时器初值设置为64536(16位模式,最大计数值65536),定时1000次,一个周期约为1ms,可生成1kHz频率的PWM。
- 用定时器0控制占空比,占空比从0到1再到0,周而复始。假设LED阳极通过限流电阻接VCC,阴极接单片机P2.7引脚,实现过程大致为:定时器1中断程序将P2.7置1,并启动定时器0,定时器0中断程序中将P2.7复位,并停止定时器0。
- 通过一个二进制位(20H.0)控制占空比变化方向,0减小,1增大,每次进入定时器0中断,首先判断20H.0,若为0,将定时器0的计数初值加1,若为1,将定时器0计数初值减1。加减操作后判断是否加到最大值(65535)或减到最小值(64536),若到达最大或最小值,20H.0取反。
(也可以只用一个定时器产生1ms的时间基准,然后设一个变量进行计数,通过软硬结合的定时方法产生PWM)
以下为用两个定时器纯硬件