单片机学习之十四:定时器应用(模式1)
看效果吧。我们发现,灯光变换的速度太快啦,几乎没有办法看清楚,原因很简单,因为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,
db 0aah,55h,00h,0ffh
end
好啦,把这个程序下载到学习板上,就会很清楚的看到灯光的变换方式啦。
在这个试验里面,由于我们的定时时间较长,所以采用了16位的计数器,假如定时时间短的话,定时/计数器还可以采用别的工作方式,例如13位,或者8位等。
单片机定时器模式 相关文章:
- 51单片机定时器模式1使用(11-30)
- 单片机定时器(更准确的模式1操作)(11-18)
- 单片机学习之十六:定时器应用3(模式3)(11-18)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)