资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,*,*,单片机原理与应用,第7章,定时器/计数器,7.1 定时器/计数器的功能和结构,7.2 定时器/计数器的工作原理,7.3 定时器/计数器的工作方式,7.4 定时器/计数器的编程,本章要点:,第7章,定时器,/计数器,7.1 定时器/计数器的功能和结构,7.1.1定时器/计数器的功能,7.1.2定时器/计数器的结构,第7章,定时器,/计数器,7.1.2定时器/计数器的结构,第7章,定时器,/计数器,7.2 定时器/计数器的工作原理,第7章,定时器,/计数器,7.3 定时器/计数器的工作方式,7.3.1工作方式寄存器-TMOD,第7章,定时器,/计数器,(1)GATE:门控位,实现选通控制,GATE0时,只需用软件使TR0(或TR1)置1就可以启动定时器,而不管INT0(或INT1)的电平是高电平还是低电平;,GATE=1时,只有在INT0(或INT1)引脚为高电平,而且TR0(或TR1)置1时,才能启动定时器工作.,(2)C/T:计数/定时方式选择位,C/T0,设置为定时方式,定时器计数单片机内部计数脉冲;当C/T1,设置为计数功能,计数器对来自T0(P3.4)或T1(P3.5)端的外部脉冲计数。,7.3.1工作方式寄存器-TMOD,第7章,定时器,/计数器,(3)M1 M0:这两位指定定时器/计数器的工作方式,可形成四种编码,M,1,M,0,工作方式,功 能 说 明,0,0,方式0,13位计数器,0,1,方式1,16位计数器,1,0,方式2,自动再装入8位计数器,1,1,方式3,定时器0:分成两个8位计数器,7.3.1工作方式寄存器-TMOD,第7章,定时器,/计数器,1.方式0,7.3.2 定时器/计数器工作方式,第7章,定时器,/计数器,2.方式1,7.3.2 定时器/计数器工作方式,第7章,定时器,/计数器,3.方式2,7.3.2 定时器/计数器工作方式,第7章,定时器,/计数器,4.方式3,7.3.2 定时器/计数器工作方式,第7章,定时器,/计数器,7.3.4 计数初值的计算,由于定时器/计数器以加1方式计数,假设计数值为x,则应装入定时器/计数器的初值为:,(n为不同方式下计数器的位数),第7章,定时器,/计数器,每个机器周期包括12个振荡周期,若晶振频率,为6MHz,一个机器周期:,计数个数为:,其中Tp为机器周期,则应装入的计数初值为:,【例】要求定时为1mS,晶振频率12MHz。,7.3.4 计数初值的计算,第7章,定时器,/计数器,应注意以下两点:,(1)正确编制定时器/计数器的初始化程序,包括定义TMOD、写入定时初值、设置中断系统和启动定时器/计数器运行等。,(2)正确编制定时器/计数器中断服务程序,注意是否需要重装定时初值,若需要连续反复使用原定时时间,且未工作在方式2,则应在中断服务程序中重装定时初值。,7.4定时器/计数器的编程,第7章,定时器,/计数器,7.4.1定时器应用实例,【例7-2】使用定时器/计数器T0的方式0,设定1ms的定时。在P1.0引脚上产生周期为2ms的方波输出。晶体振荡器的频率为fosc=6MHz。解:(1)定时常数计算振荡器频率为fosc=6MHz=6106HZ,方式0计数器长度 n=13,2n=213=8192定时时间:t=1ms=110-3s机器周期:Tp12/61062us计数值:xTc/Tp1ms/2us500那么应装入的初值为 81925007692定时常数TC转换成二进制数TCB11110 0000 1100 B。所以TCH1EH,TCL0CH。那么应该写入T0的形式为TH0=1EH,TL0=0CH。,第7章,定时器,/计数器,(2)TMOD的设定(即控制字),7.4.1定时器应用实例,第7章,定时器,/计数器,(3)编 程,ORG0000HAJMPMAIN ;转到主程序ORG000BH ;T0中断矢量地址AJMPINQP ;转到中断服务程序ORG0050HMAIN:MOV TMOD,#00H ;设置T0为方式0定时MOVTH0,#1EH ;装入T0的定时常数MOVTL0,#0CHSETBTR0 ;启动T0SETBET0 ;允许T0中断SETBEA ;CPU开中断SJMP$;等待T0中断发生ORG0100H ;中断服务程序INQP:MOVTH0,1EH ;重装定时常数MOVTL0,0CHCPLP1.0 ;P1.0变反输出RETI ;中断返回,第7章,定时器,/计数器,7.4.2计数器应用实例,【例7-3】试设定定时器/计数器T0为计数方式2。当T0引脚出现负跳变时,向CPU申请中断。,解:,(1)定数常数计算,当T0引脚出现负跳变时,即向CPU申请中断,意思是说当计数器计数到2,8,时就会溢出,设计数初值为X,再计数一次计数器就溢出,用公式表示为X12,8,,所以X2,8,125511111111B0FFH,故此时的定数常数应为TCB=0FFH。,第7章,定时器,/计数器,(2)TMOD的设定(即控制字),7.4.2计数器应用实例,第7章,定时器,/计数器,(3)编 程,ORG0000H,AJMPMAIN;转到主程序,ORG000BH;T0的中断入口,AJMPINTS ;转到中断服务程序,ORG0100H,;主程序入口地址,MAIN,:,MOVSP,#60H,;设栈指针,MOVTMOD,,,#06H,;设,T0,为计数方式,2,MOVTL0,,,#0FFH,;设,TL0,初值,MOVTH0,,,#0FFH,;设,TH0,初值,SETBTR0,;启动计数,SETBET0,;允许,T0,中断,SETBEA,;中断开放,SJMP$,;等待T0中断发生,;中断处理程序,INTS,:,PUSHA,;现场保护,把寄存器,A,中的值压入堆栈中,PUSHDPL,;把数据指针的低位,DPL,中的值压入堆栈中,PUSHDPH,;把数据指针的高位DPH中的值压入堆栈中,;现场恢复,POPDPH,;把数据指针的高位DPH中的值从堆栈中取出,POPDPL,;把数据指针的低位DPL中的值从堆栈中取出,POPA,;把寄存器A中的值从堆栈中取出,RETI,第7章,定时器,/计数器,【实例7-1】已知晶振,12MHZ,,参见图,7-9,要求利用定时器T0使图中发光二极管D进行秒闪烁。,解析,:发光二极管进行秒闪烁。即一秒钟一亮一暗,亮500ms,暗500ms。晶振12MHz,一个机器周期是1s,T0方式1最大定时只能65ms多(注:2,16,65536)。取T0定时50ms,计数10次,即可实现500ms定时。,(1)计算定时初值,T0初值=2,16,-50000s/1s,=6553650000=15536=3CB0H,TH0=3CH;TL0=B0H,7.5,实例解析,第7章,定时器,/计数器,(2)设置TMOD,0000,0,0,01,B=01H,T0方式,T0,与 INT0 无关,T1,控制位,(3)编程,ORG 0000H ;复位地址,LJMP MAIN ;转入主程序,ORG 000BH ;T0中断入口地址,LJMP IT0;转入T0中断服务程序,ORG 0100H ;主程序首地址,MAIN:MOV TMOD,#01H ;设置T0为工作方式1,MOV TH0,#3CH;装入定时常数,MOV TL0,#0B0H,MOV IE,#10000010B ;T0开中断,MOV R7,#0AH ;设置循环次数为10次,SETB TR0;T0运行,SJMP$;等待中断,第7章,定时器,/计数器,;中断服务程序:,ORG 000BH,ITO:MOV TL0,#0B0H ;重新装入时间常数,MOV TH0,#3CH,DJNZ R7,LOOP ;循环10次,CLR TR0 ;500ms定时到了,停止T0工作,LOOP:RETI ;中断返回,END ;程序结束,7.5,实例解析,第7章,定时器,/计数器,【实例7-2】利用定时器/计数器,测定如图所示波形的一个周期长度。,7.5,实例解析,第7章,定时器,/计数器,解析,:这里利用门控位GATE启动定时器的方法。设如图示定时器/计数器T0为定时器,为高电平时,启动定时器;定时器/计数器T1为计数器,T1的电平由1到0,计数器计数。,(1)定时器设置,当每秒脉冲数低于3个时,每个脉冲周期330ms左右,故而设置定时器的基本定时为100ms,可以满足测时的精度要求。因此,采用门控方式,触发启动定时器;采用方式1,16位计数器。,7.5,实例解析,第7章,定时器,/计数器,定时器T0的TMOD的设置:,控制字为9H,时间常数计算:晶体振荡器为6MHz,基本定时时间为100ms,机器周期Tc为,设置初值为x:,x=21650000=15536=3CB0H,预置:(TH0)=3CH,(TL0)=0B0H,GATE,M1,M0,1,0,0,1,7.5,实例解析,第7章,定时器,/计数器,(2)计数器设置,定时器/计数器T1为计数器。计数值为2,当计数1时,启动定时器;当计数2时,中断计数器T1,并停止定时器T0的定时;中断方式,其优先级高于定时器T0。,计数器T1的TMOD的设置:,控制字为5H。,计数器初值为:FFFEH,,预置:(TH1)=0FFH,(TL0)=0FEH。,GATE,M1,M0,0,1,0,1,7.5,实例解析,第7章,定时器,/计数器,(3)编 程,ORG0000H,AJMPMAIN,ORG000BH;T0的中断入口,AJMPTIME0 ;转入中断程序,ORG001BH ;T1的中断入口,AJMPTIME1 ;转入中断程序,ORG0033H,MAIN,:,MOVSP,,,#60H,;设置堆栈指针初值,MOVR3,#0 ;清除软件计数器,SETBP3.2 ;将P3.2,P3.5置1,即为输入状态,SETBP3.5,MOVTMOD,,,#59H,MOVTH0,,,#3CH,;装入定时器初值,MOVTL0,,,#0B0H,MOVTH1,,,#0FFH,;装入计数器初值,MOVTL1,,,#0FEH,SETBTR0,;启动定时器、计数器,第7章,定时器,/计数器,SETB TR1,MOVIP,#08H ;T0中断优先于T1,SETBET1 ;允许T1中断,SETBTF1 ;设TF0、TF1为中断标志,LOOP:SETBTF0,SETBET0 ;允许T0中断,SETBEA ;中断开放,JBTF0,$;判断TF0是否溢出,并一直等待,JBTF1,LOOP ;判断TF1是否溢出,如果溢出就转到LOOP,RET,TIME0:MOVTL0,#0B0H ;设TL0初值,MOVTH0,#3CH ;设TH0初值,INCR3 ;计数器加1,CPLTF0 ;TF0取反,RETI ;中断返回,TIME1:CLRTF0 ;清除中断标志,CLRTF1,CLRET0 ;禁止T0、T1中断,CLR ET1,CLREA ;关中断,RETI ;中断返回,第7章,定时器,/计数器,本程序占用T0、T1,溢出标志TF0,TF1及寄存器R3。R3 x 100 ms即为周期长度,因此可测的最大周期长度为256100ms=25.6s。,7.5,实例解析,第7章,定时器,/计数器,
展开阅读全文