资源描述
,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,复习“中断”,8051有几个中断源?几级优先级?,中断源对应的中断入口是多少?,中断源自然优先级的顺序?,关键字interrupt的作用?,与中断相关的SFR有哪些?,复习“中断”,简述中断响应过程。,中断源,B,向,CPU,提出中断请求,,CPU,暂时中断原来工作,A,,转去处理事件,B,,处理完成后,再回到原来被中断的地方,继续工作,A,的执行,能用,RET,指令代替,RETI,指令吗,?,不可以。,RET,虽然也能控制,PC,返回到原来中断的地方,但,RET,指令没有清零中断优先级状态触发器的功能。中断系统会任务中断仍在进行,同级或低级中断请求将不会被相应,课题五 定时,/,计数器,任务一输出,1000Hz,的方波,任务二 每秒闪烁一次的,LED,任务三简易频率计,任务一输出,1000Hz,的方波,任务目标,任务的目标是利用定时中断实现从,P1.0,输出,1000Hz,的方波。,程序设计分析,从,P1.0,输出,1000Hz,的方波,实际上就是要求从,P1.0,输出周期为,1ms,的方波。则高电平和低电平的时间各为,1ms,的一半,即各为,500s,。,也就是在单片机中实现,500s,的定时,每次定时时间到了的时候,将,P1.0,的电平改变就可以了。一个引脚的电平的改变,使用取反指令就可以完成,具体的指令如“,P10=P10,;”,延时,500,s,P1.0,电平取反,P1.0,电平取反,重装定时器初值,定时时间到了,中断结束,图,8-2,采用指令延迟程序框图,图,8-3,中断服务程序的流程图,任务二每秒闪烁一次的,LED,任务目标,利用定时中断实现将,LED,每秒闪烁一次。,程序设计分析,要使,LED,每秒闪烁一次,按,LED,的点亮时间和熄灭时间相同进行处理,则只需要进行,0.5s,的定时。具体处理是,每过,0.5s,,将,LED,的状态取反就可以实现目标了。或者说,与本课题中的任务一类似,只不过是频率变得很低了,周期更长了。,任务三简易频率计,任务目标,具体目标是:利用单片机的,T0,、,T1,的定时,/,计数功能,完成对输入的信号的频率进行测量,测量的结果通过,8,位动态数码管显示出来。这里要求实现对,0,200KHz,的信号频率进行准确测量,测量误差不超过,1Hz,。,课题目标,本课题的任务,是用单片机实现:,精确定时和计数,通过三个任务的实现,学会:,编写单片机中断服务程序,定时计数器的初始化、短时间定时和长时间定时的实现,80C51,单片机的定时,/,计数器,定时,/,计数器的结构,基本型:,T0,,定时、计数。,T1,,定时、计数、串口波特率发生器。,增强型:增加了,T2,。见节。,1,定时,/,计数器的结构和工作原理,TH1,、,TL1,TH0,、,TL0,TCON,TMOD,定时,/,计数器的工作原理,实质是,16,位加,1,计数器,定时器模式时,是对内部,机器周期,计数。计数值乘以机器周期就是定时时间,计数器模式时,是对,外部事件,计数。脉冲由,T0,(,P3.4,)或,T1,(,P3.5,),引脚输入。,注意,:(,若,计数值,为,N,计数初值,为,X,),溢出信号使,TF0,或,TF1,置,1,,并,发出中断请求,,,16,位时有:,N=65536-X,,或,X=65536-N,12MHz,晶振时,计数频率低于,0.5MHz,2,定时,/,计数器的控制,工作方式寄存器,TMOD,7,6,5,4,3,2,1,0,TMOD,GATE,C/T,M1,M0,GATE,C/T,M1,M0,字节地址:,89H,GATE,:门控位。,GATE,0,时,只要,TRx,为,1,,就可启动计数器工作;,GATA,1,时,定时器的启动还要加上,INTx,引脚为高电平这一条件。,C/T,:模式选择位。清,0,为定时模式,置,1,为计数方式。,M1M0,:工作方式设置位。可设置四种工作方式,(,见下页,)。,M1M0,工作方式,说 明,00,方式,0,13,位定时,/,计数器,01,方式,1,16,位定时,/,计数器,10,方式,2,8,位自动重装定时,/,计数器,11,方式,3,T0,分成两个独立的,8,位定时,/,计数器;,T1,此方式停止计数,注意:,TMOD,不能进行位寻址,控制寄存器,TCON,7,6,5,4,3,2,1,0,TCON,TF1,TR1,TF0,TR0,字节地址:,88H,TFx,:,Tx,溢出标志位。,响应中断后,TFx,有硬件自动清,0,。用软件设置,TFx,可产生同硬件置,1,或清,0,同样的效果。,TRx,:,Tx,运行控制位。,置,1,时开始工作;清,0,时停止工作。,TRx,要由软件置,1,或清,0,(,即启动与停止要由软件控制,)。,3,定时,/,计数器的工作方式,T0,有方式,0,、,1,、,2,、,3,;,T1,有方式,0,、,1,、,2,。以,T0,为例说明。,方式,0,:,13,位方式,C/T=1,时,则为计数模式,有:,X=2,13,-N=8192-N,C/T=0,时,则为定时模式,有:,X=2,13,-N=8192-N,,,N=,t,/Tcy,【,例,5-3】,若计数个数,N,为,2,,求计数初值。,公式法计算:,X,8192,2=8190=1FFEH,求补法计算:对,0 0000 0000 0010B,取反加,1,为:,1 1111 1111 1110B(,1FFEH,),初值计算:,公式法,求补法,:,X=,对,N,求补,门控位作用,当,GATE=0,时,仅由,TR0,控制与门的开启。与门输出,1,时,控制开关接通,计数开始;,当,GATE=1,时,与门的开启由,INT0,和,TR0,共同控制。这种方式可以用来测量,INT0,引脚上正脉冲的宽度。,注意,:方式,0,的计数初值高,8,位和低,5,位确定麻烦,,实际应用中常由,16,位的方式,1,取代。,方式,1,:,16,位方式,X=2,16,-N=65536-N,计数范围:,1,65536,计数初值要,分成,2,个字节,分别送入,TH0,、,TL0,【,例,5-4】,若要求定时器,T0,工作于方式,1,,定时时间为,1ms,,当晶振为,6 MHz,时,求送入,TH0,和,TL0,的计数初值各为多少?应怎样送入,TH0,和,TL0,?,由于晶振为,6 MHz,,所以机器周期,Tcy,为,2,S,,因此:,N=t/Tcy,=110,-3,/210,-6,500,X,2,16,-N,65536-500,65036,FE0CH,也可以利用以下,2,条指令完成:,MOV TL0,#(65536-500),MOD,256;,余数,为计数初值的,低字节,MOV TH0,#(65536-500),/,256 ;,商,为计数初值的,高字节,用传送指令分别将,FEH,送入,TH0,中,,0CH,送入,TL0,中即可。,方式,2,:,8,位自动重装方式,X=2,8,-N=256-N,计数范围:,1,256,特别适合与脉冲信号发生器,方式,3,:,(仅,T0,有此方式,,T1,的方式,3,将停止计数),TL0,进行,8,位定时,/,计数,TH0,进行,8,位定时(,T1,方式,2,时,可出借,TR1,、,TF1,),一般情况下,当定时器,T1,用作串口波特率发生器时,定时器,T0,才设置为工作模式,3,。,定时应用,定时时间较小时(小于,65ms,),。晶振为,12 MHz,时,,Tcy,为,1,S,。可直接采用方式,1,完成定时任务。,例,1,:输出,50Hz,的方波。,利用定时,/,计数器,T0,的方式,1,,产生,10ms,的定时,并使,P1.0,引脚上输出周期为,20ms,的方波,采用中断方式,设系统的晶振频率为,12 MHz,。,确定方式字:,T0,在定时的方式,1,时:,M1M0=01,,,GATE=0,,,C/T=0,方式控制字为,01,H,求计数初值,X:,Tcy,为,1,S,N=10ms/1,S=10,000,X=65536-10000=D8F0H,应将,D8,送,TH0,F0H,送,TL0,定时时间较大时(大于,65ms,),。实现方法:一是采用,1,个定时器定时一定的间隔(如,20ms,),然后用软件进行计数;二是采用,2,个定时器级联,其中一个定时器用来产生周期信号(如,20ms,为周期),然后将该信号送入另一个计数器的外部脉冲输入端进行脉冲计数。,例,2,每秒闪烁一次的,LED,。设系统的晶振频率为,12MHz,。,确定方式字:,T0,在定时的方式,1,时:,M1M0=01,,,GATE=0,,,C/T=0,方式控制字为,01,H,求计数初值,X:,Tcy,为,1,S,N=20ms/1,S=20,000,X=65536-20000=4E20H,应将,4E,送,TH0,20H,送,TL0,需要定时,500ms,,大于,65ms,采用定时,20ms,,然后再计数,25,次的方法实现,任务一,P1.0,输出,1000Hz,的方波,分析:,周期,=1/1000Hz=1ms,即每取反,12MHz,的晶振需要设:定时初值,N=500,TH0=,(65536-500),/,256,TL0=,(65536-500),%,256,工作方式设置为方式,1,初始化定时器,启动定时,等待,P1.0,电平取反,重装定时器初值,定时时间到了,中断结束,主程序,定时中断服务程序,sbit P10=P10,void main(),TMOD=0 x01;,TH0=(65536-500)/256;,TL0=(65536-500)%256;,ET0=1;,EA=1;,TR0=1;,void Timer0_int()interupt 1,TH0=(65536-500)/256;,TL0=(65536-500)%256;,P10=P10;,任务二每秒闪烁一次的,LED,任务目标,利用定时中断实现将,LED,每秒闪烁一次。,程序设计分析,要使,LED,每秒闪烁一次,按,LED,的点亮时间和熄灭时间相同进行处理,则只需要进行,0.5s,的定时。具体处理是,每过,0.5s,,将,LED,的状态取反就可以实现目标了。或者说,与本课题中的任务一类似,只不过是频率变得很低了,周期更长了。,任务二每秒闪烁一次的,LED,为了完成,0.5s,的定时,一般来说,有两种方案可以实现。,第一种方案是采用硬件定时的基础上,增加一个存储单元,每次中断时使用该存储单元进行计数,当达到某个计数值时再执行对应的程序,这样就延长了定时的时间长度。,第二种方案是也是采用一个定时器进行硬件定时,在每次中断时输出一个脉冲,然后采用硬件计数的方式进行延长定时时间。,任务二每秒闪烁一次的,LED,分析:,周期,=500ms,即每,500msP1.0,取反,硬件定时,20ms,,软件计数,25,次,12MHz,的晶振需要设:定时初值,N=20000,TH0=,(65536-20000),/,256,TL0=,(65536-20000),%,256,工作方式设置为方式,1,sbit P10=P10;,void main(),TMOD=0 x01;,TH0=(65536-500)/256;,TL0=(65536-500)%256;,ET0=1;EA=1;,TR0=1;,while(1);,void Timer0_int()interupt 1,TH0=(65536-500)/256;,TL0=(65536-500)%256;,P10=P10;,sbit P10=P10;,unsigned char count=0;,void main(),TMOD=0 x01;,TH0=(65536-20000)/256;TL0=(65536-20000)%256;,ET0=1;EA=1;TR0=1;,while(1);,void Timer0_int()interupt 1,TH0=(65536-20000)/2
展开阅读全文