1、定时器/计数器的结构
定时器/计数器T1、T0结构如下图所示,T0由特殊功能寄存器TH0、TL0构成,T1由特殊功能寄存器TH1、TL1构成。

image.png
具有定时器和计数器2种工作模式,4种工作方式(方式0、方式1、方式2和方式3)。属于增1计数器。
TMOD用于选择定时器/计数器T0、T1的工作模式和工作方式。
TCON用于控制T0、T1的启动和停止计数,同时包含了T0、T1的状态。
T0、T1不论是工作在定时器模式还是计数器模式,都是对脉冲信号进行计数,只是计数信号的来源不同。
计数器模式是对加在T0(P3.4)和T1(P3.5)两个引脚上的外部脉冲进行计数。
定时器工作模式是对单片机的时钟振荡器信号经片内12分频的内部脉冲信号计数。由于时钟频率是定值,所以可根据计数值计算出定时时间。
计数器的起始计数都是从初值开始。单片机复位时计数器的初值为0,也可用指令给计数器装入一个新的初值。
工作方式控制寄存器TMOD:
用于选择定时器/计数器的工作模式和工作方式,字节地址为89H,不能位寻址,格式如下图所示。

image.png 8位分为两组,高4位控制T1,低4位控制T0。
    TMOD各位的功能。
  (1)GATE———门控位。
       0:仅由运行控制位TRx(x = 0,1)来控制定时器/计数器运行。
       1:用外中断引脚( INT0*或 INT1*)上的电平与运行控制位TRx共同来控制定时器/计数器运行。
(2)M1、M0——工作方式选择位
     M1、M0共有4种编码,对应于4种工作方式的选择,如下表所示。

image.png
(3)C/T*—计数器模式和定时器模式选择位
    0:为定时器工作模式,对单片机的晶体振荡器12分频后的脉冲进行计数。
    1:为计数器工作模式,计数器对外部输入引脚T0(P3.4)或T1(P3.5)的外部脉冲(负跳变)计数。
定时器/计数器控制寄存器TCON:
字节地址为88H,可位寻址,位地址为88H~8FH。格式见下图。

image.png
(1)TF1、TF0——计数溢出标志位。
   当计数器计数溢出时,该位置“1”。使用查询方式时,此位作为状态位供CPU查询,但应注意查询有效后,应使用软件及时将该位清“0”。使用中断方式时,此位作为中断请求标志位,进入中断服务程序后由硬件自动清“0”。
(2)TR1、TR0——计数运行控制位。
   TR1位(或TR0位)=1,启动定时器/计数器工作的必要条件。
2、定时器/计数器T1、T0的4种工作方式
   4种工作方式分别如下。
方式0:
M1、M0=00时,被设置为工作方式0,逻辑结构框图见图5-4(以T1为例,TMOD.5、TMOD.4=00)。
   当TMOD寄存器中的GATE=0时,仅由运行控制位TRx(x=0,1)来控制定时器/计数器的运行;当GATE=1时,定时器/计数器的运行要由外中断引脚( INT0*或 INT1*)的电平与运行控制位TRx共同来控制。
image.png
为13位计数器,由TLx(x = 0,1)低5位和THx高8位构成。TLx低5位溢出则向THx进位,THx计数溢出则把TCON中的溢出标志位TFx置“1”。

    上图的C/T*位控制的电子开关决定了定时器/计数器的两种工作模式。
(1) C/T*=0,电子开关打在上面位置,T1(或T0)为定时器工作模式,把时钟振荡器12分频后的脉冲作为计数信号。
(2) C/T*=1,电子开关打在下面位置,T1(或T0)为计数器工作模式,计数脉冲为P3.4(或P3.5)引脚上的外部输入脉冲,当引脚上发生负跳变时,计数器加1。
     GATE位状态决定定时器/计数器的运行控制取决TRx一个条件还是TRx和INTx*(x = 0,1)引脚状态两个条件。
   (1)GATE=0,A点电位恒为1,B点电位仅取决于TRx状态。TRx = 1,B点为高电平,控制端控制电子开关闭合,允许T1(或T0)对脉冲计数。TRx = 0,B点为低电平,电子开关断开,禁止T1(或T0)计数。
   (2)GATE=1,B点电位由INTx* (x = 0,1)的输入电平和TRx的状态这两个条件来确定。当TRx = 1,且INTx* =1时,B点才为1,控制端控制电子开关闭合,允许T1(或T0)计数。故这种情况下计数器是否计数是由TRx和INTX* 两个条件来共同控制的。
方式1:
当M1、M0=01时,定时器/计数器工作于方式1,这时定时器/计数器的等效电路逻辑结构如下图所示。
image.png
   方式1和方式0的差别仅仅在于计数器的位数不同,方式1为16位计数器,由THx高8位和TLx低8位构成(x=0,1),方式0则为13位计数器,有关控制状态位的含义(GATE、C/T*、TFx、TRx)与方式0相同。

方式2:
    方式0和方式1的最大特点是计数溢出后,计数器为全0。因此在循环定时或循环计数应用时就存在用指令反复装入计数初值的问题。这不仅影响定时精度,也给程序设计带来麻烦。方式2就是针对此问题而设置的。
     当M1、M0为10时,定时器/计数器处于工作方式2,这时定时器/计数器的逻辑结构如下图所示(以定时器T1为例,x= 1)。

image.png
方式2为自动恢复初值(初值自动装入)的8位定时器/计数器。
    TLx(x = 0,1)作为常数缓冲器,当TLx计数溢出时,在溢出标志TFx置“1”的同时,还自动将THx中的初值送至TLx,使TLx从初值开始重新计数。
    定时器/计数器的方式2工作过程如下图所示。

image.png
该方式可省去用户软件中重装初值的指令执行时间,简化定时初值的计算方法,可以相当精确地确定定时时间。

方式3:
是为增加一个8位定时器/计数器而设,使AT89S51单片机具有3个定时器/计数器。
  方式3只适用于T0,T1不能工作在方式3。T1处于方式3时相当于TR1=0,停止计数(此时T1可用来作为串行口波特率产生器)。
1)工作方式3下的T0
  TMOD的低2位为11时,T0的工作方式被选为方式3,各引脚与T0的逻辑关系如图5-8所示。
  定时器/计数器T0分为两个独立的8位计数器TL0和TH0,TL0使用T0的状态控制位C/T*、GATE、TR0、TF0 ,而TH0被固定为一个8位定时器(不能作为外部计数模式),并使用定时器T1的状态控制位TR1和TF1,同时占用定时器T1的中断请求源TF1。
2)T0工作在方式3时T1的各种工作方式
   一般情况下,当T1用作串行口的波特率发生器时,T0才工作在方式3。T0处于工作方式3时,T1可定为方式0、方式1和方式2,用来作为串行口的波特率发生器,或不需要中断的场合。

image.png
(1)T1工作在方式0
  T1的控制字中M1、M0 =00时,T1工作在方式0,见下图。

image.png
(2)T1工作在方式1
  当T1的控制字中M1、M0 = 01时,T1工作在方式1,工作示意图如下:

image.png
(3)T1工作在方式2
   当T1的控制字中M1、M0=10时,T1的工作方式为方式2,工作示意图如下:

image.png
(4)T1设置在方式3
   当T0设置在方式3,再把T1也设成方式3,此时T1停止计数。

3、定时器/计数器T2的结构与工作方式
     AT89S52单片机与AT89S51单片机相比,新增加了一个16位的定时器/计数器T2。
    T2有3种工作方式:捕捉、重新装载(递增或递减计数)和波特率发生器。这3种模式由特殊功能寄存器中的控制寄存器T2CON 中的相关位进行选择。
T2的特殊功能寄存器T2MOD和T2CON:
(1)特殊功能寄存器T2MOD
     特殊功能寄存器T2MOD的字节地址为C9H,8位中只有2位有效,其格式见下图:

image.png
T2MOD寄存器的各位定义如下:
T2OE(D1):输出允许位。T2OE=1,允许定时时钟从P1.0输出;T2OE=0,禁止定时时钟从P1.0输出。
DCEN(D0):计数方式选择。DCEN=1,T2的计数方式由P1.1引脚状态决定。P1.1=1,T2减计数,P1.1=0,T2加计数;DCEN=0,计数方式与P1.1无关,同T1和T0一样,采用增1计数。

(2)特殊功能寄存器T2CON
T2的功能选择由特殊功能控制寄存器T2CON来设定,T2CON字节地址为C8H,可位寻址,位地址C8H~CFH。
       T2CON的格式见下图。

image.png
T2CON寄存器各位的定义如下:
   TF2(D7):T2计数计满溢出回0中断请求标志位。当T2计数计满溢出回0时,由内部硬件置“1”TF2,向CPU发出中断请求。但是当RCLK位或TCLK位为1时将不予置位。本标志位必须由软件清0。
   EXF2(D6):T2外部中断请求标志位。当由引脚T2EX上的负跳变引起“捕捉”或“重新装载”且EXEN2位为1,则置“1”EXF2标志位,向CPU发出中断请求。本标志位必须由软件清0。
   RCLK(D5):串行口接收时钟标志位。当RCLK位为1时,串行通信端使用定时器/计数器T2的溢出回0信号作为串行通信方式1和方式3的接收时钟;
当RCLK位为0时,使用定时器/计数器1的溢出回0信号作为串行通信方式1和方式3的接收时钟。
   TCLK(D4):串行发送时钟标志位。当TCLK位为1时,串行通信端使用定时器/计数器2的溢出回0信号作为串行通信方式1和方式3的发送时钟;当TCLK位为0时,串行通信端使用定时器/计数器1的溢出回0信号作为串行通信方式1和方式3的发送时钟;
   EXEN2(D3):T2外部采样允许标志位。当EXEN2位为1时,如果T2不是正工作在串行口的时钟,则在T2EX引脚(P1.1)上的负跳变将触发“捕捉”或“重新装载”操作;当EXEN2位为0时,在T2EX引脚(P1.1)上的负跳变对T2不起作用。
   TR2(D2):T2启动/停止控制位。当软件置“1”TR2时,即TR2=1,则启动T2开始计数,当软件清“0”TR2时,即TR2=0,软件置“1”TR2时,则停止计数。
   C/T2*(D1):T2的定时或计数模式选择位,当设置C/T2* =1时,选择对外部事件计数模式;C/=0时,则选择内部定时模式。
   CP/RL2(D0):T2捕捉/重新装载选择位。当设置为1时,如果EXEN2为1,则在T2EX引脚(P1.1)上的负跳变将触发“捕捉”操作;当设置为0时,如果EXEN2为1,则T2计数计满回0溢出或T2EX引脚上的负跳变都将引起重新装载操作;当RCLK位为1或TCLK位为1,CP/RL2标志位不起作用。T2的计满回0溢出时,将迫使T2进行重新装载操作。
T2的3种工作模式:
定时器T2 有3种工作方式:捕捉、重新装载(增计数或减计数)和波特率发生器3种工作方式,可对寄存器T2CON 中的相关位进行软件设置来选择,具体见表。

image.png
1. 捕捉方式
  捕捉方式就是及时“捕捉”住输入信号发生的跳变及有关信息。常用于精确测量输入信号的变化如脉宽等等。捕捉方式的工作示意见图5-14。
  根据EXEN2位的不同设置,“捕捉”方式有两种选择。
  (1)当EXEN2位=0,T2为16位的定时器/计数器。当设C/T2*位为1时选择外部计数方式,对T2引脚(P1.0)上的负跳变信号进行计数。计数器计满回0溢出置“1”中断请求标志TF2,发出中断请求信号。CPU响应中断进入该中断服务程序后,必须用软件将标志位TF2清0。其他操作均与T0和T1的方式1相同。

image.png
(2)当EXEN2位=1,T2除上述功能外,还可增加“捕捉”功能。当外部T2EX引脚(P1.1)上的信号发生负跳变,将选通三态门制端(见图5-14),将计数器TL2和TH2中的当前计数值被分别“捕捉”进RCAP2L和RCAP2H中,同时T2EX引脚(P1.1)上的信号负跳变将置“1”TCON寄存器的EXF2标志位,向CPU请求中断。
  图中RCAP2L为陷阱寄存器低字节,字节地址为CAH,RCAP2H为陷阱寄存器高字节,字节地址为CBH。T2引脚为P1.0,T2EX引脚为P1.1,因此当选用T2时,P1.0和P1.1就不能作I/O口用了。另外这两个中断请求,通过一个“或”门输出。因此当
CPU响应中断后,在中断服务程序中应该用软件识别是哪一个中断请求,分别进行处理,该中断请求标志位必须用软件清“0”。
2. 重新装载方式
T2的重新再装入方式根据寄存器TCON中的EXEN2的两种状态来进行选择。另外根据寄存器T2MOD中的DCEN位是“0”还是“1”来选择加1还是减1计数方式。
当单片机复位时,T2MOD中的DCEN=0,则默认T2为增1计数方式;当把DCEN置“1”时,将由T2EX引脚(P1.1)上的逻辑电平决定是增1/减1计数方式。

(1)当设置T2MOD寄存器的DCEN 位为0(或上电复位为0)时,T2为增1型重新装载方式,此时根据T2CON寄存器中的EXEN2位的状态,可选择两种操作方式:
当EXEN2标志位为0时,T2计满回0溢出,一方面使中断请求标志位TF2置“1”,同时又将陷阱寄存器RCAP2L、RCAP2H中预置的16位计数初值重新再装入计数器TL2、TH2中,自动进行下一轮的计数操作,其功能与T0、T1的方式2(自动装载)相同,只是本方式是16位的,计数范围大。RCAP2L、RCAP2H寄存器的计数初值由软件预置。T2的重新装载方式见图:
image.png
当设置EXEN2标志位为1时,T2仍具有上述操作方式的功能,并增加了新的特性。当外部输入引脚T2EX(P1.1)产生负跳变时,能触发三态门将RCAP2L、RCAP2H陷阱寄存器中的计数初值自动装载到TH2和TL2中,重新开始计数,并置“1”EXF2位,发出中断请求。
(2)当T2MOD的DCEN位设置为1时,可以使T2既能实现增1计数,也可实现减1计数,它取决于T2EX引脚上的逻辑电平。

image.png
当T2EX(P1.1)引脚为“1”时,T2执行增1计数功能。当不断加1计满回0溢出时,一方面置位TF2为1,发出中断请求,另一方面,溢出信号触发三态门,将存放在陷阱寄存器RCAP2L、RCAP2H中的计数初值自动装载到TL2和TH2计数器中继续进行加1计数。
  当T2EX(P1.1)引脚为“0”时,T2执行减1计数功能。当TL2和TH2计数器中的值等于陷阱寄存器RCAP2L、RCAP2H中的值时,产生向下溢出,一方面置位TF2为1,发出中断请求,另一方面,下溢信号触发三态门,将0FFFFH装入TL2和TH2计数器中,继续进行减1计数。
  中断请求标志位TF2和EXF2位必须用软件清“0”。

4、对外部输入的计数信号的要求
当定时器/计数器工作在计数器模式时,计数脉冲来自外部输入引脚T0或T1。当输入信号产生负跳变时,计数器的值增1。
每个机器周期的S5P2期间,都对外部输入引脚T0或T1进行采样。如在第一个机器周期中采得的值为1,而在下一个机器周期中采得的值为0,则在紧跟着的再下一个机器周期S3P1期间,计数器加1。由于确认一次负跳变要花2个机器周期,因此外部输入的计数脉冲的最高频率为系统振荡器频率的1/24。
例如,选用6MHz频率的晶体,允许输入的脉冲频率最高为250kHz。如果选用12MHz频率的晶体,则可输入最高频率为500kHz的外部脉冲。
   对于外部输入信号的占空比并没有什么限制,但为了确保某一给定电平在变化之前能被采样一次,则这一电平至少要保持一个机器周期。故对外部输入信号的要求如下图所示,图中,Tcy为机器周期。

image.png