C51单片机高效入门(第2版)
上QQ阅读APP看书,第一时间看更新

2.4 定时/计数器

2.4.1 定时/计数器概述

定时/计数器是单片机系统的一个重要部件,可以用来实现定时控制、频率测量、脉宽测量、信号发生等。此外,定时/计数器还可以用来作为串行通信中的波特率发生器。

在MCS-51单片机中采用加法计数器,先设置计数器的初值,然后对计数脉冲每次加一,加到计数器溢出为止。这就是所谓的加法计数器。

定时/计数器有定时和计数两大功能,但归根到底是一个计数器。对外部事件脉冲计数是计数器,对片内机器周期脉冲计数是定时器。在日常生活中也常用到定时的概念,如将时钟定时到1min,那么秒钟计时到60后就到了1min的定时。单片机内部工作原理也类似。

2.4.2 定时/计数器结构

MCS-51单片机内部设置两个16位可编程的定时/计数器T0和T1,其结构如图2-8所示,它们具有计数器方式和定时器方式以及4种工作模式。其状态字均在相应的特殊功能寄存器中,通过对控制寄存器的编程,可以方便地选择适当的工作模式。对每个定时/计数器,在特殊功能寄存器TMOD中都有一个控制位,它选择T0及T1为定时器或计数器。定时器T0由特性功能寄存器TL0(低8位)和TH0(高8位)构成,定时器T1由特性功能寄存器TL1(低8位)和TH1(高8位)构成。特殊功能寄存器TMOD控制定时寄存器的工作方式,TCON则用于控制定时器T0和T1的启动和停止计数,同时管理定时器T0和T1的溢出标志等。程序开始时需对TL0、TH0、TL1和TH1进行初始化编程,以定义它们的工作方式

978-7-111-30335-0-Chapter02-12.jpg

图2-8 MCS-51内部定时/计数器结构

和控制T0和T1的计数。系统复位时,寄存器的所有位都被清零。

2.4.3 定时/计数器控制寄存器

在单片机中有两个特殊功能寄存器与定时/计数器有关,其编程操作通过两个特殊功能寄存器TMOD和TCON的状态设置来实现。特殊功能寄存器TMOD控制定时器的工作方式,TCON控制其运行,TCON还包含T0和T1的溢出标志。

1.定时/计数器控制寄存器TCON

TCON的字节地址为88H,每一位有位地址,均可位操作。TCON寄存器已在中断系统中介绍过,它的低4位只与中断有关,此处不再重复,高4位与定时/计数器有关。TCON的结构和各位名称、功能见表2-1。

表2-1 TCON结构

978-7-111-30335-0-Chapter02-13.jpg

TF1:定时/计数器T1溢出标志。当T1被允许计数后,T1从初值开始加1计数,至最高位产生溢出时,TF置“1”,既表示计数器溢出又表示请求中断。CPU响应中断后由硬件自动对TF1清零。

TR1:定时/计数器T1运行控制位。靠软件置位或清除,当TR1=1时启动T1运行,TR1=0时则T1停止运行。

TF0:定时/计数器T0溢出标志。其意义与TF1相似。

TR0:定时/计数器T0运行控制位。其意义与TR1相似。

2.定时/计数器工作方式寄存器TMOD[1]

TMOD用于设定定时/计数器的工作方式和工作模式。低4位用于T0,高4位用于T1,TMOD的结构和各位名称、功能见表2-2。

表2-2 TMOD寄存器结构

978-7-111-30335-0-Chapter02-14.jpg

M1M0:工作方式选择位,两位二进制位可表示4种状态,具体功能见表2-3。

表2-3 工作方式选择

978-7-111-30335-0-Chapter02-15.jpg

978-7-111-30335-0-Chapter02-16.jpg:计数/定时方式选择位。

978-7-111-30335-0-Chapter02-17.jpg=1时为计数方式,对外部事件脉冲计数,负跳变脉冲有效。

978-7-111-30335-0-Chapter02-18.jpg=0时为定时工作方式,对片内机器周期脉冲计数,用作定时器。

GATE:门控位。

GATE=0时定时/计数器的运行只受TCON中运行控制位TR的控制。

GATE=1时定时/计数器的运行同时受TR和外中断输入信号的双重控制。

2.4.4 定时/计数器的工作方式

在TMOD控制寄存器中可知对M1M0的不同设置可选择4种不同工作方式,下面以T0为例分别对这4种工作方式作一介绍。

1.工作方式0

定时/计数器0的工作方式0的电路逻辑结构如图2-9所示(定时/计数器1与其完全一致)。工作方式0是13位计数结构的工作方式,其计数器由TH的全部8位和TL的低5位构成,TL的高3位没有使用。当C/T=0时,多路开关接通振荡脉冲的12分频输出,13位计数器依次进行计数。这就是定时工作方式。当C/T=1时,多路开关接通计数引脚(T0),外部计数脉冲由引脚T0输入。当计数脉冲发生负跳变时,计数器加1,这就是我们常说的计数工作方式。

978-7-111-30335-0-Chapter02-19.jpg

图2-9 工作方式0

不管是哪种工作方式,当TL的低5位溢出时,都会向TH进位,而全部13位计数器溢出时,则会向计数器溢出标志位TF0进位。

如上所述,TF0是定时/计数器的溢出状态标志,溢出时由硬件置位,TF0溢出中断被CPU响应时,转入中断时硬件清零,TF0也可由程序查询和清零。

2.工作方式1

当M1M0=01时,定时/计数器处于工作方式1,此时,定时/计数器的等效电路如图2-10所示。

方式0和方式1的区别仅在于计数器的位数不同,方式0为13位,而方式1则为16位,由TH0作为高8位,TL0为低8位,有关控制状态字(GATA、C/T、TF0、TR0)和方式0相同。

3.工作方式2

当M1M0=10时,定时/计数器处于工作方式2。此时定时器的等效电路如图2-11所示。定时/计数器1与之完全一致。

978-7-111-30335-0-Chapter02-20.jpg

图2-11 工作方式2

工作方式0和工作方式1的最大特点就是计数溢出后,计数器为全0,因而循环定时或循环计数应用时就存在反复设置初值的问题,这给程序设计带来许多不便,同时也会影响计时精度。工作方式2就针对这个问题而设置,它具有自动重装载功能,即自动加载计数初值,所以也有的文献称之为自动重加载工作方式。在这种工作方式中,16位计数器分为两部分,即以TL0为计数器,以TH0作为预置寄存器,初始化时把计数初值分别加载至TL0和TH0中,当计数溢出时,不再像方式0和方式1那样需要“人工重复加载",由软件重新赋值,而是由预置寄存器TH以硬件方式自动给计数器TL0重新加载。

程序初始化时,给TL0和TH0同时赋以初值,当TL0计数溢出时,置位TF0的同时把预置寄存器TH0中的初值加载给TL0,TL0重新计数。如此反复,这样省去了程序不断需给计数器赋值的麻烦,而且计数准确度也提高了。但这种方式也有其不利的一面,即计数结构只有8位,计数值有限,最大只能到255。所以这种工作方式很适合于那些重复计数的应用场合。例如我们可以通过这样的计数方式产生中断,从而产生一个固定频率的脉冲。也可以当作串行数据通信的波特率发送器使用。

4.工作方式3

当M1M0=11时,定时/计数器处于工作方式3。此时定时/计数器的等效电路如图2-12所示。仍以定时器0为例,值得注意的是,在工作方式3模式下,定时/计数器1的工作方式与之不同。

在工作方式3模式下,定时/计数器0被拆成两个独立的8位计数器TL0和TH0。其中TL0既可以作计数器使用,也可以作为定时器使用,定时/计数器0的各控制位和引脚信号全归它使用。其功能和操作与方式0或方式1完全相同。但TH0就只能作为简单的定时器使用,而且由于定时/计数器0的控制位已被TL0占用,因此只能借用定时/计数器1的控制位TR1和TF1,也就是以计数溢出去置位TF1,TR1则负责控制TH0定时的启动和停止。由于TL0既能作定时器也能作计数器使用,TH0只能作定时器使用而不能作计数器使用,因此在方式3模式下,定时/计数器0可以构成两个定时器或者一个定时器和一个计数器。

978-7-111-30335-0-Chapter02-21.jpg

图2-12 工作方式3

2.4.5 定时/计数器的应用

1.定时/计数器初始化

定时/计数器初始化过程如下:

1)根据要求给方式寄存器TMOD送一个方式控制字,以设定定时器响应的工作方式;

2)根据需要给C/T选送初值,以确定需要的定时时间或计数的初值;

3)根据需要给中断允许寄存器IE送中断控制字,以开放相应的中断和设定中断优先级;

4)给TCON送命令字,以启动或禁止C/T运行。

2.定时/计数器初值的计算

MCS-51单片机定时/计数器初值计算公式为

T(初值)=2N-定时时间/机器周期时间

式中,N与工作方式有关。方式0时,N=13;方式1时,N=16;方式2和3时,N=8。机器周期时间=12/fosc

【例2-1】已知晶振为12MHz时,求定时0.2ms时,T0工作方式0、方式1、方式2、方式3时的定时初值。

(1)工作方式0

213-200/1=8192-200=7992=1F38H。

1F38化成二进制:1F38=0001 1111 0011 1000 B

则低5位送TL0为18H,高8位送TH0为F9H。

(2)工作方式1

216-200/1=65536-200=65336=FF38H。即TH0=FFH,TL0=38H。

(3)工作方式2

28-200/1=256-200=56=38H。即TH0=38H,TL0=38H。

(4)工作方式3

方式3与方式2初值一样为TH0=TL0=38H。

2.4.6 定时器的应用

设单片机系统时钟频率为12MHz,要求在P0.0的LED定时50ms循环亮灭。硬件原理如图2-13所示。

978-7-111-30335-0-Chapter02-22.jpg

图2-13 硬件原理

程序设计:

定时器初值计算:T0初值=216-50000μs/1μs=65536-50000=15536=3CB0H,则

TH0=3CH,TL0=B0H。在C语言中对定时器初始化还可以用更简单的方法,即直接用减

初值的方法,如定时50ms在语句中可以写成

978-7-111-30335-0-Chapter02-23.jpg

完整程序如下:

978-7-111-30335-0-Chapter02-24.jpg

978-7-111-30335-0-Chapter02-25.jpg