今天小编要和大家分享的是控制,MCU相关信息,接下来我将从如何用定时器来实现灯的闪烁功能,墙上装饰灯这几个方面来介绍。
控制,MCU相关技术文章如何用定时器来实现灯的闪烁功能
本站前面有个灯的闪烁编程实例,那是用延时程序做的,现在回想起来,这样做不很恰当,为什么呢?我们的主程序做了灯的闪烁,就不能再干其它的事了,难道单片机只能这样工作吗?当然不是,我们能用定时器来实现灯的闪烁的功能。
例1:查询方式
ORG 0000H
AJMP START
ORG 30H
START:
MOV P1,#0FFH ;关所 灯
MOV TMOD,#00000001B ;定时/计数器0工作于方式1
MOV TH0,#15H
MOV TL0,#0A0H ;即数5536
SETB TR0 ;定时/计数器0开始运行
LOOP:JBC TF0,NEXT ;如果TF0等于1,则清TF0并转NEXT处
AJMP LOOP ;不然跳转到LOOP处运行
NEXT:CPL P1.0
MOV TH0,#15H
MOV TL0,#9FH;重置定时/计数器的初值
AJMP LOOP
END AJMP LOOP
END
键入程序,看到了什么?灯在闪烁了,这可是用定时器做的,不再是主程序的循环了。简单地分析一下程序,为什么用JBC呢?TF0是定时/计数器0的溢出标记位,当定时器产生溢出后,该位由0变1,所以查询该位就可知宇时时间是否已到。该位为1后,要用软件将标记位清0,以便下一次定时是间到时该位由0变1,所以用了JBC指令,该指位在判1转移的同时,还将该位清0。
以上程序是能实现灯的闪烁了,可是主程序除了让灯闪烁外,还是不能做其他的事啊!不,不对,我们能在LOOP:……和AJMP LOOP指令之间插入一些指令来做其他的事情,只要保证执行这些指令的时间少于定时时间就行了。那我们在用软件延时程序的时候不是也能用一些指令来替代DJNZ吗?是的,但是那就要求你精确计算所用指令的时间,然后再减去对应的DJNZ循环次数,很不方便,而现在只要求所用指令的时间少于定时时间就行,显然要求低了。当然,这样的办法还是不好,所以我们常用以下的办法来实现。
程序2:用中断实现
ORG 0000H ,
AJMP START
ORG 000BH ;定时器0的中断向量地址
AJMP TIME0 ;跳转到真正的定时器程序处
ORG 30H
START: