1、单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,1,在测控系统中,常常需要有实时时钟和计数器,以实现定时控制以及对外界事件进行计数。传统8051系列单片机有二个16位定时/计数器,它们是定时/计数器0、定时/计数器1,STC89C52单片机在此基础上增加一个16位定时/计数器2,它们简称为:T0、T1和T2。,2,本章,主要内容,:,定时器,/,计数器的组成与功能,,工作模,式和,工作方式,,以及与其相关的,4,个特殊功能寄存器,TMOD,、,TCON,、,T2CON,、,T2MOD,各位的定义及其编程,最后介绍定时器,/,计数器的编程及应用实例。,6.1 STC89C52,
2、单片机定时器,/,计数器的组成,6.2,定时,/,计数器,0,和,1,6.3,定时,/,计数器,2,3,STC89C52,定时,/,计数器由,T0,、,T1,、,T2,和,看门狗定时器,WDT_CONTR,组成,,T0,由特殊功能寄存器,TH0,、,TL0,构成,,T1,由特殊功能寄存器,TH1,、,TL1,构成,,T2,由特殊功能寄存器,TH2,、,TL2,和,RXAP2H、RCAP2L,构成。,6.1 STC89C52,定时器,/,计数器的组成,4,6.2,定时,/,计数器,0,和,1,STC89C51RC/RD+,系列单片机的定时,/,计数器,0,和,1,,与传统,8051,的定时,/,
3、计数器完全兼容。当定时器,1,作波特率发生器时,定时器,0,可以当两个,8,位定时器使用。,6.2.1 定时器/计数器0和1的相关寄存器,6.2.2 定时/计数器0和1的四种工作方式,6.2.3 定时/计数器0或1的应用,5,STC89C51RC/RD+,系列单片机内部设置的两个,16,位定时器,/,计数器,0,和,1,都具有,定时和计数两种工作模式,,在特殊功能寄存器,TMOD,中有一位控制位 来选择,T0,或,T1,为定时器还是计数器,定时器或计数器的核心部件是一个,加法计数器,,其本质是对脉冲进行计数。只是计数脉冲来源不同:如果计数脉冲来源于系统时钟,则为,定时方式,,此时定时,/,计数
4、器,每,12,个时钟或每,6,个时钟得到一个计数脉冲,,计数值加,1,;如果计数脉冲来自单片机外部引脚(,T0,为,P3.4,,,T1,为,P3.5),,则为,计数方式,,每来,一个计数脉冲加,1,。,6,当定时器/计数器,工作在定时模式,时,可在烧录用户程序时在,STC-ISP编程器,中设置如图4-12是系统时钟/12还是系统时钟/6后让T0和T1进行计数。当定时/计数器工作在,计数模式时,,对外部计数脉冲,计数不分频,。,图4-12 计数脉冲倍速设置,6,7,结论:,单片机中的定时器和计数器是一个东西,只不过计数器用来记录外界发生的事情,而定时器则是由单片机提供的一个非常稳定的计数源。,8
5、,综上所述,我们已知定时器/计数器是一种,可编程部件,,所以在其开始工作之前,,CPU,必须将一些命令(控制字)写入定时器/计数器。这个过程称为,定时器/计数器的初始化,。,当,CPU,用软件给定时器设置了某种工作方式之后,,定时器就会按设定的工作方式独立运行,不再占用,CPU,的操作时间,,除非定时器计数溢出,才可能中断,CPU,当前操作。,6.2.1,定时器,/,计数器,0,和,1,的相关寄存器,STC89C52单片机与定时/计数器0和1的相关寄存器见,表6-2,所示.,表6-2 定时器/计数器的0和1相关寄存器,10,GATE,C/T,M,1,0,M,GATE,C/T,1,M,0,M,控
6、 制,T,1,控 制,T,0,89,H,和,T,类同,0,1,M,0,M,00,01,10,11,方 式,方式0,13位,方式1 16位,方式2 自动重装,方式3 适用,T0,0,1,定时器模式,计数器模式,0,1,与,INT,无关,0,0,与,INT,有关,1.定时/计数器工作模式寄存器,TMOD,(89H),M1M0,:,方式选择位,C/T :,功能选择位,GATE:,门控位,11,GATE=1,时,若,TR,1,=1,,并且,INT,1,=1,允许,T,1计数,若,TR,1,=0,,或,INT,1,=0,都禁止,T,1计数,GATE=0,若,TR,1,=1,允许计数;若,TR,1,=0,
7、,禁止计数,返回,12,由于在不同方式下计数器位数不同,因而最大计数值(量程)也不同。,方式0:,M=2,13,=8192,方式1:,M=2,16,=65536,方式2:,M=2,8,=256,方式3:,T0,定时器分成两个8位计数器,两个,M,均256,T1,停止计数。,返回,13,TR1(0):,运行控制位,2.,定时/计数器控制寄存器,TCON,(88H),TF1(0):,溢出标志位,14,定时器/计数器的初始化,初始化的步骤如下:,确定工作方式-对,TMOD,赋值,置定时或计数的初值-可直接写入,TH0(1),TL0(1),根据需要开放定时器/计数器的中断,启动定时器/计数器。,当实现
8、了启动要求之后,定时器就按规定的工作方式和初值开始计数或定时。,15,因为定时器/计数器是作,“,加1,”,计数,并在计满溢出时产生中断,初值,X,可以这样计算:,X =M -,计数值(计数次数),例1:在6,MHZ,主频下,要求产生1,ms,的定时,计算初值,分析:因为定时器每,“,加1,”,一次所需的时间为2,s,如果要产生1,ms,的定时,需加500次,500即为计数值。,方式1下工作,:,初值,X=M-,计数值=65536-500=,FE0CH,例2:计100个外部脉冲,产生中断请求,计数初值x,x=M-100,16,若,Fosc=12MHz,在,P1.0,输出周期为,400us,方波
9、,定时,/,计数器工作方式,2,问计数初值为多少,?,初始化程序,?,机器周期,=12/Fosc=1us,(256-X)*1us=200us,X=56=38H,P1.0,MOVTMOD,#02H,SETBET0,SETBEA,MOVTL0,#38H,MOVTH0,#38H,SETBTR0,17,6.2.2,定时,/,计数器,0,和,1,的四种工作方式,由上节可知,通过对,TMOD,中的,M1,M,0,的设置,可以选择四种工作方式。也就是每个定时器可构成4种电路结构模式。,在模式0、1和2,,T0,和,T1,的工作方式相同,在模式3,两个定时器的方式不同。下面以,T1,为例,分述各种工作方式的特
10、点和用法。,1,方式,0,2,方式,1,3,方式,2,这种工作方式可省去用户软件中重装常数的程序,并可产生相当精度的定时时间。,4方式,3,该方式只适用于定时器,T0,,,T0,被拆成两个独立的8位计数器,TH0,和,TL0,。,TH0不能作为外部计数模式,22,T0,工作在方式,3,下,T1,的各种工作方式,T0工作在方式3时,T1可定为方式0、方式1和方式2,用来作为串行口的波特率发生器,或不需要中断的场合,定时器T1处于方式3时相当于TR1=0,停止计数。,T1,运行的控制条件只有,2,个,即,C/T,和,M1,M0.,23,6.2.3,定时,/,计数器,0,或,1,的应用,定时/计数器
11、的应用编程主要需考虑:根据应用要求,通过程序初始化,正确,设置控制字,,正确,计算计数初值,,编写,中断服务程序,,适时,设置控制位,等。通常情况下,设置顺序大致如下:,工作方式控制字(TMOD、,T2CON,)的设置;,计数初值的计算并装入THx、TLx、,RCAP2H、RCAP2L,;,中断允许位ETx、EA的设置,使主机开放中断;,启/停位TRx设置;,24,51系列单片机T0或T1是属于加法计数器,因此就不能直接将实际的计数值作为计数初值送入计数寄存器THx,TLx中,而必须将实际计数值以2,8,、2,13,、2,16,为模求补,以其补码作为计数初值设置THx和TLx。,设:实际计数值
12、为X,计数器长度为n(n=8、13、16),则应装入计数器THx和TLx的计数初值为2,n,-X,式中2,n,为取模值。,例如:工作方式0,以2,13,为模,工作方式1,以2,16,为模等,,计数初值:(X),补,=2,n,-X,。,25,定时模式,,是对机器周期计数,而机器周期与选定主频密切相关,因此,需要根据应用系统选定的主频来确定机器周期值,现以主频为6MHz为例,则机器周期为:,注意:对于传统51系列单片机,式(1)中分子取值为12,而对于STC89C52单片机,式(1)中分子取值是根据,计数脉冲倍速设置,来定(参见教材图4-12),若单片机选12T,则式(1)分子为12,若选6T,则
13、式(1)分子为6。若没有特别提出,书中STC89C52单片机都选12T模式。,26,实际,定时时间,Tc=x Tp,式中Tp为机器周期,Tc为所需定时时间,x为所需计数次数,主频和Tc一般是已知值,在求得Tp后就可求得所需计数值x,再求x的补码,即求得定时的,计数初值,。,(x),补,=2,n,-x,例如:设定时时间为2ms,机器周期Tp为2s,可求得定时计数次数为:,设选用工作方式1,n=16,则应设置的定时计数初值为:,(x),补,=2,n,-x=2,16,-x=65536-1000=64536=FC18H,,则将其分解成两个8位十六进制数,低8位18H装入TLx,高8位FCH装入THx中
14、。,工作方式0、1、2的最大计数次数分别为8192、65536和256。,对外部事件,计数模式,,只需根据,实际计数次数求补,后变换成两个16进制码即可。,27,6.2.3,定时,/,计数器,0,或,1,的应用,1.方式0、1的应用,【例,6.1】,设STC89C52单片机系统时钟频率f,CLK,为6,MH,Z,,要在,P,1.0,引脚上输出,1,个周期为,2,毫秒、,占空比,为50%的方波信号,.,P1.0,1ms,1ms,T=2ms,图,6-7 P1.0,引脚输出波形,解,:(1),计算初值,:,单片机工作在12T模式,1机器周期,=2,s=2,10,-6,s,T0,工作,方式0,定时1m
15、s计数次数为:,选择工作方式0,n=13,定时计数初值:(x),补,=,2,1,3,-,500=,7692=1,E0CH,X=,11110000,01100,B,则,TH0=,F0,H,TL0=0CH,29,(2),初始化程序,:,工作方式控制字(,TMOD,、,T2CON,),的设置;,TMOD=0,0,H,定时方式0,计数初值的计算并装入,THx,、,TLx,、,RCAP2H,、,RCAP2L,;,TH0=,F0,H,TL0=0CH,中断允许位,ETx,、,EA,的设置,使主机开放中断;,ET0=1,EA=1,启,/,停位,TRx,设置;,TR0=1,30,方法一、中断方式:,ORG 00
16、00H,LJMP MAIN,ORG 000BH,LJMP T0P,ORG 0100H,MAIN:MOV SP,#60H;设置堆栈指针,MOV TMOD,#00H;T0为定时、方式0、门控GATE0=0,MOV TL0,#0CH;装载计数初值,MOV TH0,#0F0H,SETB TR0;启动定时器0计数,SETB ET0;允许定时器0中断,SETB EA;允许CPU中断,HERE:AJMP HERE;踏步等待,31,/*中断服务子程序*/,T0P:MOV TL0,#0CH;重装载计数初值,MOV TH0,#0FEH,CPL P1.0;P1.0输出求反,RETI,END,Keil,uVision
17、4,32,方法二:软件查询,解,:(1),计算初值,:,机器周期,=2,s=2,10,-6,s,T0,工作,方式,1,计数初值:,(x),补,=,65036=,FEOCH,则,TH0=0FEH,TL0=0CH,33,ORG0000H,START:,MOVSP,#60H;,设置堆栈区,MOV TMOD,#01H;,T0定时方式,1,门控,GATE0=0,SETB TR0;,启动定时器,0,计数,L,1:,MOVTH0,#0FEH;,装载计数初值,MOVTL0,#0CH,L,OOP1,:,JNB TF0,LOOP1;,判计数溢出?没有,踏步等待,CLRTF0;,溢出,清溢出标志位,CPLP1.0;
18、P1.0,输出求反,SJMPL,1,END,34,中断方式、C51编程,#include,sbit P10=P10;,void main(),SP=0X60;/*设置堆栈指针*/,TMOD=0 x1;/*定时器0:定时、工作方式1、门控GATE0=0*/,TL0=0 x0c;/*装载计数初值*/,TH0=0 xfe;,TR0=1;/*启动定时器0计数*/,ET0=1;/*允许定时器0中断*/,EA=1;/*允许CPU中断*/,while(1);,35,void,timer0int(void),interrupt,1,TL0=0 x0c;/*,重装载计数初值*,/,TH0=0 xfe;,P10=
19、!P10;/*P1.0,输出求反*,/,36,【例,6.2】,设STC89C52单片机系统时钟频率f,CLK,为6,MH,Z,,请编出利用定时/计数器,T0,在,P,1.1,引脚上产生周期为,2秒,,占空比为50%的方波信号的程序,1.主程序,任务,:,(1)设定,T0,工作方式1,单片机工作在12T模式,则机器周期为2,s,,最大定时,=2,16,2s=131.072ms,量程?,MOVP2,RCAP2H;,捕获值量程,则显示FFFFH,MOVP0,#0FFH,RET,111,/*,定时器,0,中断服务子程序*,/,PT0INT:MOVTH0,#0FCH;,定时器,0,重装计数初值,MOVT
20、L0,#18H,CPLP1.5;P1.5,求反,使,P1.5,输出方波。,RETI,112,/*定时器2中断服务子程序*/,PT2INT:CLRP1.7 ;点亮P1.7,表明进入T2中断服务程序,JBC TF2,PTF2 ;定时溢出引起中断?,JBC EXF2,PEXF2 ;P1.1负跳变引发中断吗?,RETI,PEXF2:MOV C,20H.0 ;P1.1引脚负跳变引起中断,中断标志位送C,JCTT2 ;判断第一中断吗?,CY=0?,SETB TR2 ;第一次中断,启动定时器2计数,SETB 20H.0;中断次数标志置1,RETI,113,TT2:CLRTR2 ;第二次中断,定时器2停止计数
21、,CLR20H.0;中断次数标志清0,CLR EXEN2;T2的外部使能位清0,ESC:RETI,PTF2:MOVTH2,RCAP2H;溢出中断,重装计数初值,MOVTL2,RCAP2L,SETB20H.1 ;置捕获脉冲宽度大于量程标志位,RETI,Keil,uVision4,114,(2)C51,语言程序,/*,文件名为,6-7.C*/,#include,#define uchar unsigned char,sbit P16=P16;,sbit P15=P15;,sbit P17=P17;,sfr T2MOD =0 xC9;,uchar n=0;,uchar reg1,reg2;,115,
22、/*,显示*,/,void disp(),if(n=1)P2=0 xff;P0=0 xff;,P2=reg2;,P3=reg1;,116,/*,主程序*,/,void main(),SP=0X60;,TMOD=0 x01;,TH0=0 xfc;,TL0=0 x18;,TR0=1;,T2MOD=0 x0;,T2CON=0 x9;,117,TL2=0 x0;,TH2=0 x0;,RCAP2H=0 x0;,RCAP2L=0 x0;,IE=0 xa2;,while(1),disp();,118,/*,定时器,0,中断函数*,/,void timer0int(void)interrupt 1,TF0=0
23、;,TH0=0 xfc;,TL0=0 x18;,P15=!P15;,119,/*定时器2中断函数*/,void timer2int(void)interrupt 5,uchar i;,TF2=0;,P17=0;,if(TF2=1),TF2=0;TH2=RCAP2H;TL2=RCAP2L;n+;,if(EXF2=1),EXF2=0;,if(i=0)TR2=1;i+;/*第一次外部信号触发中断,启动定时器2计数*/,120,else,reg1=RCAP2L;/*,保存捕获值*,/,reg2=RCAP2H;,i=0;,TR2=0;/*,停止定时器,2,计数*,/,EXEN2=0;/*,禁止,T2EX,负跳变产生捕获*,/,Keil,uVision4,121,6.6 小 结,本章介绍,STC89C52,单片机定时,/,计数器,组成,、与定时,/,计数器相关的,特殊功能寄存器,,详细叙述这些,特殊功能寄存器每一位的物理意义,和使用这些特殊功能寄存器方法。介绍了,T0,和,T1,的,4,种工作方式,、它们的电路结构模型以及它们适合应用范围。介绍了与,T2,相关的特殊功能寄存器以及寄存器每位的物理意义和使用方法,介绍,T2,的,3,种工作方式逻辑结构图,并举例说明,T2,各种工作方式应用。,