定时/计数器工作方式
T0或T1无论用作定时器或计数器都有4种工作方式:方式0、方式1、方式2和方式3。除方式3外,T0和T1有完全相同的工作状态。下面以T0为例,分述各种工作方式的特点和用法。
1.工作方式0
当M1、M0设置为00时,定时/计数器设定为工作方式0,以T0为例,结构如图5-4所示。定时/计数器由TL0的低5位和TH0的8位构成13位计数器(TL0的高3位无效)。
图5-4 方式0的逻辑结构(13位计数器)
T0为定时器,定时信号为振荡脉冲12分频后的脉冲;
T0为计数器,计数信号来自引脚T1的外部信号。
定时/计数器能否启动工作,受TR0、GATE和引脚信号的控制。由图5-4中的逻辑电路可知,当GATE=0时,只要TR0=1就可打开控制门,使定时器工作;当GATE=1时,只有当TR0=1且
时,才可打开控制门。GATE、TR0、
的状态选择由定时器的控制寄存器TMOD、TCON中相应位状态确定,
则是外部引脚上的信号。
方式0是13位计数结构的工作方式,其计数器由TH0全部8位和TL0的低5位构成。当TL0的低5位计数溢出时,向TH0进位,而全部13位计数溢出时,则向计数溢出标志位TF0进位。如果要求计数器的计数值为N,或定时器的定时时间为T,T0的初值(也称为时间常数)设为X。在方式0下,当T0为计数器方式时,X=213-N;当T0为定时器方式时,X=(213-T/Tcy),其中Tcy为机器周期。需要注意的是,在初始化程序中,将X(13位二进制数)的低5位装入TL0,高8装入TH0。
2.工作方式1
当M1、M0设置为01时,定时/计数器设定为工作方式1,结构如图5-5所示。定时/计数器是由TH0全部8位和TL0全部8位构成的16位计数器。与工作方式0基本相同,区别仅在于工作方式1的计数器TL0和TH0组成16位计数器,从而比工作方式0有更宽的定时/计数范围。
图5-5 方式1的逻辑结构(16位计数器)
在方式1时,计数范围为1~65536。计数器的计数值由下式确定:
N=216-X=65536-X
式中:X为计数初值;N为所需计数值。
定时器的定时时间T由下式确定:
T=N×Tcy=(65536-X)×Tcy
如果fosc=12MHz,则Tcy=1μs,定时范围为1~65536μs。
当定时/计数器工作在方式0、方式1以及后面即将介绍的方式3时,一旦计数溢出,定时器被清0。因此,如果需要重复相同的定时或计数工作,需重新设置计数初值。
3.工作方式2
当M1、M0设置为10时,定时/计数器设定为工作方式2,结构如图5-6所示。定时/计数器是由TL0构成8位计数器,TH0仅用来存放时间常数。启动T0前,TL0和TH0装入相同的时间常数,当TL0计满后,除定时器溢出标志TF0置位、具备向CPU请求中断的条件外,TH0中的时间常数还会自动装入TL0,重新开始定时或计数。所以,工作方式2是一种自动装载初值的8位计数器方式。
图5-6 方式2的逻辑结构
当计数器计满溢出后,不是像其他工作方式那样通过软件方法重新加载,而是由预置寄存器TH0以硬件方法自动给计数器TL0重新加载,变软件加载为硬件加载。初始化时,8位计数初值同时装入TL0和TH0中。当TL0计满溢出时,置位TF0,同时把保存在预置寄存器TH0中的计数初值自动加载TL0,然后TL0重新计数。如此重复不止。这不但省去了用户程序中的重装初值指令,而且也有利于提高定时精度。但这种工作方式下是8位计数结构,计数值有限,最大只能到255。这种自动重新加载工作方式非常适用于循环定时或循环计数应用,例如用于产生固定脉宽的脉冲,此外还可以作串行数据通信的波特率发送器使用。
图5-7 方式3的逻辑结构
4.工作方式3
当M1、M0设置为11时,定时/计数器T0设定为工作方式3,结构如图5-7所示。工作方式3只适用于定时器T0。如果使定时器T1为工作方式3,则定时器T1将处于关闭状态。当T0为工作方式3时,TH0和TL0分成2个独立的8位计数器。其中,TL0既可用作定时器,又可用作计数器,并使用原T0的所有控制位及其定时器溢出标志和中断源。TH0只能用作定时器,并使用T1的控制位TRl、溢出标志TFl和中断源。
通常情况下,T0不运行于工作方式3,只有在T1处于工作方式2并且不要求中断的条件下才可能使用。这时,T1往往用作串行口波特率发生器,TH0用作定时器,TL0作为定时器或计数器。所以,方式3是为了使单片机有1个独立的定时器/计数器、1个定时器以及1个串行口波特率发生器的特定应用场合而提供的。这时,可把定时器T1设置为工作方式2,把定时器T0设置为工作方式3。