您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > C/C++资料 > 89C51的定时器、计数器
1定时/计数器2定时方法概述定时计数器结构和工作原理定时计数器的控制寄存器定时器的四种工作方式定时器的应用3一、定时方法概述软件定时:软件定时靠执行一个循环程序以进行时间延迟。特点是时间精确,且不需要外加硬件电路。但软件定时要占用CPU开销,因此软件定时的时间不宜太长。采用时基电路定时:特点是(定时功能全部由硬件电路完成)不占CPU时间,但需通过改变电路的元件参数来调节定时时间,在使用上不够灵活方便。采用可编程芯片定时:这种定时方法是通过对系统时钟脉冲的计数来实现的。计数值通过程序设定,改变计数值,也就改变了定时时间,使用起来既灵活有方便。结论:MCS-51单片机把定时电路集成在芯片中,称之为定时器/计数器。8051型单片机有两个定时/计数器,分别称为定时器/计数器0和定时器/计数器1。4二、定时计数器结构和工作原理定时器方式寄存器主要用于设定定时器的工作方式定时器控制寄存器主要用于控制定时器的启动与停止,并保存T0、T1的溢出和中断标志定时器0定时器15定时/计数器的结构框图16位的定时器/计数器实质上是一个加l计数器,可实现定时和计数两种功能,其功能由软件控制和切换。定时器属硬件定时和计数,是单片机中效率高而且工作灵活的部件。6定时器/计数器的定时功能。计数器的加1信号由振荡器的12分频信号产生,即每过一个机器周期,计数器加1,直至计满溢出。定时器的定时时间与系统的时钟频率有关。因一个机器周期等于12个时钟周期,所以计数频率应为系统时钟频率的十二分之一。如果晶振频率为12MHz,则机器周期为1s。通过改变定时器的定时初值,并适当选择定时器的长度(8位、13位或16位),可以调整定时时间。7定时器/计数器的计数功能。通过外部计数输入引脚T0(P3.4)和T1(P3.5)对外部信号计数,外部脉冲的下降沿将触发计数。计数器在每个机器周期的S5P2期间采样引脚输入电平,若一个机器周期S5P2期间采样值为1,下一个机器周期S5P2期间采样值为0,则计数器加1,再下一个机器周期S3P1期间,新的计数值装入计数器。因检测一个由1至0的跳变需要两个机器周期,故外部信号的最高计数频率为时钟频率的二十四分之一。如果晶振频率为12MHz,则最高计数频率为0.5MHz。虽然对外部输入信号的占空比无特殊要求,但为了确保给定电平在变化前至少被采样一次,外部计数脉冲的高电平与低电平保持时间均需在一个机器周期以上。81、工作方式寄存器TMODM0M1C/T0GATE0M0M1C/T1GATE1TMOD字节地址89HD7D6D5D4D3D2D1D0控制T0控制T1方式选择00:方式001:方式110:方式211:方式3定时/计数选择0:定时器1:计数器门控位三、定时计数器的控制寄存器9GATE:门控制位,用于控制定时器的启动是否受外部中断源信号的影响。GATE=0时,与外部中断无关,由TCON寄存器中的TRx位控制启动。GATE=1时,由控制位TRx和引脚共同控制启动,只有在没有外部中断请求信号的情况下(即外部中断引脚=1时),才允许定时器启动。INTxINTx102、定时控制寄存器(TCON)当定时器1计满溢出时,由硬件自动使TF0置1,并申请中断。对该标志位有两种处理方法,一种是以中断方式工作,即TF0置1并申请中断,响应中断后,执行中断服务程序,并由硬件自动使TF0清0;另一种以查询方式工作,即通过查询该位是否为1来判断是否溢出,TF0置1后必须用软件使TF0清0。GATE=0时,用软件使TR0置1即启动定时器1,若用软件使TR0清0则停止定时器1。GATE=1时,用软件使TR1置1的同时外部中断INT0的引脚输入高电平才能启动定时器0。113、中断允许控制寄存器EX0ET0EX1ET1ESET2хEAIE字节地址A8HD7D6D5D4D3D2D1D0定时/计数器1中断允许控制位定时/计数器0中断允许控制位0:允许中断1:禁止中断响应中断允许总控制位124、中断优先级寄存器IP(字节地址B8H)13四、定时计数器的四种工作方式定时器T0、T1的工作方式141、工作方式0(13位计数器)TR1=1启动计数GATE0=0时:GATE0=1时:TR1=1且INT1=1启动计数启停控制定时计数选择13位计数器15计数工作方式:最大的计数值为8192(213)预置的初值:X=213-N定时工作方式:定时时间的计算公式为:T=(213—计数初值)×晶振周期×12??如晶振频率为6MHZ/12MHZ,求最小定时时间和最小定时时间机器周期预置的初值:13212TX晶振周期16【例】单片机晶振频率为12MHz,若产生1ms定时,采用方式0,试计算初值X。X=1110000000011000B=E018H所以(TH)=E0H,(TL)=18H。解:预置的初值:131336221212110s8192-1210Hz127192D1C18H0001110000011000BTTX晶振频率晶振周期15141312111098///43210THTL172、工作方式1(16位计数器)16位计数器18计数工作方式:最大的计数值为65536(216)预置的初值:X=216-N定时工作方式:定时时间的计算公式为:T=(216—计数初值)×晶振周期×12??如晶振频率为6MHZ/12MHZ,求最小定时时间和最小定时时间预置的初值:X=216-T/(晶振周期×12)19【例】单片机晶振频率为12MHz,若产生1ms定时,采用方式1,试计算初值X。所以(TH)=FCH,(TL)=18H。解:预置的初值:161636221212110s655361210Hz1264536DFC18H1111110000011000BTTX晶振频率晶振周期1514131211109876543210THTL20【例】已知晶振频率fosc=12MHz,使用定时器0以工作方式1,在P1.0输出周期为2ms的连续正方波脉冲。试编写相关程序。解:计算初值:TH0=FCH,TL0=18H。ORG0000HLJMPMAIN;跳转到主程序ORG000BH;T0的中断入口地址LJMPDVT0;转向中断服务程序ORG0100HMAIN:MOVSP,#60H;设堆栈指针MOVTMOD,#01H;置T0工作于方式1//初始化TMODMOVTH0,#0FCH;装入计数初值//装入初值MOVTL0,#018HSETBET0;T0开中断//中断设置SETBEA;CPU开中断SETBTR0;启动T0//启动定时器SJMP$;等待中断DVT0:CPLP1.0;P1.0取反输出MOVTH0,#0FCH;重新装入计数值MOVTL0,#018HRETI;中断返回END21查询方式:ORG0000HLJMPMAIN;跳转到主程序ORG0100HMAIN:MOVTMOD,#01H;置T0工作于方式1//初始化TMODLOOP:MOVTH0,#0FCH;装入计数初值//装入初值MOVTL0,#018HSETBTR0;启动T0//启动定时器JNBTF0,$;查询TF0标志,如为1,说明T0溢出,;则往下执行CLRTF0;清除TF0中断标志位CLRTR0;T0溢出,关闭定时器CPLP1.0;P1.0状态取反SJMPLOOPEND223、工作方式2(自动装载初值的8位计数器)注:①适用于需要重复定时或计数的场合。②定时精度比较高,但定时时间较短。用作定时或计数时的加1计数器用作赋值(保存初值)。23例、已知晶振频率fosc=6MHz,要求使用定时器0以工作方式2产生100μs定时,在P1.0输出周期为200μs的连续正方波脉冲。试编写相关程序。解:计算初值:886622121210010s256610Hz12206D0CEH11001110BTTX晶振频率晶振周期MOVTMOD,#02H;设置定时器0为工作方式2MOVTH0,#0CEH;设置计数初值MOV,TL0,#0CEHSETBTR0;启动定时LOOP:JBCTF0,LOOP1;查询计数溢出AJMPLOOPLOOP1:CPLP1.0;输出方波,初值自动装入AJMPLOOP24例6-3当T0(P3.4)引脚上发生负跳变时,从P1.0引脚上输出一个周期为1ms的方波,如图所示。(系统时钟为6MHz)(1)工作方式选择T0为方式1计数,初值0FFFFH,即外部计数输入端T0(P3.4)发生一次负跳变时,T0加1且溢出,溢出标志TF0置“1”,发中断请求。在进入T0中断程序后,启动T1。T1定义为方式2定时。在T0脚发生一次负跳变后,启动T1每500s产生一次中断,在中断服务程序中对P1.0求反,使P1.0产生周期1ms的方波。25(2)计算T1初值设T1的初值为X:则(28-X)×2×10-6=5×10-4X=28-250=6=06H(3)程序设计ORG0000HRESET:LJMPMAIN;复位入口转主程序ORG000BHLJMPIT0P;转T0中断服务程序ORG001BHLJMPIT1P;转T1中断服务程序ORG0100HMAIN:MOVSP,#60HACALLPT0M2;调用对T0、T1初始化子程序LOOP:MOVC,F0JNCLOOP;T0没有产生中断,等待T0中断SETBET1;允许T1中断SETBTR1;启动T1SJMP$26PT0M2:MOVTMOD,#25H;初始化,T1为方式2定时,T0为方式1计数MOVTL0,#0FFH;T0置初值MOVTH0,#0FFHSETBET0;允许T0中断MOVTL1,#06H;T1置初值MOVTH1,#06HCLRF0SETBEA;开中断SETBTR0;启动T0RETIT0P:CLRTR0;T0中断服务程序,停止T0计数SETBF0;建立T0产生中断的标志RETIIT1P:CPLP1.0;T1中断服务,P1.0位取反RETIEND274、工作方式3为什么定时/计数器T1无工作方式3?两个独立的计数器注:当T1用作串行口的波特率发生器时,T0才工作在方式3。TH0被固定为1个独立的8位定时器(无外部计数功能),并使用T1的资源(TR1、TF1)TL0使用T0的资源(TR0、TF0、INT0、GATE、G/T)28例:假设某MCS-51应用系统的两个外中断源已被占用,设置T1工作在方式2,作波特率发生器用。现要求增加一个外部中断源,并控制P1.0引脚输出一个5kHz的方波。设系统时钟为12MHz。29(1)选择工作方式TL0为方式3计数,把T0引脚(P3.4)作附加的外中断输入端,TL0初值设为0FFH,当检测到T0引脚电平出现负跳变时,TL0溢出,申请中断,这相当于跳沿触发的外部中断源。TH0为8位方式3定时,控制P1.0输出5kHz的方波信号。30(2)初值计算TL0的初值设为0FFH。5kHz的方波的周期为200s,TH0的定时时间为100s。TH0初值X计算如下:(28-X)×2×10-6=1×10-4X=28-100=156=9CH(3)程序设计31ORG0000HLJMPMAINORG000BH;T0中断入口LJMPTL0INT;跳T0中断服务程序ORG001BH;在T0方式3时,TH0占用T1的中断LJMPTH0INT;跳TH0中断服务程序ORG0100HMAIN:MOVTMOD,#27H;T0方式3计数,T1方式2定时作串行口波特率发生器MOVTL0,#0FFH;置TL0初值MOVTH0,#9CH;置TH0初值MOVTL1,#dataL;data为波特率常数MOVTH1,#dataH32MOVTCON,#15H;启动T0或用SETBTR0MOVIE,#9FH;允许所有中断SJMP$TL0INT:MOVTL0,#0FFH;TL0中断服务程序,TL0重新装入初值SETBTR1;启动TH0定时RETITH0INT:MOVTH0,#9CH;TH0中断服务程序。TH0重新装入初值CPLP1.0RETI33
本文标题:89C51的定时器、计数器
链接地址:https://www.777doc.com/doc-7028975 .html