6.1 定时器概述
89C51/S51单片机内部有两个16位定时器/计数器,即定时器0(T0)和定时器1(T1)。
6.1.1 什么是记数和定时
1.计数
所谓计数就是对外部事件进行计数,外部事件的发生以输入脉冲表示,因此计数功能的实质就是对外来脉冲进行计数。51单片机有T0(P3.4)和T1(P3.5)两个信号引脚,分别是这两个计数器的计数输入端。外部输入的脉冲在负跳变(即下降沿)时进行计数器加1(加法计数)。
2.定时
定时是通过计数器的计数来实现的,只不过计数脉冲来自单片机内部,每个机器周期产生一个计数脉冲。每个机器周期,计数器加一。
(因为一个机器周期等于十二个振荡脉冲周期,因此计数频率为振荡周期的1/12)
6.1.2 定时器/计数器的组成
两个16位的定时器/计数器,即定时器0(T0)和定时器1(T1)。都是16位加1计数器。
T0由两个8位特殊功能寄存器TH0和TL0构成;T1由TH1和TL1构成。
每个定时器都可由软件设置为定时工作方式或计数工作方式以及其他灵活多样的可控功能方式,这些都由TMOD(TIMER/COUNTER MODE CONTROL REGISTER定时器/计数器模式控制寄存器)和TCON(TIMER/COUNTER CONTROL REGISTER定时器/计数器控制寄存器)所控制。
设置为定时工作方式时,每个机器周期使定时器(T0或T1)的数值加1直至计满溢出。当89C51/S5采用12 MHz晶振时,一个机器周期为1 μs,计数频率为1 MHz。
设置为计数工作方式时,通过引脚T0(P3.4)和T1(P3.5)对外部脉冲信号计数。当输入脉冲信号产生下降沿时,计数器的值加1。在每个机器周期的S5P2期间采样T0和T1引脚的输入电平,在本周期和下一周期之间存在下降沿,则计数器加1。所以,检测一个负跳变下降沿需要两个机器周期,故最高计数频率为振荡频率的1/24。(为了确保某个电平在变化之前至少被采样一次,要求电平保持时间至少是一个完整的机器周期。)
不管是定时还是计数工作方式,定时器T0或T1在对内部时钟或对外部事件计数时,不占用CPU时间,除非定时器/计数器溢出,才可能中断CPU的当前操作。
除了可以选择定时或计数工作方式外,每个定时器/计数器还有4种工作模式,也就是每个定时器可构成4种电路结构模式。其中,模式0~2对T0和T1都是一样的,模式3对两者是不同的。
6.2 定时器的控制
当89C51/S51复位时,TNOD、TCON都被清零。这两个8位寄存器被用来设置T0或T1的操作模式和控制模式。
6.2.1 工作模式寄存器TMOD
TMOD用于控制T0和T1的工作模式。TMOD不能位寻址,只能用字节设置定时器的工作模式,低半字节设置T0,高半字节设置T1。
89C51系统复位时,TMOD的所有位被清0。
M1和M0:操作模式控制位。两位可形成四种编码,对应四种操作模式。
模式0——13位计数器;模式1——16位计数器;模式2——自动再装入8位计数器;模式3——定时器0分成二个8位计数器,定时器1停止计数
:定时器/计数器方式选择
若=0,设置为定时方式,定时器计数单片机片内脉冲,即对机器周期计数(震荡周期的12倍);若=1,为计数方式,对外部脉冲计数(引脚T0(P3.4)或T1(P3.5))。
GATE:门控位。GATE=0,可以不管外部中断端口直接启动。
6.2.2 控制寄存器TCON
控制寄存器可位寻址。89C51/S51系统复位时,TCON的所有位被清0。
TF(Timer OverFlow Flag)、TR(Timer Run)
①TF1(TCON.7) —T1溢出标志位。
当T1溢出时,由硬件自动使中断触发器TF1置1,并向CPU申请中断。当CPU响应中断进入中断服务程序后,TF1被硬件自动清0。TF1也可以用软件清0。
②TF0(TCON.5)—T0溢出标志位。其功能和操作情况同TF1。
③TR1(TCON.6)—T1运行控制位。
可通过软件置1(TR1=1)或清0(TR1=0)来启动或关闭T1工作。在程序中用指令“SETB TR1”使TR1位置1,定时器T1便开始计数。用“CLR TR1使TR1清0,定时器停止工作。
④ TR0(TCON.4)—T0运行控制位。 其功能和操作情况同TR1。
⑤ 其余为中断标志位
6.3 定时器的四种模式及应用
T0、T1在模式0、模式1、模式2时,工作模式形同,模式3时不相同。
模式0通常很少使用。
6.3.1 模式1及应用
模式1对应一个16位的定时器/计数器。寄存器TH0和TL1以全部16位参与操作。
当用于定时工作方式时,定时时长为:
① 用于定时工作方式时,定时时间为:
t=(65536-T0初值)×振荡周期×12
② 用于计数工作方式时,计数长度为:
(65536-T0初值)(个外部脉冲)
6.3.2 模式2及应用
模式2把TL0配置成一个可以自动重装载的8位定时器/计数器。
TL0计数溢出时,不仅使溢出中断标志位TF0置1,而且还自动把TH0中的内容重新装载到TL0中。TL0用作8位计数器,TH0用以保存初值。
在程序初始化时,TL0和TH0由软件赋予相同的初值。
用于定时工作方式时,定时时间为:
t=(256-TL0初值)×振荡周期×12
该模式可省去软件中重装常数的语句,并可产生相当精确的定时时间,适合于作串行口波特率发生器
6.3.3 模式三及应用
若将T0设置为模式3,则TL0和TH0被分成两个相互独立的8位计数器。
T0设置为模式3,TL0和TH0被分成两个相互独立的8位计数器。
TL0:用原T0的各控制位、引脚和中断源,即,GATE,TR0,TF0,T0(P3.4)引脚,INT0(P3.2)引脚。
TL0可工作在定时器方式和计数器方式。其功能和操作与模式0、模式1相同(只是8位)。
TH0:只可用作简单的内部定时功能。TH0占用了定时器T1的控制位TR1和T1的中断标志TF1,其启动和关闭仅受TR1的控制。
所以T1没有模式3,若将T1设置为模式3,会导致T1立即停止计数,也就是保持原有的计数值。
定时器T1无工作模式3状态。在T0用作模式3时,T1仍可设置为模式0~2。
由于TR1和TF1被定时器T0占用,计数器开关K已被接通,此时,仅用T1控制位,切换其定时或计数器工作方式就可使T1运行。当计数器溢出时,只能将输出送入串行口或用于不需要中断的场合。T0模式3,一般设T1模式2作波特率发生器。