目录
定时器/计数器的结构
工作方式控制寄存器TMOD和TCON
定时器/计数器T1、T0的4种工作方式
1.方式0
2.方式1
3.方式2
4.方式3
定时器/计数器T2的结构与工作方式
1.T2的特殊功能寄存器T2MOD和T2CON
2.特殊功能寄存器T2CON
3.T2的三种工作模式
1. 捕捉方式
2.重新装载方式
3.波特率发生器方式及可编程时钟输出
对外部输入的计数信号的要求
定时器/计数器的编程和应用
T1、T0的方式1应用
T1、T0的方式2的应用
T1、T0的方式3的应用
门控制位GATEx的应用----测量脉冲宽度
实时时钟的设计
T2实现1s定时
AT89S52单片机片内有3个可编程的定时器/计数器T0、T1和T2。
定时器/计数器T1、T0结构如图5-1所示,T0由特殊功能寄存器TH0,TL0构成,T1由特殊功能寄存器TH1、TL1构成。具有定时器和计数器2种工作模式,4种工作方式 (方式0、方式1、方式2和方式3)。属于增1计数器。
TMOD用于选择定时器/计数器T0、T1的工作模式和工作方式。
TCON用于控制T0、T1的启动和停止计数,同时包含了T0、T1的状态。
T0,T1不论是工作在定时器模式还是计数器模式,都是对脉冲信号进行计数,只是计数信号的来源不同。
计数器模式是对加在T0(P3.4)和T1(P3.5)两个脚上的外部脉冲进行计数。
定时器工作模式是对单片机的时钟振荡器信号经片内12分频的内部脉冲信号计数。由于时钟频率是定值,所以可根据计数值计算出定时时间。
TMOD用于选择定时器/计数器的工作模式和工作方式,字节地址为89H,不能位寻址。
TCON字节地址为88H,可位寻址,位地址为88H~8FH。
8位分为两组,高4位控制T1,低4位控制T0。
TMOD各位的功能:
(1) GATE-门控位
0:仅由运行控制位TRx(x=0,1)来控制定时器/计数器运行。
1:用外中断引脚(INT0*或INT1*)上的电平与运行控制位TRx共同来控制定时器/计数器运行。
(2) M1、M0----工作方式选择位
M1、M0共有4种编码,对应于4种工作方式的选择,如表所示:
(3) C/T*-----计数器模式和定时器模式选择位
0:为定时器工作模式,对单片机的晶体振荡器12分频后的脉冲进行计数。
1:为计数器工作模式,计数器对外部输入引脚T0(P3.4)或T1 (P3.5)的外部脉冲(负跳变)计数。
(1) TF1、TF0一一计数溢出标志位
当计数器计数溢出时,该位置“1”。使用查询方式时,此位作为状态位供CPU查询,但应注意查询有效后,应使用软件及时将该位清“0”。使用中断方式时,此位作为中断请求标志位,进入中断服务程序后由硬件自动清“0”。
(2) TR1、TR0一一计数运行控制位
TR1位(或TR0位)=1,启动定时器/计数器工作的必要条件。TR1位(或TR0位)=0,停止定时器/计数器工作。 该位可由软件置“1”或清“0”
(3)IE0、IE1----外部中断标志位
IE0是外中断0的中断请求标志位,IE1是外中断1的中断请求标志位。
(4)IT0、IT1----控制外部中断的触发方式
IT1控制外部中断1的触发方式,控制外部中断0的触发方式。这两个位字段的取值为:
•00:低电平触发(Low-Level Trigger)
•01:下降沿触发(Falling Edge Trigger)
•10:上升沿触发(Rising Edge Trigger)
•11:双边沿触发(Dual Edge Trigger)
M1、M0=00时,被设置为工作方式0,逻辑结构框图见图(以T1为例,TMOD.5、TMOD.4=00)
为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)引脚状态两个条件。
对于左下方的GATE位:
(1)GATE=0,A点 电位恒为1,B点电位仅取决于TRx状态。
TRx=1,B点为高电平,控制端控制电子开关闭合,允许T1(或T0)对脉冲计数。TRx=0,B点为低电平,电子开关断开,禁止T1(或T0)计数。
(2) GATE=1,B点电位由INT* (x=0,1)的输入电平和TRx的状态这两个条件来确定。当TRx=1,且INT* =1时,B点才为1,控制端控制电子开关闭合,允许T1(或T0)计数。故这种情况下计数器是否计数是由TRx和INTX* 两个条件来共同控制的。
当M1、M0=01时,定时器/计数器工作于方式1,这时定时器/计数器的等效电路逻辑结构如图所示。
方式1和方式0的差别仅仅在于计数器的位数不同,方式1为16位计数器由THx高8位和TLx低8位构成 (x=0,1),方式0则为13位计数器,有关控制状态位的含义(GATE、C/T*、TFX、TRx)与方式0相同。
工作原理图如下:
注:方式0和方式1的最大特点是计数溢出后,计数器为全0。因此在循环定时或循环计数应用时就存在用指令反复装入计数初值的问题。这不仅影响定时精度,也给程序设计带来麻烦。假设TL1与TH1分别代表地址00,0FH,从000FH开始计数后溢出,若想返回000FH继续计数,那么需要通过软件编程控制将00分配给TL,将0F分配给TH,而软件编程是需要耗费机器周期的,这样装初值,会使计时不准确。但是方式2不会出现这一问题。
当M1、M0为10时,定时器/计数器处于工作方式2,这时定时器/计数器的逻辑结构如图所示(以定时器T1为例,x=1)
方式2为自动恢复初值 (初值自动装入)的8位定时器/计数器
TLx(x=0,1)作为常数缓冲器,当TLx计数溢出时,在溢出标志TFx置"1"的同时,还自动将THx中的初值送至TLx,使TLx从初值开始重新计数。
定时器/计数器的方式2工作过程如图所示,TL=0(因为方式2最大就是8位),表示溢出,TF=1表示中断请求标志位申请中断,再将TH的初值赋值给TL
该方式可省去用户软件中重装初值的指令执行时间,简化定时初值的计算方法,可以相当精确地确定定时时间。
是为增加一个8位定时器/计数器而设,使AT89S51单片机具有3个定时器/计数器。
方式3只适用于T0,T1不能工作在方式3。T1处于方式3时相当于TR1=0,停止计数(此时T1可用来作为串行口波特率产生器)
1.工作方式3下的T0
TMOD的低2位为11时,T0的工作方式被选为方式3,各引脚与T0的逻辑关系如图所示:
定时器/计数器T0分为两个独立的8位计数器TL0和TH0,TL0使用T0的状态控制位C/T*、GATE、TR0、TF0,而TH0被固定为一个8位定时器(不能作为外部计数模式,因为外部引脚被TL使用),并使用定时器T1的状态控制位TR1和TF1,同时占用定时器T1的中断请求源TF1。
2.T0工作在方式3时T1的各种工作方式
一般情况下,当T1用作串行口的波特率发生器时,TO才工作在方式3.TO处于工作方式3时,T1可定为方式0、方式1和方式2,用来作为串行口的波特率发生器,或不需要中断的场合。
当T0工作在方式3时,T1的工作方式:
(1)T1工作在方式0
T1的控制字中M1,M0=0,0时,T1工作在方式0:
(2)T1工作在方式1:
当T1的控制字中M1、M0= 0,1时,T1工作在方式1,工作示意图如图所示:
(3)T1工作在方式2(最常使用)
当T1的控制字中M1、M0=1,0时,T1的工作方式为方式2,工作示意图如图所示。
(4)T1设置在方式3
当T0设置在方式3,再把T1也设为方式3,此时T1停止计数。
AT89S52单片机与AT89S51单片机相比,新增加了一个16位的定时器/计数器T2。
T2有3种工作方式: 捕捉、重新装载(递增或递减计数) 和波特率发生器(若没有T2,需要使用T1作为波特率发生器)。
这3种模式由特殊功能寄存器中的控制寄存器T2CON中的相关位进行选择。
•特殊功能寄存器T2MOD
特殊功能寄存器T2MOD的字节地址为C9H,8位中只有2位有效,其格式见图。
T2MOD寄存器的各位:
T20E (D1) :输出允许位。T20E=1,允许定时时钟从P1.0输出;T20E=0,禁止定时时钟从P1.0输出。
DCEN (D0):计数方式选择。DCEN=1,T2的计数方式由P1.引脚状态决定。P1.1=1,T2减计数,P1.1=0,T2加计数;DCEN=0,计数方式与P1.1无关,同T1和T0一样,采用增1计数。
T2的功能选择由特殊功能控制寄存器T2CON来设定,T2CON字节地址为C8H,可位寻址,位地址C8H~CFH。
T2CON的格式见图:
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):串行口接收时钟标志位。
•当RC LK位为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引脚 (P11)的负跳变将触发“捕捉”或“重新装载”操作;当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进行重新装载操作。
计满回0时,将迫使T2进行重新装载操作
计时器T2总结:
定时器T2有3种工作方式:捕捉、重新装载(增计数或减计数)和波特率发生器3种工作方式,可对寄存器T2CON中的相关位进行软件设置来选择,具体见表。
捕捉方式就是及时“捕捉”住输入信号发生的跳变及有关信息。常用于精确测量输入信号的变化如脉宽等等。捕捉方式的工作示意见图。
根据EXEN2位的不同设置,“捕捉”方式有两种选择。
注:RCAP2L和RCAP2H代表陷阱寄存器,暂存数据
(1)当EXEN2位=0,T2为16位的定时器/计数器。当设C/T2*位为1时选择外部计数方式,对T2引脚(P1.0)上的负跳变信号进行计数。计数器计满回0溢出置“1”中断请求标志TF2,发出中断请求信号。CPU响应中断进入该中断服务程序后,必须用软件将标志位TF2清0。其他操作均与T0和T1的方式1相同。
(2)当EXEN2位=1,T2除上述功能外,还可增加“捕捉”功能。当外部T2EX引脚(P1.1)上的信号发生负跳变,将选通三态门制端 ,将计数器TL2和TH2中的当前计数值被分别“捕捉”进RCAP2L和RCAP2H中同时T2EX引脚(P11)上的信号负跳变将置“1”TCON寄存器的EXF2标志位,向CPU请求中断。
图中RCAP2L为陷阱寄存器低字节,字节地址为CAH,RCAP2H为陷阱寄存器高字节,字节地址为CBH。T2引脚为P1.0,T2EX引脚为P1.1,因此当选用T2时,P1.0和P1.1就不能作I/O口用了。另外这两个中断请求,通过一个“或门输出。因此当CPU响应中断后,在中断服务程序中应该用软件识别是哪个中断请求,分别进行处理,该中断请求标志位必须用软件清“0”
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中,自动进行下一轮的计数操作,其功能与T0T1的方式2(自动装载)相同,只是本方式是16位的,计数范围大。RCAP2L、RCAP2H寄存器的计数初值由软件预置。T2的重新装载方式见图。
•当设置EXEN2标志位为1时,T2仍具有上述操作方式的功能,并增加了新的特性。当外部输入引脚T2EX(P1.1)产生负跳变时,能触发三态门将RCAP2L、RCAP2H陷阱寄存器中的计数初值自动装载到TH2和TL2中,重新开始计数,并置“1”EXF2位,发出中断请求。
(2)当T2MOD的DCEN位设置为1时,可以使T2既能实现增1计数,也可实现减1计数,它取决于T2EX引脚上的逻辑电平,由图可见,当设置DCEN 位为1时,可以使T2具有增1/减1计数功能
当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,发出中断请求,另一方面,下溢信号触发三态门,将OFFFFH装入TL2和TH2计数器中,继续进行减1计数。
中断请求标志位TF2和EXF2位必须用软件清“0”
当特殊功能寄存器T2CON中的RCLK和TCLK位均置成1或者其中某位为1时,串行口进行接收1发送工作,T2可工作于波特率发生器方式,还可作为可编程时钟输出。
当定时器/计数器工作在计数器模式时,计数脉冲来自外部输入引脚TO或T1。当输入信号产生负跳变时,计数器的值增1。
每个机器周期的S5P2期间,都对外部输入引脚TO或T1进行采样。如在第个机器周期中采得的值为1,而在下一个机器周期中采得的值为0,则在紧跟着的再下一个机器周期S3P1期间,计数器加1。由于确认一次负跳变要花2个机器周期,因此外部输入的计数脉冲的最高频率为系统振荡器频率的1/24。
例如,选用6MHz频率的晶体,允许输入的脉冲频率最高为250kHz。如果选用12MHz频率的晶体,则可输入最高频率为500kHz的外部脉冲。
对于外部输入信号的占空比并没有什么限制,但为了确保某一给定电平在变化之前能被采样一次,则这一电平至少要保持一个机器周期。故对外部输入信号的要求如图所示,图中,为机器周期
4种方式,方式0与方式1基本相同,只是计数位数不同。方式0初值计算复杂,一般不用方式0,而用方式1。
基本思想:方波周期用T0确定,T0每隔1ms计数溢出1次,即T0每隔1ms产生一次中断,CPU响应中断后,在中断服务子程序中对P1.0取反如图所示。
当单片机复位时,从程序入口0000H跳向主程序MAIN处执行。其中调用了TO初始化子程序PTOMO。
子程序返回后,程序执行“AJMP HERE”指令,则循环等待
当响应T0定时中断时,则跳向T0中断入口,再从T0中断入口跳向IT0P标号处执行T0中断服务子程序。
当执行完中断返回的指令“RET1”后,又返回断点处继续执行循环指令“AJMP HERE”。在实际的程序中,“AJMP HERE”实际上是一段主程序。当下一次定时器TO的1ms定时中断发生时,再跳向TO中断入口,从而重复执行上述过程。
如CPU不做其他工作,也可用查询方式进行控制,程序要简单得多:
查询程序虽简单,但CPU必须要不断查询TF0标志,工作效率低。
基本思想:采用定时器模式。因定时时间较长,首先确定采用哪一种工作方式。时钟为6MHz的条件下,定时器各种工作方式最长可定时时间:
方式0最长可定时16.384ms;
方式1最长可定时131.072ms;
方式2最长可定时512us。
由上可见,可选方式1,每隔100ms中断一次,中断10次为1s。
基本思想:T0设为方式1计数,初值为FFFFH。当外部计数输入端T0(P3.4) 发生一次负跳变时,T0加1且溢出,溢出标志TF0置“1”,向CPU发出中断请求,此时T0相当于一个负跳沿触发的外部中断源。
进入T0中断程序后,F0标志置“1”,说明T0引脚上已接收过负跳变信号。T1定义为方式2定时。在T0引脚产生一次负跳变后,启动T1每500us产生一次中断,在中断服务子程序中对P1.0求反,使P1.0产生周期1ms的方波。由于省去重新装初值指令,所以可产生精确的定时时间。
程序说明:当单片机复位时,从0000H跳向主程序MAIN处执行程序。其中调用了对T0,T1初始化子程序PTOM2。子程序返回后执行标号LOOP处指令,循环等待T0引脚上负脉冲的到来。由于负脉冲到来的标志位FO的复位初始值为0,所以程序就在标号LOOP处循环等待。
程序说明:由于T1的中断服务子程序只有两条指令,不超过8个字节,所以进入T1中断服务程序入口后,没有选择再跳转。
方式3下的TO和T1大不相同。TO工作在方式3,TLO和THO被分成两个独立的8位定时器/计数器。其中,TLO可作为8位的定时器/计数器,而THO只能作为8位的定时器。此时T1只能工作在方式0、1或2。
一般情况下,当T1用作串行口波特率发生器时,T0才设置为方式3。此时常把定时器T1设置为方式2,用作波特率发生器。
基本思想:设置TL0为方式3计数,TLO初值设为OFFH,当检测到T0脚信号出现负跳变时,TL0溢出,同时向CPU申请中断,这里T0脚作为一个负跳沿触发的外部中断请求输入端。在中断处理子程序中,启动TH-,TH0事先被设置为方式3的100us定时,从而控制P1.0输出周期为200us的方波信号,如图所示
介绍门控制位GATE的具体应用,测量INT1* (P3.3)引脚上正脉冲的宽度
执行以上程序,使INT1*引脚上出现的正脉冲宽度以机器周期数的形式显示在显示器上。
[例5-7]实时时钟最小计时单位是“秒”,关键是如何获得“秒”的定时时间。
基本思想
最小计时单位是秒,如何获得1s的定时时间呢?定时器方式1,最大定时时间也只能131ms。可将定时器的定时时间定为100ms,中断方式进行溢出次数的累计,计满10次,即得秒计时。而计数10次可用循环程序的方法实现。初值的计算如例5-2。
片内RAM规定3个单元为秒、分、时单元:
42H:“秒”单元; 41H:“分”单元; 40H:”时“单元
从秒到分,从分到时是通过软件累加并比较来实现。要求每满1秒,则“秒”单元42H中的内容加1;“秒”单元满60,则“分”单元41H中的内容加1;“分”单元满60,则“时”单元40H中的内容加1;“时”单元满24,则将42H、41H、40H的内容全部清“0”
程序设计
(1) 主程序设计
进行定时器T0初始化,并启动T0,然后反复调用显示子程序,等待100ms中断到来。
(2) 中断服务程序的设计实现秒、分、时的计时处理。流程如图所示。
参考程序:
下面的的例子,是利用T2的16位自动重新装载方式实现1秒定时。
单片机的P1.0脚接一个发光二极管LED,进入T2中断服务子程序后,对P1.0求反从而控制LED闪烁。晶振采用12MHz,因此计数器增1的定时时间为1us。
1秒定时时间与计数初值计算如下:
1秒时间采用16次中断来实现,每次的中断时间所需的计数为1s/16=62500
因此计数初值的十进制数为:216-62500=3036,3036转换为16进制数为OBDCH。
由本例可见,定时器T2的16位自动重新装载方式,其功能与T0T1的方式2(8位计数初值自动装载)相同,只是该方式是16位的,计数范围大。当T2计数溢出时,又将陷阱寄存器RCAP2L、RCAP2H中预置的16位计数初值重新再装入计数器TL2、TH2中,自动进行下一轮的计数操作。
注意,由于引起T2中断的可能是EXF2,也可能是TF2,所以要在中断服务程序进行判断,对TF2的中断不处理,只处理EXF2引起的中断。