一、定时器/计数器的结构
MCS-51系列单片机典型产品8051等内部有两个16位的可编程定时/计数器,称为定时器0(T0)和定时器1(T1),可编程选择其作为定时器用或作为计数器用。此外,工作方式、定时时间、计数值、启动、中断请求等都可以由程序设定,其逻辑结构如图3.9所示。
图3.9 定时器/计数器逻辑结构图
由图可知,805l定时/计数器由定时器0、定时器1、定时器方式寄存器TMOD和定时器控制寄存器TCON组成。
定时器0、定时器1是16位加法计数器,分别由两个8位专用寄存器组成,定时器0由TH0和TL0组成,定时器1由TH1和TL1组成,每个寄存器均可单独访问。
当定时/计数器设置为定时工作方式时,计数器对内部机器周期计数,每过一个机器周期,计数器加1,直至计满溢出。当定时/计数器设置为计数工作方式时,计数器对来自输入引脚T0(P3.4)和T1(P3.5)的外部信号计数。如果在第一个机器周期检测到T0/T1引脚的脉冲信号为1,第二个机器周期检测到T0/T1引脚的脉冲信号为0,即出现从高电平到低电平的跳变时,计数器加1。由于检测一个由1到0的负跳变需要两个机器周期,所以,最高检测频率为振荡频率的1/24。
定时器方式寄存器TMOD用于设置定时/计数器的工作方式,定时器控制寄存器TCON用于控制定时/计数器启动和停止。
当设置了定时器的工作方式并启动定时器工作后,定时器就按被设定的工作方式独立工作,不再占用CPU的操作时间,只有在计数器计满溢出时才可能中断CPU当前的操作。
二、定时/计数器的控制
在启动定时/计数器工作之前,CPU必须将一些命令(称为控制字)写入定时/计数器中,这个过程称为定时/计数器的初始化。定时/计数器的初始化通过定时/计数器的方式寄存器TMOD和控制寄存器TCON完成。
1.定时/计数器方式控制寄存器TMOD
定时/计数器方式控制寄存器TMOD的地址为89H,用于控制和选择定时/计数器的工作方式,高四位控制T1,低四位控制T0,不能采用位寻址方式。格式如下:
TMOD的低4位为定时器0的方式字段,高4位为定时器1的方式字段,它们的含义完全相同。
M1和M0:方式选择位。定义如下表:
表3.4 定时计数器工作方式
C/¯T:功能选择位。C/¯T=0时,设置为定时器工作方式;C/¯T=1时,设置为计数器工作方式。
GATE:门控位。当GATE=0时,软件控制位TR0或TR1置1即可启动定时器;当GATE=1时,软件控制位TR0或TR1须置1,同时还须(P3.2)或(P3.3)为高电平方可启动定时器,即允许外中断、启动定时器。
例如:设置T0工作于定时方式,内部启动,操作方式为方式2;设置T1工作在计数方式下,外部启动,操作方式为方式0,则设定工作方式的程序为:
TMOD=0xC2;
2.定时/计数器控制寄存器TCON
TCON既是用于定时/计数器控制的寄存器,也是用于中断标志及中断控制的寄存器,其中分布了与外部中断及定时/计数器相关的中断请求标志位。格式如下:
与定时/计数器控制相关的有定时器溢出中断请求标志TF1/TF0及定时器启动停止控制位TR1/TR0。
TF1/TF0=1时,定时器有溢出中断请求;TF1/TF0=0时,定时器无溢出中断请求。
TR1/TR0=1时,启动定时器工作;TR1/TR0=0,停止定时器工作。
有关中断控制的内容见中断单元。
三、定时/计数器的工作方式
定时/计数器有四种工作方式,每种工作方式下,内部计数器的位数及功能有所不同。
1.工作方式0
当TMOD中的M1M0=00时,定时/计数器工作在方式0,构成一个13位定时/计数器。其逻辑结构图如图3.10所示。定时器1的结构和操作与定时器0完全相同。
图3.10 定时器0(或定时器1)在方式0时的逻辑结构图
由图可知:16位加法计数器(TH0和TL0)只用了13位,其中,TH0占高8位,TL0占低5位。当TL0低5位溢出时自动向TH0进位,而TH0溢出时向中断位TF0进位(硬件自动置位),并申请中断,此时内部计数器的最大计数值为213=8192。
当C/¯T=0、GATE=0、TR0=1时,定时器0对机器周期计数,此时,定时器0为定时器。
当C/¯T=1、GATE=0、TR0=1时,定时器0的计数脉冲从P3.4引脚输入,当外部信号电平发生由0到1的负跳变时,计数器加1,此时,定时器0为计数器。
当GATE=1、TR0=1时,定时/计数器的启停由外部中断请求信控制,若,可用于测量脉宽。
2.工作方式1
当TMOD中的M1M0=01时,定时/计数器工作在方式1,其逻辑结构图如图3.11所示。由图可知,方式1构成一个16位定时/计数器,其结构与操作几乎完全与方式0相同,只是二者计数位数不同,最大计数值为216=65536。
图3.11 定时器0(或定时器1)在方式1时的逻辑结构图
3.工作方式2
当TMOD中的M1M0=10时,定时/计数器T0、T1工作在方式2,其逻辑结构图如图3.12所示。由图可知,定时/计数器内部的计数器为自动重装初值的8位计数器。其中,TL0是8位计数器,TH0是重置初值的8位缓冲器。当TL0计数满溢出时,将中断请求TF0置1,同时将TH0中的计数初值以硬件方法自动装入TL0。最大计数值为28=256。(www.daowen.com)
定时/计数器工作在方式2,适合用作较精确的定时脉冲信号发生器。
图3.12 定时器0(或定时器1)在方式2时的逻辑结构图
4.工作方式3
当TMOD中的M1M0=11时,定时/计数器工作在方式3,其逻辑结构图如图3.13所示。此时定时/计数器T0可拆成两个独立的8位定时/计数器使用,T1不变。当T0工作在方式3下,T0、T1的设置和使用方法是不同的。
图3.13 定时器0在方式3时的逻辑结构图
定时/计数器T0中的两个8位计数器TH0、TL0拆分为两个独立的计数器后,TL0所对应的定时/计数器使用T0原有控制资源,使用TR0控制启停,TF0作为溢出标志。TH0所对应的定时/计数器只能作8位定时器用,借用T1的资源TR1、TF1。T0工作在方式3时定时/计数值的初值计算与方式2相同。
方式3时,定时器1仍可设置为方式0、方式1或方式2。但由于TR1、TF1及T1的中断源已被定时器0占用,此时,定时器1仅由控制位切换其定时或计数功能,当计数器计满溢出时,只能将输出送往串行口。在这种情况下,定时器1一般用作串行口波特率发生器或不需要中断的场合。因定时器1的TR1被占用,因此其启动和关闭较为特殊,当设置好工作方式时,定时器1即自动开始运行。若要停止操作,只需送入一个设置定时器1为方式3的方式字即可。
四、定时/计数器的程序设计
1.定时/计数器的初始化编程
初始化编程主要包括以下几方面的内容:
(1)设定定时器的工作方式控制字,并将其写入TMOD中。
(2)确定定时或计数的初值,并将其写入TH0、TL0或THl、TL1。
设K为定时/计数器位数,则各种工作方式下的位数如下:
方式0:K=13;
方式1:K=16;
方式2:K=8;
方式3:T0的K=8。
定时时间及计数值可按下式计算:
定时时间为:
定时/计数器为计数器,其计数值为:
2K-计数初值
(3)若使用定时/计数器的中断功能,则设置IE、IP。
(4)启动定时/计数器工作,将TR0或TR1置1。
2.定时/计数器应用实例
例3-1 设单片机的晶振频率fosc=12MHz,要求由T0产生1ms的定时并使P1.7输出周期为2ms的方波。
分析:将P1.7口线每隔1ms反相一次,即可输出周期为2ms的方波。首先应编程使定时器产生1ms的定时,设定时/计数器T0工作在方式0,工作方式控制字为0X00,此时定时器内部计数器为13位,则
将高8位送入TH0,低5位送入TL0,然后,启动定时器。源程序如下:
仿真输出波形如图3.14所示,示波器中显示了输出的方波,并且测量出方波的周期是2ms。
图3.14 仿真输出波形
例3-2 设fosc=12MHz,利用定时器控制P1口外接的8个发光二极管,以1S为间隔循环点亮。
分析:选用T0方式1、定时50ms,当定时器溢出20次后,就完成1秒的定时。计算定时50 ms时的初值:
计算得计数初值=65536-50000。
源程序如下:
定时/计数器是单片机中的重要部件,灵活应用定时/计数器可以提高编程技巧,减轻CPU的负担,简化外围电路。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。