定时器/计数器是单片机的重要部件之一,能进行精确的定时和计数,定时器由单片机内部稳定的信号源计数,而计数器用于记录单片机外部发生的事件。定时器/计数器广泛应用于工业控制和检测中,可实现定时、延时、频率测量、信号检测等功能。
MCS-51单片机内部有两个16位的可编程定时器/计数器T0(定时器0)和T1(定时器1),分别由两个8位的RAM单元组成,最大计数值为65 536,当超过65 536时,定时器/计数器产生溢出。
1.定时器/计数器的内部结构及工作原理
定时器/计数器T0、T1由加法计数器、定时器/计数器工作方式寄存器TMOD和定时器/计数器控制寄存器TCON组成,其内部结构如图4.1所示。T0和T1实质上是16位加法计数器。T0由TH0和TL0两个8位加法计数器构成,TH0为高8位,TH1为低8位。T1由TH1和TL1构成。TL0、TL1、TH0、TH1的访问地址依次为8AH~8DH,每个寄存器均可单独访问。TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能。TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。
图4.1 T0、T1内部结构
定时器/计数器每接收到一个计数脉冲,计数器加1,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON中TF0或TF1置1,如果定时/计数器中断允许,则向CPU发出中断请求。根据计数脉冲来源的不同,定时器/计数器有定时和计数两大功能。
当定时/计数器设置为定时工作方式时,计数脉冲来自系统时钟振荡器输出十二分频信号。实际上,计数周期即为单片机的一个机器周期。调整计数器初值,可调整从初值到计满溢出的机器周期数,即调整了定时时间。相关数值计算如下:
计数值N=溢出值(最大计数值)-计数初值X
定时时间τ=机器周期T×计数值N
计数频率 fc=时钟频率fosc/12
若系统采用12 MHz晶振,则计数周期(机器周期)
T=1/[12×106×(1/12)]=1(μs)
若计数值为N,则定时N μs。
当定时器/计数器设置为计数工作方式时,计数脉冲来自输入引脚T0(P3.4)和T1(P3.5)的外部信号,外部脉冲的下降沿触发计数,计数器加1。新的计数值于下一个机器周期装入计数器中。由于检测一个高电平到低电平的负跳变需要两个机器周期,因此,CPU能够检测到的外部脉冲的最高频率为系统时钟频率的1/24。外部输入信号的高电平与低电平的持续时间须在一个机器周期以上。
2.定时器/计数器的控制寄存器
MCS-51单片机的定时器/计数器由TMOD和TCON两个工作寄存器控制,用户通过编程TMOD和TCON的控制内容来选择定时器/计数器的功能(定时还是计数)、设定工作方式、定时时间、计数初值、启动、中断请求等操作。
1)定时器工作方式寄存器TMOD
TMOD用于控制T0和T1的工作方式,低4位用于T0,高4位用于T1。其位格式定义见表4.2。
表4.2 TMOD位格式定义
GATE:选通控制位。GATE=0,只要用软件对TR0(或TR1)置1就可启动定时器。GATE=1,只有在INT0(或INT1)引脚为1,且用软件对TR0(或TR1)置1时才能启动定时器工作。
定时器/计数器方式选择位。设置成定时工作方式;设置成计数工作方式。
M1、M0:工作方式控制位,可构成表4.3的四种工作方式。
TMOD所有位复位后清零。TMOD不能位寻址,只能以字节方式工作。
表4.3 工作方式选择
2)定时器控制寄存器TCON
定时器控制寄存器TCON已在前面介绍过,与定时器计数器相关的是TCON的高4位,TF1、TF0为溢出中断标志位,TR1、TR0为定时器/计数器运行控制位。
3.定时器/计数器的工作方式
MCS-51单片机由TMOD中的M1、M0控制,可以设置成四种工作方式。除了工作方式3以外,其他三种工作方式基本原理一致。用户通过指令把方式写入TMOD,选择定时器/计数器的功能和工作方式,然后将计数初值写入THx和TLx中控制定时或计数长度,再通过选通控制位的置1或清0来启动或停止定时器/计数器工作。另外,通过查询TH、TL和TCON的内容,可以判断定时器的状态。
1)工作方式0
方式0为13位计数器,由TLx的低5位(高3位未用)和THx的8位组成,最大计数值为213=8 192。TLx的低5位溢出时向THx进位,THx溢出时,置位TCON中的TFx标志,向CPU发出中断请求。工作方式0下,T0的结构如图4.2所示。
图4.2 T0工作方式0的结构
当时,多路开关与T0(P3.4)相连,外部计数脉冲由T0脚输入,此时,T0为计数器。计数值为
N=213-X=8 192-X
其中,N为计数值,X为TH0、TL0的初值。X的取值范围为0~8 191,则计数范围为1~8 192。
当时,多路开关与时钟的十二分频信号相连,T0对机器周期Tcy计数,此时T0为定时器。其定时时间为
T=N·Tcy=(8 192-X)Tcy
当振荡频率fosc=12 MHz时,Tcy=1 μs,定时范围为1~8 192 μs。
门控位GATE具有特殊的作用。
当GATE=0时,或门被封锁,信号无效。或门输出常为1,打开与门,TR0直接控制定时器0的启动和关闭。TR0=1,接通控制开关,定时器0从初值开始计数直至溢出。溢出时,16位加法计数器为0,TF0置位,并申请中断。如要循环计数,则定时器T0需重置初值,且需用软件将TF0复位。TR0=0,则与门被封锁,控制开关被关断,停止计数。
当GATE=1时,与门的输出由的输入电平和TR0位共同决定。若TR0=1,则与门打开,外部电平通过引脚直接开启或关断定时器T0,为高电平时,允许计数,否则停止计数。这种方式常用来测量外中断引脚上正脉冲的宽度。若TR0=0,则与门被封锁,控制开关被关断,停止计数。
2)工作方式1
方式1为16位计数器,由TLx作为低8位和THx作为高8位共同组成,最大计数值为216=65 536。工作方式1下,T0的结构如图4.3所示。
图4.3 T0工作方式1结构
方式1构成一个16位定时器/计数器,其结构与操作几乎和方式0相同,差别在于两者计数位数不同。作为计数器时,计数值为
N=213-X=8 192-X
计数范围为1~65 536。
作定时器时,其定时时间为
T=N·Tcy=(65 536-X)Tcy
当振荡频率fosc=12 MHz时,Tcy=1 μs,则定时范围为1~65 536 μs。
3)工作方式2
方式2为可自动重装初值的8位计数器,仅TLx用于计数,THx用于保存计数初值。最大计数值为28=256。工作方式2下,T0的结构如图4.4所示。
图4.4 T0工作方式2的结构
方式2与方式0和方式1的区别不仅仅在于计数位数少,计数范围小,方式2还具有初值自动重装功能。当TLx计满溢出后,溢出标志位TFx=1,与此同时,将原来装在THx中的计数初值重新装入TLx,特别适合需要重复定时的场合,如脉冲信号发生器。
方式2作为计数器时,计数值为
N=28-X=256-X(www.xing528.com)
计数范围为1~256。
作定时器时,其定时时间为
T=N·Tcy=(256-X)Tcy
当振荡频率fosc=12 MHz时,Tcy=1 μs,则定时范围为1~256 μs。
4)工作方式3
定时器/计数器工作在方式3时,定时器T0被分解成两个独立的8位计数器TL0和TH0,两个定时器的最大计数值均为256,其结构如图4.5所示。
图4.5 T0工作方式3结构
定时器/计数器工作在方式3时,TL0占用原T0的控制位、引脚和中断源。除计数位数与方式0、方式1不同外,其功能、操作与方式0、方式1完全相同,可定时也可计数。而TH0占用原定时器T1的控制位TF1和TR1,同时还占用了T1的中断源,其启动和关闭仅受TR1置1或清0控制,TH0只能对机器周期进行计数,因此,TH0只能用作简单的内部定时,不能用作对外部脉冲进行计数,是定时器T0附加的一个8位定时器。TL0和TH0的定时时间分别为
TTL0=NTL0·Tcy=(256-XTL0)Tcy
TTH0=NTH0·Tcy=(256-XTH0)Tcy
其中,XTL0、XTH0分别为TL0和TH0的计数初值。
一般系统需要增加一个额外的8位定时器时,可设置为工作方式3。在这种情况下,T1仍然可以被定义为工作方式0、1、2,由于中断标志位和运行控制位被TH0占用,T1不能中断,只能将计数器溢出直接送给串行口,一般作为串行口波特率发生器使用,故T1无法使用方式3工作。
4.定时器/计数器的应用
1)定时器/计数器的编程
定时器/计数器的初始化步骤如下:
(1)确定工作方式,将工作方式控制字写入TMOD。
(2)根据定时时间或计数要求计算计数初值,并将其写入TLx和THx。
(3)若需要使用中断,ETx、EA置1,开放定时器/计数器中断和CPU中断。
(4)当GATE=0时,TRx置1,启动计数;当GATE=1时,除软件置位外,还必须在外中断引脚处加上相应的电平值才能启动。
定时器/计数器的应用一般有查询和中断两种方式。查询方式时在整个计数过程中,通过指令不断查询TF0或TF1的状态来判断计数是否溢出。这种方式编程较简单,但是需要占用大量CPU时间,使得CPU效率降低。中断方式是利用中断系统,计数溢出后向CPU发出中断请求,将溢出后需要执行的操作放入定时器/计数器对应的中断服务程序中执行。采用中断方式可以提高CPU的效率。
另外,如果在某些应用中不需要进行定时或计数,则T0和T1可作为外部中断请求使用。此时将定时器/计数器设置成计数方式,计数初值设为最大值,在计数输入端T0(P3.4)或T1(P3.5)引脚上发生负跳变时,计数器加1便产生溢出中断。这样把T0脚或T1脚作为外部中断请求输入端口,而计数器的溢出中断作为外部中断请求标志。
2)定时器/计数器应用实例
【例4.1】如图4.6所示,P1口接有8个发光二极管,编程使8个发光二极管轮流点亮。每个发光二极管亮100 ms,设晶振频率fosc=6 MHz。
图4.6 例4.1题图
解:
(1)工作方式确定。可用T1完成100 ms定时时间,使P1初始状态为FEH,每隔100 ms左移一次。当晶振频率fosc=6 MHz时,机器周期Tcy=2 μs,则计数值计算如下:
N=T/Tcy=100 ms/2 μs=50 000
因此采用工作方式1,工作方式字TMOD=10H,即
TMOD.0~TMOD.3:因T0不用,可取任意值,此处取0值;
TMOD.4、TMOD.5:M1M0=01,T1工作在方式1;
TMOD.6:T1为定时方式;
TMOD.7:GATE=0,计数不受脚控制。
(2)计算计数初值:
X=216-N=65 536-50 000=15 536=3CB0H
则TH0=3CH,TL0=0B0H。
(3)查询方式参考程序。
C语言源程序如下:
(4)中断方式参考程序。
C语言源程序如下:
【例4.2】在单片机P1.0口接一个发光二极管,要求利用定时控制使LED亮1 s灭1 s,周而复始,设晶振频率fosc=6 MHz。
解:
(1)分析与计算。当fosc=6 MHz时,机器周期Tcy=2 μs,工作方式0最大定时时间为16.384 ms,工作方式1最大定时时间为131.072 ms,工作方式2最大定时时间为512 μs。显然无法满足定时1 s的要求。可以采用方式0,使T0每隔10 ms中断一次,利用软件对中断次数进行计数,中断100次即实现1 s定时。也可以采用方式1,使T0每隔100 ms中断一次,中断10次实现1 s定时。
这里采用T0工作方式0,则TMOD=00H。
计数初值:
X=213-N=8 192-(10 ms/2 μs)=3 192=0C78H=000 0 1100 011 1 1000B
则TH0=0110 0011B=63H,TL0=0001 1000B=18H。
(2)参考程序。
C语言源程序如下:
【例4.3】当GATE=1、TR0=1时,只有引脚上出现高电平时,T0才被允许计数,试利用这一功能测试引脚上正脉冲的宽度(以机器周期表示)。
解:
(1)分析。设外部待测脉冲由脚输入,T0工作在方式1,设置为定时状态,GATE置1。测试时,在端为0时TR0置1,当变为1时启动计数;再次变为0时停止计数。此时的计数值即为被测正脉冲宽度。
(2)参考程序。
C语言源程序如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。