片微机的定时器计数器原理及应用.ppt
51单片机IO端口操作的一个有趣现象:我想实现P1.1端口跟随P1.4端口同步输出,都是驱动LED,P1.4端口使用定时器定时翻转,主循环程序随时判断P1.4状态,同步驱动P1.1。程序如下:,看来没问题,可是下载到单片机中,只见OUT闪烁,LED根本不动,奇怪?,FLAG BIT 00H,CPL FLAGMOV C,FLAGMOV OUT,C,MOV C,FLAG,第六章 单片微机的定时器/计数器原理及应用,6.1 概述6.2 定时器/计数器T0、T16.3 定时器/计数器T26.4 监视定时器(看门狗)T36.5 定时器/计数器的应用编程,定时或计数方法:1硬件法:定时功能完全由硬件电路完成,不占用CPU时间。2软件法:软件定时是执行一段循环程序来进行时间延时。3可编程定时器计数器:通过软件编程来实现定时时间的改变,通过中断或查询方法来完成定时功能或计数功能。,6-1 概述,6-1 概述,定时器资源:80C51包含有两个16位的定时器计数器:T0和T1;80C52包含有三个16位的定时器计数器:T0、T1、T2在80C51系列的部分产品(如Philips公司的80C552)中,还包含有作看门狗的8位定时器T3。,定时器计数器的核心是一个加1计数器其基本功能是计数加1。,计数是对单片微机的T0、T1(或T2)引脚上输入的一个1到0的跳变进行计数增l。定时是对单片微机内部的机器周期进行计数,从而得到定时。波特率发生器80C51的定时器/计数器还可用作串行接口的波特率发生器。,T0、T1 的内部结构简图:,6.2 定时器计数器T0、T1,图61 定时器/计数器T0、T1的内部结构框图,T0、T1 的方式寄存器TMOD,6.2.1 与定时器计数器T0、T1有关的特殊功能寄存器-TMOD、TCON、TH、TL、IE、IP,D7 D6 D5 D4 D3 D2 D1 D0,T1,T0,GATE门控位 图62CT:功能选择位,定时时钟脉冲:1/12fosc,最高计数频率:1/24fosc,M1、M0:工作方式选择位。,定时器计数器T0、T1 的控制寄存器TCON,T0、T1 的数据寄存器TH1、TL1,TH0、TL0,定时器/计数器中断 中断允许寄存器IE 中断矢量 中断优先级寄存器IP,T0:有4种工作方式可选(方式0,1,2,3)T1:有3种工作方式可选(方式0,1,2)方式0-13位定时器/计数器(M10、M00)最大计数值213=8192,当fosc=12MHZ时,Tmax=8192S,6.2.2 定时器计数器T0、T1 的工作方式,B=TRx(GATE+INTx),方式1-16位定时器/计数器(M10、M01),最大计数值216=65535,当fosc=12MHZ时,Tmax=65535S,方式2-8位定时器/计数器自动重装载(M11、M00),优点:定时初值可自动恢复,TH中存放初值;缺点:计数范围小,最大计数值为28=256适用于需要重复定时,而定时范围不大的应用场合,比如:作为串行口波特率发生器使用,方式3-仅T0有此方式,T1无方式3,中断矢量000BH,中断矢量001BH,T0方式3下的T0 在方式3情况下,T0被拆成二个独立的8位计数器TH0、TL0。TL0:8位定时/计数器,使用T0原有的控制寄存器资源:TF0,TR0,GATE,C/T,INT0,中断矢量等;TH0:8位定时器,占用T1的中断溢出标志TF1,运行控制开关TR1,中断矢量001BH,只能对片内机器周期脉冲计数,T0方式3情况下的T1 T1由于其TF1、TR1被T0的TH0占用,计数器溢出时,只能将输出信号送至串行口,即用作串行口波特率发生器。,定时器/计数器T0方式3时,T1的逻辑结构图,80C52中的T2:16位功能:自动重装载和捕获能力相关寄存器:8位计数器TL2、TH2,控制寄存器T2CON,模式寄存器T2MOD,捕获寄存器RCAP2L(低字节)和RCAP2H(高字节)。计数脉冲源:两个-内部机器周期及 T2(P10)端输入的外部计数脉冲。工作方式:3种-自动重装载、捕获和波特率发生器方式引脚T2是外部计数脉冲输入端引脚T2EX是外部控制信号输入端。,6.3 定时器计数器T2,控制寄存器 T2CON,6.3.1 T2中的特殊功能寄存器,TF2T2 溢出标志,T2溢出时置位并申请中断,软件清除。在波特率发生器方式下,即RCLK1或TCLK1时,定时器溢出不对TF2置位。EXF2T2外部标志,EXF2要靠软件来清除当EXEN21,且T2EX引脚上出现负跳变而造成捕获或重装载时EXF2置位,申请中断。若已允许T2中断,CPU将响应中断,转向中断服务程序。,RCLK:接收时钟标志,软件置位或清除用以选择T2或T1作串行口接收波特率发生器。RCLK1时,用T2溢出脉冲作为串行口的接收时钟;RCLK0时,用T1的溢出脉冲作接收时钟。TCLK:发送时钟标志,软件置位或清除用以选择T2或T1作串行口发送波特率发生器。TCLKl时,用T2溢出脉冲作为串行口的发送时钟;TCLK0时,用T1的溢出脉冲作发送时钟。EXEN2:T2外部允许标志,软件设置或清除允许或禁止用外部信号来触发捕获或重装载操作。EXEN2l时,若T2未用作串行口的波特率发生器,则在T2EX端出现的信号负跳变时,将造成T2捕获或重装载,并置EXF2标志为 1,请求中断。EXEN20时,T2EX端的外部信号不起作用,TR2:T2运行控制位。软件设置或清除C/T2:T2的定时器方式或计数器方式选择位。C/T20时,定时器工作方式。计数脉冲的频率为1/12fosc C/T21时,计数器工作方式,下降沿触发。计数脉冲自T2引脚输入,每当外部脉冲负跳变时,计数器值增1。CPRL2:捕获重装载标志。CPRL2l选择捕获功能,这时若EXEN21,且T2EX端的信号负跳变时,发生捕获操作。CPRL20,选择重装载功能,这时若T2溢出或在EXEN21条件下 T2EX端信号负跳变,都会造成自动重装载操作。当RCLKl或TCLKl时,CPRL2控制位不起作用,T2 被强制工作于重装载方式。重装载发生于T2溢出时,常用来作波特率发生器。,方式控制寄存器T2MOD,T2OE:T2输出允许位。当T2OE1时,允许时钟输出至T2引脚。仅对80C5480C58有定义。DCEN:向下计数允许位DCEN=1,T2向下(减)计数 DCEN=0,T2向上(加)计数,数据寄存器:TH2、TL2 T2有一个16位的数据寄存器,是由高8位寄存器TH2和低8位寄存器TL2所组成。它们都只能字节寻址,相应的字节地址为CDH和CCH。复位后,这两个寄存器全部清零。,捕获寄存器:RCAP2H、RCAP2L T2中的捕获寄存器是一个16位的数据寄存器,由高8位寄存器RCAP2H和低8 位寄存器RCAP2L所组成,相应的字节地址为CBH和CAH。捕获寄存器RCAP2H和RCAP2L,用于捕获计数器TL2、TH2的计数状态,或用来预置计数初值的。TH2、TL2和 RCAP2H、RCAP2L之间接有双向缓冲器(三态门)。复位后,两个寄存器全部清零。,T3俗称看门狗(watchdog),它的作用是强迫单片微机进入复位状态,使之从硬件或软件故障中解脱出来。,6.4 监视定时器(看门狗)T3,定时器初值的计算 定时时间=脉冲数脉冲周期(机器周期)定时时间t=(2L-初值TC),6.5 定时器/计数器的应用编程 6.5.1 定时器的应用,L与工作方式有关,13、16、8,定时器溢出率为定时时间的倒数,fosc=12MHZ时,1机周=1S;fosc=6MHZ 时,1机周=2S,解:工作方式0:213500S/2S=8192-250=7942=1F06H TL0=00110B=06H TH0=11111000B=F8H,【例】已知晶振6MHz,要求定时0.5ms,试分别求出T0工作于方式0、方式1、方式2时的定时初值。,工作方式1:T0初值=216-500s/2s=65536250=65286=FF06H TH0=FFH;TL0=06H。,工作方式2:T0初值=28-500s/2s=256-250=6 TH0=06H;TL0=06H。,从上例中看到,方式0计算定时初值比较麻烦,根据公式计算出数值后,还要变换一下,容易出错,不如直接用方式1,且方式0计数范围比方式1小,方式0完全可以用方式1代替,方式0与方式1相比,无任何优点。,解:分析 采用方式0定时时间 t1ms=1000S定时常数:TC=213-1000/2=8192-500=7692=11110000 01100B用定时器T0:TMOD=00H,TH0=F0H,TL0=0CH,【例】要求在 P10引脚上产生周期为2 ms的方波输出fosc=6MHz,查询方式ORG 0000HAJMP STORG 0030HST:MOV SP,#60HMOV TMOD,#00H;方式0L1:MOV TH0,#0F0H;初值MOV TL0,#0CHCPL P1.0SETB TR0L2:JBC TF0,L1SJMP L2END,中断方式:ORG0000HAJMPMAINORG000BH;T0中断矢量AJMP INQPORG0030HMAIN:MOV TMOD,00H;设T0为定时器方式0 MOV TH0,0F0H;写定时常数(定时1ms)MOV TL0,0CH SETB TR0;启动 T0 SETB ET0;允许T0中断 SETB EA;开放CPU中断 AJMP$;定时中断等待ORG2000 H;T0中断服务程序 INQP:MOV TH0,0F0H;重写定时常数 MOV TL0,0CHCPL P10;P10变反输出 RETI,采用方式1,定时时间 t1ms=1000S定时常数:TC=216-1000/2=65535-500=65035=11111110 00001011B=FE0BH用定时器T0:TMOD=01H,TH0=FEH,TL0=0BH编程与前相同,如果要求产生周期为2S的方波,怎样编程?,【例】欲用80C51产生两个方波,一个方波周期为200s,另一个方波周期为400s,该80C51同时使用串行口,用定时器/计数器作为波特率发生器,波特率为2400,fOCS9.216 MHz。分析:这时T0采用方式3工作,其中,TL0产生100s定时,由 P1.0输出方波1TH0产生200s定时,由Pl.1输出方波2;T1设置为方式2,作波特率发生器用。,计算:TL0初值:,TH0初值:,TH1、TL1初值为:F6H,编程:ORG 0000H AJMPMAINORG 000BH;TL0的中断入口AJMP ITL0ORG 00lBH;TH0的中断入口AJMP ITH0ORG 0100HMAIN:MOV SP,60H;设栈指针MOV TMOD,23H;设T0为方式3,TI为2 MOV TL0,0B3H;设TL0初值(100s定时)MOVTH0,66H;设TH0初值(200s定时)MOV TL1,0F6H;设TL1初值(波特率为2400)MOV TH1,0F6H;设 TH1初值,SETB TR0;启动 TL0 SETB TR1;启动TH0 SETB ET0;允许TL0中断 SETB ET1;允许TH0中断 SETB EA;CPU中断开放 AJMP,ORG 0200HITL0:MOV TL0,0B3H;重装定时常数 CPL P10;输出方波1(200s)RETIITH0:MOV TH0,66H;重装定时常数CPL P11;输出方波2(400s)RETI,不用方式3,能否只用T0产生两个时间?,6.5.2 计数器的应用,分析:除两个外中断(INT0、INT1)外,还需要两个定时器(5KHZ和波特率发生器)和一个计数器(扩展外中断)把T0设置为方式3:TL0设置为计数器,TH0只能做8位定时器(产生5KHz方波),T1就作为波特率发生器,设为方式2。频率5kHz即周期为200s,则定时时间100s,若采用12MHz的晶体振荡器,则机器周期为1s。,计算时间常数:TC28100/1156,编程:ORG0000HSJMPMAINORG000BHAJMPTL0INT;TL0中断入口ORG001BHAJMPTH0INT;TH0中断入口,ORG 0030HMAIN:MOV TMOD,#27H;T0为方式3,TL0为计数方式,TH0为;定时;T1作波特率发生器,方式2MOVTH0,#156;TH0定时常数MOVTL0,#0FFH;TL0计数常数MOVTL1,#BAUD;BAUD根据波特率算出MOVTH1,#BAUDMOVTCON,#55H;TR0和TR1为1,启动TL0和TH0MOV IE,#8AH SJMP$,ORG0100HTL0INT:MOVTL0,#0FFH;重置计数长度(中断处理)RETITH0INT:MOVTH0,#156;重置定时常数CPLP1.0;P1.0引脚输出方波RETI,TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0,GATE C/T M1 M0 GATE C/T M1 M0,门控位GATE可用作对INTx引脚上的高电平持续时间进行计量。通过反相器,则可测得相应INTx引脚上低电平的持续时间。两个时间的和即为INTx引脚上输入波形的周期,其倒数即为INTx引脚上输入波形的频率。还可算出占空比等参数。,6.5.3 门控位GATE的应用,【例】利用定时器计数器测定图示波形的一个周期长度。分析:若GATE=1,则T1为定时器时,当TR1=1且INT1为高电平时,才启动定时器。,查询法ORG0000HSTART:MOVTMOD,#90HMOVTL1,#00H;置为最大定时值MOVTH1,#00HLP1:JBP3.3,LP1;P3.3为高电平,等待 SETB TR1;当P3.3为低时,置TR1为1LP2:JNBP3.3,LP2;当P3.3为低电平时,再等待LP3:JBP3.3,LP3;当P3.3为高电平时,T1开;始定时计数CLRTR1;当P3.3为低电平时,高电;平脉宽定时计数结束SJMP$,当fosc12MHz时,最大被测脉宽为65536s。,此编程实际只测量了高电平的宽度,若被测波形除了接至P3.3,另外同时通过一个反相器接至P3.2(INT0),则通过编程同时可以测得波形的高电平宽度和低电平宽度。,中断法:【分析】对于脉冲宽度大于65.536ms的脉冲,可以采用对定时溢出次数进行计数的方法。这样,脉宽为(定时溢出时间溢出次数)定时时间。测定脉冲周期可用图示方法。,T1脚上对下降沿计数二次,即为外部脉冲的一个周期时间。现设T1为计数器。计数值为2。,设6MHz晶振,T0为方式1,定时溢出时间为 100 ms,当计数值为1时,启动定时器;当计数值为2时,中断计数器T1,并停止定时器T0的定时。T1中断优先级设为高于定时器T0。计数初值为 FFFEH:(TH1)FFH,(TL1)FEH。编程:ORG0000HSJMPMAINORG 000BH;定时器T0中断入口 AJMPTIME0 ORG 00IBH;定时器 T1中断入口 AJMP TIME1,ORG0030HMAIN:MOV R0,0;清除T0定时中断次数计数器MOV TMOD,59H;T0为定时器,方式1,GATE1;T1为计数器、方式1 MOV TH0,3CH;T0定时器初值 MOVTL0,0B0H MOVTH1,0FFH;T1计数器初值 MOVTL1,0FEH SETB TR0;启动T0定时器 SETB TR1;启动T1计数器 MOV IP,08H;T1中断优先级高于T0SETB ET1;允许T1中断 SETB ET0;允许T0中断 SETB EA;CPU开中断SETB 20H;设20H为T1计数中断标志,LOOP:SETB F0;设F0为T0定时中断标志 JB F0,$;T0定时未溢出,等待 JB 20H,LOOP;判T1若未溢出则循环SJMP$,ORG0100HTIME0:MOV TL0,0B0H;重置T0定时器初值MOVTH0,3CH INCR0;T0定时溢出计数器加 1 CPL F0;T0定时中断标志变反RETI,ORG0200HTIME1:CLR F0;清除T0定时中断标志 CLR 20H;清除T1计数中断标志 CLR ET0;禁止T0、T1 中断 CLR ET1CLR EA;关中断 RETI,80C51可以随时读写计数寄存器TLx和THx(x为0或1),用于实时显示计数值等。办法是:先读THx,后读TLx,再重读THx,若两次读得的THx值是一样的,则可以确定读入的数据是正确的;若两次读得的THx值不一致,则必须重读。,6.5.4 运行中读定时器/计数器,例.飞读RDTIME:MOVA,TH0;读TH0MOVR0,TL0;读TL0并存入R0CJNEA,TH0,RDTIME;再读TH0,与上次;读入的TH0比较,若不等,重读MOVR1,A;存TH0在R1中RET,END,图61 定时器/计数器T0、T1的内部结构框图,图62 方式0时,定时器/计数器T0、T1的逻辑结构图,图63 方式1时,定时器/计数器T0、T1的逻辑结构图,图64 方式2时定时器/计数器T0、T1的结构图,图65定时器/计数器T0方式3时的逻辑结构图,图66 定时器/计数器T0方式3时,T1的逻辑结构图,图67定时器/计数器T2的捕获方式逻辑结构阁,图68定时器/计数器T2的自动重装载方式逻辑结构阁,图69 定时器/计数器T2的波特率发生器方式下的结构图,图610监视定时器T3,图612 利用定时器/计数器测脉冲周期,表61定时器/计数器的工作方式,表62 定时器/计数器T2的工作方式,实验四 外中断P1.0P1.7接8个发光二极管,管脚INT0、INT1接两个按键,分别定义为“+”和“-”。要求:上电全灭,每按一次“+”键,亮的灯多一盏,每按一次“-”键,亮的灯减一盏,当全亮时,再按一次“+”键,则全灭当全灭时,再按一次“-”键,则全亮,