收藏 分销(赏)

单片机(c语言版)定时器计数器复习进程.ppt

上传人:精**** 文档编号:10711514 上传时间:2025-06-11 格式:PPT 页数:47 大小:707KB 下载积分:14 金币
下载 相关
单片机(c语言版)定时器计数器复习进程.ppt_第1页
第1页 / 共47页
单片机(c语言版)定时器计数器复习进程.ppt_第2页
第2页 / 共47页


点击查看更多>>
资源描述
,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单片机(c语言版)定时器计数器,图,6-1 AT89S51,单片机的定时器,/,计数器结构框图,2,6.1.1,工作方式控制寄存器,TMOD,AT89S51,定时器工作方式寄存器,TMOD,用于选择工作模式和 工作方式,字节地址为,89H,,不能位寻址。,8,位分为两组,高,4,位控制,T1,,低,4,位控制,T0,。,(,1,),GATE,门控位,GATE=0,时,仅由运行控制位,TR,x,(,x,=0,1,),来控制定时器运行,GATE=1,时,用外中断引脚,INT0*,(或,INT1*,)上的电平与运行控制位,TR,x,共同控制定时器运行。,图,6-2,寄存器,TMOD,格式,3,(,2,),M1,、,M0,工作方式选择位,M1,、,M0,的,4,种编码,对应于,4,种工作方式,的选择。,(,3,),C/T*,计数器模式和定时器模式选择位,C/T*=0,,为定时器工作模式,对单片机的晶体振荡器,12,分频后的脉冲进行计数。,C/T*=1,,为计数器工作模式,计数器对外部输入引脚,T0,(,P3.4,)或,T1,(,P3.5,)的外部脉冲(负跳变)计数。,4,6.1.2,定时器,/,计数器控制寄存器,TCON,TCON,字节地址为,88H,,可位寻址,位地址为,88H,8FH,。,(,1,),TF1,、,TF0,计数溢出标志位。,当,计数器计数溢出时,该位置“,1”,。使用查询方式时,应注意查询有效后,使用软件及时将该位清“,0”,。使用中断方式时,中断请求标志位在进入中断服务程序后由硬件自动清“,0”,。,(,2,),TR1,、,TR0,计数运行控制位。,TR1,位(或,TR0,位),=1,,启动定时器工作。,TR1,位(或,TR0,位),=0,,停止定时器工作。,该位可由软件置“,1”,或清“,0”,。,图,6-3,TCON,格式,5,6.2,定时器,/,计数器的,4,种工作方式,6.2.1,方式,0,M1M0=00,方式,0,为,13,位计数,,由,TL0,的低,5,位(高,3,位未用)和,TH0,的,8,位组成。,TL0,的低,5,位溢出时向,TH0,进位,,TH0,溢出时,置位,TCON,中的,TF0,标志,向,CPU,发出中断请求。,6,图,6-4,定时器,/,计数器方式,0,逻辑结构框图,C/T*,位决定定时器,/,计数器的两种工作模式,(,1,),C/T*=0,,,T1,(或,T0,)为定时器工作模式,把时钟振荡器,12,分频后的脉冲作为计数信号。,(,2,),C/T*=1,,,T1,(或,T0,)为计数器工作模式,计数脉冲为,P3.4,(或,P3.5,)引脚上的外部输入脉冲,当引脚上发生负跳变时,计数器加,1,。,GATE,位决定定时器的运行控制取决于,TRx,一个条件,还是取决于,TRx,和,INTX,*(x=0,1),引脚状态这两个条件,。,(,1,),GATE=0,时,仅由,TR0,控制与门的开启。与门输出,1,时,控制开关接通,计数开始;,(,2,),GATE=1,时,由外中断引脚信号控制或门的输出,此时控制,与门的开启由外中断引脚信号和,TR0,共同控制,。,当,TR0=1,时,外中断引脚信号引脚的,高电平启动计数,,外中断引脚信号引脚的,低电平停止计数,。这种方式常用来测量外中断引脚上正脉冲的宽度。,定时器模式时,有,:N,t/Tcy,计数初值计算的公式为:,8,6.2.2,方式,1M1M0=01,方式,1,的计数位数是,16,位,由,TLX,作为低,8,位、,THX,作为高,8,位,组成了,16,位加,1,计数器。,计数个数与计数初值的关系为:,6.2.3,方式,2,M1M0=10,方式,2,为自动重装初值的,8,位计数方式。,工作方式,2,特别适合于用作较精确的脉冲信号发生器。,计数个数与计数初值的关系为,:,工作过程,T0,分成两个,8,位定时,/,计数器,TL0,和,TH0,;,TL0,:,既可计数也可定时,是一个,8,位定时,/,计数器。占用了,T0,所有控制位:,C/T,TR0,GATE,TF,0,和,INT,0,、,T,0,引脚;,TH0,:,只能作为定时器,因为,T,0,已被,TL0,占用,,TH0,用,T1,的,控制位:,TR1,、,TF1,;,6.2.4,方式,3M1M0=11,12,T0,在方式,3,时,T1,的工作模式,T1,只能工作在,0,、,1,、,2,方式,作为串行口的,波特率发生器,使用。因为,T1,的运行控制位,TR1,及计数溢出标志位,TF1,已被定时,/,计数器,T0,借用。,当作为波特率发生器使用时,只需要设置好工作方式,便可自动运行。如要停止工作,只需送入一个把,T1,设置为方式,3,的方式控制字。因为定时,/,计数器,T1,不能在方式,3,下工作,因为,T1,处于方式,3,时相当于,TR1=0,,停止计数,。,6.3,对外部输入的计数信号的要求,当定时器,/,计数器工作在计数器模式时,计数脉冲来自外部输入引脚,T0,或,T1,。当输入信号产生由,1,至,0,的跳变(即负跳变)时,计数器值增,1,。,由于确认一次负跳变花,2,个机器周期,即,24,个振荡周期,因此,外部输入的计数脉冲的最高频率为系统振荡器频率的,1/24,。,图,6-12,对外部计数输入信号的要求,例如,选用,6MHz,频率的晶体,允许输入的脉冲频率最高为,250kHz,。如果选用,12MHz,频率的晶体,则可输入最高频率为,500kHz,的外部脉冲。,13,14,6.3,对外部输入的计数信号的要求,当定时器,/,计数器工作在计数器模式时,计数脉冲来自外部输入引脚,T0,或,T1,。当输入信号产生由,1,至,0,的跳变(即负跳变)时,计数器值增,1,。,由于确认一次负跳变花,2,个机器周期,即,24,个振荡周期,因此,外部输入计数脉冲的最高频率为系统振荡器频率的,1/24,。,图,6-12,对外部计数输入信号的要求,例如,选用,6MHz,频率,的晶体,允许输入的脉冲频率最高为,250kHz,。如果选用,12MHz,频率的晶体,则可输入最高频率为,500kHz,的外部脉冲。,时间常数的计算,时间常数,:定时器,/,计数器,T0,或,T1,的初始计数值,在,T0,或,T1,被启动后,每个机器周期使计数器中的计数值加,1,,计数器产生溢出后。,定时时间,:计数器溢出时间,时间常数越大,定时时间就越短;时间常数越小,定时时间就越长。时钟的频率越高,定时时间越短;时钟的频率越低,定时时间越长。,设系统时钟的频率为,fosc,,计数器的初始值为,N,,定时器工作于方式,1,,则定时时间:,T=,(,2,16,-N,),12/fosc (1),如果定时器工作于方式,2,或方式,3,,定时时间为:,T=,(,2,8,-N,),12/fosc (2),当初始值,N=0,时,如果,fosc=12MHZ,,最大定时时间为:,方式,1,为:,Tmax=2,16,12/fosc=65536us=65.536ms,方式,2,、方式,3,为:,Tmax=2,8,12/fosc=256us,根据定时时间,T,,及公式,(1),、,(2),分别可以求出初值,N,为:,方式,1,:,N=2,16,-Tfosc/12,(,3,),方式,2,、方式,3,:,N=2,8,-Tfosc/12,(,4,),如果,fosc=12MHZ,以上公式可简化为,方式,1,:,N=2,16,-T,方式,2,、方式,3,:,N=2,8,-T,例如:系统的时钟频率是,12MHz,,在方式,1,下,如果希望定时器,/,计数器,T0,的定时时间,T,为,10ms,,则初值,N=2,16,-T=65536-10000=55536,如何将,55536,给两个,8,位寄存器,TH0,、,TL0,赋值呢?可将十进制数,55536,转换成四位十六进制数,将高,2,位送,TH0,,低,2,位送,TL0,。,更简单的方法是:对于,16,位计数器来讲,,2,16,等效为,0,,对于,8,位计数器,,2,8,等效为,0,,这样公式(,3,)、(,4,)可简化为,N=-T,,直接用下面两条语句就可以完成计数器初值的设置:,TH0=-10000/256,;,/,取,-N,的高,8,位,TL0=-10000%256,;,/,取,-N,的低,8,位,例如:设系统的时钟频率是,12MHz,,定时器工作于方式,2,,定时时间,200us,。,根据前面分析,,N=-T=-200,,可直接用以下语句实现:,TH0=-200,;,TL0=-200,;,MCS-51,单片机的定时器是可编程的,但在进行定时或计数之前要对程序进行,初始化,,具体步骤如下:,(,1,)确定工作方式字:对,TMOD,寄存器正确赋值;,(,2,)确定定时初值:计算初值,直接将初值写入寄存器的,TH0,、,TL0,或,TH1,、,TL1,;,初值计算,:,设计数器的最大值为,M,,则置入的初值,X,为:,计数方式:,X=M-,计数值,定时方式:由,(M-X)T=,定时值,得,X=M-,定时值,/T,T,为计数周期,是单片机的机器周期。,(模式,0-M,为,2,13,,模式,1-M,为,2,16,,模式,2,和,3-M,为,2,8,),(,3,)根据需要,对,IE,置初值,开放定时器中断;,(,4,)启动定时,/,计数器,对,TCON,寄存器中的,TR0,或,TR1,置位,置位以后,计数器即按规定的工作模式和初值进行计数或开始定时。,6.4,定时器,/,计数器的编程和应用,6.4.1 P1,口外接的,8,只,LED,每,0.5s,闪亮一次。,【,例,6-1】,在,AT89S51,单片机的,P1,口上接有,8,只,LED,(电路见图,4-7,)。下面采用定时器,T0,的方式,1,的定时中断方式,使,P1,口外接的,8,只,LED,每,0.5s,闪亮一次。,(,1,)设置,TMOD,寄存器,方式,1,;计时工作模式;仅由,TR0,来控制;,T1,不使用。,TMOD,寄存器应初始化为,0 x01=0000 0001B,(,2,)计算,T0,计数初值,设定时时间,5ms,(即,5000s,),设定时器,T0,的计数初值为,X,,假设晶振的频率为,11.0592MHz,,则定时时间为:,定时时间,=(2,16,X,),12/,晶振频率,则,5000=(2,16,X,),12/11.0592,得:,X,=60928,,转换成,16,进制后为:,0 xee00,,其中,0 xee,装入,TH0,,,0 x00,装入,TL0,。,(,3,)设置,IE,寄存器,本例由于采用定时器,T0,中断,因此需将,IE,寄存器中的,EA,、,ET0,位置,1,。,(,4,)启动和停止定时器,T0,将定时器控制寄存器,TCON,中的,TR0=1,,则启动定时器,T0,;,TR0=0,,则停止定时器,T0,定时。,20,#include,Char i=100,;,/*,给变量,i,赋初值,定时,0.5S,,每次定时中断,5MS,,需要中断,100,次*,/,void main(),TMOD=0 x01,;,/*,设置定时器,T0,为方式,1*/,TH0=0 xee,;,/*,向,TH0,写入初值的高,8,位*,/,TL0=0 x00,;,/*,向,TL0,写入初值的低,8,位*,/,P1=0 x00,;,/*P1,口,8,只,LED,点亮*,/,EA=1,;,/*,总中断允许*,/,ET0=1,;,/*,定时器,T0,中断允许*,/,TR0=1,;,/*,启动定时器,T0*/,while(1),;,/*,无穷循环,等待定时中断*,/,21,/*,以下为定时器,T0,的中断服务程序*,/,void T0_int(void)interrupt 1,TH0=0 xee,;,/*,给,T0,装入,16,位初值,计,4608,个数后,,T0,溢出,TL0=0 x00,;,i-,;,/*,循环次数减,1*/,if(i0,;,i-),for(j=0,;,j125,;,j+),;,/*,空函数*,/,void main()/*,主函数*,/,TMOD=0 x50,;,/*,设置定时器,T1,为方式,1,计数*,/,TH0=0 xff,;,/*,向,TH0,写入初值的高,8,位*,/,29,TL0=0 xfc,;,/*,向,TL0,写入初值低,8,位*,/,EA=1,;,/*,总中断允许*,/,ET1=1,;,/*T1,中断允许*,/,TR1=1,;,/*,启动,T1*/,while(1),;,/*,无穷循环,等待定时中断*,/,/*,以下为定时器,T1,的中断服务程序*,/,void T1_int(void)interrupt 3,for(,;,)/*,无限循环*,/,P1=0 xff,;,/*8,位,LED,全灭*,/,Delay(500),;,/*,延时,500ms*/,P1=0,;,/*8,位,LED,全亮*,/,Delay(500),;,/*,延时,500ms*/,30,案例,4,用定时器来控制数码管的动态显示。,用定时器控制数码管动态显示的方法:,设定时器的定时时间为,1ms,,每次产生溢出中断,就根据位选变量,bsel,(主程序中将其初值设置为,0 xfe,)送位选口,点亮一位数码管,并将,bsel,左移一位,为下一位的显示做好准备,,4,次定时中断分别完成,4,位数码管的显示,之后将,bsel,的值再次初始化为,0 xfe,,准备下一轮显示。,因此这种显示方式由定时中断自动完成,无需在主程序中调用,主程序,uchar bsel,n;,void main(void),n=0;,bsel=0 xfe;/,首先显示数码管的最低位,TMOD=0 x01;/T0,工作于定时方式,2,TH0=-1000/256;/T0,的定时时间为,1000us,TL0=-1000%256;,ET0=1;/,允许,T0,中断,TR0=1;/,启动定时,EA=1;/,开中断,while(1);,uchar code segtab=,0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 x88,0 x83,0 xc6,0 xa1,0 x86,0 x8e,0 x89,0 x8c;,uchar dbuf4=,4,3,2,1;,字符,0F,的字形码表,显示缓存,存放要显示字符,void time0(void)interrupt 1,TH0=-1000/256;,TL0=-1000%256;,P0=0 xff;,P2=bsel;,P0=segtabdbufn;,bsel=_crol_(bsel,1);,n+;,if(n=4),n=0;,bsel=0 xfe;,重新装入时间常数,定时器,T0,中断服务程序,熄灭数码管,防止上一位字符在当前位置显示出来。,点亮当前位,根据显示缓存查字段码,准备显示下一位,指向下一位要显示的数据,如果四位已显示完,重新从最低位开始,6.4.3,扩展一个外部中断源,方式,2,可自动重新装载初值。此方式可省去用户程序中重新装初值的指令。,当某个定时器,/,计数器不使用时,可为,AT89S51,扩展一个负跳沿触发的外部中断源。,基本思想:,把定时器溢出中断做成外部中断,,然后把计数输入信号接到定时器的相应引脚上,T0,脚(或,T1,脚),并把定时器被设置为方式,2,(自动装入常数方式)计数工作模式,计数器,TH0,、,TL0,初值均为,0FFH,,并允许,T0,中断,总中断开放。当检测到,T0,脚(或,T1,脚)引脚电平发生负跳变时,计数器,TF0(,或,TF1),溢出,这时将产生一个中断请求。,【,例,6-3】,扩展一个负跳沿触发的外部中断源,把定时器,T0,计数输入引脚作为外部中断请求信号的输入端。,34,#include,void main(),TMOD=0 x06,;,/*,设置定时器,T0,为方式,2,计数*,/,TH0=0 xff,;,/*,给,T0,装入初值*,/,TL0=0 xff,;,/*,给,T0,装入初值*,/,ET0=1,;,/*,允许,T0,中断*,/,EA=1,;,/*,总中断开*,/,TF0=0,;,/*T0,中断溢出标志位清,0*/,TR0=1/*,接通,T0,计数*,/,while (1)/*,无限循环等待*,/,/*,以下为定时器,T0,的中断服务程序*,/,void T0_int(void)interrupt 1 using 0,/*,外中断处理部分*,/,35,6.4.4 P1.0,上产生周期为,2ms,的方波,【,例,6-4】,系统时钟为,12MHz,,编程实现从,P1.0,引脚上输出一个周期为,2ms,的方波,如,图,6-14,所示。,基本思想:,要在,P1.0,上产生周期为,2ms,的方波,定时器应产生,1ms,的周期性的定时,定时对,P1.0,求反。选择定时器,T0,,方式,1,定时,采用中断方式,,GATE,不起作用。,图,6-14,定时器控制,P1.0,输出一个周期为,2ms,的方波,36,计算,T0,的初值计算:,设,T0,的初值为,X,,则,(2,16,X,),1,10,6,=1,10,3,=65536,X,=1000,则初值为:,655361000=64536,,,因此,TH0=(655361000)/256,,,TL0=(655361000)%256,。,参考程序如下:,37,#include,sbit P1_0=P10;,void main(void),TMOD=0 x01,;,/*,设置定时器,T0,为方式,2,计数*,/,P1_0=0;,TH0=(655361000)/256,;,/*,给,T0,装入初值*,/,TL0=(655361000)%256,;,/*,给,T0,装入初值*,/,ET0=1,;,/*,允许,T0,中断*,/,EA=1,;,/*,总中断开*,/,TR0=1/*,接通,T0,计数*,/,do while(1);/*,无限循环等待*,/,void T0_int(void)interrupt 1 using 1,P1_0=!P1_0;,TH0=(655361000)/256,;,TL0=(655361000)%256,;,38,6.4.5 P1.1,上产生周期为,1s,的方波,【,例,6-5】,假设系统时钟为,12MHz,,编程实现从,P1.1,引脚上,输出一个周期为,1s,的方波。,基本思想:,要在,P1.0,上产生周期为,1s,的方波,定时器应产生,500ms,的周期性定时,定时到则对,P1.0,求反。由于定时时间较长,用定时器不能直接实现,直接定时时间最长的就是方式,1,,仅为,65ms(,系统时钟,12MHz),多一点。,实现:,T0,定为,10ms,定时,每,10ms,对,P1.0,求反一次,,P1.0,输出的脉冲加到定时器,T1,的计数输入脚,P3.5,(,T1,脚),作为计数输入,定时,500ms,需计数,50,次。,T1,设为方式,2,计数,初值,X,为:,2,8,X,=50,,则,X,=206,,,39,所以,TH1=TL1=206,。,T0,设为方式,1,定时,则控制字为,61H,。定时器,T0,和,T1,均采用中断方式工作。,参考程序如下:,#include,sbit P1_0=P10;,sbit P1_1=P11;,void main(void),TMOD=0 x61,;,/*,设置定时器,T0,为方式,1,定时,,T1,为方式,2,计数*,/,P1_0=0;,TH0=(6553610000)/256,;,/*,给,T0,装初值*,/,TL0=(6553610000)%256,;,TH1=206,;,/*,给,T1,装初值*,/,TL1=206,;,40,EA=1,;,/*,总中断开*,/,ET0=1,;,/*,允许,T0,中断*,/,ET1=1,;,/*,允许,T1,中断*,/,TR0=1;,TR1=1;,while(1);,void T0_int(void)interrupt 1,TH0=(655361000)/256,;,TL0=(655361000)%256,;,P1_0=!P1_0;,void T1_int(void)interrupt 3,P1_1=!P1_1;,;,/*P1.1,脚产生,1s,的方波*,/,。,41,6.4.6 T1,控制发出,1KHz,的音频信号,【,例,6-6】,利用定时器,T1,的中断来控制蜂鸣器发出,1KHz,的音频信号,电路图见,图,6-15,。,假设系统时钟为,11.0592MHz,,则每个脉冲的周期为,12/11.0592=1.085s,。,1KHz,的音频信号周期为,1ms,,因此要计数的脉冲数为,1000/1.085=921,次。所以,T1,的初值:,TH1=(65536921)/256,;,TL1=(65536921)%256,参考程序如下:,#include,sbit sound=P17;,42,void main(void),EA=1,;,/*,总中断开*,/,ET1=1,;,/*,允许,T0,中断*,/,TMOD=0 x10,;,/*,设置定时器,T1,为方式,1,定时*,/,sound=0;,TH1=(65536921)/256,;,/*,给,T1,装初值*,/,TL1=(65536921)%256,;,TR1=1;,while(1);,void T1_int(void)interrupt 3 using0,sound=,sound;,TH1=(65536921)/256,;,TL1=(65536921)%256,;,43,6.4.7,测量脉冲宽度(门控位,GATEx,的应用),下面以定时器,T1,为例,介绍门控制位,GATE,的具体应用,即测量,INT0*,(或,INT1*,)引脚上正脉冲的宽度。,【,例,6-7】,门控位,GATE1,可使,T1,的启动计数受,INT1*,的控制,当,GATE1=1,,,TR1=1,时,只有引脚,INT1*,输入高电平时,,T1,才被允许计数。利用,GATE1,这一功能,可测量引脚,INT1*,(,P3.3,)上正脉冲的宽度(机器周期数),利用门控制位,GATE1,,测量引脚,INT1*,上正脉冲宽度。方法如,图,6-16,所示。,图,6-16,利用,GATE,位测量正脉冲的宽度,44,参考程序如下:,#include,sbit P3_3=P33,;,/*,位变量定义*,/,unsigned count_high,;,/*,定义计数变量,用来读取,TH0*/,unsigned count_low,;,/*,定义计数变量,用来读取,TL0*/,void read_ count(),;,/*,读计数器函数*,/,void main(),TMOD=0 x90,;,/*,设置定时器,T1,为方式,1,定时*,/,TH1=0,;,/*,向定时器,T1,写入计数初值*,/,TL1=0,;,TR1=1,;,while(P3_3=1);/*,等待变低*,/,TR1=1,;,/*,如果为低,启动,T1(,未真正开始计数,)*/,45,while(P3_3=0);/*,等待变高,变高后,T1,真正开始计数*,/,while(P3_3=1);/*,等待变低,变低后,T1,停止计数*,/,TR1=0,;,read_ count();/*,读计数寄存器内容的函数*,/,void read_ count()/*,读取计数寄存器的内容*,/,do,count_high=TH1,;,/*,读高字节*,/,count_low=TL1,;,/*,读低字节*,/,/*,可将两字节的机器周期数进行显示处理*,/,while(count_high!=TH1),;,正脉冲宽度以机器周期数的形式读入到,count_high,和,count_low,两个单元中,,此课件下载可自行编辑修改,仅供参考!感谢您的支持,我们努力做得更好!谢谢,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服