资源描述
第五章MCS-51定时器/计数器及其应用
5.1定时方法概述
在单片机的应用中,可供选择的定时方法主要有:
1.软件定时
软件定时是靠执行一个循环程序以进行时间延迟。软件定时的特点是时间较精确,且不需外加硬件电路。但软件定时要占用CPU的时间,增加CPU开销,因此软件定时的时间不宜太长。
当单片机时钟确定后,每条指令的指令周期是确定的,在指令表中用振荡周期表示出来了。因此,根据程序执行所用的总的振荡周期数和振荡频率,可以较准确的计算,程序执行完所用的时间。软件延时是实际经常采用的一种短时间定时方法。
例4-16 ORG 1000H
TIME: MOV R1, #0FAH ;12个振荡周期
L1 : MOV R0, #0FFH ;12个振荡周期
W1 : DJNZ R0 , W1 ;24个振荡周期
DJNZ R1 , L1 ; 24个振荡周期
NOP ; 12个振荡周期
NOP ; 12个振荡周期
RET ; 24个振荡周期
计算延时时间:
N=12+(12+24×255+24)×250+12+12+24
=1539060个振荡周期
如果ƒ=6MHz Tƒ=1/ƒ=1/6μs
Tt=N×Tƒ=1539060×1/6μS=256510μS=0.25651S
调整R0和R1中的参数,可改变延时时间,如果需要加长延时间,可以增加循环嵌入。当延时时间较长、不便多占用CPU时间的情况下,一般采用定时器方法。
2.内部可编程定时器
这种定时方法是通过对系统时钟脉冲的计数来实现的。计数值通过程序设定,改变计数值,也就改变了定时时间,使用起来既灵活又方便。此外,由于采用计数方法实现定时,因此可编程定时器都兼有计数功能,可以对外来脉冲进行计数。
3.外部扩展专用定时器
对于时间较长的定时,常使用外部扩展专用定时器完成。这种方法定时全部由硬件电路完成,不占用CPU时间。例如:DALLAS 公司的DS1302低功耗时钟芯片.它可以对年月日时分秒计时,并且有闰年补偿功能,它可以很方便地和单片机接口.
5.2 51单片机内部的定时器/计数器
作为基本组成内容,8051单片机共有两个可编程的定时器/计数器,分别称定时器/计数器0和定时器/计数器1。它们都是十六位加法计数结构,分别由TH0和TL0及TH1和TL1两个8位计数器组成,它们具有计数和定时两种工作方式以及四种工作模式。两个特殊功能寄存器(定时器控制寄存器TCON和定时器方式寄存器TMOD)用于确定定时器/计数器的功能和操作方式。图5-1给出了定时器/计数器的结构框图,它反映了单片机中微处理器、寄存器TCON和TMOD与定时器T0、T1之间的关系。计数器的输入脉冲源可以是外部脉冲源或系统时钟振荡器,计数器对这两个输入脉冲之一进行递增计数。
顾名思义,MCS-51的每个定时器/计数器都具有定时和计数两种功能。
图5-1 定时器/计数器的结构框图
1.计数功能
所谓计数是指对外部事件进行计数。外部事件的发生以输入脉冲表示,因此计数功能的实质就是对外来脉冲进行计数。8051芯片有T。(P3.4)和T1(P3.5)两个信号引脚,分别是这两个计数器的计数输入端,外部输入的脉冲在负跳变时有效,进行计数器加1(加法计数)。
计数方式下,单片机在每个机器周期的S5P2拍节对外部计数脉冲进行采样。如果前一个机器周期采样为高电平,后一个机器周期采样为低电平,即为一个有效的计数脉冲。在下一机器周期的S3P1进行计数。可见采样计数脉冲是在二个机器周期进行的。鉴于此,计数脉冲的频率不能高于振荡脉冲频率的1/24。
2.定时功能
定时功能也是通过计数器的计数来实现的,不过这时的计数脉冲来自单片机的内部,即每个机器周期产生一个计数脉冲。也就是每个机器周期计数器加1。由于一个机器周期等于12个振荡脉冲周期,因此计数频率为振荡频率的1/12。如果单片机采用12MHZ晶体,则计数频率为1MHz。即每微秒计数器加1。这样不但可以根据计数值计算出定时时间,也可以反过来按定时时间的要求计算出计数器的预置值。
5.3 定时器/计数器的控制寄存器
与定时器/控制器有关的控制寄存器有:
1.定时器控制寄存器(TCON)
TCON寄存器既参与中断控制又参与定时控制。有关中断的控制内容已在第六章中说明,此处只对其定时控制功能加以介绍。其中有关定时的控制位共有四位:
·TF0(TF1)--计数溢出标志位
当计数器从初值开始递增计数至计数溢出(计满)时,由单片机内部(硬件)自动对该位置1。使用查询方式时,此位作状态位供查询,但应注意查询有效后应以软件方法及时将该位清0;使用中断方式时,此位作中断标志位,在转向中断服务程序时,自动(硬件)清0。
·TR0(TR1)--定时器运行控制位
定时器T0(T1)的运行控制位
该位根据需要以软件方法使其置1或清0,用来启动/关闭定时器T0(T1)。
2.工作方式控制寄存器(TMOD)
TMOD寄存器是一个专用寄存器,用于控制两个定时器/计数器的工作方式。但TMOD寄存器不能位寻址,只能用字节传送指令设置其内容。各位定义如下:
位序
D7
D6
D5
D4
D3
D2
D1
D0
位符号
GATE
C/T
M1
M0
GATE
C/T
M1
M0
其中:高4位字段用于定时器T1的工作方式控制,低4位字段用于定时器T0的工作方式控制。TMOD各位的定义和功能如下:
·GATE--门控位
GATE=0以运行控制位TR0(TR1)启动定时器
GATE=l以外中断请求信号(INT0、INT1)启动定时器
以上说明:GATE为1时,定时器/计数器的计数受外部引脚输入电平的控制,具体来讲,INT0控制T0运行,INT1控制T1运行。GATE为0时,定时器/计数器的运行不受外部输入引脚的控制。因此,通常称前者为外部控制,后者为内部控制。
·C/T--定时方式或计数方式选择位
C/T=0定时工作方式,计数脉冲是内部脉冲,其周期等于机器周期。
C/T=1计数工作方式,计数脉冲是从引脚T0或T1输入。
·M1M0—工作方式选择位
M1M0=00 方式0
M1M0=01 方式1
MlM0=10 方式2
M1M0=11 方式3
3.中断允许寄存器(IE)
IE寄存器的详细内容请见第六章。其中与定时器/计数器有关的位重复介绍如下。
·EA--中断允许总控制位
·ET。(ET1)--定时/计数中断允许控制位
ET。(ET1)=0禁止定时/计数中断
ET。(ET1)=1允许定时/计数中断
5.4 MCS-51的定时器/计数器工作方式
MCS-51的定时器/计数器共有四种工作方式,现从方式0开始逐个介绍。
5.4.1定时器/计数器工作方式0
1.电路逻辑结构
方式0是13位计数结构的工作方式,其计数器由TH0全部8位和TL0的低5位构成。TL0的高3位弃之不用。图5-2是定时器/计数器0在工作方式0的逻辑结构(定时器/计数器1与此完全相同)。
图5-2 定时器/计数器工作方式0逻辑结构
如图所示,当C/T=0时,多路开关接通振荡脉冲的十二分频输出,13位计数器以此进行计数,这就是所谓定时器工作方式。当C/T=1时,多路开关接通计数引脚(T0),外部计数脉冲由引脚T。输入。当计数脉冲发生负跳变时,计数器加1,这就是所谓计数工作方式。
不管是那种工作方式,当TL。的低5位计数溢出时,向TH。进位,而全部13位计数溢出时,则向计数溢出标志位TF。进位。
这里说明一下工作方式控制寄存器中门控位(GATE)的功能。当GATE=0时,由于GATE信号封锁了或门,使引脚INT0信号无效。而这时或门输出端的高电平状态却打开了与门。因此可以由TR0(TCON寄存器)的状态来控制计数脉冲的接通与断开。这时如果TR0=1,则接通模拟开关,使计数器进行加法计数,即定时器/计数器工作。如果TR。=0,则断开模拟开关,停止计数,定时器/计数器不能工作。因此在单片机的定时或计数应用中要注意GATE位的清0
当GATE=1,同时又TR0=1时,有关电路的或门和与门全都打开,计数脉冲的接通与断开由引脚信号INT。控制。当该信号为高电平时计数器工作;当该信号为低电平时计数器停止工作。这种情况可用于测量外信号的脉冲宽度。
2.定时和计数应用
在方式0下,当为计数工作方式时,计数值的范围是:
1~8192(213)
当为定时工作方式时,定时时间的计算公式为;
(213-计数初值)×T ×12
或(213-计数初值)×机器周期
其时间单位分别与晶振周期或机器周期相同。
如晶振频率为6MHZ,则最小定时时间为:
[213-(213-1)]×1/6 × 10-6 ×12 = 2 × 10-6=2(us)
最大定时时间为:
(213-0)× 1/6 × 10-6X12=16384X10-6=16384(us)
定时器/计数器初始化程序设计的基本步骤如下:
(1)确定工作方式,对寄存器TMOD和TCON等赋值;
(2)预置定时或计数的初值X;
(3)根据需要开放或关闭定时器/计数器的中断;
(4)启动定时器/计数器工作。
[应用举例]设单片机晶振频率Fosc=6MHz,使用定时器1以方式0产生周期为500us的等宽正方波脉冲,并由P1.0输出。以查询方式完成。
①计算计数初值
欲产生500us的等宽正方波脉冲,只需在P1.0端以250us为周期交替输出高低电平即可实现,为此定时时间应为250us。使用6MHZ晶振,则一个机器周期为2us。方式0为13位计数结构。
设待求的计数初值为X,则:
(213-X) × 1/6 × 10-6× 12=250× 10-6 ,求解得:
X=8067。二进制数表示为1111110000011。转换为十六进制数,高8位为FCH,低5位为03H。其中高8位放入TH1,即TH1=FCH;低5位放入TL1,即TL1=O3H。
②TMOD寄存器初始化
为把定时器/计数器1设定为方式0,则M1M0=00;为实现定时功能,应使C/T=0;为实现定时器/计数器1的运行控制,则GATE=0。定时器/计数器0不用,有关位设定为0。因此TMOD寄存器应初始化为00H。
③由定时器控制寄存器TCON中的TR1位控制定时的启动和停止,TR1=1启动,TR1=0停止。
④程序设计
MOV TMOD,#00H ;设置T1工作方式0
MOV TH1,#OFCH ;设置计数初值
MOV TL1,#03H ;
MOV IE,#00H ;禁止中断
SETB TR1 ;启动定时
LOOP:JBC TF1,LOOP1 ;查询计数溢出
AJMP LOOP
LOOP1:MOV TH1,#0FCH ;重新设置计数初值。N
MOV TL1,#03H ;
CPL P1。0 ;输出取反
AJMP LOOP ;重复循环
5.4.2定时器/计数器工作方式1
方式1是16位计数结构的工作方式,计数器由TH全部8位和TL全部8位构成。其逻辑电路和工作情况与方式0完全相同。所不同的只是组成计数器的位数。
图5-3 定时器/计数器工作方式1逻辑结构
当为计数工作方式时,计数值的范围是:
1~65536(216)
当为定时工作方式时,定时时间计算公式为:
(216-计数初值)X晶振周期X12
或(216-计数初值)X机器周期
其时间单位与晶振周期或机器周期相同。
如晶振频率为6MHZ,则最小定时时间为:
[216-(216-1)]X1/6X10-6X12=2X10-6=2(us)
最大定时时间为:
(216-0)X1/6X10-6X12=131072X10-6=131072(us)»131ms
[应用举例]:题目同方式0的应用举例,但以中断方式完成。即单片机晶振频率FOSC=6MHZ,使用定时器1以工作方式1产生周期为500us的等宽正方波脉冲,并在P1。0端输出。
①计算计数初值
TH1=FFH TL1=A1H
②TMOD寄存器初始化
TMOD=10H
③程序设计
主程序:
MOV TMOD,#1OH ;定时器 1工作方式1
MOV TH1,#0FFH ;设置计数初值
MOV TL1,#0A1H ;
SETB EA ;开中断
SETB ET1 ;定时器1允许中断
LOOP:SETB TR1 ;定时开始
HERE:SJMP $ ;等待中断
SJMP HERE
中断服务程序:
ORG 001BH
MOV TH1,#0FFH ;重新设置计数初值
MOV TL1,#0A1H ;
CPL P1.0 ;输出取反
RETI ;中断返回
5.4.3定时器/计数器工作方式2
工作方式0和工作方式1的最大特点是计数溢出后,计数器为全0。因此循环定时或循环计数应用时就存在反复设置计数初值的问题。这不但影响定时精度,而且也给程序设计带来不便。方式2就是针对此问题而设置的,它具有自动重新加载功能,即自动加载计数初值,因此也可以说方式2是自动重新加载工作方式。在这种工作方式下,把16位计数器分为两部分,即以TL作计数器,以TH作预置寄存器,初始化时把计数初值分别装入TL和TH中。当计数溢出后,不是像前两种工作方式那样通过软件方法,而是由预置寄存器TH以硬件方法自动给计数器TL重新加载。
1.电路逻辑结构
图5-3是定时器/计数器0在工作方式2的逻辑结构。
图5-4 定时器/计数器工作方式2逻辑结构
初始化时:8位计数初值同时装入TL和TH中。当TL计数溢出时,置位TF,同时把保存在预置寄存器TH中的计数初值自动加载TL,然后TL重新计数。如此重复不止。这不但省去了用户程序中的重装指令,而且也有利于提高定时精度。但这种工作方式下是8位计数结构,计数值有限,最大只能到255。
这种自动重新加载工作方式非常适用于循环定时或循环计数应用,例如用于产生固定脉宽的脉冲,此外还可以作串行数据通信的波特率发送器使用。
2.循环定时和循环计数应用
[应用举例]使用定时器0以工作方式2产生100us定时,在P1.0输出周期为200us的连续方波。已知晶振频率Fosc=6MHZ。
①计算计数初值。
6MHZ晶振下,一个机器周期为2us,以TH0作重新装载的预置寄存器,TL0作8位计数器,假设计数初值为X。则:
(28-X)X2X10-6=100X10-6
求解得:
X=206D=11001110B=CEH
把CEH分别装入TH-0和TL0中:
TH0=CEH,TL0=CEH
②TMOD寄存器初始化
定时器/计数器0为工式方式2,M1M0=10;为实现定时功能C/T=0;为实现定时器/计数器0的运行GATE=0;定时器/计数器1不用,有关位设定为0。
综上情况TMOD寄存器的状态应为02H。
③程序设计(查询方式)
MOV IE,#00H ;禁止中断
MOV TMOD,#02H ;设置定时器0为方式2
MOV TH0,#0CEH ;设置计数初值
MOV TL0,#0CEH ;保存计数初值
SETB TR0 ;启动定时
LOOP: JBC TF0,LOOPI ;查询计数溢出
AJMP LOOP ;输出方波
LOOP1:AJMP LOOP ;重复循环
由于方式2具有自动重装载功能,因此计数初值只需设置一次,以后不再需要软件重置。
④程序设计(中断方式)
主程序:
MOV TMOD,#02H ;定时器O为方式2
MOV TH0,#0CEH ;设置计数初值
MOV TL0,#0CEH ;保存计数初值
SETB EA ;开中断
SETB ET0 ;定时器0允许中断
LOOP: SETB TR0 ;启动定时
HERE: SJMP $ ;等待中断
SJMP HERE
中断服务程序:
ORG 000BH
CPL P1.0 ;输出方波
RETI ;中断返回。
[应用举例]用定时器1以工作方式2计数,每计100次进行累加器加1操作。
①计算计数初值
28-100=156D=9CH
则TH1=9CH,TL1=9CH
@TMOD寄存器初始化
M1M0=10,C/T=1,GATE=0
因此TMOD=60H
③程序设计
MOV IE,#00H ;禁止中断
MOV TMOD,#60H ;设置计数器1为方式2
MOV TH1,#9CH ;计数初值
MOV TL1,#9CH ;设置计数初值
SETB TR1 ;启动计数
DEL:JBC TF1,LOOP ;查询计数溢出
AJMP DEL
LOOP:INC A ;累加器加1
AJMP DEL ;循环返回
5.4.4定时器/计数器工作方式3
前三种工作方式下,对两个定时器/计数器的设置和使用是完全相同的。但是在工作方式3下,两个定时器/计数器的设置和使用却是不同的,因此要分开介绍。
1.工作方式3下的定时器/计数器0
在工作方式3下,定时器/计数器0被拆成两个独立的8位计数器TL0和TH0。其中TL0既可以计数使用,又可以定时使用,定时器/计数器0的各控制位和引脚信号全归它使用。其功能和操作与方式0或方式1完全相同。而且逻辑电路结构也极其类似,如图5-4所示。
图5-5 定时器/计数器0工作方式3逻辑结构
与TL0的情况相反,对于定时器/计数器0的另一半TH0,则只能作为简单的定时器使用。而且由于定时器/计数器0的控制位已被TL0独占,因此只好借用定时器/计数器1的控制位TR1和TF1。即以计数溢出去置位TF1,而定时的启动和停止则受TR1的状态控制。
由于TL0既能作定时器使用也能作计数器使用,而TH0只能作定时器使用却不能作计数器使用,因此在工作方式3下,定时器/计数器0可以构成二个定时器或一个定时器一个计数器。
2.工作方式3定时器/计数器1
如果定时器/计数器0已工作在工作方式3,则定时器/计数器1只能工作在方式0、方式1或方式2下,因为它的运行控制位TR1及计数溢出标志位TF1;已被定时器/计数器0借用,如图8-5所示。
图5-6 定时器/计数器0工作方式3下的使用
在这种情况下,定时器/计数器1通常是作为串行口的波特率发生器使用,以确定串行通信的速率。因为已没有计数溢出标志位TF1可供使用,因此只能把计数溢出直接送给串行口。当作为波特率发生器使用时,只需设置好工作方式,便可自动运行。如要停止工作,只需送入一个把它设置为方式3的方式控制字就可以了。因为定时器/计数器1不能在方式3下使用,如果硬把它设置为方式3,就停止工作。
5.5门控位GATE的功能和使用方法
当TMOD中的门控位GATE0=1时,定时器T0的启动受INT0上的电平控制,只有当INT0和TR0同时为1时,定时器T0才启动。利用这个功能,可以测试INT0上输入的正脉冲宽度。其具体程序如下:
ORG 8000H
MOV TMOD,#09H
MOV TL0,#00H
MOV TH0,#00H
CLR OAFH ;关中断
HERE1:JB INT0,HERE1 ;等INT0为低电平
SETB TR0
HERE2:JNB INT0,HERE2 ;等INT0为高电平,启动定时器T0
HERE3:JB INT0,HERE3 ;等INT0低电平到来
CLR TR0 ;停止定时器T0工作
LCALL DIR ;显示子程序,显示TH0、TL0计数,即
;显示脉宽有多少个机器周期
5.6用定时器/计数器进行外部中断扩展
MCS-51为用户提供了两个外部中断请求输入线INT0和INT1。在实际应用中,外部中断源可能多于两个,这时就需要对外部中断源进行扩展连接。
在这种情况下若定时器/计数器尚有富余的话,则可利用定时器/计数器以计数工作方式实现外部中断扩展。
在计数工作方式下,如果把计数器预置为全1,则只要在计数输入端(T1或T0)输入一个脉冲,就可以使计数器溢出,产生计数溢出中断。如果以一个外部中断请求作为计数脉冲输入,则可以借“计数中断”之名行“外部中断服务”之实,这就是所谓的以定时器/计数器实现外部中断扩展。具体实现方法为:
①置定时器/计数器为工作方式2,即自动装载式8位计数,以便在一次中断响应后,为下一次中断请求作好准备。
②高低8位计数器(TH和TL)均预置为FFH。
③扩展的外部中断请求信号接计数输入端(T0或T1)。
④把扩展外中断服务程序按所用的定时器/计数器中断入口地址存放。
例如以定时器/计数器0扩展一个外部中断,其初始化程序段为:
MOV TMOD,#06H ;置计数器0为工作方式2
MOV TH0,#0FFH ;置计数初值
MOV TL0,#0FFH ;
SETB EA ;开中断
SETB ET0 ;计数器0允许中断
SETB TR0 ;计数启动
思考及练习题
1. 8051单片机内部设有几个定时器/计数器?它们是由哪些专用寄存器组成?
2. MCS-51单片机定时器/计数器有哪几种工作方式?各有什么特点?
3. 8051单片机定时器/计数器作定时和计数时其计数脉冲分别由谁提供?
4. 8051单片机定时器/计数器的门控信号GATE设置为1时,定时器如何启动?
5. 8051的T0、T1用作定时时,其定时时间与哪些因素有关?
6. 当8051的T0用作方式3时,由于TR1已被T0占用,此时如何控制定时器T1的开启和关闭?
7. 已知8051单片机的FOSC=6MHZ,请利用T0和P1.0输出矩形波,其矩形波高电平宽度50us,低电平宽度300us。请编程实现。
展开阅读全文