1、2019/5/29,1,第5章 80C51的中断系统及定时/计数器,80C51单片机的中断系统,5.1,80C51单片机的中断处理过程,5.2,80C51单片机的定时/计数器,5.3,80C52的定时/计数器2,5.4,2019/5/29,2,5.1 80C51单片机的中断系统,5.1.1 80C51中断系统的结构,CPU进行工作A时发生了事件B,请求CPU马上处理CPU暂时中断当前工作A,转去处理事件B事件B处理完后,回到工作A被中断的地方继续处理A工作,中断的概念,中断源中断请求中断服务中断返回中断系统,中断的优点利用率高实时性强可靠性好,2019/5/29,3,80C51中断系统的结构,
2、5个中断源、2个优先级,2019/5/29,4,中断源,5.1.2 80C51的中断源,外部中断0(INT0) 外部中断1(INT1) T0溢出中断(TF0) T1溢出中断(TF1) 串行口中断(RI或TI),2019/5/29,5,触发方式设置及中断标志,电平方式(ITx=0),INTx引脚低电平时IEx=1,响应中断后IEx不自动清0(INTx引脚状态)。边沿方式(ITx=1),INTx引脚负跳变时IEx=1,响应中断后IEx自动清0。,外部中断标志IE1、IE0(用IEx表示),2019/5/29,6,两种触发方式比较:,电平方式时,INTx低电平必须保持到响应时,否则就会漏掉;在中断服
3、务结束前,INTx低电平必须撤除,否则中断返回之后将再次产生中断。例:8255A的中断请求线在接受读或写操作后即被复位,因此以其去请求电平触发方式的中断比较方便。,边沿方式时,采样到有效下降沿后,在IEx中将锁存一个1。若CPU暂时不能响应,申请标志也不会丢失,直到响应时才清0。例:ADC0809的转换结束信号EOC为正脉冲,经反相后就可以作为80C51的INTx信号 。,2019/5/29,7,溢出中断标志TF1、TF0(用TFx表示),溢出中断请求标志TFx ,Tx启动后就开始由初值进行加1计数,直至最高位产生溢出使TFx=1向CPU请求中断。CPU响应中断后TFx自动清0。,SCON的中
4、断标志,RI:串口接收中断标志,响应中断时不能自动清除。 TI:串口发送中断标志,响应中断时不能自动清除。,2019/5/29,8,5.1.3 80C51中断的控制,中断允许控制,中断源的开放和屏蔽由IE控制(1,开放;0,禁止),EX0:外中断0允许 ET0:T0中断允许 EX1:外中断1允许,ET1:T1中断允许ES :串口中断允许EA :CPU中断允许,2019/5/29,9,中断优先级控制,中断优先级由IP控制(1,高级;0,低级),PX0:外中断0优先级 PT0:T0中断优先级PX1:外中断1优先级,PT1:T1中断优先级PS :串口中断优先级,同一优先级的自然顺序: 自高至低:IN
5、T0、TO、INT1、T1、串口。,2019/5/29,10,中断优先级遵循的原则,几个中断同时申请,先响应高级的中断 正进行的中断服务,同级或低级中断不能对其中断,但可以被高级中断所中断。,为此,中断系统内设有对应高、低2个优先级状态触发器(用户不能寻址)。状态触发器的复位由中断返回指令RETI控制。,2019/5/29,11,5.2 80C51单片机中断处理过程,5.2.1 中断响应条件和时间,中断响应条件,有中断请求 CPU开中断(即EA=1) 相应的中断允许位为1,遇下面情况之一将不被响应(此间中断条件失效,中断丢失),正在处理同级或高级中断 当前查询周期不是所执行指令的最后一个机器周
6、期 正在执行RETI或访问IE或IP 的指令(至少再执行一条指令后),2019/5/29,12,中断响应时间,中断响应至少需要3个完整的机器周期(38个)!,受阻时要附加35个机器周期(无同级或高级中断正进行),查询周期不是当前指令的最后机器周期(如MUL指令,要+3个) 查询周期恰逢RETI类指令(且后跟MUL指令,要+5个),2019/5/29,13,5.2.2 中断响应过程,CPU响应中断过程,将相应优先级状态触发器置1(阻断后来同级或低级中断 ) 执行硬件LCALL指令(PC入栈,中断服务程序入口址送PC ) 执行中断服务程序,编写中断服务程序注意,中断服务程序入口存放指令LJMP或A
7、JMP 现场保护与现场恢复,2019/5/29,14,5.2.3 中断返回,中断服务程序最后指令必须是RETI,其功能:,将断点从堆栈弹送PC,CPU从原断点继续执行 将相应优先级状态触发器清0,恢复原来工作状态,注意:,不能用RET代替RETI 中断服务程序中PUSH和POP必须成对使用,2019/5/29,15,5.2.4 中断程序举例,【例5-1】单外部中断源示例。 采用电平触发方式,IE0要由程序清除。,ORG 0000H START:LJMP MAIN ORG 0003HLJMP INTO ORG 0030HMAIN:CLR IT0 ;电平触发 SETB EASETB EX0 MOV
8、 DPTR,#1000H ,主程序:,2019/5/29,16,中断服务程序:,ORG 0200H INT0:PUSH PSW ;INT0中断服务程序PUSH ACCCLR P3.0 ;由P3.0输出0NOPNOPSETB P3.0 ;由P3.0输出1,撤除INTOMOV P1,#0FFH ;置P1口为输入MOV A,P1 ;输入数据MOVX DPTR,A ;存入数据存储器INC DPTR ;修改数据指针,指向下一个单元 POP ACC ;恢复现场POP PSWRETI,2019/5/29,17,【例5-2】 多外部中断源示例。 5个外部中断优先级顺序为:XI0XI4。,中断服务程序:,ORG
9、 0003HLJMP INSE0ORG 0013HLJMP INSE1 INSE0:PUSH PSW ;XI0中断服务PUSH ACC POP ACCPOP PSWRETI (转下页),2019/5/29,18,INSE1:PUSH PSW (接上页) PUSH ACCJB P1.0,DV1 ;P1.0为1,转XI1中断服务程序JB P1.1,DV2 ;P1.1为1,转XI2中断服务程序JB P1.2,DV3 ;P1.2为1,转XI3中断服务程序JB P1.3,DV4 ;P1.3为1,转XI4中断服务程序 INRET:POP ACCPOP PSWRETIDV1: ;XI1中断服务程序AJMP
10、INRET DV4: ;XI4中断服务程序AJMP INRET,2019/5/29,19,5.3 80C51单片机的定时/计数器,定时/计数器的结构,基本型:T0:定时、计数T1:定时、计数、串口波特率发生器,增强型:增加了T2。见5.3.4节。,5.3.1 定时/计数器的结构和工作原理,TH1、TL1 TH0、TL0 TCON TMOD,2019/5/29,20,定时/计数器的工作原理,实质是16位加1计数器,定时器模式时,是对内部机器周期计数。计数值乘以机器周期就是定时时间。 计数器模式时,是对外部事件计数。脉冲由T0(P3.4)或T1(P3.5)引脚输入。,注意:(若计数值为N,计数初值
11、为X) 溢出信号使TF0或TF1置1,并发出中断请求,16位时有:N= 65536 - X,或X = 65536 - N 12MHz晶振时,计数频率低于0.5MHz,2019/5/29,21,5.3.2 定时/计数器的控制,工作方式寄存器TMOD,GATE:门控位。GATE0时,只要TRx为1,就可启动计数器工作;GATA1时,定时器的启动还要加上INTx引脚为高电平这一条件。 C/T:模式选择位。 清0为定时模式,置1为计数方式。 M1M0:工作方式设置位。可设置四种工作方式(见下页)。,2019/5/29,22,注意:TMOD不能进行位寻址。,2019/5/29,23,控制寄存器TCON,
12、TFx:Tx溢出标志位。响应中断后TFx有硬件自动清0。用软件设置TFx可产生同硬件置1或清0同样的效果。 TRx:Tx运行控制位。置1时开始工作;清0时停止工作。TRx要由软件置1或清0(即启动与停止要由软件控制)。,2019/5/29,24,5.3.3 定时/计数器的工作方式,T0有方式0、1、2、3;T1有方式0、1、2。以T0为例说明。,方式0:13位方式,2019/5/29,25,C/ T = 1时,则为计数模式,有:X= 213- N = 8192 - NC/ T = 0时,则为定时模式,有:X= 213- N = 8192 - N,N = t / Tcy,【例5-3】若计数个数N
13、为2,求计数初值。公式法计算:X 81922 = 8190 = 1FFEH求补法计算:对0 0000 0000 0010B取反加1为:1 1111 1111 1110B(1FFEH),初值计算:,公式法,求补法 :X = 对N求补,2019/5/29,26,门控位作用,当GATE = 0时 仅由TR0控制与门的开启。与门输出1时,控制开关接通,计数开始。,当GATE = 1时 与门的开启由INT0和TR0共同控制。这种方式可以用来测量INT0引脚上正脉冲的宽度。,注意:方式0的计数初值高8位和低5位确定麻烦 ,实际应用中常由16位的方式1取代。,2019/5/29,27,方式1:16位方式,X
14、= 216- N = 65536 - N 计数范围:165536计数初值要分成2个字节分别送入TH0、TL0,2019/5/29,28,【例5-4】若要求定时器T0工作于方式1,定时时间为1ms,当晶振为6 MHz时,求送入TH0和TL0的计数初值各为多少?应怎样送入TH0和TL0?,由于晶振为6 MHz,所以机器周期Tcy为2S,因此: N = t / Tcy = 110-3/210-6 500 X216- N 65536 500 65036 FE0CH,也可以利用以下2条指令完成:MOV TL0,#(65536-500)MOD 256 ;余数为计数初值的低字节MOV TH0,#(65536
15、-500)/256 ; 商为计数初值的高字节,用传送指令分别将FEH送入TH0中,0CH送入TL0中即可。,2019/5/29,29,方式2:8位自动重装方式,X= 28- N = 256 - N 计数范围:1256特别适合与脉冲信号发生器,2019/5/29,30,方式3:(仅T0有此方式,T1的方式3将停止计数),TL0进行8位定时/计数TH0进行8位定时(T1方式2时,可出借TR1、TF1),2019/5/29,31,5.3.4 定时/计数器用于外部中断扩展,【例】用T0扩展一个外部中断源。将T0设置为计数器方式,按方式2工作,TH0、TL0的初值均为0FFH,T0允许中断,CPU开放中
16、断。其初始化程序如下:MOV TMOD,#06H ;置T0为计数器方式2MOV TL0,#0FFH ;置计数初值MOV TH0,#0FFHSETB TR0 ;启动T0工作SETB EA ;CPU开中断SETB ET0 ;允许T0中断 ,T0外部引脚上出现一个下降沿信号时,TL0计数加1,产生溢出,将TF0置1,向CPU发出中断请求,2019/5/29,32,5.3.5 定时/计数器应用举例,初始化程序应完成: 对TMOD赋值,以确定T0和T1的工作方式; 求初值,并写入TH0、TL0或TH1、TL1; 中断方式时,要对IE赋值,开放中断; 使TR0或TR1置位,启动定时/计数器工作。,2019
17、/5/29,33,计数应用,【例5-5】有一包装流水线,产品每计数24瓶时发出一个包装控制信号。试编写程序完成这一计数任务。用T0完成计数,用P1.0发出控制信号。,确定方式字: T0在计数的方式2时: M1M0 = 10,GATE = 0 ,C/T=1 方式控制字为06H,求计数初值X: N = 24 X = 256 - 24 = 232 = E8H 应将E8H送入TH0和TL0中,2019/5/29,34,ORG 0000HLJMP MAIN ORG 000BH LJMP DVT0 ORG 0100H MAIN:MOV TMOD,#06H ;置T0计数方式2MOV TH0,#0E8H ;装
18、入计数初值MOV TL0,#0E8H SETB ET0 ;T0开中断SETB EA ;CPU开中断SETB TR0 ;启动T0SJMP $ ;等待中断,DVT0:SETB P1.0 NOP NOPCLR P1.0RETI END,主程序,中断服务程序,2019/5/29,35,定时应用,定时时间较小时(小于65ms)。晶振为12 MHz时,Tcy为1S。可直接采用方式1完成定时任务。,【例5-6】利用定时/计数器T0的方式1,产生10ms的定时,并使P1.0引脚上输出周期为20ms的方波,采用中断方式,设系统的晶振频率为12 MHz。,确定方式字: T0在定时的方式1时: M1M0 = 01,
19、GATE = 0 ,C/T = 0 方式控制字为01H,求计数初值X: Tcy为1S N = 10ms/1S = 10 000 X= 65536 10000 = D8F0H 应将D8送TH0, F0H送TL0,2019/5/29,36,ORG 0000HLJMP MAIN ORG 000BH LJMP DVT0 ORG 0100H MAIN:MOV TMOD,#01H ;置T0方式1MOV TH0,#0D8H;装入计数初值MOV TL0,#0F0H SETB ET0 ;T0开中断SETB EA ;CPU开中断SETB TR0 ;启动T0SJMP $ ;等待中断,DVT0:CPL P1.0 MO
20、V TH0,#0D8H MOV TL0,#0F0HRETI END,主程序,中断服务程序,2019/5/29,37,采用软件查询方式完成的源程序如下:,ORG 0000HLJMP MAIN ;跳转到主程序ORG 0100H ;主程序MAIN:MOV TMOD,#01H ;置T0工作于方式1LOOP:MOV TH0,#0D8H ;装入计数初值MOV TL0,#0F0H SETB TR0 ;启动定时器T0JNB TF0,$ ;TF0=0,查询等待CLR TF0 ;清TF0CPL P1.0 ;P1.0取反输出SJMP LOOP END,2019/5/29,38,定时时间较大时(大于65ms)。实现方
21、法:一是采用1个定时器定时一定的间隔(如20ms),然后用软件进行计数;二是采用2个定时器级联,其中一个定时器用来产生周期信号(如20ms为周期),然后将该信号送入另一个计数器的外部脉冲输入端进行脉冲计数。,【例5-7】编写程序,实现用定时/计数器T0定时,使P1.7引脚输出周期为2s的方波。设系统的晶振频率为12MHz。,确定方式字: T0在定时的方式1时: M1M0 = 01,GATE = 0 ,C/T = 0 方式控制字为01H,求计数初值X: Tcy为1S N= 20ms/1S = 20 000 X= 65536 20000 = 4E20H 应将4E送TH0, 20H送TL0中,采用定
22、时20ms,然后再计数50次的方法实现,2019/5/29,39,ORG 0000HLJMP MAIN ORG 000BH LJMP DVT0 ORG 0030H MAIN:MOV TMOD,#01H;置T0方式1MOV TH0,#4EH ;装入计数初值MOV TL0,#20H ;首次计数值MOV R7,#50 ;计数50次SETB ET0 ;T0开中断SETB EA ;CPU开中断SETB TR0 ;启动T0SJMP $ ;等待中断,DVT0:DJNZ R7,NT0MOV R7,#50 CPL P1.7NT0:MOV TH0,#4EH MOV TL0,#20HSETB TR0RETI END
23、,主程序,中断服务程序,2019/5/29,40,门控位的应用,【例5-8】 测量INT0引脚上出现的正脉冲宽度,并将结果(以机器周期的形式)存放在30H和31H两个单元中。,将T0设置为方式1的定时方式,且GATE = 1,计数器初值为0,将TR0置1。,INT0引脚上出现高电平时,加1计数器开始对机器周期计数。,INT0引脚上信号变为低电平时,停止计数,然后读出TH0、TL0的值,80C51INT0( P3.2),2019/5/29,41,ORG 0000HAJMP MAINORG 0200HMAIN:MOV TMOD,#09H ;置T0为定时器方式1,GATE=1MOV TH0,#00H
24、 ;置计数初值MOV TL0,#00HMOV R0,#31H ;置地址指针初值(指向低字节)L1:JB P3.2,L1 ;高电平等待SETB TR0 ;当INT0由高变低时使TR0=1,准备好 L2:JNB P3.2,L2 ;等待INT0变高 L3:JB P3.2,L3 ;已变高,启动定时,直到INT0变低CLR TR0 ;INT0由高变低,停止定时 MOV R0,TL0 ;存结果DEC R0MOV R0,TH0SJMP $END,利用单片机扩展5个外部中断源,中断的优先次序为X0X4,其中X0接到外部中断上,X1X4接到外部中断上;单片机的P1.4P1.7接4个发光二极管用来作输出指示;当有
25、X1X4其中一个外部中断发生时,相应的发光二极管D1D4点亮;当X0外部中断发生时,4个发光二极管全亮。,ORG 0000HAJMP MAINORG 0003H ;中断服务程序入口地址AJMP ZHD0ORG 0013H ;中断服务程序入口地址AJMP ZHD1ORG 0030H MAIN:MOV SP,#70H ;设置堆栈指针SETB IT0 ;设置外部中断0为边沿触发方式SETB IT1 ;设置外部中断1为边沿触发方式MOV IP,#01H ;设置外部中断0为最高优先级MOV IE,#85H ;开放外部中断0及外部中断1MOV A,#0FFH ;关闭发光二极管,MOV P1,A LOOP:
26、AJMP LOOP ZHD0:PUSH PSW ;保护现场PUSH AMOV A,#0FH ;4个发光二极管全亮MOV P1,APOP A ;恢复现场POP PSWRETI ;中断返回 ZHD1:PUSH PSW ;保护现场PUSH AORL P1,#0FH ;读取P1口的低4位JNB P1.0,IN1 ;查中断源并转向相应的中断服务程序,JNB P1.1,IN2JNB P1.2,IN3JNB P1.3,IN4 FH1: POP A ;恢复现场POP PSWRETI IN1: MOV A,#11101111B ;中断服务程序1MOV P1,A ;D1发光二极管亮AJMP FH1 IN2: MOV A,#11011111B ;中断服务程序2MOV P1,A ;D2发光二极管亮AJMP FH1,IN3:MOV A,#10111111B ;中断服务程序3MOV P1,A ;D3发光二极管亮AJMP FH1 IN4:MOV A,#01111111B ;中断服务程序4MOV P1,A ;D4发光二极管亮 AJMP FH1END,Thank You !,