《《定时器计数器习题》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《定时器计数器习题》PPT课件.ppt(41页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1第第6 6章章 定时器定时器/计数器习题计数器习题126.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,在引脚上输出一个在引脚上输出一个周期为周期为2ms2ms的的方波方波,如,如图图6-136-13所示。所示。2图图6-13引脚上输出周期为引
2、脚上输出周期为2ms的方波的方波3基本思想基本思想:方波周期:方波周期T0T0确定,确定,T0T0每隔每隔1ms1ms计数溢出计数溢出1 1次,次,即即T0T0每隔每隔1ms1ms产生一次中断,产生一次中断,CPUCPU响应中断后,在中断服务响应中断后,在中断服务子程序中对子程序中对取反取反,如如图图6-136-13所示。为此要做如下几步工作。所示。为此要做如下几步工作。(1 1)计算计数初值)计算计数初值X X机器周期机器周期=2=2 s=2s=2 1010 6 6s s设需要设需要装入装入T0T0的的初值为初值为X X,则有,则有(2(21616 X X)2 2 1010 6 6=1=1
3、1010 3 3,2 21616 X X=500=500,X X=65036=65036。X X化为十六进制数,即:化为十六进制数,即:65036=FE0CH65036=FE0CH。T0T0的的初值初值为为TH0=FEHTH0=FEH,TL0=0CHTL0=0CH。34(2)初始化程序设计)初始化程序设计采用定时器中断方式中断方式工作。包括定时器初始化和中断系统初始化,主要是对寄存器寄存器IP、IE、TCON、TMOD的相应位进行正确的设置,并将计数初值送入定时器中。(3)程序设计)程序设计中断服务子程序除了完成所要求的产生方波产生方波的工作之外,还要注意将计数初值重新装入定时器初值重新装入定
4、时器,为下一次产生中断做准备。本例,主程序主程序用一条转至自身的短跳转指令来代替。45参考程序如下:参考程序如下:ORG0000H;程序入口RESET:AJMPMAIN;转主程序ORG000BH;T0中断入口AJMPIT0P;转T0中断处理程序IT0PORG0100H;主程序入口MAIN:MOVSP,#60H;设堆栈指针MOVTMOD,#01H;设置T0为方式1定时ACALLPT0M0;调用初始化子程序PT0M0HERE:AJMPHERE;原地循环,等待中断56PT0M0:MOVTL0,#0CH;T0初始化,装初值的低8位MOVTH0,#0FEH;装初值的高8位SETBET0;允许T0中断SE
5、TBEA;总中断允许SETBTR0;启动T0RETIT0P:MOVTL0,#0CH;中断子程序,T0重装初值MOVTH0,#0FEHCPLP1.0;的状态取反RETI程序说明:程序说明:当单片机复位时,从程序入口0000H跳向主程序MAIN处执行。其中调用了T0初始化子程序PT0M0。67子程序返回后,程序执行程序执行“AJMPHERE”指令,则循环指令,则循环等待。等待。当响应响应T0定时中断定时中断时,则跳向T0中断入口,再从T0中断入口跳向IT0P标号处执行T0中断服务子程序。当执行完中断返回的指令执行完中断返回的指令“RETI”后,又返回断点处继续执行循环指令“AJMPHERE”。在实
6、际的程序中,“AJMPHERE”实际上是一段主程序。当下一次定时器T0的1ms定时中断发生时,再跳向T0中断入口,从而重复执行上述过程。如CPU不做其他工作,也可用查询方式也可用查询方式进行控制,程序要简单得多。78查询方式参考程序:查询方式参考程序:MOVTMOD,#01H;设置T0为方式1LOOP:MOVTH0,#0FEH;T0置初值MOVTL0,#0CHSETBTR0;接通T0LOOP1:JNBTF0,LOOP1;查TF0,TF0=0,T0未溢出;TF0=1,T0溢出,CLRTR0;T0溢出,关断T0CPLP1.0;的状态求反SJMPLOOP查询程序虽简单程序虽简单,但CPU必须要不断查
7、询TF0标志,工作效率低效率低。89【例例6-2】系统时钟为6MHz,编写定时器T0产生1s定时的程序。基本思想:基本思想:采用定时器模式。因定时时间较长,首先确定采用哪一种工作方式采用哪一种工作方式。时钟为6MHz的条件下,定时器各种工作方式最长可定时时间:方式方式0最长可定时;方式方式1最长可定时;方式方式2最长可定时512 s。由上可见,可选选方式方式1,每隔,每隔100ms中断一次中断一次,中断中断10次次为1s。910(1)计算计数初值)计算计数初值X因为(216X)2106=101,所以X=15536=3CB0H。因此TH0=3CH,TL0=B0H。(2)10次计数的实现次计数的实
8、现对于中断10次的计数,采用B寄存器寄存器作为中断次数计数器中断次数计数器。(3)程序设计)程序设计参考程序如下:ORG0000H;程序运行入口RESET:LJMPMAIN;跳向主程序入口MAINORG000BH;T0的中断入口LJMPIT0P;转T0中断处理子程序IT0PORG1000H;主程序入口1011MAIN:MOVSP,#60H;设堆栈指针MOVB,#0AH;设循环次数10次MOVTMOD,#01H;设置T0工作在方式1定时MOV TL0,#0B0H;给T0设初值MOV TH0,#3CHSETBET0;允许T0中断SETBEA;总中断允许SETBTR0;启动T0HERE:SJMPHE
9、RE;原地循环,等待中断1112IT0P:MOVTL0,#0B0H;T0中断子程序,T0重装初值MOVTH0,#3CHDJNZB,RTURN;B中断次数计数,减1非0则;中断返回CLRTR0;1s定时时间到,停止T0工作SETBF0;1s定时时间到标志F0置1RTURN:RETI程序说明:程序说明:不论1s定时时间是否已到,都返回到“SJMPHERE”指令处。“SJMPHERE”指令实际是一段主程序。在这段主程序中再通过对再通过对F0标志标志的的判定判定,可知1s定时是否到,再进行具体处理。12136.4.2方式方式2的应用的应用方式2是一个可以自动重新装载初值自动重新装载初值的8位计数器/定
10、时器。可省去省去重装初值指令。当某个定时器/计数器不使用时,可扩展一个扩展一个负跳沿触负跳沿触发发的的外中断源外中断源。【例例6-36-3】扩展一个负跳沿触发的外部中断源负跳沿触发的外部中断源,把定时器/计数器T0脚脚作为外部中断请求输入端外部中断请求输入端,溢出标志TF0作为外中断请求标志。基本思想:基本思想:设为方式2(自动装入常数方式)计数模式,TH0、TL0初值初值均为0FFH。当T0脚发生负跳变时,T0计数溢出,TF0置“1”,单片机发出中断请求。1314初始化程序:ORG0000HAJMPIINI;跳到初始化程序ORG000BHAJMPIT0P;跳到外中断处理程序IINI:MOV
11、TMOD,#06H;设置T0为方式2MOVTL0,#0FFH;设T0初值MOVTH0,#0FFHSETBET0;允许T0中断SETBEA;总中断允许SETBTR0;启动T0IT0P:外中断处理程序段外中断处理程序段1415程序说明:程序说明:当连接在(T0脚)的外部中断请求输入脚电平发生负跳变时,TL0加1,产生溢出,TF0置“1”,向单片机发出中断请求,同时TH0的内容的内容0FFH送TL0,即TL0恢复初值0FFH。脚相当于一个脚相当于一个负跳沿负跳沿触发的触发的外中断请求源外中断请求源输入输入。对也可做类似的处理。【例例6-4】当T0()引脚上发生负跳变时,作为引脚产生方波的启动信号。开
12、始从脚脚上输出一个周期为周期为1ms的方方波波,如图图6-14所示所示(系统时钟6MHz)。1516基本思想:基本思想:T0设为方式方式1计数计数,初值初值为FFFFH。当外部计数输入端T0()发生一次负跳变发生一次负跳变时,T0加1且溢出溢出,溢出标志TF0置“1”,向CPU发出中断请求,此时T0相当于一个负跳沿触发的外部中断源。进入T0中断程序后,F0标志置“1”,说明T0引脚上已接收过负跳变信号。T1定义为方式方式2定时定时。在T0引脚产生一次负跳变后,启动T1每每500 s产生一次中断产生一次中断,在中断中断服务子程序服务子程序中对求反求反,使产生周期周期1ms的方波。由于省去重新装初
13、值指令,所以可产生精确精确的定时时间。161717图6-14 6-14 负跳跳变触触发输出一个周期出一个周期为1ms1ms的方波的方波18(1)计算)计算T1的初值的初值设T1的初值为x,则(28x)2106=5104x=28250=6=06H(2)程序设计)程序设计参考程序参考程序:ORG0000H;程序入口RESET:LJMPMAIN;跳向主程序MAINORG000BH;T0的中断入口LJMPIT0P;转T0中断服务程序ORG001BH;T1的中断入口1819LJMPIT1P;转T1中断服务程序ORG0100H;主程序入口MAIN:MOVSP,#60H;设堆栈指针ACALLPT0M2;调用
14、对T0,T1初始化子程序LOOP:MOVC,F0;T0是否是否产产生过中断,若产生;过,F0置1JNCLOOP;T0未产生中断,C=0,则跳;到LOOP,等待T0中断SETBET1;允许T1产生定时中断SETBTR1;启动T1HERE:AJMPHERE1920PT0M2:MOVTMOD,#26H;对T0,T1初始化,T0方式1;计数,T1方式2定时MOVTL0,#0FFH;T0置初值MOVTH0,#0FFHSETBET0;允许T0中断MOVTL1,#06H;T1置初值MOVTH1,#06HCLR F0;把T0已发生中断标志F0清0SETBEA;总中断允许SETBTR0;启动T0RET2021I
15、T0P:CLRTR0;T0中断服务程序中断服务程序,停止T0计数SETBF0;把T0引脚接收过负脉冲标志F0置1,;即接收过负跳变RETIIT1P:CPLP1.0;T1中断服务程序中断服务程序,位取反 RETI程序说明:程序说明:当单片机复位时,从0000H跳向主程序MAIN处执行程序。其中调用了对T0,T1初始化子程序PT0M2。子程序返回后执行标号LOOP处指令,循环等待T0引脚上负脉冲的到来。由于负脉冲到来的标志位F0的复位初始值为0,所以程序就在标号LOOP处循环等待。2122当T0()脚()脚发生负跳变发生负跳变时,由于T0计数溢出,则跳向T0中断服务子程序。此时停止T0计数,并把T
16、0引脚接收过负脉冲的标志F0置1。当中断返回中断返回时,由于F0已被置已被置1,则程序跳出LOOP处的循环等待。此时执行指令来允许T1中断,并启动T1定时,然后执行“AJMPHERE”指令,循环等待,等待等待T1的的500 s定时中断定时中断到来。当T1的500s定时中断产生时,则进入则进入T1的中断服务的中断服务子程序子程序IT1P,把脚电平取反。由于是自动装初值,省去对T1重装初值指令。中断返回后,到“AJMPHERE”处等待T1的500s定时中断。如此重复,即得到图6-14波形。2223【例例6-5】利用定时器T1的方式方式2计数计数,每计满计满100个个数,将取反。本例是方式方式2计数
17、模式计数模式的应用举例。(1)选择工作方式)选择工作方式外部信号由T1()引脚输入,每发生一次负跳变计数器便加1,每输入100个脉冲,计数器将产生溢出中断,在中断服务程序中将取反一次。T1工作在方式方式2的控制字TMOD=60H。不使用T0时,TMOD低4位任取,但不能使T0为方式3,这里取全0。(2)计算)计算T1的初值的初值X=28100=156=9CHTL1的初值为9CH,重装初值寄存器TH1=9CH。2324(3)参考程序:)参考程序:ORG0000H;程序运行入口LJMP MAIN;跳向主程序MAINORG001BH;T1中断服务程序入口CPLP1.0;位取反RETIORG0100H
18、;主程序入口MAIN:MOV TMOD,#60H;设置T1为方式2计数MOVTL0,#9CH;T0置初值MOVTH0,#9CHSETBTR1;启动T1HERE:AJMPHEREEND2425程序说明:程序说明:由于T1的中断服务子程序只有两条指令,不超过8个字节,所以进入T1中断服务程序入口后,没有选择再跳转。6.4.3方式方式3的应用的应用方式方式3下的下的T0和和T1大不相同大不相同。T0工作在方式3,TL0和TH0被分成两个独立的8位定时器/计数器。其中,TL0可作为8位的定时器/计数器,而TH0只能作为8位的定时器。此时T1只能工作在方式0、1或2。一般情况下,当T1用作串行口波特率发
19、生器串行口波特率发生器时,T0才设置为方式方式3。此时,常把定时器T1设置为方式方式2,用作波特率发生器。2526【例例6-6】假设某AT89S51单片机应用系统的两个外部中断源已被占用,设置T1工作在方式工作在方式2,用作波特率发生,用作波特率发生器器。现要求增加一个要求增加一个外部中断源外部中断源,并控制引脚输出一个控制引脚输出一个5kHz(周期为(周期为200 s)的)的方波方波。设时钟为12MHz。基本思想:基本思想:设置TL0工作在方式3计数模式,TL0的初值设为0FFH,当检测到检测到T0脚信号出现脚信号出现负跳变负跳变时,TL0溢出,同时向CPU申请中断,这里T0脚作为一个负跳沿
20、触发的外脚作为一个负跳沿触发的外部中断请求输入端部中断请求输入端。在中断处理子程序中,启动TH0,TH0事先被设置为方式方式3的的100 s定时定时,从而控制输出周控制输出周期为期为200 s的方波信号的方波信号,如图图6-15所示所示。262727图6-15 6-15 定定时器器输出的方波信号出的方波信号28(1)初值)初值X计算计算TL0的初值设为0FFH。5kHz方波方波的周期为周期为200 s,因此TH0的定时时间为100 s。初值X计算:(28X)1106=1104 X=28100=156=9CH(2)程序设计)程序设计ORG0000HLJMPMAINORG000BH;TL0中断入口
21、,TL0使用T0的中断LJMPTL0INT;跳向TL0中断服务程序,TL0占用T0中断2829ORG001BH;TH0中断入口,T1为方式3时,TH0;使用了T1的中断LJMPTH0INT;跳向TH0中断服务程序ORG0100H;主程序入口MAIN:MOVTMOD,#27H;T0方式3,T1方式2定时作串;行口波特率发生器MOVTL0,#0FFH;置TL0初值MOVTH0,#9CH;置TH0初值MOVTL1,#datal;TL1装入串口波特率常数MOV TH1,#datah;TH1装入串口波特率常数MOV TCON,#15H;允许T0中断2930MOVIE,#9FH;设置中断允许,总中断允许,
22、;TH0、TL0中断允许HERE:AJMPHERE;循环等待TL0INT:MOVTL0,#0FFH;TL0中断服务处理子程序,TL0;重新装入初值SETBTR1;开始启动TH0定时RETITH0INT:MOVTH0,#9CH;TH0中断服务程序,TH0重新;装入初值CPLP1.0;位取反输出RETI 30316.4.4门控制位门控制位GATEx的应用的应用测量脉冲宽度测量脉冲宽度介绍门控制位GATE的具体应用,测量()引脚上正脉冲的宽度。【例例6-7】门控位GATE1可使T1的启动计数受的控制,当GATE1=1,TR1=1时,时,只有只有INT1*引脚输入高引脚输入高电平时电平时,T1才被允许
23、计数才被允许计数。可测量引脚()上正脉冲的宽度。其方法如图图6-16所示所示。31图6-16利用利用GATE位位测量正脉冲的量正脉冲的宽度度32参考程序:ORG0000HRESET:AJMPMAIN;复位入口转主程序ORG0100H;主程序入口MAIN:MOVSP,#60HMOVTMOD,#90H;向TMOD写控制字,T1为方;式1定时,GATE1=1MOV TL1,#00HMOVTH1,#00HLOOP0:,LOOP0;等待低SETBTR1;如为低,启动T13233LOOP1:,LOOP1;等待升高LOOP2:,LOOP2;为高,此时计数器计数,;等待降低CLRTR1;停止T1计数MOVA,
24、TL1;T1计数值送A;将T1计数值送显示器END执行以上程序,使引脚上出现的正脉冲宽度正脉冲宽度以机机器周期数器周期数的形式显示在显示器上。33将A中的T1计数值送到显示器显示346.4.5实时时钟的设计实时时钟的设计介绍使用定时器/计数器实现时钟。1实现实时时钟的基本思想实现实时时钟的基本思想最小计时单位是秒秒,如何获得1s的定时时间的定时时间呢?从前面介绍知,定时器方式方式1,最大定时时间也只能131ms。可将定时器的定时时间定为100ms,中断方式进行溢出次数的累计,计满计满10次次,即得秒计时。而计数10次可用循环程序的方法实现。初值的计算如例6-2。片内RAM规定3个单元个单元为秒
25、、分、时秒、分、时单元:42H:“秒秒”单元;41H:“分分”单元;40H:“时时”单元3435从秒到分,从分到时从秒到分,从分到时是通过软件累加通过软件累加并比较来实现。要求每满1秒,则“秒”单元42H中的内容加1;“秒”单元满60,则“分”单元41H中的内容加1;“分”单元满60,则“时”单元40H中的内容加1;“时”单元满24,则将42H、41H、40H的内容全部清“0”。2程序设计程序设计(1)主程序设计)主程序设计进行定时器T0初始化,并启动T0,然后反复调用显示子程序,等待100ms中断到来。流程如图6-17所示。(2)中断服务程序的设计)中断服务程序的设计实现秒、分、时秒、分、时
26、的计时处理。流程如图6-18所示。353636图6-17时钟主程序流程主程序流程3737图6-18中断服中断服务程序流程程序流程38参考程序:参考程序:ORG0000HAJMPMAIN;上电,跳向主程序ORG 000BH;T0的中断入口AJMP IT0PORG1000HMAIN:MOV TMOD,#01H;设T0为方式1MOV 20H,#0AH;装入中断次数CLRAMOV40H,A;“时”单元清“0”MOV 41H,A;“分”单元清“0”MOV 42H,A;“秒”单元清“0”3839SETBET0;允许T0申请中断SETBEA;总中断允许MOV TH0,#3CH;给T0装入计数初值MOV TL
27、0,#0B0HSETBTR0;启动T0HERE:SJMPHERE;等中断(也可调用显示子程序)IT0P:PUSHPSW;T0中断子程序入口,保护现场PUSHAccMOV TH0,#3CH;重新装入初值MOV TL0,#0B0HDJNZ20H,RETURN;1秒秒时时间未到,返回MOV 20H,#0AH;重置中断次数MOV A,#01H;“秒”单元增13940ADDA,42HDAA;“秒”单元十进制调整MOV 42H,A;“秒”的BCD码存回“秒”单元CJNE A,#60H,RETURN;是否到60秒,未到则返回MOV 42H,#00H;计满60秒,“秒”单元清“0”MOV A,#01H;“分”单元增1ADDA,41HDAA;“分”单元十进制调整MOV 41H,A;“分”的BCD码存回“分”单元CJNE A,#60H,RETURN;是否到60分,未到则返回4041MOV 41H,#00H;计满60分,“分”单元清“0”MOV A,#01H;“时”单元增1ADDA,40HDAA;“时”单元十进制调整MOV 40H,ACJNE A,#24H,RETURN;是否到24小时,未;到则返回MOV 40H,#00H;到24小时,“时”单元清“0”RETURN:POP Acc;恢复现场POPPSWRETI;中断返回END41
限制150内