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

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

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

们要用到T0的溢出中断。

16位的计数器从0开始,记入216=65536个脉冲的时候,会向外面产生溢出,这个溢出把TFX置一,(注:TF0是T0的溢出中断标志,TF1是T1的溢出中断标志),从而向CPU申请中断,在进入中断处理程序后,由硬件对TFX清0,不需要我们操作。(注:顺便说一下TF0和TF1,它是我们以前接触过的tcon特殊功能寄存器中的两位,tcon是一个可以“位寻址”的特殊功能寄存器,我们在试验七中用这个寄存器设置过外部中断的触发方式,想不起来的话,回头看看前面的实验吧。)

4、计数初值的计算

继续刚才的问题,16位的计数器要记入65536个脉冲才会产生溢出中断,那么怎样让它在记入50000个脉冲后产生中断呢?这就要用到我们在数电中间学习过的内容啦。我们可以给计数器置一个初值65536-50000=15536,这样计数器在记入50000个脉冲之后就会产生溢出中断了。

那么,怎样给计数器置初值呢?T0和T1是两个16位的计数器,我们可以把它们分为高8位THX和低8位TLX。Cpu和T0、T1之间的关系如下图所示(注:其中,P3.4和P3.5用作第二功能,是工作于计数方式的时候,外部的计数脉冲输入,也就是定时/计数器结构图10-1中的TX端。)

我们以T0为例,要给它置入初值15536,就要对高8位的TH0和低8位的TL0分别置数。15536变换成16进制的数是3CB0(注:转换方法可以查阅数电教材《进制转换》一章),所以我们就这样给T0置初值:mov th0,#3ch ;mov tl0,#0b0h,就可以啦。

5、计数器的启动和停止

在给T0置入初值之后,并且在允许T0溢出中断(注:由IE寄存器中的ET0控制,详细说明可见试验7),和cpu开启中断的前提下,我们就要启动T0开始定时了。我们前面说过T0的启动和停止是由图10-1中与门的输出决定的。当与门输出是1的时候,T0启动;当与门输出是0的时候,T0停止。
那么什么时候与门输出是1呢?从图上可知有两种情况。
(1)、当gate=0时,只需要tr0=1,即可启动T0计数
(2)、当gate=1,并且tr0=1的时候,还需要int0=1才能启动T0计数

在该试验中,我们用到第一种情况,也就是我们把gate赋值0,然后通过对tr0的置1和置0来启动和停止计数器。这是一种常用的方式,至于第二种方式,我们以后通过试验给大家分析它们之间的不同。

Gate在哪里呢?大家再看看上面给出的tmod寄存器图,就是d3和d7位。所以我们在对T0初始化的时候,要给d3赋值0。至于d4~d7都和T0没有关系,可以是任何状态。
再说说tr0的问题,它也是tcon寄存器中的一位,它的各位功能如下图所示,我们把用到的作个简单介绍。


1、TF0:T0的溢出中断,当T0溢出的时候由硬件置位,在进入中断服务程序后,由硬件清0,不用我们操作;TF1类似。(注:如果我们采用查询方式,通过查询TFx的状态判断是否到达定时,而不进入中断服务程序,那就要对这1位用软件清0啦!可不要忘啦!)
TR0:当gate=0时,置一启动T0计数,置0停止T0计数;TR1类似

好啦,现在基本上分析清楚了,我们来看看主程序和中断服务程序的流程图吧。

四、程序流程图:

五、实验程序
(注意:在作这个试验的时候,不要忘了把JMP0跳线置于1、2的位置,选择二极管显示单元)
org 0000h
ajmp main

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

org 0020h
main: clr p1.5
mov r1,#0ffh
mov sp,#70h ;设置堆栈
mov tmod,#01h ;T0初始化,工作于定时方式,详细解释见注释
mov th0,#3ch ;T0置计数初值
mov tl0,#0b0h
setb et0 ;允许T0溢出中断
setb ea ;cpu开中断
setb tr0 ;启动T0计数
ajmp $ ;等待

time0:inc r1 ;查表求灯光,输出到p0口,详细解释见多位数码显示试验
mov a,r1
mov dptr,#tab
movc a,@a+dptr
mov p0,a
cjne a,#0ffh,next
mov r1,#0ffh
next: mov th0,#3ch ;由于计数器已经溢出,所以需要重设计数初值
mov tl0,#0b0h
reti

tab: db 0fah,0f5h,0afh,05fh ;按顺序存储灯光的表格
db 0aah,55h,00h,0ffh
end

六、几点说明
我们来看看T0初始化的语句mov tmod,#01h,现在我们把tmod的各位功能详细说明一下。

(1) d2是定时/计数方式选择,这里应该把d2置0,选择T0工作于定时方式
(2)d3也应该置0,这样通过控制tr0即可启动T0
(3)d1d0(M1M0)用来指明T0的位数,说明如下:
M1M0=00:13位的计数器;
M1M0=01:16位计数器;
M1M0=10:可自动再装入的8位计数器
M1M0=11:把定时器0分成两个8位的计数器,或者关闭定时器1

(2) 在这个试验中,由于定时50ms需要16位的计数器,故d1d0=01
从上面的分析可见,我们给tmod可以赋值:XXXX0001,可以是01h,也可以是0f1h,大家随便吧。

现在把这个程序下载到学习板上,看

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

网站地图

Top