资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第4章 中断系统和定时/计数器,本章学习目标 :,理解中断概念,能正确描绘单片机中断响应过程,熟记,80C51,5,个中断源及其中断入口地址,能按要求正确设置特殊功能寄存器,IE,、,IP,、,TCON,、,SCON,和,TMOD,熟悉中断优先控制的方法,能正确描绘定时,/,4,种工作方式,重点掌握方式,1,、方式,2,的应用,学会定时,/,计数初值的计算,能读懂教材中的控制实例,学会编写同等难度的中断、定时,/,1,4.1 中断系统,4.1.1中断系统的基本概念,某人看书,某人正在处理一件事A,电话铃响,出现另一件须立即解决的事B,暂停看书,中止A,书中作记号,记录断点,便于接续,电话谈话,处理B,继续看书,继续A的工作,保护断点,中断响应,中断请求,中断返回,1.中断的概念,(1)现实生活中的中断:,2,中断原因:,一个人不可能同时完成两项任务。,单片机,只有一个CPU,一旦面临多任务,它也会,中断吗?,先接电话,然后再继续看书,这样效率最高!,4.1.1中断系统的基本概念,3,(2)单片机中的中断,CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理,(中断发生或中断请求),;,CPU暂时中断当前的工作,转去处理事件B,(中断响应和中断服务),;,待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A,(中断返回),。,中断请求中断响应中断服务中断返回,中断过程,事件B的处理过程,事件A,事件B,什么是中断,?,4,2.中断技术的应用,并行处理,CPU可以与多台外设并行工作,并分时与他们进行信息交换,提高了CPU的工作效率。,实时控制,单片机应用系统可能随机请求CPU提供服务。有了中断系统,CPU就可以立即响应并予以处理。,故障处理,单片机系统在工作时可能会出现一些突发故障,如电源断电,存储器出错,程序执行错误(如除数为0)等,一旦出现故障,CPU就可及时转去执行故障处理程序,而不必停机。,5,3.中断系统,为实现中断功能而配置的硬件和编写的软件就是中断系统。,中断由谁来实施?,中断功能由中断系统来执行。,6,图4-1 中断系统的结构框图,7,4.1.2 中断源中断的申请方,能够向CPU发出中断申请的部件称为中断源。,80C51单片机有5个中断源。见下表,那些部件可以向CPU,申请,中断呢?,中断源,说明,外部中断,从P3.2引脚引入的外部中断申请,定时器T0中断,定时器T0溢出时引发中断申请,外部中断,从P3.3引脚引入的外部中断申请,定时器T1中断,定时器T1溢出时引发中断申请,串行口中断,一次串行发送或接收完成后,发出中断申请,8,4.1.3 中断控制中断的控制“工具”,中断允许寄存器IE,中断优先级寄存器IP,定时/计数器及外部中断控制寄存器TCON,串口控制寄存器SCON,单片机通过对,4个特殊功能寄存器,实施中断控制:,9,1中断允许寄存器IE,功能:,控制单片机是否接受中断申请,以及接受哪一种中断申请,字节地址:,A8H,其格式和每位的含义如下:,10,图4-2 IE的格式,11,由位操作指令或数据传送指令实现。,例:同时打开外部中断0和串行口中断,可设置为:,法1:,MOV IE,#10010001B,法2:,SETB EA,SETB ES,SETB EX0,想一想还可以怎样实现?,如何对IE进行设置?,IE的设置方法:,12,2中断优先级寄存器IP,功能:,对80C51单片机进行高级别或低级别中断的设置,,IP的字节地址:,B8H,格式和每位的含义如下:,13,图4-3 IP的格式,14,举例,例:,令串行口为高优先级中断,外部中断,0,为低优先级中断。,设置方法:,法1:,MOV IE,#10010001B,;开中断,MOV IP,#00010000B,;设优先级,法2:,MOV IE,#10010001B,SETB PS,说明:,此时串口的优先级高于外部中断0的优先级,15,答案:,此时,CPU,按自然优先级顺序确定该响应哪个中断请求。,如果几个同级别的中断源同时申请中断,CPU如何响应?,注意:,自然优先级由硬件决定,用户不能更改。,排列见表,42,16,表42 中断入口地址及自然优先级,17,3定时/计数器及外部中断控制寄存器TCON,功能:,字节地址:,88H,可设置外部中断申请的形式:低电平触发还是下降沿触发,控制定时,/,计数器的计时开始或停止,是各中断源(串口中断除外)是否申请中断的标志位,格式如下,各位含义见表43,TCON,D7,D6,D5,D4,D3,D2,D1,D0,TF1,TR1,TF0,TR0,IE1,IT1,IE0,IT0,18,形式,符号,位地址,功 能,说 明,中,断,控,制,IT0,88H,外部中断0的触发控制位,IT0=0:低电平触发,IT0=1:下降沿触发,IT0的状态由用户通过初始化程序定义,IE0,89H,外部中断0请求标志位。,CPU采样到外部中断0的中断请求时, IE0=1,CPU响应该中断时, IE00,IE0的状态由单片机自动设置,IT1,8AH,外部中断1的触发控制位,IT1=0:低电平触发,IT1=1:下降沿触发,IT1的状态由用户通过初始化程序定义,IE1,8BH,外部中断1的中断请求标志位,CPU采样到外部中断1的中断请求时, IE1=1,CPU响应该中断时, IE10,IE1的状态由单片机自动设置,表43,TCON,的功能说明,19,形式,符号,位地址,功 能,说 明,定,时,/,计,数,控,制,TR0,8CH,TR0=1:启动定时/计数器T0,TR0=0:停止定时/计数器T0,TR0的状态由用户通过初始化程序定义,TF0,8DH,定时/计数器T0溢出中断请求位,T0定时或计数完成时TF0=1,同时申请中断,CPU响应该中断时, TF00,TF0的状态由单片机自动设置,TR1,8EH,TR1=1:启动定时/计数器T1,TR1=0:停止定时/计数器T1,TR1的状态由用户通过初始化程序定义,TF1,8FH,定时/计数器T1溢出中断请求位,T1定时或计数完成时TF1=1,同时申请中断CPU响应该中断时, TF10,TF1的状态由单片机自动设置,续表43,20,例 1,编程设定TCON为低电平触发的高优先级中断源。,分析:,这是典型的中断初始化问题,方法一般如下:,1)对TCON的相关位赋值,2)设定所用中断源的优先级赋值IP,3)开中断置位IE,21,解:,法1:,CLR IT1,SETB PX1,SETB EX1,SETB EA,例 1,法2:,CLR IT1,MOV IP,#04H,MOV IE,#84H,22,4串口控制寄存器SCON,功能:,只有D1和D0位用于中断,作为串口中断请求标志,即串口中断请求寄存器,字节地址:,98H,格式如下:,23,RI为接收中断请求标志位。,当串口接收完一帧串行数据时,RI自动置1;,CPU响应中断后,用软件对RI清0。,TI为串行口发送中断请求标志。,当串口发送完一帧串行数据时,TI自动置1,请求中断。,CPU响应中断后,由软件对TI清零。,其他几位的含义及用法见第5章。,24,4.1.4 中断响应,无同级或高级中断正在服务,有中断请求信号,相应的中断源已打开,即EA=1,中断源对应中断允许位也为1。,当前的指令周期已经结束,如果当前指令为RETI或访问IE和IP的指令,至少还要再执行完一条指令。,1.,中断响应条件,25,2.中断响应过程,图44中断响应过程,将当前寄存器内容压入堆栈,如 PUSH ACC,在中断服务程序中实现,解决单片机中断后要干什么的问题。,把保存在堆栈中的寄存器内容取出,送回原来的位置,如POP ACC,26,4.1.5中断嵌套,答案:CPU要进行分析判断,决定是否响应:,当CPU正在执行中断服务程序时,又有新的中断源发出中断申请,响应吗?,情况1:,同级或低级中断源申请中断,CPU不予理睬,情况2:,高级别中断源申请中断,CPU就要响应。,待执行完高级别中断服务程序后再转回低级中断服务程序继续执行,这就是,中断嵌套。,27,图45 二级中断嵌套的执行过程,28,软件构成:,主程序+中断服务程序,程序编制的关键点:,要对题目要求进行精确分析,明确哪些环节应该安排在主程序中,哪些环节应该安排在中断服务程序中,再分别编制主程序和中断服务程序。,4.2 中断的应用,4.2.1中断应用指导,1中断系统的程序编制,29,1中断系统的程序编制,(1)编制主程序,第一部分:主程序初始化,功能:,第二部分:须由主程序完成的其它功能。,此部分必须编写,用于设置堆栈位置;,定义触发方式(低电平触发或脉冲下降沿触发),对,IE,和,IP,赋值等;,30,(2)选择中断服务程序的入口地址。,(3)编制中断服务程序,。,1中断系统的程序编制,即明确中断服务程序的起始位置,注意1:,一般要保护断点,即保护进入中断时累加器A、进/借位标志CY和SFR的状态,,并在退出中断之前将其恢复;,注意2:,必须在中断服务程序中设定是否允许再次中断,(即中断嵌套),由用户对EX0(或EX1)位置位或清0决定。,说明:,一般在中断服务程序中涉及到关键数据的设置时应关 中断,即禁止嵌套。,31,2中断应用举例,三相交流电的故障检测电路,例2,图4-6是三相交流电的故障检测电路。当A相缺电时,发光二极管LEDA 亮;当B相缺电时,发光二极管LEDB亮;当C相缺电时,发光二极管LEDC亮。,硬件特点:,外部中断 由3个交流继电器的触点和一个或非门扩展而成;,3个220V的交流继电器的线圈ZA、ZB、ZC分别接在A、B、C各相和交流地之间。,图,4-6,三相交流电的故障检测电路,32,(1)检测原理,三相电正常情况下,3个线圈同时得电,3个常开触点全都闭合,0,0,0,1,不申请外部中断,33,故障情况下(假设A相掉电),(1)检测原理,线圈ZA失电,常开触点ZA断开,0,申请外部中断,在外部中断服务程序中读取P1.0引脚状态,0,0,1,1,产生A相掉电状态信号送入P1.0,1,在中断服务程序中对该引脚输出1,A相故障指示灯亮,线圈ZB、ZC有电,常开触点ZB、ZC闭合,B、C相故障指示灯不亮,34,(2)软件设计,ORG 0000H,LJMP MAIN;跳至主程序,ORG 0013H;的中断入口地址,LJMP TEST;转至中断服务程序,ORG 0100H,MAIN:MOV P1,#15H;P1.0、P1.2、P1.4作输入;P1.1、P1.3、P1.5输出0,SETB EX1;开中断,CLR IT1 ;为低电平触发,SETB EA;CPU开中断,SJMP $;等待中断,TEST:JNB P1.0,LB;A相正常,转测B相,SETB P1.1;A相掉电,点亮LEDA,LB:JNB P1.2,LC;B相正常,转测C相,SETB P1.3;B相掉电,点亮LEDB,LC:JNB P1.4,LL;C相正常,返回,SETB P1.5;C相掉电,点亮LEDC,LL: RETI,END,35,4.2.2 课题与实训7 中断控制流水灯,一.实训目的,学习外部中断的基本用法,掌握中断处理程序的编程方法,二.课题要求,在程序正常运行时P1口的8个LED灯作单灯左移8次而后单灯右移7次,如此循环;中断时(即按键按下)则P1口的8个LED闪烁3次(即全亮全灭3次),。,三.背景知识,1中断程序的设计主要涉及开中断、设定优先级,外中断还 涉及触发方式的设定。,2在软件设计中,首先要对主程序和中断服务程序所完成的 任务进行划分。根据该课题提出的要求,在主程序中应该 完成的任务是8个LED循环左移右移;在中断服务程序中 应该完成的功能是8个LED闪烁3次。,36,四.硬件电路,硬件结构如图,12引脚的按键点动表示有中断请求发出。,图4-7 实训7电路,37,五.参考程序,ORG 0000H,LJMP START,ORG 0003H,LJMP INT0,ORG 0100H,START:MOV SP,#60H,MOV IE,#81H ;开INT0中断,SETB IT0 ;INT0下降沿触发,L1: MOV A,#0FFH ;设初值,MOV R0,#8 ;设定左移八次,CLR C ;将CY清0,L2: RLC A ;带进位位循环左移一位,MOV P1,A ;送P1口,P1.0灯亮,38,ACALL DELAY ;延时0.2秒,DJNZ R0,L2 ;判断是否左移8次,MOV R0,#7 ;移动7次,L3: RRC A ;带进位位循环右移,MOV P1,A ;送P1口,ACALL DELAY,DJNZ R0,L3 ;是否右移7次?,AJMP L1 ;重新开始,DELAY:MOV R5,#4 ;延时0.2秒,D1: MOV R6,#200,D2: MOV R7,#123,NOP,DJNZ R7,$,39,DJNZ R6,D2,DJNZ R5,D1,RET,INT0: PUSH PSW ;保护PSW,ACC值,PUSH ACC,MOV A,#00H ;使8个LED全亮,MOV R2,#6 ;闪烁3次(全亮全灭各3次),L4:MOV P1,A ;A值送出,LCALL DELAY ;延时0.2秒,CPL A ;A值取反,DJNZ R2,L4 ;闪烁3次?,POP ACC ;恢复保护的A值,POP PSW ;恢复保护的PSW值,RETI ;返回主程序,END,40,六.总结与提高,1. 总结:中断服务程序与子程序对比,共同点:格式相近,执行过程大体相同,子程序,执行时刻是确定的,CPU只要执行LCALL、ACALL等调用指令就会转去执行子程序,中断服务程序,中断申请往往是随机发生的。中断服务程序的发生可能是在开中断后的任意时刻,也可能不发生,,41,2提高,编写一个由两个中断(外部中断0、外部中断1)控制的流水灯程序。,要求:,主程序不变,中断0可使P1.0P1.3的LED闪烁5次,中断1可使P1.4P1.7的LED闪烁5次,设定中断1的优先级比中断0高。,42,.3定时计数器,1. 日常生活中定时、计数的例子:,如闹钟、画“正”统计选票、家用水表对水量的计数。,2 . 单片机应用系统中定时计数的需求:,如用单片机控制的打铃器、空调的定时开关、啤酒自动生产线上对酒瓶的计数装置等。,3 . 80C51单片机片内的定时/计数器:,两个位可编程的定时计数器:T0和T1,都能定时和对外部事件进行计数。,此外,T1还可以作为串行接口的波特率发生器。,43,.3.1定时计数器的结构,.定时和计数的原理,(1)计数,定时计数器的实质是加计数器(位),其原理类似于古代用来计时的水钟:,假设计满一小时需要100,000,000,滴,这称为水钟的计数容量,16位定时/计数器的计数容量是65536,单片机是对脉冲个数计数,计数器每接收到一个脉冲,计数值加1,,当接收满65535个脉冲后,再来一个脉冲,计数值清0表明这一轮计数结束,同时将标志位TF0或TF1置1。,44,(2)定时,单片机内部的计数器用作定时器时,是对标准的时钟进行了计数,每来一个时钟脉冲,计数器加1,只要保证计数脉冲的间隔相等,则计数值就代表了时间的流逝。,计数器如何能作为定时器使用呢?,单片机中的定时器和计数器其实是一个器件:,计数器:,是对外部发生的事件进行计数,,定时器:,是对单片机内部的标准时钟脉冲进行计数。,45,单片机内部的标准时钟脉冲是如何获得的呢?,见图4-9 ,它是由单片机的晶振经过12分频后得到。由于晶振的频率很准,所以这个时钟脉冲的时间间隔也很准。不难算出,当单片机采用12的晶振时,它提供给计数器的脉冲频率是,脉冲周期就是微秒。,图4-9 定时/计数器T0的结构示意图,46,单片机内部的16位定时计数器由高8位和低8位两个寄存器组成:,T0,由,TH0,和,TL0,组成,,T1,由,TH1,和,TL1,组成,,定时计数器的计数值就存放在这里面。定时,/,计数器,T1,的结构与,T0,相同。,图4-9 定时/计数器T0的结构示意图,2定时/计数器的结构,47,再以水钟为例,当水不断落下,下面容器中的水不断变多,最终总有一滴水使得容器完全充满。这时如果再有一滴水落下,就会发生“溢出”。与此类似,16位定时计数器计满65536个脉冲时,也会发生溢出。,定时计数器溢出后标志位TF0(或TF1)由0变1,由此能够引发定时中断(在中断定时方式下),这就像定时的时间一到,闹钟就会响一样,。,如果采用12的晶振,对应的脉冲周期是微秒,计满65536个脉冲所对应的时间就是65.536ms。,3定时/计数值的设置,48,现实生活中,如何满足计数值少于65536的需要?,如牛奶包装线上24盒装箱一次。,再回到水钟的例子上去:,刚才假设下面容器滴入100,000,000滴水才会满,现在我们在开始滴水之前先放入一勺水,这样问题就解决了。,计数器的道理是一样的,只要用预置数的方法先在计数容器内存入一个初值,(通常称为时间常数),,如我们要计100,那就存入65436,只要再来100个脉冲,就刚好会溢出,引发中断。,计数器初值的设置,49,在主频为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发出中断请求信号。,定时器初值的设置,50,4-10 定时/计数器的控制关系,51,4.3.2定时计数器的控制,在单片机中有两个特殊功能寄存器与定时/计数有关,它们就是TMOD和TCON,定时计数器T0、T1就由它们来控制:,TMOD用于设置工作方式;,TCON用于控制其启动、停止和中断申请。,1.定时器工作方式寄存器TMOD,TMOD用于设置T0和T1的工作方式,字节地址为89H,不能按位寻址。其格式和各位的含义如下:,52,53,54,2定时/计数器控制寄存器TCON,TCON的低4位用于控制外部中断,高4位用于控制定时/计数器的启动和中断申请。,TF0,(或,TF1,),当计数溢出时,,TF0,(或,TF1,)会自动由,0,变,1,,告诉我们计数已满,我们可以通过查询,TF0(,或,TF1),位的状态来判断计时时间是否已到;,如果采用定时中断方式,则,TF0,(或,TF1,)由,0,变,1,时,能自动引发中断。,55,TR0(,或,TR1),由图,4-11,可知,只有当,TR0(,或,TR1),为,1,时,开关,1,才能闭合,计数脉冲才能进入计数器,故,TR0(,或,TR1),称为运行控制位,,可用指令“,SETB TR0(,或,TR1)”,来置位以启动定时,/,计数器运行;,或用指令“,CLR TR0(,或,TR1)”,来关闭定时,/,计数器的工作,,一切全靠编程人员控制。,图4-11 定时/计数器T0方式0的逻辑结构示意图,56,4.3.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进行查询。,57,图4-11 定时/计数器T0方式0的逻辑结构示意图,58,2. 方式1,当M1M0=01时,定时/计数器工作于方式1。方式1的计数位数是16位,由TL0作为低8位,TH0作为高8位共同构成。其余操作同方式0。,图4-12 定时/计数器T0方式1的逻辑结构示意图,59,3. 方式2,当M1M0=10时,定时/计数器工作于方式2。这是自动重装初值的8位计数方式,它省去了方式0和方式1在多次重复计数状态下必须重新设定计数初值的麻烦,但是却付出了减小定时时间的代价。,图4-13 定时/计数器T0方式2的逻辑结构示意图,特别适合于制作比较精确的脉冲信号发生器。,60,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控制。,61,图4-14 定时/计数器T0方式3的逻辑结构示意图,定时器T1无工作方式3,当定时器T0工作在方式3时,定时器T1可设置为方式0、方式1和方式2。,62,4.4.1应用指导,1定时/计数器的定时/计数范围,定时/计数器工作于不同方式下的位数不同,它所具有的计数范围也不一样:,工作方式,0,:,13,位定时,/,计数方式,因此,最多可以计到,213,,也就是,8192,次。,工作方式,1,:,16,位定时,/,计数方式,因此,最多可 以计到,216,,也就是,65536,次。,工作方式,2,和工作方式,3,:,都是,8,位定时,/,计数方 式,因此,最多可以计到,2 8,,也就是,256,次。, 如果我们需要超过计数器计数范围的定时或计数功能,应该怎样做?,4.4定时/计数器应用与训练,63,2时间常数初值的计算,定时/计数器只要预设一个时间常数初值,就可以完成不超过其计数范围的任意大小的计数。算法如下:,定时时间常数初值,X,:,方式,0 X=8192-t(fosc/12),方式,1 X=65536-t(fosc/12),方式,2,、方式,3 X=256-t(fosc/12),其中,t,是需要定时的时间,单位是微秒;,fosc,是晶振,计数时间常数,X,:,方式,0 X=8192-S,方式,1 X=65536-S,方式,2,、方式,3 X=256-S,说明:式中,S,是需要计数的次数,64,假设流水线上一个包装是12盒,要求每到12盒就产生一个动作,用单片机的工作方式0来控制,应当预置的计数初值是多少呢?,对了,就是8192-12=8180。,3定时/计数器的初始化,对80C51单片机的定时/计数器编程的初始化方法:, 对TMOD赋值,以确定T0和T1的工作方式;, 计算时间常数初值,并将其写入TH0、TL0或TH1、 TL1;, 采用中断定时方式时,需对IE赋值开中断;, 置位TR0或TR1,启动定时/计数器。,65,4.4.2 基本训练初始化训练,例3:,某牛奶生产线上一个包装是12盒,要求每生产12盒就执行装箱操作,用80C51单片机来控制,请编写初始化程序。,1思路与计算:,要确定定时器(T0 或T1),选择其工作方式。我们以T0的工作方式2为例,计算时间常数并赋值给TH0、TL0。,X=256-S=256-12=244=0F4H,66,2初始化程序:,MOV TMOD,#06H ;T0作计数器,工作于方式2,MOV TH0,#0F4H ;装入时间常数初值,MOV TL0,#0F4H ;自动重装时间常数,MOV IE ,#00H ;用查询方式确定计满12盒?,(或MOV IE ,#82H);使用T0中断,计满12盒后,,;自动申请中断,SETB TR0 ;启动T0波特率发生器,3总结:,对计数过程是否结束有查询和中断两种方法,要合理选择,并在程序设计中正确体现。,67,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,就可以启动定时器,而与 的输入状态无关。,68,利用上述特点,将被测脉冲信号从(P3.3)引入,在T1的程序初始化中令GATE1,同时“SETB TR1”,这样脉冲信号的上升沿就能启动T1计数,脉冲信号下降沿能使T1停止计数。利用定时器T1的计数值m乘以机器周期就可以得到被测脉冲信号的宽度TW。,(2)硬件电路,硬件电路简图如图4-15。,69,(3)程序设计,利用80C51的内部RAM30H、31H单元保存被测脉冲宽度对应的计数值。,参考程序如下:,ORG 0000H,AJMP MAIN,ORG 0100H,MAIN:MOV SP,#60H ;设堆栈指针,MOV TMOD,#90H;设置控制字,T1工作于方式,; 1,GATE=1,MOV TH1,#00H ;设定计数初值为00H,70,MOV TL1,#00H,L1: JB P3.3,L1 ;等待输入变为低电平,SETB TR1 ;预置TR1=1,准备启动T1,L2: JNB P3.3,L2 ;等待上升沿,以便开始计数,L3: JB P3.3,L3 ;是高电平则计数继续,CLR TR1 ;低电平则停止计数,MOV A,TL1 ;读低位计数值,MOV 30H,A ;低位计数值存于30H,MOV A,TH1 ;读高位计数值,MOV 31H,A ;高位计数值存于31H,END,71,(4)总结与思考,定时/计数器还可用于测量脉冲信号的频率、周期等。本实例是利用定时/计数器的门控位(GATE)测量脉冲宽度。但要注意,在晶振12MHz的情况下,被测脉冲宽度范围最大为655351s=65.536ms。,,如果要测量脉冲信号的周期,该如何去做?,2计数器用于绕线机的控制,绕线机常用于对电机或变压器的绕组进行绕制,图4-16是绕线机的控制电路。当按下工作按钮以后,机器启动,绕线机在直流电机和减速齿轮的带动下开始工作。当绕线架上的线圈绕到规定的圈数时,绕线机会自动停止绕线。如果再次按下工作按钮,绕线机会重复以上过程。,72,图4-16 绕线机的控制电路,控制说明:1软件控制P1.0=0时,绕线机开始绕线;P1.0=1时,绕线机不绕线。,2绕线机每绕一圈,绕线机脉冲产生电路就产生一个脉冲信号。,73,(1)工作原理,由于单片机复位后P1 口的输出状态全部为1,所以,系统上电后,,P1.0输出高电平“1”绕线机不工作。,当按下工作按钮以后,,P1.1输入低电平“0”,当程序检测到P1.1=0时,在程序指令的控制下从P1.0输出低电平“0”。绕线机开始绕线。绕线机每绕一圈,定时/计数器T1的输入引脚上就会产生一个负跳变的输入脉冲。因此,只要用定时/计数器T1的计数功能控制好输入脉冲的个数,就等于控制了绕线机的绕线圈数。,当绕线机缠绕到指定的圈数时,,定时/计数器T1引发计数中断,在程序指令的控制下,P1.0将输出的高电平“1”,使电机停转,制动器恢复制动,于是系统回到最初的停机状态。,74,我们假设绕线架的规定匝数是5000圈,为控制这个圈数,可以设定定时/计数器T1用作计数器且工作在方式1,于是确定其计数初值为:,初值=65536-5000=60536=0EC78H,所以(TH1)=0ECH,(TL1)=78H,(2)控制程序,参考程序如下:,ORG 0000H,AJMP MAIN,ORG 001BH,AJMP COUNT,ORG 0100H,75,MAIN: MOV TMOD,#50H ;设置T1为计数器,工作于方式1,MOV TH1,#0ECH ;设定计数初值 MOV TL1,#78H,MOV SP,#60H ;设堆栈指针,SETB ET1 ;开T1中断,SETB EA ;CPU开中断,CLR F0 ;用户标志F0清0,WAIT: MOV C,P1.1;等待启动,JC WAIT;P1.1=1,等待,CLR P1.0;启动设备,SETB TR0;T1开始计数,76,LOOP: JNB F0,$ ;等待计数5000中断,SETB P1.0;绕线机停止工作,CLR TR0 ;T1停止计数,CLR F0 ;清0,SJMP WAIT;等待重新启动,ORG 0200H;T1中断服务程序起始地址COUNT:MOV TH1,#0ECH;重新设定计数初值,MOV TL1,#78H,SETB F0;用户标志置1,RETI ;中断返回,END,77,.4.4课题与实训8 简易方波发生器,一.实训目的,掌握定时器初值的计算方法,学习定时器的使用及定时中断程序的设计方法,掌握方波信号发生器的设计方法,二.课题要求,1基本要求:,利用定时/计数器T1,工作于方式0,采用查询方式,在P1.0引脚输出频率为500Hz的方波,并用示波器进行观察(晶振采用12MHz)。,2较高要求:,利用定时/计数器T1,工作于方式0,采用中断方式,在P1.0引脚输出频率为500Hz的方波,并用示波器进行观察(晶振采用12MHz)。,78,三.背景知识,1方波产生原理,使P1.0引脚的输出状态定时翻转,则该端口能输出一定频率的方波。,2方式0的时间常数初值,定时/计数器工作于方式0状态下,定时/计数的长度是13位。应用前面给出的时间常数初值的计算公式,X=8192-t(fosc/12),我们可以很方便地计算出时间常数初值,但在将其装入定时/计数器的TH、TL寄存器时,,必须要注意:将计算结果的高8位装入TH1(或TH0)、低5位装入TL1(或TL0),这一环节是非常容易出错的。,79,以该实训T1方式0产生500Hz的方波(周期是2ms)为例,需要进行1ms的定时,时间常数初值,X=8192-110-3(12106/12)=8192- 1000=7192=1C18H=,000,1110000011000B,以13位二进制数表示,是11100000 11000B,,则,(TL1)=00011000B=18H,(TH1)=11100000B=0E0H,定义TMOD=00000000B,80,四.硬件电路,该实训硬件电路十分简单,见图4-17。,图4-17 简易方波发生器的硬件电路,81,五.参考程序,(1) P1.0输出500Hz方波查询方式,ORG 0000H,LJMP MAIN ;跳至主程序,ORG 0100H,MAIN:MOV TMOD,#00H;置T1工作于方式0,MOV TH1,#0E0H;装入时间常数初值,MOV TL1,#18H,SETB TR1 ;启动T1,LOOP:JNB TF1,LOOP ;查询等待,CLR TF1 ;清TF1,CPL P1.0 ;P1.0取反,82,MOV TH1,#0E0H;重新装入时间常数初值,MOV TL1,#18H,AJMP LOOP ;继续生成波形,END,83,(2) P1.0输出500Hz方波中断方式,ORG 0000H,LJMP MAIN ;跳至主程序,ORG 001BH ;T1的中断入口地址,LJMP FANGBO;转至中断服务程序,ORG 0100H,MAIN:MOV TMOD,#00H;置T1工作于方式0,MOV TH1,#0E0H;装入时间常数初值,MOV TL1,#18H,SETB ET1 ;允许T1中断,SETB EA ;CPU开中断,SETB TR1 ;启动T1,84,SJMP $ ;等待中断,FANGBO:CPL P1.0 ;P1.0取反,MOV TH1,#0E0H;重新装入时间常数初值,MOV TL1,#18H,RETI ;中断返回,END,六.总结与提高,1总结,本实训利用定时器T1的定时功能,以两种形式输出频率为500Hz方波。在实际应用中,方波的频率可能要根据现场测量参数、给定参数或按照某种函数关系而变化。因此输出波形的频率在编程时还是未知的。,85,2提高,定时/计数器的计时范围有限,当晶振采用12MHz时,方式1的计时时间最长,也只有65.536ms。当需要定时的时间超出了定时/计数器的计数范围,如需定时2秒,这时可以采用以下两种方法来处理:, 定时器+软件计数的方法,思路是:,利用定时/计数器T1,工作于方式1,实现50 ms/次的定时,只要定时40次即可实现2s定时。,可以算出定时/计数器T1工作于方式1时,时间常数初值为,X=65536-t(fosc/12)=65536-5010-3(12106/12) =15536=3CB0H,于是(TH1)=3CH ,(TL1)=0B0H。,86,定义TMOD=00010000B,此处只给出延时2s的查询方式子程序。,DELAY:MOV R3,#40 ;设置定时器溢出次数,SETB TR1 ;启动T1开始计时,D1: MOV TH1,#3CH ;装入时间常数初值,MOV TL1,#0B0H,D2:JBC TF1,D3;TF1为1否?是则跳至D3,并清TF1,,AJMP D2 ;否,则跳至D2,D3:DJNZ R3,D1;R3=0?不是,跳到D1,CLR TR1 ;是,则停止计数,RET,87,采用两个定时器串联的方法,思路是:,将两个定时器中的一个(如T0)设置为定时方式,另一个(T1)设置成计数方式;将定时器T0计满产生的输出,通过一根I/O口线(如P1.0)连接到计数器T1的计数脉冲输入端P3.5,从而实现更长时间的定时。,88,.5中断与定时计数器综合应用举例,4.5.1 概述,定时/计数功能与中断一样,都是单片机的常用功能。两者常常同时使用。如实训7就是简单的中断、定时综合应用实例。在这类程序的编制过程中,要注意这样几个问题:,选择合适的中断和定时,/,计数方式。,如外部中断是采用电平触发还是脉冲下降沿触发;定时,/,计数是用自动重装方式还是每次定时结束后用软件重装。,89,确定定时结束的判别方法,用中断还是查询,。,如采用中断,与其它中断的优先级如何确定,是否会影响系统功能。,正确初始化。,合理分配控制功能。,.5.2课题与实训9 音乐门铃,一.实训目的,1. 掌握中断与定时/计数综合程序的设计方法,2.学习音乐门铃的设计过程,二.课题要求,在单片机P1.0引脚外接扬声器,唱出祝你生日快乐歌。,90,三.背景知识,1.音频脉冲的产生,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单片机某个口线的“高”电平或“低”电平,则在该口线上就能产生一定频率的方波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调。,例如,,要产生中音1。从表4-5可知,中音1的频率为523Hz,周期T=1/523=1912s,其半周期为1912/2=956s,因此只要在P1.0引脚产生半周期为956s的方波,即可听到持续的1音。C调各音符频率与计数初值的对应表如下:,91,注:不发音的简谱码用“0”表示,92,2音乐节拍的生成,要唱出一首歌,只产生出音频脉冲还不够,还要考虑节拍。,定义:每个音符占用一个字节,字节的高4位代表音符的高低,低4位表示该音符的节拍,,如果一拍为0.4秒,则1/4拍是0.1秒,只要设定延迟时间就可获得节拍的时间。我们也可以设1/4拍为1个DELAY,则1拍应该是4个DELAY,只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数。见表,表4-6 节拍与节拍码对照表,93,3.建立音乐的步骤:,先把谱的音符找出,然后由上表建立时间常数初值,T,的顺序表,标号为,TABLE1,。,建立音符和节拍表,标号为,TABLE,,将构成发音符的计数值放在其中。,TABLE,表的结构为:,简谱码(代表音符)为高,4,位,,节拍码(表示节拍数)为低,4,位,,在唱歌程序中对每一个有节拍的音符能通过设计共同生成音符节拍码,本程序的音符节拍码表见表,4-5,。,94,(1)1/4拍的延迟时间=187毫秒,DELAY:MOV R5,#02,D1:MOV R4,#187,D2:MOV R3,#248,DJNZ R3,$,DJNZ R4,D2,DJNZ R5,D1,DJNZ R6,DELAY,RET,(2)歌谱 生日快乐歌,C3/4,5 . 5,6 5 7 -,5 . 5,6 5 -,祝 你生日 快 乐 祝 你 生 日 快 乐,5 . 5, 7 6-,我 们高声 歌 唱 祝 你生日 快 乐,95,四.硬件电路,图4-18 音乐的应用 电路,96,五.参考程序,ORG 0000H,LJMP MAIN ;跳至主程序,ORG 001BH ;T1的中断入口地址,LJMP TIM1 ;转至中断服务程序,ORG 0100H,MAIN:MOV TMOD,#10H ;置T1工作于方式1,SETB ET1 ;开T1中断,SETB EA ;CPU开中断,MAIN1: MOV 60H,#00H ;取简谱码指针,NEXT: MOV A,60H ;简谱码指针装入A,MOV DPTR,#TABLE ;指向简谱码TABLE表地址,MOVC A,A+DPTR ;简谱码存入A,MOV R1,A ;简谱码暂存R1,JZ STOP ;是否取到结束码00?,97,ANL A,#0FH ;没有,则取低4位的节拍码,MOV R6,A ;取到的节拍码存入R6,MOV A, R1 ;将取到的简谱码再装入A,SWAP A ;高低4位交换,ANL A,#0FH ;取低4位的音符码,JNZ SING ;取到的音符码是否为0?,CLR TR1 ;是,则不发音,AJMP DT ;转至DTSING: DEC A ;对取到的非0音符码减1,MOV 22H,A ;音符码暂存22H,RL A;乘2,MOV DPTR,#TABLE1 ;至TABLE1取与高字节相,;对应的频率初值,98,MOVC A,A+DPTR ;,MOV TH1,A ;取到的高字节存入TH1,MOV 21H,A ;取到的高字节存入21H,MOV A, 22H ;重装取到的音符码,RL A;乘2,INC A;加1,MOVC A,A+DPTR ;至TABLE1取与低字节相对,;应的频率初值,MOV TL1,A ;取到的低字节存入TL1,MOV 20H,A ;取到的低字节存入20H,SETB TR1 ;启动T1,开始计时,DT: LCALL DELAY ;1/4拍的基本单位时间187毫秒,INC 60H ;将简谱码指针加1,99,AJMP NEXT ;取下一个码,STOP: CLR TR1 ;计时停止,AJMP MAIN1 ;重复循环,TIM1: PUSH ACC ;保护A值,PUSH PSW ;保护PSW,MOV TH1,21H;重装入时间常数初值,MOV TL1,20H;重装入时间常数初值,CPL P1.0 ;P1.0取反,发声,POP PSW ;恢复PSW,POP ACC ;恢复A,RETI,DELAY: MOV R5,#2 ;187毫秒子程序,决定音乐节拍,D2: MOV R4,#187 ;,100,D3: MOV R3,#248;,DJNZ R3,$;,DJNZ R4,D3;,DJNZ R5,D2;,DJNZ R6,DELAY;,RET,TABLE1:,DW 64260,64400,64524,64580,DW 64684,64777,64820,64898,DW 64968,65030,65058,65110,DW 65157,65178,65217,TABLE:,;1,DB 82H,01H,81H,94H,84H,DB 0B4H,0A4H,04H,DB 82H,01H,81H,94H,84H,DB 0C4H,0B4H,04H,101,DB 0E2H,01H,0E1H,0D4H,0B4H,DB 0C4H,0B4H,04H,DB 00,END,六.总结与提高,制作音乐门铃的关键就是对乐谱建表,包括T值表和简码表。,以表4-5的T值表为例,对于简单的乐谱,只需再增加高音区和低音区的几个音符,其余部分不变;而简码表则不然,它要随着每个音的音符和节拍而定,因曲目而异。,;2,DB 82H,01H,81H,0F4H,0D4H,DB 0B4H,0A4H,94H,102,下面给出两只老虎的乐谱,你能制作出它的音乐门铃吗?,两只老虎,4/4,1 2 3 11 2 3 13 4 53 4 5,两只老虎 两只老虎 跑得快跑得快,5 6,5 4,3 1,5 6,5 4,3 11 5 11 5 1,一只没有耳朵 一只没有尾巴 真奇怪 真奇怪,103,4.6外部中断源的扩展,在单片机控制系统中,外部中断的使用非常重要,通过它可以中断CPU的运行,转去处理更为紧迫的外部事务,如报警、电源掉电保护等。,80C51单片机仅提供了两个外部中断源,在实际控制系统中可能出现多个外部中断,因此有必要对外部中断源进行扩展。,4.
展开阅读全文