单片机(c语言版)定时器计数器

上传人:zhu****ng 文档编号:252947847 上传时间:2024-11-26 格式:PPT 页数:47 大小:574KB
返回 下载 相关 举报
单片机(c语言版)定时器计数器_第1页
第1页 / 共47页
单片机(c语言版)定时器计数器_第2页
第2页 / 共47页
单片机(c语言版)定时器计数器_第3页
第3页 / 共47页
点击查看更多>>
资源描述
,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,6,章,AT89S51,单片机的 定时器,/,计数器,1,内容概要:,介绍,AT89S51,单片机片内定时器,/,计数器的结构与功能,两种工作模式和,4,种工作方式,以及与其相关的两个特殊功能寄存器,TMOD,和,TCON,各位的定义及其编程,最后介绍定时器,/,计数器的,C51,编程及应用实例。,6.1,定时器,/,计数器的结构,定时,/,计数器的实质是加,1,计数器(,16,位,),由,高,8,位,THX,(,X=0,或,1,)和,低,8,位,TLX,两个寄存器组成。,TMOD,是定时,/,计数器的工作方式寄存器,确定工作方式和功能;,TCON,是控制寄存器,控制,T0,、,T1,的启动和停止及设置溢出标志,。,外部脉冲,3,图,6-1 AT89S51,单片机的定时器,/,计数器结构框图,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,共同控制定时器运行。,4,图,6-2,寄存器,TMOD,格式,(,2,),M1,、,M0,工作方式选择位,M1,、,M0,的,4,种编码,对应于,4,种工作方式,的选择。,(,3,),C/T* ,计数器模式和定时器模式选择位,C/T*=0,,为定时器工作模式,对单片机的晶体振荡器,12,分频后的脉冲进行计数。,C/T*=1,,为计数器工作模式,计数器对外部输入引脚,T0,(,P3.4,)或,T1,(,P3.5,)的外部脉冲(负跳变)计数。,5,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,图,6-3,TCON,格式,6.2,定时器,/,计数器的,4,种工作方式,6.2.1,方式,0,M1M0=00,方式,0,为,13,位计数,,由,TL0,的低,5,位(高,3,位未用)和,TH0,的,8,位组成。,TL0,的低,5,位溢出时向,TH0,进位,,TH0,溢出时,置位,TCON,中的,TF0,标志,向,CPU,发出中断请求。,7,图,6-4,定时器,/,计数器方式,0,逻辑结构框图,C/T*,位决定定时器,/,计数器的两种工作模式,(,1,),C/T*=0,,,T1,(或,T0,)为定时器工作模式,把时钟振荡器,12,分频后的脉冲作为计数信号。,(,2,),C/T*=1,,,T1,(或,T0,)为计数器工作模式,计数脉冲为,P3.4,(或,P3.5,)引脚上的外部输入脉冲,当引脚上发生负跳变时,计数器加,1,。,9,GATE,位决定定时器的运行控制取决于,TRx,一个条件,还是取决于,TRx,和,INTX,*(x=0,1),引脚状态这两个条件,。,(,1,),GATE=0,时,仅由,TR0,控制与门的开启。与门输出,1,时,控制开关接通,计数开始;,(,2,),GATE=1,时,由外中断引脚信号控制或门的输出,此时控制,与门的开启由外中断引脚信号和,TR0,共同控制,。,当,TR0=1,时,外中断引脚信号引脚的,高电平启动计数,,外中断引脚信号引脚的,低电平停止计数,。这种方式常用来测量外中断引脚上正脉冲的宽度。,定时器模式时,有,:N,t/Tcy,计数初值计算的公式为:,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,13,T0,在方式,3,时,T1,的工作模式,T1,只能工作在,0,、,1,、,2,方式,作为串行口的,波特率发生器,使用。因为,T1,的运行控制位,TR1,及计数溢出标志位,TF1,已被定时,/,计数器,T0,借用。,当作为波特率发生器使用时,只需要设置好工作方式,便可自动运行。如要停止工作,只需送入一个把,T1,设置为方式,3,的方式控制字。因为定时,/,计数器,T1,不能在方式,3,下工作, 因为,T1,处于方式,3,时相当于,TR1=0,,停止计数,。,14,6.3,对外部输入的计数信号的要求,当定时器,/,计数器工作在计数器模式时,计数脉冲来自外部输入引脚,T0,或,T1,。当输入信号产生由,1,至,0,的跳变(即负跳变)时,计数器值增,1,。,由于确认一次负跳变花,2,个机器周期,即,24,个振荡周期,因此,外部输入的计数脉冲的最高频率为系统振荡器频率的,1/24,。,图,6-12,对外部计数输入信号的要求,例如,选用,6MHz,频率的晶体,允许输入的脉冲频率最高为,250kHz,。如果选用,12MHz,频率的晶体,则可输入最高频率为,500kHz,的外部脉冲。,15,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,寄存器应初始化为,0x01=0000 0001B,(,2,)计算,T0,计数初值,设定时时间,5ms,(即,5000s,),设定时器,T0,的计数初值为,X,,假设晶振的频率为,11.0592MHz,,则定时时间为:,定时时间,=(2,16,X,),12/,晶振频率,则,5000=(2,16,X,),12/11.0592,得:,X,= 60928,,转换成,16,进制后为:,0xee00,,其中,0xee,装入,TH0,,,0x00,装入,TL0,。,(,3,)设置,IE,寄存器,本例由于采用定时器,T0,中断,因此需将,IE,寄存器中的,EA,、,ET0,位置,1,。,(,4,)启动和停止定时器,T0,将定时器控制寄存器,TCON,中的,TR0=1,,则启动定时器,T0,;,TR0=0,,则停止定时器,T0,定时。,21,#include,Char i=100,;,/*,给变量,i,赋初值,定时,0.5S,,每次定时中断,5MS,,需要中断,100,次*,/,void main( ),TMOD=0x01,;,/*,设置定时器,T0,为方式,1*/,TH0=0xee,;,/*,向,TH0,写入初值的高,8,位*,/,TL0=0x00,;,/*,向,TL0,写入初值的低,8,位*,/,P1=0x00,;,/*P1,口,8,只,LED,点亮*,/,EA=1,;,/*,总中断允许*,/,ET0=1,;,/*,定时器,T0,中断允许*,/,TR0=1,;,/*,启动定时器,T0*/,while(1),;,/*,无穷循环,等待定时中断*,/,22,/*,以下为定时器,T0,的中断服务程序*,/,void T0_int(void) interrupt 1,TH0=0xee,;,/*,给,T0,装入,16,位初值,计,4608,个数后,,T0,溢出,TL0=0x00,;,i-,;,/*,循环次数减,1*/,if(i0,;,i-),for(j=0,;,j125,;,j+),;,/*,空函数*,/,void main( )/*,主函数*,/,TMOD=0x50,;,/*,设置定时器,T1,为方式,1,计数*,/,TH0=0xff,;,/*,向,TH0,写入初值的高,8,位*,/,30,TL0=0xfc,;,/*,向,TL0,写入初值低,8,位*,/,EA=1,;,/*,总中断允许*,/,ET1=1,;,/*T1,中断允许*,/,TR1=1,;,/*,启动,T1*/,while(1),;,/*,无穷循环,等待定时中断*,/,/*,以下为定时器,T1,的中断服务程序*,/,void T1_int(void) interrupt 3,for(,;,) /*,无限循环*,/,P1=0xff,;,/*8,位,LED,全灭*,/,Delay(500),;,/*,延时,500ms*/,P1=0,;,/*8,位,LED,全亮*,/,Delay(500),;,/*,延时,500ms */,31,案例,4,用定时器来控制数码管的动态显示。,用定时器控制数码管动态显示的方法:,设定时器的定时时间为,1ms,,每次产生溢出中断,就根据位选变量,bsel,(主程序中将其初值设置为,0xfe,)送位选口,点亮一位数码管,并将,bsel,左移一位,为下一位的显示做好准备,,4,次定时中断分别完成,4,位数码管的显示,之后将,bsel,的值再次初始化为,0xfe,,准备下一轮显示。,因此这种显示方式由定时中断自动完成,无需在主程序中调用,主程序,uchar bsel , n;,void main(void), n=0;,bsel=0xfe; /,首先显示数码管的最低位,TMOD=0x01; /T0,工作于定时方式,2,TH0=-1000/256; /T0,的定时时间为,1000us,TL0=-1000%256;,ET0=1; /,允许,T0,中断,TR0=1; /,启动定时,EA=1; /,开中断,while(1);,uchar code segtab=,0xc0,0xf9,0xa4,0xb0, 0x99, 0x92,0x82,0xf8, 0x80, 0x90,0x88, 0x83, 0xc6,0xa1, 0x86, 0x8e,0x89,0x8c;,uchar dbuf4=,4,3,2,1;,字符,0F,的字形码表,显示缓存,存放要显示字符,void time0(void) interrupt 1, TH0=-1000/256;,TL0=-1000%256;,P0=0xff;,P2=bsel;,P0=segtabdbufn;,bsel=_crol_(bsel,1);,n+;,if(n=4), n=0;,bsel=0xfe;,重新装入时间常数,定时器,T0,中断服务程序,熄灭数码管,防止上一位字符在当前位置显示出来。,点亮当前位,根据显示缓存查字段码,准备显示下一位,指向下一位要显示的数据,如果四位已显示完,重新从最低位开始,6.4.3,扩展一个外部中断源,方式,2,可自动重新装载初值。此方式可省去用户程序中重新装初值的指令。,当某个定时器,/,计数器不使用时,可为,AT89S51,扩展一个负跳沿触发的外部中断源。,基本思想:,把定时器溢出中断做成外部中断,,然后把计数输入信号接到定时器的相应引脚上,T0,脚(或,T1,脚),并把定时器被设置为方式,2,(自动装入常数方式)计数工作模式,计数器,TH0,、,TL0,初值均为,0FFH,,并允许,T0,中断,总中断开放。当检测到,T0,脚(或,T1,脚)引脚电平发生负跳变时,计数器,TF0(,或,TF1),溢出,这时将产生一个中断请求。,【,例,6-3】,扩展一个负跳沿触发的外部中断源,把定时器,T0,计数输入引脚作为外部中断请求信号的输入端。,35,#include,void main( ), ,TMOD=0x06,;,/*,设置定时器,T0,为方式,2,计数*,/,TH0=0xff,;,/*,给,T0,装入初值*,/,TL0=0xff,;,/*,给,T0,装入初值*,/,ET0=1,;,/*,允许,T0,中断*,/,EA=1,;,/*,总中断开*,/,TF0=0,;,/*T0,中断溢出标志位清,0*/,TR0=1/*,接通,T0,计数*,/,while (1) /*,无限循环等待*,/,/*,以下为定时器,T0,的中断服务程序*,/,void T0_int(void) interrupt 1 using 0, /*,外中断处理部分*,/,36,6.4.4 P1.0,上产生周期为,2ms,的方波,【,例,6-4】,系统时钟为,12MHz,,编程实现从,P1.0,引脚上输出一个周期为,2ms,的方波,如,图,6-14,所示。,基本思想:,要在,P1.0,上产生周期为,2ms,的方波,定时器应产生,1ms,的周期性的定时,定时对,P1.0,求反。选择定时器,T0,,方式,1,定时,采用中断方式,,GATE,不起作用。,37,图,6-14,定时器控制,P1.0,输出一个周期为,2ms,的方波,计算,T0,的初值计算:,设,T0,的初值为,X,,则,(2,16,X,),1,10,6,=1,10,3,=65536,X,=1000,则初值为:,655361000=64536,,,因此,TH0=(655361000)/256,,,TL0=(655361000)%256,。,参考程序如下:,38,#include,sbit P1_0=P10;,void main(void),TMOD=0x01,;,/*,设置定时器,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,;,39,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,,,40,所以,TH1= TL1=206,。,T0,设为方式,1,定时,则控制字为,61H,。定时器,T0,和,T1,均采用中断方式工作。,参考程序如下:,#include,sbit P1_0=P10;,sbit P1_1=P11;,void main(void),TMOD=0x61,;,/*,设置定时器,T0,为方式,1,定时,,T1,为方式,2,计数*,/,P1_0=0;,TH0=(6553610000)/256,;,/*,给,T0,装初值*,/,TL0=(6553610000)%256,;,TH1=206,;,/*,给,T1,装初值*,/,TL1=206,;,41,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,的方波*,/,。,42,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,参考程序如下:,43,#include,sbit sound=P17;,void main(void),EA=1,;,/*,总中断开 *,/,ET1=1,;,/*,允许,T0,中断 *,/,TMOD=0x10,;,/*,设置定时器,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,;,44,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,所示。,45,图,6-16,利用,GATE,位测量正脉冲的宽度,参考程序如下:,#include,sbit P3_3=P33,;,/*,位变量定义*,/,unsigned count_high,;,/*,定义计数变量,用来读取,TH0*/,unsigned count_low,;,/*,定义计数变量,用来读取,TL0*/,void read_ count( ),;,/*,读计数器函数*,/,void main( ),TMOD=0x90,;,/*,设置定时器,T1,为方式,1,定时*,/,TH1=0,;,/*,向定时器,T1,写入计数初值*,/,TL1=0,;,TR1=1,;,while(P3_3=1); /*,等待变低*,/,TR1=1,;,/*,如果为低,启动,T1(,未真正开始计数,)*/,46,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,两个单元中,,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!