定时器/计数器是MCS-51单片机的重要功能模块之一。在微机系统中,常需要定时及对外部事件计数等。MCS-51系统单片机中51子系列内部有两个定时器/计数器T0、T1,它们都是16位的。52子系列有3个定时器/计数器,除T0、T1外,还有T2。本节主要介绍单片机定时器/计数器的结构、原理、工作方式和基本用法。
定时器/计数器简称定时器,8051单片机有两个16位的可编程定时器/计数器:定时器0(T0)和定时器1(T1)。它们都有定时或事件计数的功能,可用于定时控制、延时、对外部事件计数和检测等场合。
定时器/计数器的结构如图8-2所示,它主要由几个专用寄存器组成,分别是TH0、TL0、TH1、TL1及TMOD、TCON。其中,T0由TH0和TL0构成,T1则由TH1和TL1构成。T0和T1的工作主要由特殊功能寄存器TMOD、TCON控制,TMOD主要控制定时器的工作方式,TCON主要控制定时器的启动和停止。
图8-2 TMOD、TCON与T0、T1的结构框图
作定时器时,定时器计数8051片内振荡器输出的经12分频后的脉冲,即每个机器周期使定时器(T0或T1)的寄存器自动加1直至计满溢出。所以定时的最高频率是时钟振荡频率的1/12。作计数器时,通过引脚T0(P3.4)和T1(P3.5)对外部脉冲信号计数,当输入脉冲信号从1到0负跳变时,计数器就自动加1。计数的最高频率一般为振荡频率的1/24。
不论是定时或是计数工作方式,定时器T0或T1都不占用CPU时间,除非定时器/计数器溢出,才可能中断CPU的当前操作。由此可见,定时器是单片机中效率高而且工作灵活的部件。
52子系列有3个可编程定时器/计数器,增加了定时器/计数器T2。
定时器共有两个控制寄存器TMOD和TCON,由软件写入TMOD和TCON这两个8位寄存器,用来设置各个定时器的操作模式和控制功能。
TMOD在特殊功能寄存器中。TMOD的格式如图8-3所示。
由图可见,TMOD的高4位用于T1,低4位用于T0,4种符号的含义如下。
(1)GATE:门控位。GATE=0时,只要用软件使TR0(或TR1)置1就启动了定时器,而不管(或)的电平是高还是低;GATE=1时,只有(或)引脚是高电平且由软件使TR0(或TR1)置1时,才能启动定时器工作。
(2)C/:定时器/计数器方式选择位。C/=0为定时器方式,C/=1为计数器方式。
(3)M1M0:操作模式选择位。
· M1M0=00:模式0(13位定时器/计数器)。
· M1M0=01:模式1(16位定时器/计数器)。
· M1M0=10:模式2(8位自动重装常数的定时器/计数器)。
· M1M0=11:模式3(两个8位定时器/计数器,仅对T0)。
图8-3 定时器工作模式寄存器TMOD
定时器控制寄存器除了可字节寻址外,各位还可位寻址,各位定义及格式如图8-4所示。
图8-4 定时器工作模式寄存器TCON
· TF1、TR1用于定时器T1,TF0、TR0用于定时器T0。两组符号有相同的意义。
· TFx是定时器Tx的溢出标志,当定时器Tx溢出时由硬件自动使中断触发器TFx置1,并向CPU申请中断。当CPU响应进入中断服务程序后,TFx又被硬件自动清零。TFx也可用软件清零。
· TRx是定时器Tx运行控制位。可由软件置1或清零来启动或关闭定时器Tx。
· IE1、IT1用于外部中断l(或),IE0、IT0用于外部中断0(或)。两组符号的含义相同。
· IT是下跳沿/低电平引起外部中断请求的选择位。IT=1,由下跳沿引起;IT=0,由低电平引起。
· IE是外部中断的中断申请标志。IE=0,无外部中断申请;IE=1,有外部中断请求。CPU响应中断后,IE硬件清零。
定时器/计数器T0、T1有4种工作模式,也就是它们可构成4种电路结构模式。在模式0、1和2时,T0和T1的工作模式相同,在模式3时,两个定时器的工作模式不同。下面以T1为例,分述各种工作模式的特点和用法。
T0在工作方式0的逻辑结构如图8-5所示。在这种工作方式下,16位的计数器(TH0和TL0)只用了13位构成13位定时器/计数器,TL0的高3位未用;当TL0的低5位计满时,向TH0进位,而TH0溢出后对中断标志位TF0置“1”,并申请中断。T0是否溢出可用软件查询TF0是否为“1”。
图8-5 T0工作方式0的逻辑结构图
当GATE=0时,引脚被封锁,仅由TR0便可控制(图中的B点)T0的开启和关闭;当GATE=1时,T0的开启与关闭取决于和TR0相“与”的结果,即只有=l和TR0=1时,T0才被开启。
在一般应用中,通常使GATE=0,从而由TR0的状态控制T0的开闭,TR0=1,打开T0;TR0=0,关闭T0。在特殊的应用场合,如利用定时器测量接于引脚的输入的正脉冲的宽度,即引脚由“0”变“1”电平时,启动T0定时且测量开始;一旦外部脉冲出现下降沿,亦即引脚由“1”变“0”时就关闭T0,此时定时器T0的值就为引脚输入的正脉冲的宽度。
在图8-5中,=0时控制开关接通内部振荡器,即处于定时工作方式。T0对机器周期加“1”计数,其定时时间为:
t=(213-T0初值)×机器周期
C/=l时控制开关接通外部输入信号,当外部输入信号电平发生从“1”到“0”的跳变时,计数器加“l”,即处于计数工作方式。
定时器启动后,定时或计数脉冲加到TL0的低5位,从预先设置的初值(时间常数)开始不断增“1”,TL0计满后,向TH0进位。当TL0和TH0都计满后,置位T0定时器的计数满标志TF0,表明定时时间或计数次数已到,以供查询或在开中断的条件下向CPU请求中断。如果需再次定时或计数,需要用指令重置时间常数。
T0在工作方式1的逻辑结构如图8-6所示。由图8-6可知,它与工作方式0的差别仅在于工作方式1是以16位计数器参加计数,工作方式0之所以用13位计数方式是为了和MCS-51单片机的前一个MCS-48系列单片机相兼容,所以定时器的工作方式0已很少使用。定时时间与初值的关系为:
t=(216 -T0初值)×机器周期
工作方式1下计数寄存器为16位,若晶振频率为12 MHz,则工作方式1下的最大定时时间为65.536 ms。即计数器初值设置为0000H,经过216 =65 536个机器周期后定时器将产生溢出,故定时时间为1ms×65 536=65.536 ms。
图8-6 T0工作方式1的逻辑结构图
T0在工作方式2的逻辑结构图如图8-7所示。
图8-7 T0工作方式2的逻辑结构图
定时器/计数器构成一个能重复装初值的8位计数器。在工作方式0、工作方式l,若用于重复定时或计数,则每次计满溢出后,计数器变为全“0”,故需要用软件重新装入初值。而工作方式2可在计数器计满时自动装入初值。工作方式2把16位的计数器拆成两个8位计数器,TL0用作8位计数器,TH0用来保存初值,每当TL0计满溢出时,可自动将TH0的初值再装入TL0中,继续计数,循环重复。工作方式2的定时时间为TF0溢出周期,即:
t=(28-T0初值)×机器周期
用于计数器工作方式时,最大计数长度(TH0初值=0)为28 =256个外部脉冲。
这种工作方式可省去用户软件中重装初值的程序,并可产生相当精度的定时时间,特别适合于产生周期性脉冲及作为串行口波率发生器(见第7章),缺点是计数长度太小。
工作方式3的逻辑结构图如图8-8所示,该工作方式只适用于定时器/计数器T0。T0在工作方式3时被拆成两个相互独立的计数器。
(a)
(b)
图8-8 T0工作方式3的逻辑结构图
一般在系统需增加一个额外的8位计数器时,可设置T0为工作方式3,此时T1虽仍可定义为工作方式0、工作方式l和工作方式2,但只能用在不需中断控制的场合。
从逻辑结构可以看到,8位定时器/计数器TL0占用了引脚T0、及控制位TR0、GATE、C/和溢出标志位TF0,该8位定时器的功能同工作方式0、工作方式1;另一个8位定时器TH0只能完成定时功能,并使用了定时器/计数器1的控制启动位TR1和溢出标志位TF1。此时,定时器/计数器1不能设置为工作方式3,如果将其设置为工作方式3,则停止计数。
工作方式3是为使用串行口时需要两个独立的计数器而特别提供的。因为此时把定时器1规定用作串行通信的波特率发生器,并设定为工作方式2,使用时只要将计数初值送到计数寄存器即开始工作,启动后不需要软件干预,也不使用溢出标志。
定时器/计数器在计数器模式下工作时必须设置计数初值,这个计数初值是送到TH(TH0/TH1)和TL(TL0/TL1)中的。
计数器是在计数初值基础上以加法计数的,并能在计数器从全“1”变为全“0”时自动产生定时溢出中断请求。因此,可以把计数器计满为零所需要的计数值设定为C,计数初值设定为TC,由此便可得到如下的计算公式:TC=M-C。式中,M为计数器模值,该值和计数器工作方式有关。在方式0时M为213;在方式1时M为216;在方式2和方式3时M为28。
在定时器模式下,计数器由单片机主脉冲经12分频后计数。因此,定时器定时时间T的计算公式为:T=(M-TC)T计数。
上式也可写成:TC=M-T/T计数。
式中,M为模值,和定时器的工作方式有关;T计数是单片机振荡周期TCLK的12倍;C为定时器的定时初值。若设TC=0,则定时器定时时间为最大。由于M的值和定时器工作方式有关,因此不同工作方式下定时器的最大定时时间也不一样。
如若设单片机主脉冲频率为12MHz,则最大定时时间如下。
方式0时: TMAX=213×1ms=8.192ms
方式1时: TMAX=216×lms=65.536ms
方式2和方式3时: TMAX=28×lms=0.256ms
【例8-1】若单片机时钟频率为12MHz,计算定时2ms所需的定时器初值。
解:由于定时器工作在方式2和方式3下时的最大定时时间只有0.256ms,因此要想获得2ms的定时时间,定时器必须工作在方式0或方式1。
T计数=12/12=lms
若采用方式0,则定时器的初值为:
TC=213-2ms/lms=6192=1830H=1100 0001 10000B
即:TH0应装0C1H,TL0应装10H(TL0只用低5位,高3位填0)。
若采用方式1,则定时器的初值为:
TC=216-2ms/1ms=63536=F830H
即:TH0应装0F8H,TL0应装30H。
定时器/计数器是单片机应用系统中经常使用的部件之一。定时器/计数器的使用方法对程序编制、硬件电路及CPU的工作都有直接影响。下面将通过一些实例来说明定时器的具体应用方法。
【例8-2】利用定时器T0的工作方式1,使定时器产生1ms的定时,在P1.0端输一个周期为2 ms的方波。设振荡器频率为12MHz。
解:因振荡器频率为12MHz,则机器周期为1ms。时间常数为y=65 536-1000=64 536=0FCl8H。
参考程序如下。
ORG I000H
MAIN: MOV TMOD,#01H ;设T0工作在方式1,定时
MOV TL0,#18H ;T0设初值
MOV TH0,#0FCH
SETB TR0 ;启动T0
WAIT: JNB TF0,WAIT ;等待定时1ms到
CLR TF0 ;清标志
CPL P1.0 ;P1.0取反(每1ms都翻转,则形成周期为2ms的方波)
SJMP MAIN
说明:本题的参考程序有几处可改进的地方,如定时精度的改进等,请读者思考并改进。
【例8-3】设重复周期大于1 ms的低频脉冲信号从引脚T0(P3.4)输入。要求P3.4每发生一次负跳变时,P1.0输出一个500ms的同步负脉冲,同时由P1.1输出一个1 ms的同步正脉冲,设晶振频率为6 MHz,其波形如图8-9所示。
图8-9 利用定时器/计数器产生同步脉冲
解:先将定时器T0设为方式2计数器功能,初值为0FFH。当T0有外部负跳变后,计数脉冲计满溢出,TF0置“1”;经程序查询TF0后改变定时器T0为方式2的500μs定时(定时初值为06H),并且P1.0输出“0”,P1.1输出“1”。T0第一次计数溢出后,P1.0恢复为“l”,T0第二次计数溢出后,P1.1恢复为“0”,T0重复外部计数。
参考程序如下。
ORG 2000H
START: SETB P3.4 ;P3.4初值为1
SETB P1.0 ;P1.0初值为1
CLR P1.1 ;P1.1初值为0
LOOP: NOV TMOD,#06H ;设T0方式2、外部计数
NOV TH0,#0FFH ;计数值为01就溢出
NOV TL0,#0FFH
SETB TR0 ;启动计数器
WT01: JBC TF0,PULl ;检测外部下跳变信号
AJMP WT01
PUL1: CLR TR0
MOV TMOD,#02H ;重置T0方式2、500ms定时
NOV TH0,#06H
NOV TL0,#06H
SETB P1.1 ;P1.1置1
CLR P1.0 ;P1.0清零
SETB TR0 ;启动定时器
D5B1: JBC TF0,Y5B1 ;检测首次500ms
AJMP D5B1
Y5Bl: SETB P1.0 ;P1.0置1
D5B2: JBC TF0,Y5B2 ;第二次检测500ms
AJMP D5B2
Y5B2: CLR P1.1 ;P1.1恢复为0
CIJR.TR0
AJMP LOOP