您的位置: 网站首页 > 电子与嵌入式 > 单片机原理与应用 > 第8章 单片机的输入/输出接口 > 【8.2 定时器/计数器】

8.2 定时器/计数器

 

定时器/计数器是MCS-51单片机的重要功能模块之一。在微机系统中,常需要定时及对外部事件计数等。MCS-51系统单片机中51子系列内部有两个定时器/计数器T0T1,它们都是16位的。52子系列有3个定时器/计数器,除T0T1外,还有T2。本节主要介绍单片机定时器/计数器的结构、原理、工作方式和基本用法。

8.2.1  定时器/计数器的结构

定时器/计数器简称定时器,8051单片机有两个16位的可编程定时器/计数器:定时器0T0)和定时器1T1)。它们都有定时或事件计数的功能,可用于定时控制、延时、对外部事件计数和检测等场合。

定时器/计数器的结构如图8-2所示,它主要由几个专用寄存器组成,分别是TH0TL0TH1TL1TMODTCON。其中,T0TH0TL0构成,T1则由TH1TL1构成。T0T1的工作主要由特殊功能寄存器TMODTCON控制,TMOD主要控制定时器的工作方式,TCON主要控制定时器的启动和停止。

8-2  TMODTCONT0T1的结构框图

作定时器时,定时器计数8051片内振荡器输出的经12分频后的脉冲,即每个机器周期使定时器(T0T1)的寄存器自动加1直至计满溢出。所以定时的最高频率是时钟振荡频率的1/12。作计数器时,通过引脚T0P3.4)和T1P3.5)对外部脉冲信号计数,当输入脉冲信号从10负跳变时,计数器就自动加1。计数的最高频率一般为振荡频率的1/24

不论是定时或是计数工作方式,定时器T0T1都不占用CPU时间,除非定时器/计数器溢出,才可能中断CPU的当前操作。由此可见,定时器是单片机中效率高而且工作灵活的部件。

52子系列有3个可编程定时器/计数器,增加了定时器/计数器T2

8.2.2  定时器/计数器的控制寄存器

定时器共有两个控制寄存器TMODTCON,由软件写入TMODTCON这两个8位寄存器,用来设置各个定时器的操作模式和控制功能。

1.工作模式控制寄存器——TMOD89H

TMOD在特殊功能寄存器中。TMOD的格式如图8-3所示。

由图可见,TMOD的高4位用于T1,低4位用于T04种符号的含义如下。

1GATE:门控位。GATE=0时,只要用软件使TR0(或TR1)置1就启动了定时器,而不管(或)的电平是高还是低;GATE=1时,只有(或)引脚是高电平且由软件使TR0(或TR1)置1时,才能启动定时器工作。

2C/:定时器/计数器方式选择位。C/=0为定时器方式,C/=1为计数器方式。

3M1M0:操作模式选择位。

·    M1M0=00模式013位定时器/计数器)。

·    M1M0=01模式116位定时器/计数器)。

·    M1M0=10模式28位自动重装常数的定时器/计数器)。

·    M1M0=11模式3(两个8位定时器/计数器,仅对T0)。

8-3  定时器工作模式寄存器TMOD

2.定时器控制寄存器——TCON88H

定时器控制寄存器除了可字节寻址外,各位还可位寻址,各位定义及格式如图8-4所示。

8-4  定时器工作模式寄存器TCON

·    TF1TR1用于定时器T1TF0TR0用于定时器T0。两组符号有相同的意义。

·    TFx是定时器Tx的溢出标志,当定时器Tx溢出时由硬件自动使中断触发器TFx1,并向CPU申请中断。当CPU响应进入中断服务程序后,TFx又被硬件自动清零。TFx也可用软件清零。

·    TRx是定时器Tx运行控制位。可由软件置1或清零来启动或关闭定时器Tx

·    IE1IT1用于外部中断l(或),IE0IT0用于外部中断0(或)。两组符号的含义相同。

·    IT是下跳沿/低电平引起外部中断请求的选择位。IT=1,由下跳沿引起;IT=0,由低电平引起。

·    IE是外部中断的中断申请标志。IE=0,无外部中断申请;IE=1,有外部中断请求。CPU响应中断后,IE硬件清零。

8.2.3  定时器/计数器的工作模式

定时器/计数器T0T14种工作模式,也就是它们可构成4种电路结构模式。在模式012时,T0T1的工作模式相同,在模式3时,两个定时器的工作模式不同。下面以T1为例,分述各种工作模式的特点和用法。

1.工作方式0

T0在工作方式0的逻辑结构如图8-5所示。在这种工作方式下,16位的计数器(TH0TL0)只用了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相“与”的结果,即只有=lTR0=1时,T0才被开启。

在一般应用中,通常使GATE=0,从而由TR0的状态控制T0的开闭,TR0=1,打开T0TR0=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进位。当TL0TH0都计满后,置位T0定时器的计数满标志TF0,表明定时时间或计数次数已到,以供查询或在开中断的条件下向CPU请求中断。如果需再次定时或计数,需要用指令重置时间常数。

2.工作方式1

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的逻辑结构图

3.工作方式2

T0在工作方式2的逻辑结构图如图8-7所示。

8-7  T0工作方式2的逻辑结构图

定时器/计数器构成一个能重复装初值的8位计数器。在工作方式0、工作方式l,若用于重复定时或计数,则每次计满溢出后,计数器变为全“0”,故需要用软件重新装入初值。而工作方式2可在计数器计满时自动装入初值。工作方式216位的计数器拆成两个8位计数器,TL0用作8位计数器,TH0用来保存初值,每当TL0计满溢出时,可自动将TH0的初值再装入TL0中,继续计数,循环重复。工作方式2的定时时间为TF0溢出周期,即:

t=28-T0初值)×机器周期

用于计数器工作方式时,最大计数长度(TH0初值=0)为28  =256个外部脉冲。

这种工作方式可省去用户软件中重装初值的程序,并可产生相当精度的定时时间,特别适合于产生周期性脉冲及作为串行口波率发生器(见第7章),缺点是计数长度太小。

4.工作方式3

工作方式3的逻辑结构图如图8-8所示,该工作方式只适用于定时器/计数器T0T0在工作方式3时被拆成两个相互独立的计数器。

a

b

8-8  T0工作方式3的逻辑结构图

一般在系统需增加一个额外的8位计数器时,可设置T0为工作方式3,此时T1虽仍可定义为工作方式0、工作方式l和工作方式2,但只能用在不需中断控制的场合。

从逻辑结构可以看到,8位定时器/计数器TL0占用了引脚T0及控制位TR0GATEC/和溢出标志位TF0,该8位定时器的功能同工作方式0、工作方式1;另一个8位定时器TH0只能完成定时功能,并使用了定时器/计数器1的控制启动位TR1和溢出标志位TF1。此时,定时器/计数器1不能设置为工作方式3,如果将其设置为工作方式3,则停止计数。

工作方式3是为使用串行口时需要两个独立的计数器而特别提供的。因为此时把定时器1规定用作串行通信的波特率发生器,并设定为工作方式2,使用时只要将计数初值送到计数寄存器即开始工作,启动后不需要软件干预,也不使用溢出标志。

8.2.4  定时器/计数器常数的计算

1.计数器初值的计算

定时器/计数器在计数器模式下工作时必须设置计数初值,这个计数初值是送到THTH0/TH1)和TLTL0/TL1)中的。

计数器是在计数初值基础上以加法计数的,并能在计数器从全“1”变为全“0”时自动产生定时溢出中断请求。因此,可以把计数器计满为零所需要的计数值设定为C,计数初值设定为TC,由此便可得到如下的计算公式:TC=M-C。式中,M为计数器模值,该值和计数器工作方式有关。在方式0M213;在方式1M216;在方式2和方式3M28

2.定时器初值的计算

在定时器模式下,计数器由单片机主脉冲经12分频后计数。因此,定时器定时时间T的计算公式为:T=M-TCT计数

上式也可写成:TC=M-T/T计数

式中,M为模值,和定时器的工作方式有关;T计数是单片机振荡周期TCLK12倍;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应装0C1HTL0应装10HTL0只用低5位,高3位填0)。

若采用方式1,则定时器的初值为:

TC=216-2ms/1ms=63536=F830H

即:TH0应装0F8HTL0应装30H

8.2.5  定时器/计数器的应用

定时器/计数器是单片机应用系统中经常使用的部件之一。定时器/计数器的使用方法对程序编制、硬件电路及CPU的工作都有直接影响。下面将通过一些实例来说明定时器的具体应用方法。

1.方式1的应用

【例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          

说明:本题的参考程序有几处可改进的地方,如定时精度的改进等,请读者思考并改进。

2.方式2的应用

【例8-3设重复周期大于1 ms的低频脉冲信号从引脚T0P3.4)输入。要求P3.4每发生一次负跳变时,P1.0输出一个500ms的同步负脉冲,同时由P1.1输出一个1 ms的同步正脉冲,设晶振频率为6 MHz,其波形如图8-9所示。

8-9  利用定时器/计数器产生同步脉冲

解:先将定时器T0设为方式2计数器功能,初值为0FFH。当T0有外部负跳变后,计数脉冲计满溢出,TF0置“1”;经程序查询TF0后改变定时器T0为方式2500μ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方式2500ms定时

         NOV TH0,#06H       

         NOV TL0,#06H       

         SETB P1.1           ;P1.11

         CLR P1.0            ;P1.0清零

         SETB TR0            ;启动定时器

D5B1:   JBC TF0,Y5B1        ;检测首次500ms

         AJMP D5B1          

Y5Bl:   SETB P1.0           ;P1.01

D5B2:   JBC TF0,Y5B2        ;第二次检测500ms

         AJMP D5B2          

Y5B2:   CLR P1.1            ;P1.1恢复为0

         CIJR.TR0           

         AJMP LOOP