微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机学习之十四:定时器应用(模式1)

单片机学习之十四:定时器应用(模式1)

时间:11-18 来源:互联网 点击:

看效果吧。我们发现,灯光变换的速度太快啦,几乎没有办法看清楚,原因很简单,因为50ms的定时太短了。16位的计数器定时最多能够达到65.536ms,那么如果我们需要更长时间的定时,比如仍然是刚才的试验,但是时间要求是1s,该怎么办呢?

其实也很简单,我们设一个计数器,初值是0,每次T0溢出中断的时候,给这个计数器加一。在主程序里,我们反复检测这个计数器的值,达到20的时候调用灯光子程序就可以啦。
下面就是这个定时1s的程序,其中,我们用r2作这个计数器。
org 0000h
ajmp main

org 000bh ;T0溢出中断入口地址·
ajmp time0

org 0020h
main: clr p1.5
mov r1,#0ffh
mov r2,#00h ;给计数器r2赋初值0

mov sp,#70h ;设置堆栈
mov tmod,#01h ;设置T0工作方式
mov th0,#3ch ;T0置计数初值
mov tl0,#0b0h
setb et0 ;允许T0溢出中断
setb ea ;cpu开中断
setb tr0 ;启动T0开始计数

wait: cjne r2,#20,wait ;定时时间未到,继续查询等待
acall light ;定时时间到,调用查表求灯光子程序
ajmp wait

;以下是查表求灯光子程序
light: mov r2,#00h ;计数器重新赋初值

inc r1 ;查表求灯光,详细解释见试验5“多位数码显示”
mov a,r1
mov dptr,#tab
movc a,@a+dptr
mov p0,a
cjne a,#0ffh,next
mov r1,#0ffh
next: ret ;子程序返回

;以下是中断服务程序
time0: inc r2 ;计数器加1
mov th0,#3ch ;重置计数初值
mov tl0,#0b0h
reti ;中断返回

tab: db 0fah,0f5h,0afh,05fh ;灯光变换表格
db 0aah,55h,00h,0ffh
end

好啦,把这个程序下载到学习板上,就会很清楚的看到灯光的变换方式啦。

在这个试验里面,由于我们的定时时间较长,所以采用了16位的计数器,假如定时时间短的话,定时/计数器还可以采用别的工作方式,例如13位,或者8位等。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top