太原工业学院毕业设计
② GATE门控位
由GATE、软件控制位TR1/TR0和INT1/INT0共同决定定时/计数器的打开或关闭。
—GATE=0,只要用指令置TR1/TR0为1即可启动定时/计数器工作,而不管INT的 状态如何;
—GATE=1,只有INT1/INT0为高电平且用指令置TR1/TR0为1时,才能启动定时/计数器工作。
(2)定时/计数器控制寄存器(TCON)
TCON是一个特殊功能寄存器,TCON的字节地址为88H,其各位地址从88位开始分别为88H~8FH。高4位为定时/计数器的运行控制和溢出标志位,低4位与外部中断有关。其格式如下表列:
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 TCON的高4位的功能描述如下: ① TF1/TF0 溢出标志位
当T1或T0产生溢出时,由硬件自动置位中断触发器TF1或TF0,并向CPU申请中断。如果用中断方式,则CPU在响应中断进入中断服务程序后,TF1或TF0被硬件自动清0。如果是用软件查询方式对TF1或TF0进行查询,则在定时/计数器回0后,应当用指令将TF1或TF0清0。
② TR1/TR0 运行控制位
用指令(“SETB TR1”)对TR1或TR0进行置位或清零,也可以启动或关闭T1或T0的运行。
3.2.4定时/计数器的MODE0[8]
MODE0为13位定时/计数器工作方式,其内部结构如图3.4所示。由图3.4可知,MODE0实际上是由TL0(5位)和TH0(8位)构成的13位脉冲计数器,并由TCON和TMOD控制和管理。
??设定MODE0的步骤:
(1)设定MODE0的步骤(四选1)
MOV TMOD,#00H TIMER0设定计时工作方式(内部输入)
16
太原工业学院毕业设计
MOV TMOD,#00H TIMER1设定计时工作方式(内部输入) MOV TMOD,#04H TIMER0设定计数工作方式(T0输入) MOV TMOD,#40H TIMER1设定计数工作方式(T1输入) (2)预置计数初值
MOV TLX,#(8192–COUNT) MOD/32; TLX的值为计数值除以32的余数 MOV THX,#(8192–COUNT)/32 ;THX为计数值除以32的商 (3)启动定时器 SETB TRX (4)检查TFX是否溢出
JBC TFX ;查询方式检查TFX是否溢出,溢出转移,否则等待
图3.4 方式0内部结构
3.2.5定时/计数器的MODE1[8]
方式1和方式0的工作原理基本相同,唯一不同是T0和T1工作在方式1时,计数长度M是2的16次方,内部结构参考图3.5。16位的初值直接拆成高低字节,分别送入TH和TL即可,对于实际应用比MODE0更有实际意义。
? 设定MODE1的步骤:
(1) 设定MODE1的步骤(四选1)
MOV TMOD,#01H TIMER0设定计时工作方式(内部输入) MOV TMOD,#10H TIMER1设定计时工作方式(内部输入) MOV TMOD,#05H TIMER0设定计数工作方式(T0输入) MOV TMOD,#50H TIMER1设定计数工作方式(T1输入)
17
太原工业学院毕业设计
(2) 启动定时器 SETB TRX (3) 预置计数初值
MOV TLX,#(65536–COUNT) MOD 256 MOV THX,#(65536–COUNT)/256 (4) 检查TFX是否溢出 JBC TFX
图3.5 方式1内部结构
3.2.6定时/计数器的MODE2[8]
方式1和方式0的工作原理基本相同,计数溢出后计数器清0。在循环计数或循环定时应用时就存在反复设置计数初值的问题。不仅会给程序设计带来不便,同时影响定时的精度。
针对以上问题,最好的解决办法就是使用方式2,它具有自动加载功能,即自动加载计数初值。在这种方式下,把16位计数器分为两部分,即TL作为计数器,以TH作初值预置寄存器,初始化时将计数初值分别装入TL和TH中。计数溢出后由预置寄存器TH以硬件方法自动给TL重新加载,由硬件重新赋值,所以也称为硬件自动重加载工作方式。其内部结构参考图3.6。
图3.6 方式2内部结构
18
太原工业学院毕业设计
? 设定MODE2的步骤
(1) 设定MODE2的步骤(四选1)
MOV TMOD,#02H TIMER0设定计时工作方式(内部输入) MOV TMOD,#20H TIMER1设定计时工作方式(内部输入) MOV TMOD,#06H TIMER0设定计数工作方式(T0输入) MOV TMOD,#60H TIMER1设定计数工作方式(T1输入) (2) 启动定时器 SETB TRX (3) 预置计数初值
MOV TLX,#(256–COUNT) MOV THX,#(256–COUNT) (4) 检查TFX是否溢出 JBC TFX
3.2.7定时/计数器的MODE3[8]
在工作方式3模式下,定时/计数器T0被拆成两个独立的8位计数器TL0和TH0。其结构如图3.7所示。其中TL0既可以作计数器使用,也可以作为定时器使用,定时/计数器T0的各控制位和引脚信号全归它使用。其功能和操作与方式0或方式1完全相同。TH0就没有那么多“资源”可利用了,只能作为简单的定时器使用,而且由于定时/计数器T0的控制位已被TL0占用,因此只能借用定时/计数器1的控制位TR1和TF1,也就是以计数溢出去置位TF1,TR1则负责控制TH0定时的启动和停止。
由于TL0既能作定时器也能作计数器使用,而TH0只能作定时器使用而不能作计数器使用,因此在方式3模式下,定时/计数器0可以构成二个定时器或者一个定时器和一个计数器。
如果定时/计数器0工作于工作方式3,那么定时/计数器1的工作方式就不可避免受到一定的限制,因为自己的一些控制位已被定时/计数器借用,只能工作在方式0、方式1或方式2下,如果设置T1工作在方式3,则T1停止工作,相当于其他方式时令TR1=0。
??设定MODE3的步骤
(1) 设定MODE3的步骤(三选1)
MOV TMOD,#03H TL0设定计时工作方式(内部输入) MOV TMOD,#03H TH0设定计时工作方式(内部输入)
19
太原工业学院毕业设计
MOV TMOD,#07H TL0设定计数工作方式(T0输入) (2) 启动定时器 SETB TRX (3) 预置计数初值
MOV TL0,#(256–COUNT) 或 MOV TH0,#(256–COUNT) (4) 检查TFX是否溢出 JBC TFX
图3.7 方式3内部结构
小结:通过定时器/计时器的结构、工作原理和应用的介绍,知道T0和T1的设置步骤几乎是相同的,分别要定义TMOD、TCON、TH0、TL0、TH1和TL1等寄存器后,定时计数器方能正确操作。在程序刚规划的阶段时,每个定时器的操作和控制模式都必须考虑清楚后才可以开始写程序,具体的操作分解为以下几步。
设置步骤1:确定是定时还是计数操作,定时TMOD中的C/T位为0,计数时C/T=1。 设置步骤2:确定定时/计数时是否受外部的硬件信号控制,若不受外部INT0或INT1引脚控制时,TMOD中的GATE位为0,否则需设成1。有关GATE的使用将在中断章节讨论。
设置步骤3:决定计数器的模式,模式0时最大计数值为8192,模式1时最大计数值为65536,两个计数器均没有自动载入的功能;模式2时最大计数值为256,且可自动载入计数值;模式3时有两个计数器,其最大计数值都是256,各种模式的选择应仔细考虑。
将前3个步骤的结果组合起来,成为一个给TMOD寄存器的设置值。
20