资源预览内容
第1页 / 共49页
第2页 / 共49页
第3页 / 共49页
第4页 / 共49页
第5页 / 共49页
第6页 / 共49页
第7页 / 共49页
第8页 / 共49页
第9页 / 共49页
第10页 / 共49页
亲,该文档总共49页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
单片机第单片机第6章定时器计数器章定时器计数器应用实例应用实例6.1 定时计数器的应用定时计数器的应用TR1位(或TR0位)=0,停止定时器/计数器工作。该位可由软件置“1”或清“0”。6.2定时器定时器/计数器的计数器的4种工作方式种工作方式4种工作方式分别介绍如下。6.2.1方式方式0M1、M0=00时,被设置为工作方式0,等效逻辑结构框图如图图6-4所示所示(以定时器/计数器T1为例,TMOD.5、TMOD.4=00)。9 9图6-4定时器/计数器方式0逻辑结构框图13位位计数器,由TLx x(x=0,1)低低5位位和THx高高8位位构成。TLx低5位溢出则向THx进位,THx计数溢出则把TCON中的溢出标志位TFx置“1”。10106.2.2方式方式1当M1、M0=01时,定时器/计数器工作于方式方式1,这时定时器/计数器的等效电路逻辑结构如图图6-5所示。方式方式1和方式和方式0的差别的差别仅仅在于计数器的位数计数器的位数不同,方式1为16位计数器位计数器,由THx高8位和TLx低8位构成(x=0,1),方式0则为13位计数器,有关控制状态位的含义(GATE、C/、TFx、TRx)与方式0相同。1112图图6-5定时器/计数器方式1逻辑结构框图126.2.3方式方式2方式0和方式1的最大特点是计数溢出后,计数器为全0。因此在循环定时或循环计数应用时就存在用指令反复装入计存在用指令反复装入计数初值的数初值的问题问题。这不仅影响定时精度,也给程序设计带来麻烦。方式2就是针对此问题而设置的。当M1、M0为10时,定时器/计数器处于工作方式2,这时定时器/计数器的等效逻辑结构如图图6-6所示所示(以定时器T1为例,x=1)。13定时器/计数器的方式方式2为自动恢复初值为自动恢复初值(初值自动装入)的8位位定时器定时器/计数器计数器。TLx(x=0,1)作为常数缓冲器,当TLx计数溢出时,在溢出标志TFx置“1”的同时,还自动将自动将THx中的初值送至中的初值送至TLx,使TLx从初值开始重新计数。定时器/计数器的方式2工作过程如图6-7所示。1415图6-6定时器/计数器方式2逻辑结构框图15图图6-7方式2工作过程该方式可省去用户软件中重装初值的指令执行时间,简化定时初值的计算方法,可以相当精确地确定相当精确地确定定时时间定时时间。16166.2.4方式方式3是为增加一个增加一个8位定时器位定时器/计数器计数器而设,使AT89S51单片机具有3个个定时器/计数器。方式方式3只适用于只适用于T0,T1不能工作在方式不能工作在方式3。T1处于方式3时相当于TR1=0,停止计数(此时T1可用来作为串行口波特率产生器)。1工作方式工作方式3下的下的T0TMOD的低的低2位为位为11时,T0的工作方式被选为方式3,各引脚与T0的逻辑关系如图图6-8所示所示。定时器/计数器T0分为两个独立的分为两个独立的8位计数器位计数器TL0和和TH0,TL0使用T0的状态控制位C/、GATE、TR0、1717TF0,而TH0被固定为一个固定为一个8位定时器位定时器(不能作为外部计数模式),并使用定时器T1的状态控制位TR1和TF1,同时占用定时器T1的中断请求源TF1。2T0工作在方式工作在方式3时时T1的各种工作方式的各种工作方式一般情况下,当当T1用作串行口的波特率发生器时,用作串行口的波特率发生器时,T0才工作才工作在方式在方式3。T0处于工作方式3时,T1可定为方式0、方式1和方式2,用来作为串行口的波特率发生器,或不需要中断的场合。1819图图6-8定时器/计数器T0方式3的逻辑结构框图19(1 1)T1T1工作在方式工作在方式0 0T1的控制字中M1、M0=00时,T1工作在方式0,工作示意图如图图6-9所示所示。20图6-9T0工作在方式3时T1为方式0的工作示意图20(2)T1工作在方式工作在方式1当T1的控制字中M1、M0=01时,T1工作在方式1,工作示意图如图6-10所示。21图图6-10T0工作在方式3时T1为方式1的工作示意图21(3)T1工作在方式工作在方式2当T1的控制字中M1、M0=10时,T1的工作方式为方式2,工作示意图如图6-11所示。22图图6-11T0工作在方式3时T1为方式2的工作示意图22(4)T1设置在方式设置在方式3当T0设置在方式3,再把T1也设成方式3,此时T1停止计数停止计数。6.3对外部输入的计数信号的要求对外部输入的计数信号的要求当定时器/计数器工作在计数器模式时,计数脉冲来自外部输入引脚T0或T1。当输入信号产生负跳变时,计数器的值增1。每个机器周期每个机器周期的S5P2期间,都对外部输入引脚对外部输入引脚T0或或T1进行采样。如在第一个机器周期中采得的值为1,而在下一个机器周期中采得的值为0,则在紧跟着的再下一个机器周期S3P123期间,计数器加1。由于确认一次确认一次负跳变负跳变要花要花2个个机器周期机器周期,因此外部输入的计数脉冲的外部输入的计数脉冲的最高频率最高频率为系统振荡器频率的为系统振荡器频率的1/24。例如,选用6MHz频率的晶体,允许输入的脉冲频率最高为250kHz。如果选用12MHz频率的晶体,则可输入最高频率为500kHz的外部脉冲。对于外部输入信号的占空比占空比并没有什么限制并没有什么限制,但为了确保某一给定电平在变化之前能被采样一次,则这一电平至少要至少要保持一个机器周期保持一个机器周期。24故对外部输入信号的要求如图图6-12所示,图中,Tcy为机器周期。25图6-12对外部计数输入信号的要求25具体功能要求:控制具体功能要求:控制8 8个个LEDLED,亮灭各,亮灭各50ms50ms。已知:已知:fosc=12MHz,机器周期,机器周期Tcy=12/fosc=1us。思路:实现思路:实现50ms50ms定时,定时时间每到一次,定时,定时时间每到一次,P1P1取反取反D7D6D5D4D3D2D1D0GATEC/TM1M0GATEC/TM1M0M1、M0:定时器/计数器工作方式选择位。T1T0M1 M0 方式方式说说 明明(x=0或或1)最大计数值最大计数值最大定时时间最大定时时间(Tcy=1 us)0 0013 位定时器位定时器/计数器计数器(THx的的 8 位和位和TLx的低的低 5 位)位) 8192(213)8192s0 11Tx都为都为16 位定时器位定时器/计数器计数器 65536(216)65536s1 02Tx为自动重赋初值的为自动重赋初值的8 位定时位定时器器/计数器计数器 256(28)256s1 13 T0 分成两个独立的分成两个独立的 8 位定时器位定时器/计数器计数器, T1 在方式在方式 3 时停止工时停止工作作 256(28)256s第第1步:工作方式寄存器步:工作方式寄存器TMOD的设置的设置定时定时/ /计数器使用方法计数器使用方法101101T0、T1工作方式工作方式1的逻辑结构(的逻辑结构(M1M0=01)D7D6D5D4D3D2D1D0GATEC/TM1M0GATEC/TM1M0:定时或计数功能选择位定时或计数功能选择位1:计数功能;计数功能;0:定时功能。定时功能。C/T定时器定时器/计数器方式控制寄存器计数器方式控制寄存器TMOD外部引脚外部引脚Tx(x同时取同时取0或或1)GATE:门控信号。门控信号。GATE=1时,常用来测试时,常用来测试INTX引脚上正脉冲的宽度。引脚上正脉冲的宽度。绝大多数情况:绝大多数情况:GATE=0T1T0 计数器的计数个数由下式确定:计数器的计数个数由下式确定: N=2N=21616-X=65536-X (X-X=65536-X (X:初值:初值) ) 定时器的定时时间由下式确定定时器的定时时间由下式确定: : t=NTt=NTcy cy = =(65536-X65536-X)T Tcycy 算出算出X后后两种处理方式两种处理方式1)THx=X/256TLx=X%2562)X转化成转化成16进制进制高高8位赋予位赋予THx,低,低8位赋予位赋予TLx第第2步:为步:为THx、TLx赋初值赋初值TRx:GATE=0时,启停相应时,启停相应TxTRx=1:启动;:启动;TRx=0:停止;停止;TFx:Tx溢出标志位,溢出标志位,硬件置位;硬件置位;注意:注意:CPU查询到查询到TFx=1后,后,需由程序清零需由程序清零TFx四种工作方式中,四种工作方式中,只有方式只有方式2 2为为TxTx自动重赋初值!自动重赋初值!011第第3步:设置步:设置控制寄存器控制寄存器TCOND7D6D5D4D3D2D1D0TF1TR1TR0TF0IE1IT1IT0IE0注意:注意:定时到后处理程序定时到后处理程序无论哪种方式都需要考虑是否需无论哪种方式都需要考虑是否需要重赋初值:只有方式要重赋初值:只有方式2 2为为TxTx自动重赋初值!自动重赋初值!第第4步:定时时间到后处理程序的编写步:定时时间到后处理程序的编写查询方式:查询方式:循环检测循环检测TFx=1?若为?若为1,清,清0进行定时时间到后进行定时时间到后处理程序。处理程序。中断方式:中断方式:在启动定时器前,打开定时器中断,在启动定时器前,打开定时器中断,TFx=1时硬件自时硬件自动清标志位,进入中断进行定时时间到后处理程序。动清标志位,进入中断进行定时时间到后处理程序。参考程序一参考程序一(查询方式):查询方式):#includevoidmain()TMOD=0x01;TH0= (65536-50000)/256(65536-50000)/256;TL0= (65536-50000)%256 (65536-50000)%256;TR0=1;while(1)if(TF0=1)TH0= (65536-50000)/256(65536-50000)/256;TL0= (65536-50000)%256 (65536-50000)%256;TF0=0;P1=P1;#includeChari=100;/*给变量给变量i赋初值赋初值*/voidmain()TMOD=0x01;/*设置定时器设置定时器T0为方式为方式1*/TH0= (65536-50000)/256 (65536-50000)/256;/*向向TH0写入初值的高写入初值的高8位位*/TL0= (65536-50000)%256 (65536-50000)%256 ;/*向向TL0写入初值的低写入初值的低8位位*/P1=0x00;/*P1口口8只只LED点亮点亮*/EA=1;/*总中断允许总中断允许*/ET0=1;/*定时器定时器T0中断允许中断允许*/TR0=1;/*启动定时器启动定时器T0*/while(1);/*无穷循环,等待定时中断无穷循环,等待定时中断*/参考程序二参考程序二(中断方式):中断方式):33/*以下为定时器以下为定时器T0的中断服务程序的中断服务程序*/voidT0_int(void)interrupt1TH0= (65536-50000)/256 (65536-50000)/256 ;/*给给T0装入初值,计装入初值,计15536个数后,个数后,T0溢出溢出*/TL0= (65536-50000)%256 (65536-50000)%256 ;P1=P1;/*P1口按位取反口按位取反*/34while(1)if(TF0=1)TH0=(65536-50000)/256;TL0=(65536-50000)%256;TF0=0;n+;扩展:将扩展:将LED的亮灭时间调整为的亮灭时间调整为1分钟分钟if(n=20)P1=P1;n=0;参考程序参考程序(查询方式):查询方式):#includecharn=0;voidmain()TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;#includeCharn=20;/*给变量给变量i赋初值赋初值*/voidmain()TMOD=0x01;/*设置定时器设置定时器T0为方式为方式1*/TH0= (65536-50000)/256 (65536-50000)/256;/*向向TH0写入初值的高写入初值的高8位位*/TL0= (65536-50000)%256 (65536-50000)%256 ;/*向向TL0写入初值的低写入初值的低8位位*/P1=0x00;/*P1口口8只只LED点亮点亮*/EA=1;/*总中断允许总中断允许*/ET0=1;/*定时器定时器T0中断允许中断允许*/TR0=1;/*启动定时器启动定时器T0*/while(1);/*无穷循环,等待定时中断无穷循环,等待定时中断*/参考程序二参考程序二(中断方式):中断方式):36/*以下为定时器以下为定时器T0的中断服务程序的中断服务程序*/voidT0_int(void)interrupt1TH0= (65536-50000)/256 (65536-50000)/256 ;/*给给T0装入初值,计装入初值,计15536个数后,个数后,T0溢出溢出*/TL0= (65536-50000)%256 (65536-50000)%256 ;i-;/*循环次数减循环次数减1*/if(i=0)P1=P1;/*P1口按位取反口按位取反*/i=20;/*重新设置循环次数重新设置循环次数*/376.4 6.4 定时器定时器/ /计数器的编程和应用计数器的编程和应用4 4种方式,方式种方式,方式0 0与方式与方式1 1基本相同,只是计数位数不同。方基本相同,只是计数位数不同。方式式0 0初值计算复杂,初值计算复杂,一般不用方式一般不用方式0 0,而,而用方式用方式1 1。6.4.1 6.4.1 方式方式1 1的应用的应用【例例6-16-1】假设系统时钟频率采用假设系统时钟频率采用6MHz6MHz,在在P1.0P1.0引脚上输出引脚上输出一个一个周期为周期为2ms2ms的的方波方波,如,如图图6-136-13所示。所示。38图图6-13P1.0引脚上输出周期为引脚上输出周期为2ms的方波的方波38基本思想基本思想:方波周期:方波周期T0T0确定,确定,T0T0每隔每隔1ms1ms计数溢出计数溢出1 1次,次,即即T0T0每隔每隔1ms1ms产生一次中断,产生一次中断,CPUCPU响应中断后,在中断服务响应中断后,在中断服务子程序中对子程序中对P1.0P1.0取反取反, ,如如图图6-136-13所示。为此要做如下几步所示。为此要做如下几步工作。工作。 (1 1)计算计数初值)计算计数初值X X机器周期机器周期=2=2 s=2s=2 10106 6s s设需要设需要装入装入T0T0的的初值为初值为X X,则有,则有(2(21616X X) ) 2 2 10106 6=1=1 10103 3,2 21616X X=500=500,X X=65036=65036。X X化为十六进制数,即:化为十六进制数,即:65036=FE0CH65036=FE0CH。T0T0的的初值初值为为TH0 =FEHTH0 =FEH,TL0 =0CHTL0 =0CH。3939(2)初始化程序设计)初始化程序设计采用定时器中断方式中断方式工作。包括定时器初始化和中断系统初始化,主要是对寄存器寄存器IP、IE、TCON、TMOD的相应位进行正确的设置,并将计数初值送入定时器中。(3)程序设计)程序设计中断服务子程序除了完成所要求的产生方波产生方波的工作之外,还要注意将计数初值重新装入定时器初值重新装入定时器,为下一次产生中断做准备。本例,主程序主程序用一条转至自身的短跳转指令来代替。4040参考程序如下:参考程序如下:ORG0000H;程序入口RESET:AJMPMAIN;转主程序ORG000BH;T0中断入口AJMPIT0P;转T0中断处理程序IT0PORG0100H;主程序入口MAIN: MOVSP,#60H;设堆栈指针MOVTMOD,#01H;设置T0为方式1定时ACALLPT0M0;调用初始化子程序PT0M0HERE:AJMPHERE;原地循环,等待中断4141PT0M0:MOVTL0,#0CH;T0初始化,装初值的低8位MOVTH0,#0FEH;装初值的高8位SETBET0;允许T0中断SETBEA;总中断允许SETBTR0;启动T0RETIT0P:MOVTL0,#0CH;中断子程序,T0重装初值MOVTH0,#0FEHCPLP1.0;P1.0的状态取反RETI程序说明:程序说明:当单片机复位时,从程序入口0000H跳向主程序MAIN处执行。其中调用了T0初始化子程序PT0M0。4242子程序返回后,程序执行程序执行“AJMPHERE”指令,则循环指令,则循环等待。等待。当响应响应T0定时中断定时中断时,则跳向T0中断入口,再从T0中断入口跳向IT0P标号处执行T0中断服务子程序。当执行完中断返回的指令执行完中断返回的指令“RETI”后,又返回断点处继续执行循环指令“AJMPHERE”。在实际的程序中,“AJMPHERE”实际上是一段主程序。当下一次定时器T0的1ms定时中断发生时,再跳向T0中断入口,从而重复执行上述过程。如CPU不做其他工作,也可用查询方式也可用查询方式进行控制,程序要简单得多。4343查询方式参考程序:查询方式参考程序:MOVTMOD,#01H;设置T0为方式1LOOP: MOVTH0,#0FEH;T0置初值MOVTL0,#0CHSETBTR0;接通T0LOOP1:JNBTF0,LOOP1;查TF0,TF0=0,T0未溢出;TF0=1,T0溢出,CLRTR0;T0溢出,关断T0CPLP1.0;P1.0的状态求反SJMPLOOP查询程序虽简单程序虽简单,但CPU必须要不断查询TF0标志,工作效率低效率低。4444【例例6-2】系统时钟为6MHz,编写定时器T0产生1s定时的程序。基本思想:基本思想:采用定时器模式。因定时时间较长,首先确定采用哪一种工作方式采用哪一种工作方式。时钟为6MHz的条件下,定时器各种工作方式最长可定时时间:方式方式0最长可定时16.384ms;方式方式1最长可定时131.072ms;方式方式2最长可定时512 s。由上可见,可选选方式方式1,每隔,每隔100ms中断一次中断一次,中断中断10次次为1s。4545(1)计算计数初值)计算计数初值X因为(216X)2106=101,所以X=15536=3CB0H。因此TH0=3CH,TL0=B0H。(2)10次计数的实现次计数的实现对于中断10次的计数,采用B寄存器寄存器作为中断次数计数器中断次数计数器。(3)程序设计)程序设计参考程序如下:ORG0000H;程序运行入口RESET:LJMPMAIN;跳向主程序入口MAINORG000BH;T0的中断入口LJMPIT0P;转T0中断处理子程序IT0PORG1000H;主程序入口4646MAIN:MOVSP,#60H;设堆栈指针MOVB,#0AH;设循环次数10次MOVTMOD,#01H;设置T0工作在方式1定时MOV TL0,#0B0H;给T0设初值MOV TH0,#3CHSETBET0;允许T0中断SETBEA;总中断允许SETBTR0;启动T0HERE: SJMPHERE;原地循环,等待中断4747IT0P:MOVTL0,#0B0H ;T0中断子程序,T0重装初值MOVTH0,#3CHDJNZB,RTURN;B中断次数计数,减1非0则;中断返回CLRTR0;1s定时时间到,停止T0工作SETBF0;1s定时时间到标志F0置1RTURN:RETI程序说明:程序说明:不论1s定时时间是否已到,都返回到“SJMPHERE”指令处。“SJMPHERE”指令实际是一段主程序。在这段主程序中再通过对再通过对F0标志标志的的判定判定,可知1s定时是否到,再进行具体处理。4848结束语结束语谢谢大家聆听!谢谢大家聆听!49
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号