您好,欢迎访问三七文档
第5章定时/计数器本章学习目标:能正确描绘定时/计数器的4种工作方式,重点掌握方式1、方式2的应用学会定时/计数初值的计算能读懂教材中的控制实例,学会编写同等难度的中断、定时/计数程序5.定时/计数器1.日常生活中定时、计数的例子:如闹钟、画“正”统计选票、家用水表对水量的计数。2.单片机应用系统中定时计数的需求:如用单片机控制的打铃器、空调的定时开关、啤酒自动生产线上对酒瓶的计数装置等。3.80C51单片机片内的定时/计数器:两个16位可编程的定时/计数器:T0和T1,都能定时和对外部事件进行计数。此外,T1还可以作为串行接口的波特率发生器。5.1.1定时/计数器的结构1.定时和计数的原理(1)计数定时/计数器的实质是加1计数器(16位),其原理类似于古代用来计时的水钟:假设计满一小时需要100,000,000滴,这称为水钟的计数容量16位定时/计数器的计数容量是65536单片机是对脉冲个数计数,计数器每接收到一个脉冲,计数值加1,当接收满65535个脉冲后,再来一个脉冲,计数值清0表明这一轮计数结束,同时将标志位TF0或TF1置1。(2)定时单片机内部的计数器用作定时器时,是对标准的时钟进行了计数,每来一个时钟脉冲,计数器加1,只要保证计数脉冲的间隔相等,则计数值就代表了时间的流逝。计数器如何能作为定时器使用呢?单片机中的定时器和计数器其实是一个器件:计数器:是对外部发生的事件进行计数,定时器:是对单片机内部的标准时钟脉冲进行计数。单片机内部的标准时钟脉冲是如何获得的呢?见图4-9,它是由单片机的晶振经过12分频后得到。由于晶振的频率很准,所以这个时钟脉冲的时间间隔也很准。不难算出,当单片机采用12MHz的晶振时,它提供给计数器的脉冲频率是12MHz/12=1MHz,脉冲周期就是1微秒。图4-9定时/计数器T0的结构示意图单片机内部的16位定时/计数器由高8位和低8位两个寄存器组成:T0由TH0和TL0组成,T1由TH1和TL1组成,定时/计数器的计数值就存放在这里面。定时/计数器T1的结构与T0相同。图4-9定时/计数器T0的结构示意图2.定时/计数器的结构再以水钟为例,当水不断落下,下面容器中的水不断变多,最终总有一滴水使得容器完全充满。这时如果再有一滴水落下,就会发生“溢出”。与此类似,16位定时/计数器计满65536个脉冲时,也会发生溢出。定时/计数器溢出后标志位TF0(或TF1)由0变1,由此能够引发定时中断(在中断定时方式下),这就像定时的时间一到,闹钟就会响一样。如果采用12MHz的晶振,对应的脉冲周期是1微秒,计满65536个脉冲所对应的时间就是65.536ms。3.定时/计数值的设置现实生活中,如何满足计数值少于65536的需要?如牛奶包装线上24盒装箱一次。再回到水钟的例子上去:刚才假设下面容器滴入100,000,000滴水才会满,现在我们在开始滴水之前先放入一勺水,这样问题就解决了。计数器的道理是一样的,只要用预置数的方法先在计数容器内存入一个初值(通常称为时间常数),如我们要计100,那就存入65436,只要再来100个脉冲,就刚好会溢出,引发中断。计数器初值的设置在主频为12MHz的情况下,每个时钟脉冲是1微秒,则计满65536个脉冲需65.536毫秒,如要定时10毫秒则存入初值55536,(10毫秒是10000微秒,需计数10000个脉冲)。可见,定时器的定时时间长短与系统时钟和定时器初值有关。说明1.当定时/计数器用作计数器时,通过引脚P3.4(P3.5)对外部输入脉冲计数。2.定时/计数器T0(T1)启动运行后,会按设定的工作方式独立进行计数,不再占用CPU时间。当计数器T0(T1)计满溢出时,TF0(TF1)置1,向CPU发出中断请求信号。定时器初值的设置4-10定时/计数器的控制关系5.2定时/计数器的控制在单片机中有两个特殊功能寄存器与定时/计数有关,它们就是TMOD和TCON,定时/计数器T0、T1就由它们来控制:TMOD用于设置工作方式;TCON用于控制其启动、停止和中断申请。1.定时器工作方式寄存器TMODTMOD用于设置T0和T1的工作方式,字节地址为89H,不能按位寻址。其格式和各位的含义如下:2.定时/计数器控制寄存器TCONTCON的低4位用于控制外部中断,高4位用于控制定时/计数器的启动和中断申请。TF0(或TF1)当计数溢出时,TF0(或TF1)会自动由0变1,告诉我们计数已满,我们可以通过查询TF0(或TF1)位的状态来判断计时时间是否已到;如果采用定时中断方式,则TF0(或TF1)由0变1时,能自动引发中断。TR0(或TR1)由图4-11可知,只有当TR0(或TR1)为1时,开关1才能闭合,计数脉冲才能进入计数器,故TR0(或TR1)称为运行控制位,可用指令“SETBTR0(或TR1)”来置位以启动定时/计数器运行;或用指令“CLRTR0(或TR1)”来关闭定时/计数器的工作,一切全靠编程人员控制。图4-11定时/计数器T0方式0的逻辑结构示意图5.3定时/计数器的工作方式80C51单片机定时/计数器T0有4种工作方式(方式0、1、2、3),T1有3种工作方式(方式0、1、2)。1.方式0当TMOD的M1M0=00时,定时/计数器工作于方式0。方式0为13位定时/计数器,由TL0的低5位和TH0(8位)共同完成计数功能(TL0的高3位可忽略)。当TL0的低5位溢出时,向TH0产生进位;TH0溢出时,将定时器中断请求标志位TF0置1,可申请中断,也可对TF0进行查询。图4-11定时/计数器T0方式0的逻辑结构示意图2.方式1当M1M0=01时,定时/计数器工作于方式1。方式1的计数位数是16位,由TL0作为低8位,TH0作为高8位共同构成。其余操作同方式0。图4-12定时/计数器T0方式1的逻辑结构示意图3.方式2当M1M0=10时,定时/计数器工作于方式2。这是自动重装初值的8位计数方式,它省去了方式0和方式1在多次重复计数状态下必须重新设定计数初值的麻烦,但是却付出了减小定时时间的代价。图4-13定时/计数器T0方式2的逻辑结构示意图特别适合于制作比较精确的脉冲信号发生器。4.方式3方式3只适用于定时/计数器T0。当T1被设定为方式3状态时,将停止计数。当M1M0=11时,T0工作于方式3。此时TL0和TH0作为两个相互独立的8位定时/计数器使用。TL0既可定时又可计数,它使用T0的各控制位、引脚和中断源,即C/、GATE、TR0、TF0、T0(P3.4引脚)、(P3.2引脚);TH0此时只能用作内部定时功能,它借用了定时/计数器T1的控制位TR1和T1的中断标志位TF1,其启动和停止只受TR1控制。图4-14定时/计数器T0方式3的逻辑结构示意图定时器T1无工作方式3,当定时器T0工作在方式3时,定时器T1可设置为方式0、方式1和方式2。4.4.1应用指导1.定时/计数器的定时/计数范围定时/计数器工作于不同方式下的位数不同,它所具有的计数范围也不一样:工作方式0:13位定时/计数方式,因此,最多可以计到213,也就是8192次。工作方式1:16位定时/计数方式,因此,最多可以计到216,也就是65536次。工作方式2和工作方式3:都是8位定时/计数方式,因此,最多可以计到28,也就是256次。想一想如果我们需要超过计数器计数范围的定时或计数功能,应该怎样做?4.4定时/计数器应用与训练2.时间常数初值的计算定时/计数器只要预设一个时间常数初值,就可以完成不超过其计数范围的任意大小的计数。算法如下:定时时间常数初值X:方式0X=8192-t(fosc/12)方式1X=65536-t(fosc/12)方式2、方式3X=256-t(fosc/12)其中t是需要定时的时间,单位是微秒;fosc是晶振计数时间常数X:方式0X=8192-S方式1X=65536-S方式2、方式3X=256-S说明:式中S是需要计数的次数假设流水线上一个包装是12盒,要求每到12盒就产生一个动作,用单片机的工作方式0来控制,应当预置的计数初值是多少呢?对了,就是8192-12=8180。3.定时/计数器的初始化对80C51单片机的定时/计数器编程的初始化方法:①对TMOD赋值,以确定T0和T1的工作方式;②计算时间常数初值,并将其写入TH0、TL0或TH1、TL1;③采用中断定时方式时,需对IE赋值开中断;④置位TR0或TR1,启动定时/计数器。4.4.2基本训练—初始化训练例3:某牛奶生产线上一个包装是12盒,要求每生产12盒就执行装箱操作,用80C51单片机来控制,请编写初始化程序。1.思路与计算:要确定定时器(T0或T1),选择其工作方式。我们以T0的工作方式2为例,计算时间常数并赋值给TH0、TL0。X=256-S=256-12=244=0F4H2.初始化程序:MOVTMOD,#06H;T0作计数器,工作于方式2MOVTH0,#0F4H;装入时间常数初值MOVTL0,#0F4H;自动重装时间常数MOVIE,#00H;用查询方式确定计满12盒?(或MOVIE,#82H);使用T0中断,计满12盒后,;自动申请中断SETBTR0;启动T0波特率发生器3.总结:对计数过程是否结束有查询和中断两种方法,要合理选择,并在程序设计中正确体现。4.4.3应用实例1.定时/计数器用于外部脉冲宽度的测量(1)测量原理可以利用定时/计数器方式寄存器TMOD中的门控位GATE与引脚配合使用,控制定时/计数器的启动与停止:当GATE=1时,要求TR1=l,且为高电平,才能启动定时器T1计数工作;如果出现低电平,则T1停止计数;当GATE=0时,只要TR1=1就可以启动定时器,而与的输入状态无关。可以利用定时/计数器方式寄存器TMOD中的门控位GATE与引脚配合使用,控制定时/计数器的启动与停止:当GATE=1时,要求TR1=l,且为高电平,才能启动定时器T1计数工作;如果出现低电平,则T1停止计数;当GATE=0时,只要TR1=1就可以启动定时器,而与的输入状态无关。利用上述特点,将被测脉冲信号从(P3.3)引入,在T1的程序初始化中令GATE=1,同时“SETBTR1”,这样脉冲信号的上升沿就能启动T1计数,脉冲信号下降沿能使T1停止计数。利用定时器T1的计数值m乘以机器周期就可以得到被测脉冲信号的宽度TW。(2)硬件电路硬件电路简图如图4-15。(3)程序设计利用80C51的内部RAM30H、31H单元保存被测脉冲宽度对应的计数值。参考程序如下:ORG0000HAJMPMAINORG0100HMAIN:MOVSP,#60H;设堆栈指针MOVTMOD,#90H;设置控制字,T1工作于方式;1,GATE=1MOVTH1,#00H;设定计数初值为00HMOVTL1,#00HL1:JBP3.3,L1;等待输入变为低电平SETBTR1;预置TR1=1,准备启动T1L2:JNBP3.3,L2;等待上升沿,以便开始计数L3:JBP3.3,L3;是高电平则计数继续CLRTR1;低电平则停止计数MOVA,TL1;读低位计数值MOV30H,A;低位计数值存于30HMOVA,TH1;读高位计数值MOV31H,A;高位计数值存于31HEND(4)总结与思考定时/计数器还可用于测量脉冲信号的频率、周期等。本实例是利用定时/计数器的门控位(GATE)测量脉冲宽度。但要注意,在晶振12MHz的情况下,被测脉冲宽度范围最大为65535×1μs=65.536ms。想一想,如果要测量脉冲信号的周期,该如何去做?2.计数器用于绕线机的控制绕线机常用于对电机或变压器的绕组进行绕制,图4-16是绕线机的控制电路。当按下工作按钮以后,机器启动,绕线机在直流电机和减速齿轮的带动下开始工作。当绕线架上的线圈绕到规定的圈数时,绕线机会自动停止绕线。如果再次按下工作按钮,绕线机会重复以上过程。图4-16绕线机的控制电路控制说明:1.软件控制P1.0=0时,绕线机开始绕线;P1.0=1时,绕线机不绕线。
本文标题:第5章-定时计数器
链接地址:https://www.777doc.com/doc-5719971 .html