理论教育 MCS-51单片机定时器/计数器结构及控制

MCS-51单片机定时器/计数器结构及控制

时间:2023-11-05 理论教育 版权反馈
【摘要】:由图可知,MCS-51定时器/计数器系统由定时器/计数器T0、定时器/计数器T1、定时器方式寄存器TMOD和定时器控制寄存器TCON组成。

MCS-51单片机定时器/计数器结构及控制

1.定时器/计数器的结构和工作原理

(1)定时器/计数器的结构

MCS-51系列单片机片内有两个16位可编程定时器/计数器,分别称为定时器/计数器T0和定时器/计数器T1。其逻辑结构如图5-8所示。

由图可知,MCS-51定时器/计数器系统由定时器/计数器T0、定时器/计数器T1、定时器方式寄存器TMOD和定时器控制寄存器TCON组成。定时器/计数器T0由TH0和TL0组成,TH0、TL0分别是定时器/计数器T0的高8位和低8位;定时器/计数器T1由TH1和TL1组成,TH1、TL1分别是定时器/计数器T1的高8位和低8位。TH0、TL0、TH1、TL1都是特殊功能寄存器。

图5-8 MCS-51定时器/计数器逻辑结构图

(2)定时器/计数器的工作原理

定时器/计数器T0和T1的核心是16位加“1”计数器,对计数器每输入一个脉冲,计数器加“1”,当加到计数器全为“1”时,向CPU发出中断请求。此外,定时器/计数器T0或T1即可作为计数器使用又可作为定时器使用,区别仅在于计数脉冲的来源不同。具体如下:

1)计数器工作方式。当定时器/计数器作为计数器使用时,对来自引脚T0(P3.4)和引脚T1(P3.5)的外部脉冲计数(即这时引脚T0和引脚T1分别作为两个计数器的计数脉冲输入端),外部脉冲的负跳变有效。每输入一个脉冲,加法计数器增加1,加法计数溢出时可向CPU发出中断请求信号。

计数方式下,CPU在每个机器周期的S5P2期间采样外部计数脉冲。若前一个机器周期采样值为电平,后一个机器周期采样值为低电平,即为一个有效的计数脉冲。在下一个机器周期的S3P1期间进行计数。可见,检测一个由高电平到低电平的负跳变需要两个机器周期。所以,计数脉冲最高频率为振荡脉冲频率的img计数器对外部输入信号的占空比没有特别的限制,但必须保证输入信号的高电平与低电平的持续时间在一个机器周期以上。

2)定时器工作方式。当定时器/计数器作为定时器使用时,其定时功能也是通过计数来实现的,不过此时是对内部机器周期计数,每过一个机器周期,计数器加1,直至计满溢出。由于一个机器周期等于12个振荡脉冲周期,因此计数频率为振荡频率的img如果单片机系统采用12MHz晶振,则计数频率为1MHz,即定时周期为1s。这样不但可以根据计数值计算出定时时间,也可以反过来按定时时间的要求计算出计数器的初值。

2.定时器/计数器的控制

MCS-51单片机定时器/计数器的控制与实现由两个特殊功能寄存器定时器/计数器工作方式寄存器TMOD和定时器/计数器控制寄存器TCON完成。TMOD用于设置定时器/计数器的工作方式;TCON用于控制定时器/计数器启动和中断申请。

(1)定时器/计数器工作方式寄存器TMOD

定时器/计数器T0、T1都有四种工作方式,可通过程序对TMOD设置来选择。TMOD字节地址为89H,它的低4位为定时器/计数器T0的工作方式控制字段,高4位为定时器/计数器T1的工作方式控制字段,它们的含义完全相同,其格式见表5-7。

表5-7 定时器/计数器工作方式寄存器TMOD

其各位含义如下:

1)M1、M0:定时器/计数器工作方式选择位,其值与工作方式对应关系见表5-8。

表5-8 工作 方 式 选 择

2)img定时或计数功能选择位。

img时为计数器方式。

img时为定时器方式。

3)GATE:门控位,用于控制定时器/计数器的启动是否受外部中断请求信号的影响。

当GATE=0时,定时器/计数器的启动不受外部中断请求信号的影响,通过软件控制TR0或TR1位来启动和停止定时器。

当GATE=1时,定时器/计数器的启动受外部中断请求信号的影响,除了用软件置1 TR0位或TR1位外,同时还需imgimg为高电平方可启动定时器。

TMOD不能位寻址,只能用字节指令设置高4位定义定时器1,低4位定义定时器0定时器工作方式。复位时,TMOD所有位均置0。

(2)定时器/计数器控制寄存器TCON

定时器/计数器控制寄存器TCON的作用是控制定时器的启动、停止,标志定时器的溢出和中断情况,其字节地址是88H,可以进行位寻址。TCON的格式见表5-9。

表5-9 定时器/计数器控制寄存器TCON

TCON的各位含义如下:

1)TR1:定时器/计数器T1运行控制位,由软件置1或清0来启动或关闭定时器/计数器T1。

当GATE=1,且img为高电平时:TR1=1启动定时器/计数器T1;TR1=0停止定时器/计数器T1。

当GATE=0时:TR1=1启动定时器/计数器T1;TR1=0停止定时器/计数器T1。

2)TR0:定时器/计数器T0运行控制位,由软件置1或清0来启动或关闭定时器/计数器T0。

当GATE=1,且img为高电平时:TR0=1启动定时器/计数器T0;TR0=0停止定时器/计数器T0。

当GATE=0时:TR0=1启动定时器/计数器T1;TCON中其余的位在前面已经介绍过了,这里不再重述。

3.定时器/计数器的4种工作方式

MCS-51单片机的定时器/计数器有4种工作方式(方式0、1、2、3),通过对TMOD寄存器中M0、M1位进行设置,可对这4种工作方式进行选择,下面逐一进行论述。

(1)方式0

当TMOD的M1 M0为00时,定时器/计数器工作在方式0,图5-9是定时器/计数器T0在方式0时的逻辑电路结构,定时器/计数器T1的结构和操作与定时器/计数器T0完全相同。

图5-9 定时器/计数器T0在方式0时的逻辑电路结构图

方式0为13位计数,TH0占高8位,TL0占低5位(只用低5位,高3位未用)。图5-9中OSC是Oscillator(振荡器)的缩写。如图5-9所示,当img时,多路开关接通振荡脉冲的12分频输出,13位计数器以此进行计数,这就是定时器工作方式。当C/T=1时,多路开关接通计数引脚T0,外部计数脉冲由引脚T0输入。当计数脉冲发生负跳变时,计数器加1,这就是所谓计数工作方式。但无论哪种工作方式,当TL0低5位溢出时自动向TH0进位,而TH0溢出时置位TCON中的TF0标志位,向CPU发出中断申请。

(2)方式1

当TMOD的M1、M0为01时,定时器/计数器工作在方式1,图5-10是定时器/计数器T0在方式1时的逻辑电路结构,定时器/计数器T1的结构和操作与定时器/计数器T0完全相同。

图5-10 定时器/计数器T0在方式1时的逻辑电路结构图

方式1构成一个16位定时器/计数器,由TL0作为低8位、TH0作为高8位,其结构与操作几乎完全与方式0相同,唯一差别是二者计数位数不同。

作为计数器时计数个数M与计数初值N的关系为

M=216-N

作为定时器时定时时间t与计数个数M和计数初值N的关系为

t=M×机器周期=M×时钟周期×12=(216-N)×时钟周期×12

则如果晶振为12MHz,机器周期为1μs,初值的取值范围为0~65535,则定时范围为1μs~65.536ms。

(3)方式2

当TMOD的M1、M0为10时,定时器/计数器工作在方式2,定时器/计数器T0在方式2时的逻辑电路结构图如图5-11所示。

方式0和方式1的最大特点是计数溢出后,计数器全为0。因此在循环定时或计数应用时就存在反复装入计数初值的问题。这不仅影响定时精度,而且也给程序设计带来麻烦。方式2就是针对此问题而设置的。

方式2为自动重装初值的8位计数方式。TL0作为8位定时器/计数器使用,TH0作为8位初值寄存器保持不变。当TL0计满溢出时,由硬件置“1”TF0位,向CPU发出中断请求,同时自动地将TH0中的计数初值送入TL0。TL0从初值重新进行加“1”计数。周而复始,直至TR0=0才会停止。

作为计数器时计数个数M与计数初值N的关系为

图5-11 定时器/计数器T0在方式2时的逻辑电路结构图

M=28-N

初值N的范围是0~255,计数范围为1~256。

作为定时器时定时时间t与计数个数M和计数初值N的关系为

t=M×机器周期=M×时钟周期×12=(28-N)×时钟周期×12

则如果晶振为12MHz,机器周期为1μs,初值的取值范围为0~255,则定时范围1μs~256μs。(www.daowen.com)

由于工作方式2省去了用户软件中重新装入常数的程序,故方式2特别适合于用较精确的脉冲信号发生器或者异步串行通信中串行口的波特率发生器。

(4)方式3

当TMOD的M1、M0为11时,定时器/计数器工作在方式3,定时器/计数器T0在方式3时的逻辑电路结构图如图5-12所示。

图5-12 定时器/计数器T0在方式3时的逻辑电路结构图

当定时器/计数器工作在方式3时,定时器T0被分解成两个独立的8位计数器TL0和TH0。此时:

TL0占用原定时器T0的控制位、引脚和中断源,即C/T、GATE、TR0、TF0位和T0(P3.4)引脚、img引脚。除计数位数不同于方式0、方式1外,其功能、操作与方式0、方式1完全相同,可定时亦可计数。

TH0占用原定时器/计数器T1的控制位TF1和TR1,同时还占用了定时器T1的中断源TF1,其启动和关闭仅受TR1置1或清0控制。TH0只能对机器周期进行计数,因此,TH0只能用作8位定时器使用,不能用作对外部脉冲进行计数。

定时器T1仍可设置为方式0、方式1或方式2。但由于TR1、TF1及T1的中断源已被定时器T0占用,此时,定时器T1仅由控制位img切换其定时或计数功能,当计数器计满溢出时,只能将输出送往串行口。在这种情况下,定时器T1一般用作串行口波特率发生器或不需要中断的场合。因定时器T1的TR1被占用,因此其启动和关闭较为特殊,当设置好工作方式时,定时器T1即自动开始运行。若要停止操作,只需送入一个设置定时器T1为方式3的方式字即可。

4.定时器/计数器编程和应用

MCS-51单片机的定时、计数器通常工作于中断场合,可遵循以下几个方面进行应用设计。

1)计算定时器/计数器的初值。

2)在主程序中进行初始化设计。包括定时/计数器的初始化和中断初始化,即对TH0、TL0或TH1、TL1、TMOD、TCON、IP、IE赋值

3)中断服务程序设计

【例5-4】 利用定时器/计数器T0的方式1,产生一个50Hz的方波,此方波由P1.0引脚输出,晶振频率为12MHz。

解 解题思路如下:

方波频率f=50Hz,如果让定时器计满0.01s,P1.0输出“0”,再计满0.01s,P1.0输出“1”,就能满足要求。所以此题转化为由T0产生0.01s定时的问题。

实现方法如下:

1)查询方式:通过查询T0的溢出标志TF0是否为“1”,判断定时时间是否已到。当TF0=1时,定时时间已到,对P1.0取反操作。其缺点是,CPU一直在忙于查询工作,占用了CPU的有效时间。

2)中断方式:CPU正常执行主程序,一旦定时时间到,TF0=1向CPU申请中断,CPU响应了T0的中断,就执行中断程序,在中断程序中对P1.0取反操作。

解题步骤如下:

1)确定定时器初值N。

由于晶振12MHz,所以1个机器周期 Tcy=12×1/12×106=1(μs)

计数值

M=t/Tcy=10×10-3/1×10-6=10000

N=216-M=65536-10000=55536=D8F0 H

即应将D8H送入TH0中,F0H送入TL0中。

2)求T0的方式控制字TMOD。

GATE=0,imgM1M0=01可取方式控制字为TMOD=01H,即T0工作于方式1。

①查询方式实现

②中断方式实现

【例5-5】 假设系统时钟为6MHz,编程完成当T0(P3.4)引脚上发生负跳变时,从P1.0引脚上输出1个周期为1ms的方波。

解 解题思路如下:

T0定义为方式1计数器模式,T0初值为0FFFFH,即外部计数输入端T0(P3.4)发生1次负跳变时,计数器T0加1且溢出,溢出标志TF0置1,向CPU发出中断请求。在进入T0中断程序后,把F0标志置1,说明T0引脚上已接收了负跳变信号。T1定义为方式2定时器模式。在T0引脚产生1次负跳变后,启动T1每500μs产生1次中断,在中断服务程序对P1.0引脚信号求反,使P1.0产生周期为1ms的方波。

解题步骤如下:

1)计算T1的初值。

设T1的初值为X:

则(28-X)×2×10-6=5×10-4

X=28-250=6=06H

2)程序设计。

在T1定时中断服务程序IT1P中,由于方式2下初值是自动重新装载的,省去了T1中断服务程序中重新装入初值06 H的指令。

【例5-6】 利用定时器T1的方式2对外部信号计数,要求每计满100个数,将P1.0引脚信号取反。

本例是方式2计数模式的应用举例。

解 解题思路如下:

外部信号由T1(P3.5)引脚输入,每发生1次负跳变计数器加1,每输入100个脉冲,计数器产生溢出中断,在中断服务程序中将P1.0引脚信号取反1次。

T1工作在方式2的方式控制字为TMOD=60 H。不使用T0时,TMOD的低4位可任取,但不能使T0进入方式3,这里取全0。

解题步骤如下:

1)计算T1的初值。

X=28-100=156=9CH

因此TL1的初值为9CH,重装初值寄存器TH1=9CH

2)程序设计。

【例5-7】 设8051时钟频率为12MHz,请编出利用定时器、计数器T0在P1.0引脚上输出2s方波的程序。

解 解题思路如下:

欲产生周期为2s的方波,定时器T0必须能定时1s,这个值显然已超过了定时器的最大定时时间。为此,只有采用定时器和软件计数器相结合的方法才能解决问题。例如,可以在主程序中设定一个初值为20的软件计数器R0并使T0定时50ms。这样,每当T0定时到50ms时CPU就响应它的溢出中断请求,从而进入它的中断服务程序。在中断服务程序中,CPU先使软件计数器减1,然后判断它是否为零。若它为零,则表示定时1s已到,便可恢复软件计数器初值并改变P1.0引脚上的电平,然后返回主程序;若它不为零,则表示定时1s未到,也返回主程序。如此重复上述过程,便可在P1.0引脚上观察到周期为2s的方波。

程序设计如下:

本程序有主程序和中断服务程序两部分组成。

主程序包括对8051内部定时器T0的初始化和设定软件计数器初值等。由于需要定时50ms,故定时器T0必须工作于方式1。T0的定时初值为:

TC=M-T/T计数=226-50ms/1μs=155326=3CB0 H

主程序

中断服务程序

应当指出:CPU从响应T0中断到完成定时器初值重装这段时间,定时器T0并不停止工作,而是继续计数。因此,为了确保T0能准确定时50ms,重装的定时器初值必须加以修正,修正的定时器初值必须考虑到从原定时器初值中扣除计数器多计的脉冲个数。由于定时及计数脉冲的周期恰好和机器周期吻合,因此修正量等于CPU从响应中断到重装完TL0为止所用的机器周期数。CPU响应中断通常需要3~8个机器周期,因为无法预知CPU响应中断时正在执行哪一类指令,故通常以4~5个机器周期计算。中断响应结束到重装完TL0为止这段时间是可以知道的,本例中有3条指令,共需6个机器周期。所以,中断服务程序中定时器初值可以修正为3CBAH或3CBBH。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈