第六章定时器及应用张文昭15116501682zhyy122122@126.com教学内容基本要求:掌握计数/定时器的应用及编程方法重点:定时器/计数器工作模式及应用难点:定时器/计数器的应用编程定时器/计数器的结构及功能定时器/计数器的控制定时器/计数器的4种工作模式及其应用定时器/计数器的编程方法§6.1定时器概述89C51单片机内有两个16位定时器/计数器,即定时器0(T0)和定时器1(T1),都是16位加1计数器。功能:定时和事件计数,可用于定时控制、延时、对外部件计数和检测等场合。T0由两个8位特殊功能寄存器TH0和TL0构成;T1由TH1和TL1构成。每个定时器都可由软件设置为定时工作方式或计数工作方式。由特殊功能寄存器TMOD和TCON所控制。定时器工作不占用CPU时间,除非定时器/计数器溢出,才能中断CPU的当前操作。定时器/计数器有四种工作模式。定时器对89C51片内振荡器输出经12分频后的脉冲进行计数,即每个机器周期使定时器(T0或T1)的数值加1直至计满溢出。当89C51采用12MHz晶振时,一个机器周期为1μs,计数频率为1MHz。定时工作方式若89C51采用6MHz晶振,计数频率为多少?通过引脚T0(P3.4)和T1(P3.5)对外部脉冲信号计数。当输入脉冲信号产生由1至0的下降沿时计数器的值加1。CPU检测一个1至0的跳变需要两个机器周期,故最高计数频率为振荡频率的1/24。为了确保某个电平在变化之前被采样一次,要求电平保持时间至少是一个完整的机器周期Tcy。计数工作方式TcyTcy定时器共有两个控制字,由软件写TMOD和TCON两个8位寄存器,用来设置T0和T1的工作模式和控制功能。单片机系统复位时,两个寄存器所有位都被清0。§6.2定时器的控制TMOD用于控制T0和T1的工作模式,其各位的定义格式如下图所示。一、工作模式寄存器—TMOD(89H)TMOD不能位寻址,只能字节寻址。TMODGATEC/TM1M0用于T0工作模式(89H)工作模式00—模式001—模式110—模式211—模式3功能选择1—计数0—定时选通控制1—受/INT1控制0—不受/INT1控制M1M0工作模式功能描述00模式013位计数器01模式116位计数器10模式2自动装入8位计数器11模式3定时器0:分成两个8位计数器定时器1:停止计数M1、M0形成四种编码控制四种工作模式C/T:定时器/计数器方式选择位C/T=0:定时方式计数片内脉冲(即对机器周期计数,周期确定)C/T=1:计数方式计数片外脉冲(即对通过P3.4/P3.5来自片外的计数信号计数,周期不定)GATE:门控位GATE=0:软件使TR0/TR1置1,即可启动定时器GATE=1:只有INT0/INT1输入信号为高电平,软件使TR0/TR1置1,才可启动定时器定时器的使用:设置工作方式----置初值----启动----溢出中断二、控制寄存器—TCON(88H)TCON各位的作用如下:①TF1(TCON.7)——T1溢出标志位。有溢出,TF1=1.②TF0(TCON.5)——T0溢出标志位。有溢出,TF0=1.③TR1(TCON.6)——T1运行控制位。TR1=1,启动T1④TR0(TCON.4)——T0运行控制位。TR0=1,启动T0⑤IE1,IT1,IE0和IT0(TCON.3~TCON.0)——外部中断INT1,INT0请求及请求方式控制位。89C51复位后,TCON的所有位被清0。§6.3定时器的四种模式及应用89C51单片机的定时/计数器T0和T1的四种工作模式,在模式0、模式1和模式2时,T0和T1的工作模式相同;在模式3时,两个定时器的工作模式不同。一、模式1及其应用(一)模式1的逻辑电路结构(以T0为例)模式1对应的是一个16位的定时器/计数器。定时计数在这种模式下,寄存器(TH0和TL0)以全16位参与计数。TH0占高8位,TL0为低8位。当TL0计数溢出时,向TH0进位;TH0溢出时,向中断标志TF0进位(硬件置位TF0),并申请中断。(二)模式1工作特点(二)模式1工作特点计100个机器周期数所需的时间为多少?(所接晶振为12MHz)定时时间为:t=计数值×机器周期=(216-T0初值)×振荡周期×12如何实现定时?如何得到所需的定时时间?最大可计数多少个机器周期?当C/T=0时,控制开关接通振荡器12分频输出端,T0对机器周期计数。这就是定时工作方式。利用溢出中断,并给出相应的计数初值(二)模式1工作特点当C/T=1时,T0对外部输入计数。计数长度为:L=(216-T0初值)(个外部脉冲)例1:设晶振频率为12MHz,试计算定时器T0工作于模式1时的最大定时时间T。解:当T0处于工作模式1时,加1计数器为16位。定时时间为:t=(216-T0初值)×振荡周期×12最大定时时间为“T0初值=0”时。所以:T=216×振荡周期×12ms536.6512101212616例2:用定时器T1产生一个50Hz的方波,由P1.1输出。fosc=6MHz。解:1)确定定时器T1初值∵方波周期T=1/50=0.02s=20ms∴用T1定时10ms,时间到P1.1引脚电平取反。121T2t16振荡周期初值)(定时时间:12t21T16振荡周期初值121061ms1021T616初值H78EC605361T初值∴(TH1)=ECH,(TL1)=78H20ms10ms10ms解:2)确定工作模式寄存器TMOD的值∵定时器T1工作于模式1的定时器工作方式,∴高四位:GATE=0,C/T=0,M1M0=01,低四位:取0。∴(TMOD)=00010000B=10H3)编程(查询方式)#includeat89x51.hvoidmain(){TMOD=0x10;TH1=0xec;TL1=0x78;TR1=1;P1_1=1;while(1){if(TF1==1){TF1=0;TH1=0xec;TL1=0x78;P1_1=~P1_1;}}}3)编程(定时器溢出中断方式)#includeat89x51.hvoidmain(){TMOD=0x10;TH1=0xec;TL1=0x78;ET1=1;EA=1;TR1=1;P1_1=1;while(1);}voidtimer_1()interrupt3{TH1=0xec;TL1=0x78;P1_1=~P1_1;}思考:设定时器T0用于定时10ms,晶振为6MHz。编程实现:P1.0输出周期为40ms,高电平宽为10ms,低电平宽为30ms的矩形波。如何编程?例3:设定时器T0选择工作模式1的计数器工作方式,其计数器初值为FFFFH,问此时定时器T0的实际用途是什么?解:因其初值为FFFFH,只要随机外来一脉冲即可溢出,向CPU申请中断,故这一内部中断源实质上已作为外部中断源使用。因此此定时器T0并不用于定时或计数。该模式对应的是一个13位的定时器/计数器。在这种模式下,(以T0为例)16位寄存器(TH0和TL0)只用了13位。其中TL0的高3位未用,其余5位为整个13位的低5位,TH0占高8位。当TL0的低5位溢出时,向TH0进位;TH0溢出时,向中断标志TF0进位(硬件置位TF0),并申请中断。×××TH0TL08位5位二、模式0及其应用二、模式0及其应用用于定时工作方式时,定时时间为:t=(213–T0初值)×振荡周期×12用于计数工作方式时,计数长度为:(213-T0初值)(个外部脉冲)。例4:设晶振频率为12MHz,试计算定时器T0工作于模式0时的最大定时时间T。解:当T0处于工作模式0时,加1计数器为13位。定时时间为:t=(213-T0初值)×振荡周期×12最大定时时间为“T0初值=0”时。所以:122T13振荡周期12101212613ms192.81081926模式2把TL0(或TL1)配置成一个可以自动重装载的8位定时器/计数器,逻辑电路结构如下图。三、模式2及其应用TL0计数溢出时,不仅使溢出中断标志位TF0置1,而且还自动把TH0中的内容重新装载到TL0中。在程序初始化时,TL0和TH0由软件赋予相同的初值。用于定时工作方式时,定时时间为:t=(28-TL0初值)×机器周期用于计数工作方式时,计数长度为:(28-TL0初值)(外部脉冲的个数)该模式可省去软件中重装常数的语句,并可产生相当精确的定时时间,适合于作串行口波特率发生器。例5:利用定时器T1的模式2对外部信号计数。要求每计满100次,将P1.0端取反。解:(1)选择模式外部信号由T1(P3.5)引脚输入,每发生一次负跳变计数器加1,每输入100个脉冲,计数器发生溢出中断,中断服务程序将P1.0取反一次。T1计数工作方式模式2的模式字为(TMOD)=60H。T0不用时,TMOD的低4位可任取,但不能进入模式3,一般取0。(2)计算T1的计数初值X=28-100=156=9CH因此:TL1的初值为9CH,重装初值寄存器TH1=9CH。(3)程序清单#includeat89x51.hmain(){TMOD=0x60;TH1=0x9c;TL1=0x9c;ET1=1;EA=1;TR1=1;while(1);}voidtimer_1()interrupt3{P1_1=~P1_1;}四、模式3及其应用工作模式3对T0和T1大不相同。若将T0设置为模式3,TL0和TH0被分成为两个相互独立的8位计数器,逻辑图如下图:TL0:用原T0的各控制位、引脚和中断源,即C/T,GATE,TR0,TF0,T0(P3.4)引脚,INT0(P3.2)引脚。TL0可工作在定时器方式和计数器方式。其功能和操作与模式0、模式1相同(只是8位)。TH0:只可用作简单的内部定时功能。TH0占用了定时器T1的控制位TR1和T1的中断标志TF1,其启动和关闭仅受TR1的控制。定时器T1无工作模式3状态。在T0用作模式3时,T1仍可设置为模式0~2。五、综合应用举例解:(1)定时器T0工作模式的确定∵模式0最长可定时16.384ms;模式1最长可定时131.072ms;模式2最长可定时512μs;LED每1秒闪烁一次。∴定时0.5s,可选用模式1,每隔100ms中断一次,中断5次从而达到0.5s的定时。(2)求计数器初值X∵(216-X)×12/(6×106)=100×10-3s∴X=15536=3CB0H因此:(TL0)=0B0H(TH0)=3CH例6:设时钟频率为6MHz,试编写用T0产生定时使P1.0所接的发光二极管每1秒钟闪烁一次。源程序清单(使发光二极管闪烁,每1S闪烁1次)#includeat89x51.hunsignedchartemp=5;main(){TMOD=0x01;TH0=0X3C;TL0=0XB0;ET0=1;EA=1;TR0=1;P1_0=1;while(1);}voidtimer_0()interrupt1{TH0=0X3C;TL0=0XB0;temp--;if(temp==0){temp=5;P1_0=~P1_0;}}例7:设计实时时钟程序。时钟就是以秒、分、时为单位进行计时。用定时器与中断的联合应用。解:(1)实现时钟计时的基本方法①计算计数初值。时钟计时的最小单位是秒,可把定时器的定时时间定为100ms,计数溢出10次即得到1秒;10次计数可用软件方法实现。假定使用定时器T1,以工作模式1进行100ms的定时。如fosc=6MHz,则计数初值X为:∴X=15536=3CB0H∴(TL0)=0B0H(TH0)=3CH例6:设计实时时钟程序。时钟就是以秒、分、时为单位进行计时。用定时器与中断的联合应用。②采用定时方式进行溢出次数的累计,计满10次即得到秒计时。设置软件计数器初值为10,每100ms定时时间到溢出中断,使软件计数器减1,直到减到0,则1s到。③从秒到分和从分到时的计时是通过累计和数值比