跳转至

第6章 定时器/计数器

第六章 定时器/计数器

结构/工作方式

MCS-51系列单片机有2个16位定时/计数器T0和T1,分别有8位计数器TH0、TL0和TH1、TL1构成各自的16位计数器

都是以加"1"的方式完成计数

特殊功能寄存器TMOD控制定时/计数器的工作方式

TCON控制定时/计数器的启动运行并记录T0、T1的溢出标志

通过对TH0、TL0和TH1、TL1的初始化编程可以预置T0、T1的计数初值

通过对TMOD和TCON的初始化编程可以分别置入方式字和控制字,以指定其工作方式并控制T0、T1按规定的工作方式计数

定时器工作原理

当设置为定时器工作方式时,计数输入信号来自内部振荡信号,在每个机器周期内定时器的计数器做一次“+1”运算

每个机器周期等于12个振荡脉冲,故定时器的计数速率为振荡周期的1/12(即12分频)——若单片机的晶振主频为12MHz,则计数周期为1us

当定时器的计数器“+1”产生溢出时,标志着定时时间到

计数器工作原理

当设置为计数器工作方式时,计数输入信号来自外部引脚T0(P3.4)、T1(P3.5)的脉冲

外部每输入一个脉冲,计数器TH0、TL0(或TH1、TL1)“+1”

计数器由计数脉冲的下降沿触发——即CPU在每个机器周期的S5P2对外部输入引脚T0(或T1)采样,若在一个机器周期中采样值为高电平,而在下一个机器周期中采样值为低电平,则紧跟着的再下一个机器周期的S3P1期间计数值就“+1”,完成一次计数操作。因此确认一次外部输入脉冲的有效跳变至少要花费2个机器周期,即24个振荡周期,所以最高计数频率为振荡频率的1/24

为了确保计数脉冲不被丢失,脉冲的高电平及低电平应保持一个机器周期以上

方式寄存器TMOD

定时/计数器的方式寄存器,是一可编程的特殊功能寄存器,字节地址为89H,不可位寻址

前四位控制定时器/计数器T1,后四位控制定时器/计数器T0

GATE:门控位。当GATE=1时,计数器受外部信号\(\overline{INTx}\) 控制,当运行控制位TR0(或TR1)为“1”且\(\overline{INTx}\)为高电平时开始计数,否则停止计数

\(C/\overline{T}\):计数器方式还是定时器方式选择位。当\(C/\overline{T}=0\)时为定时器方式,其计数器输入为晶振的12分频,即对机器周期计数;当\(C/\overline{T}=1\)时为计数器方式,计数器的触发输入来自T0(P3.4)或T1(P3.5)端输入的外部脉冲。

M1和M0:操作方式选择位

单片机复位时,TMOD各位均为“0”

四种工作方式

方式0

13位计数器

TL的低5位(TL的高3位未用)和TH的高8位构成13位计数器(对T0、T1都适用)

方式1

当编程使方式寄存器TMOD中 M1M0 = 01时,计数器按16位工作TL、TH全部使用,构成16位计数器。

其它控制与操作方式与方式0完全相同

方式2

当编程使方式寄存器TMOD中 M1M0 = 10时,定时/计数器就变为可自动装载计数初值的8位计数器

在这种方式下,TL1(或TL0)被当做8位计数器,TH1(或TH0)被定义为赋值寄存器(存储计数器的初值)

当TLx计数溢出时,除了产生中断信号TFx外,还自动将THx的值装载到TLx,并继续进行计数

方式3

当编程使方式寄存器TMOD中 M1M0 = 11时,内部控制逻辑把T0的TL0和TH0配置成2个相互独立的8位计数器

TL0使用T0本身的一些控制位和控制信号,可作为计数器和定时器

TH0借用T1相关的一些控制位(TR1和TF1),只可用作定时器

T1此时只能用在不要中断控制的情况下,如串行口的波特率发生器

方式3只适合于定时/计数器T0,使其增加一个8位定时器;若定时器T1选择方式3,T1将停止工作,相当于TR1=0的情况;当定时器T0选择为方式3工作时,定时器T1仍可工作在方式0、方式1、方式2,用在不需要中断控制的场合。

控制寄存器TCON

定时/计数器的控制寄存器也是一个8位特殊功能寄存器,字节地址为88H,可以位寻址,位地址88~8FH,用来存放控制字

TF1(TCON.7,timer-flag):T1溢出标志。当T1产生溢出时,由硬件置“1”,可向CPU发中断请求,响应中断后被硬件自动清“0”。

TR1(TCON.6,timer-run):T1运行控制位。由软件置“1”或置“0”来启动或关闭T1工作,因而又称启/停控制位。

TF0(TCON.5):T0溢出标志(类同TF1)。

TR0(TCON.4):T0运行控制位(类同TR1)。

低四位与中断相关

复位后,TCON的各位均被清“0”

定时/计数器的初始化

由于定时/计数器是可编程的,因此在定时或计数之前要用程序进行初始化,初始化一般有以下几个步骤:

确定工作方式——对方式寄存器TMOD赋值

预置定时或计数初值,直接将初值写入TL0、TH0或TL1、TH1中

根据需要对中断允许寄存器有关位赋值,以开放或禁止定时/计数器中断(ET0、ET1、ET2、EA)

启动定时/计数器,将TCON中的TR0或TR1置“1”,计数器即按确定的工作方式和初值开始计数或定时

计算方法