第六章输入/输出和中断6.1输入/输出6.2CPU与外设数据传送方式6.3MCS-51中断系统6.4中断应用举例6.1输入/输出直接传送方式查询方式一、直接传送方式(无条件)也称无条件传送方式,例:驱动指示灯、继电器、启动电机等6.2CPU与外设数据传送方式二、查询方式送数据或发命令前先检查设备状态1)输出:P1(8位),接打印机数据口2)输入:P3.1(1位),接打印机的“忙”信号低电平表示状态“忙”SETBP3.1Busy:JNBP3.1,Busy…MOVP1,ADJNZRn,Busy例:打印机的“忙”状态有什么办法可以提高CPU效率?初始化Busy?输出数据结束?三、中断传送方式查寻方式中断方式CPU不主动查询外设,只执行自己的程序,当外设准备好需要传送数据时,主动提出申请,(突发的),若CPU准于请求,(响应),放下正在执行的程序,去传送外设的数据。见下页图有直接、查询、中断、DMA等传送方式。查询中断仿真中断有硬件中断和软件中断,仅讨论硬件中断。中断的特点:外设主动提出申请,突发性,软硬件共同完成。中断的好处:1、CPU分时操作(与多个外设并行工作,多任务)温度压力断电CPU处理2、实现实时处理外设外设外设CPU3、故障处理和调试程序机器如何实现中断?中断是软硬件共同组成的系统。1、中断请求外设向CPU发出的“中断申请信号”称“中断请求”。请求CPU外设2、中断源引起中断的原因,或能发出中断申请的源,称为“中断源”。通常中断源有:(1)一般的输入输出设备,如键盘,打印机等。(2)数据通道,如磁盘,磁带等。(3)定时器。(4)故障源,如电源掉电。(5)为调试程序而设的中断,如单步、断点设置等。键盘打印机磁盘掉电定时器5、中断系统的功能(1)响应中断及返回4、中断及响应的过程中断源提出申请→CPU决定是否响应→若响应转去中断处理→完成后返回原中断处。中断请求中断请求RETIRETI主程序(2)能实现优先权排队(3)能实现中断嵌套6、CPU响应中断的条件(1)有中断请求7、中断响应及中断期间应做的工作(1)关中断(硬件自动实现)(2)保留断点(硬件自动实现)(3)保护现场(软件完成)(4)给出中断,入口转入相应的中断服务程序(硬件自动完成)(5)恢复现场(6)开中断与返回(由RETI指令实现)(2)中断请求没有被屏蔽(3)中断是开放的或者是允许的(4)在现行指令结束后才响应中断6.3MCS-51中断系统MCS-51允许5个中断请求源,提供二个中断优先级,可实现二级中断服务程序嵌套。与中断系统相关的特殊功能寄存器有:中断源寄存器:TCON(88H),SCON(98H)中断允许控制寄存器IE(A8H)中断优先级控制寄存器IP(B8H)外部中断0定时器0外部中断1定时器1串行口中断中断允许总允许优先级一、中断请求源1、TCON(TimerControl)定时器/计数器的控制寄存器,锁存外部中断请求标志。(1)IT0、IT1(interrupttriggermode)外部中断请求触发方式①ITi=0为低电平触发方式;(2)IE0、IE1(externalinterruptflag)外部中断标志,当有外部中断请求时,置“1”该位①当ITi=0时,若INTi=0,则置“1”IEi,否则清“0”IEi;②当ITi=1时,若INTi=↓,置“1”IEi;③IEi=1表示外部正在向CPU申请中断,CPU响应中断后自动清IEiITi=00ITi=1INT0INT1②ITi=1为边沿触发方式;③ITi可由软件置“1”或清“0”。(3)TF0、TF1(Timeroverflowinterruptflag)定时器溢出中断标志当定时器/计数器最高位进位时,置“1”TFi表示正在向CPU申请中断,CPU响应中断后,自动清“0”TFi。二、中断控制1、IE(InterruptEnable)中断允许寄存器:控制中断是开放还是屏蔽的。(1)EA(EnableAll)总中断允许标志(2)ES(EnableSeries)串行口允许标志(3)ET0、ET1(EnableTimer)定时器/计数器溢出中断标志(4)EX0、EX1(EnableeXternal)外部中断允许标志上述中:“1”表示允许中断,“0”表示屏蔽中断。2、IP(Interruptpriority)中断优先权控制寄存器(B8H)(1)PS:串行口中断优先级控制位(2)PT0、PT1:定时器/计数器中断优先级控制位(3)PX0、PX1:外部中断优先级控制位上述中:“1”表示高优先级,“0”表示低优先级。三、中断响应过程每个周期S6→对中断源进行采样→在下一个周期按优先级顺序依次查询→如果某个中断标志在上一个周期S6已被置“1”→CPU执行硬件LCALL转向相应中断的特定单元,进入中断服务程序,但是如果遇上下列条件之一,硬件将受阻:(1)正在执行同级或高级中断服务程序。(2)当前的查询周期不是执行指令的最后一个机器周期。(3)正在执行RETI或任何仿问IE或IP的指令。CPU响应中断时先置“1”相应的优先级触发器,然后执行硬件LCALL(压栈与转移),同时清“0”中断请求标志(TI、RI除外)。中断服务程序入口:IE00003H~000AHIT0000BH~0012HIE10013H~001AHIT1001BH~0022HIS0023H~002AH在中断服务程序的最后,须放一条指令RETI,该指令清“0”响应时所置的优先级触发器(RET没有此操作),然后返回。举例:RETI与RET的异同点?①相同:匀执行恢复断点操作,即从堆栈中弹出断点给PC。②不同:RETI将清“0”响应时所置的优先级触发器,RET没有该功能。中断与子程序调用的区别?当P3.2为高电平时,P2.0输出的1赫兹的方波,表示正常交通时序;当P3.2为低电平时,P2.0输出占空比为75%的2赫兹矩形波,表示紧急交通时序。P3.2为单片机的中断信号INT0,利用中断方式,实现上述交通时序。用C程序编写中断程序函数,以及初始化和主程序查询方式P3^2=1;while(1){P2^0=0;if(P3^2)delay_ms(500);elsedelay_ms(125);P2^0=1;delay_ms(375+125*P3^2);}中断方式主程序#includereg52.hunsignedcharstate_normal;main(){IT0=0;//低电平触发PX0=1;//高优先级EA=1;//开总中断EX0=1;//开INT0中断state_normal=1;while(1){P2^0=0;delay_ms(125+375*state_normal);P2^0=1;delay_ms(375+125*state_normal);}}中断服务程序函数voidstate_change()interrupt0{state_normal^=0x01;}ORG0100HINTP:JBF0,FSCLRP1.0;F0=0,关水CPLF0RETIFS:SETBP1.0;F0=1,放水CPLF0RETIORG0003HLJMPINTPORG0040HCLRP1.0CLRIT0;低电平触发SETBPX0;高优先级SETBEA;开总中断SETBEX0;开INT0中断主程序简单I/O实验(实验四)(交通灯控制)系统晶振是11.0592MHzORG0000HLJMPSTARTORG0040HSTART:MOVSP,#60HLCALLSTATUS0;初始状态(都是红灯)CIRCLE:LCALLSTATUS1;南北绿灯,东西红灯LCALLSTATUS2;南北绿灯闪转黄灯,东LCALLSTATUS3;南北红灯,东西绿灯LCALLSTATUS4;南北红灯,东西绿灯LJMPCIRCLESTATUS0:;南北红灯,东西红灯MOVDPTR,#8300HMOVA,#0FHMOVX@DPTR,AMOVR2,#10;延时1秒LCALLDELAYRETSTATUS1:;南北绿灯,东西红灯MOVDPTR,#08300HMOVA,#96H;南北绿灯,东西红灯MOVX@DPTR,AMOVR2,#200;延时20秒LCALLDELAYRETSTATUS2:;南北绿灯闪转黄灯,MOVDPTR,#8300HMOVR3,#03H;绿灯闪3次FLASH:MOVA,#9FHMOVX@DPTR,AMOVR2,#03HLCALLDELAYMOVA,#96HMOVX@DPTR,AMOVR2,#03HLCALLDELAYDJNZR3,FLASHMOVA,#06H;南北黄灯,东西红灯MOVX@DPTR,AMOVR2,#10;延时1秒LCALLDELAYRETSTATUS3:;南北红灯,东西绿灯MOVDPTR,#8300HMOVA,#69HMOVX@DPTR,AMOVR2,#200;延时20秒LCALLDELAYRETSTATUS4:;南北红灯,东西绿灯MOVDPTR,#8300HMOVR3,#03H;绿灯闪3次FLASH1:MOVA,#6FHMOVX@DPTR,AMOVR2,#03HLCALLDELAYMOVA,#69HMOVX@DPTR,AMOVR2,#03HLCALLDELAYDJNZR3,FLASH1MOVA,#09H;南北红灯,东西黄灯MOVX@DPTR,AMOVR2,#10;延时1秒LCALLDELAYNOPRETDELAY:;延时子程序PUSH2PUSH1PUSH0DELAY1:MOV1,#00HDELAY2:MOV0,#0B2HDJNZ0,$DJNZ1,DELAY2;延时100mSDJNZ2,DELAY1POP0POP1POP2RETEND举例:外部中断实验(实验五)(急救车与交通灯)系统晶振是11.0592MHzORG0000HLJMPSTARTORG0003H;INT0中断入口地址LJMPINT0ORG0040HSTART:MOVSP,#60HSETBEX0;INT0中断有效SETBIT0SETBEALCALLSTATUS0;初始状态(都是红灯)CIRCLE:LCALLSTATUS1;南北绿灯,东西红灯LCALLSTATUS2;南北绿灯闪转黄灯,东LCALLSTATUS3;南北红灯,东西绿灯LCALLSTATUS4;南北红灯,东西绿灯闪LJMPCIRCLEINT0:PUSHPSW;保护现场PUSH2PUSHACCMOVDPTR,#8300HMOVA,#0FH;南北,东西都亮红灯MOVX@DPTR,AMOVR2,#100;延时10秒LCALLDELAYPOPACC;恢复现场MOVX@DPTR,APOP2POPPSWRETISTATUS0:;南北红灯,东西红灯MOVDPTR,#8300HMOVA,#0FHMOVX@DPTR,AMOVR2,#10;延时1秒LCALLDELAYRETSTATUS1:;南北绿灯,东西红灯MOVDPTR,#8300HMOVA,#96H;南北绿灯,东西红灯MOVX@DPTR,AMOVR2,#200;延时20秒LCALLDELAYRETSTATUS2:;南北绿灯闪转黄灯,东MOVDPTR,#8300HMOVR3,#03H;绿灯闪3次FLASH:MOVA,#9FHMOVX@DPTR,AMOVR2,#03HLCALLDELAYMOVA,#96HMOVX@DPTR,AMOVR2,#03HLCALLDELAYDJNZR3,FLASHMOVA,#06H;南北黄灯,东西红灯MOVX@DPTR,AMOVR2,#10;延时1秒LCALLDELAYRETSTATUS3:;南北红灯,东西绿灯MOVDPTR,#8300HMOVA,#69HMOVX@DPTR,AMOVR2,#200;延时20秒LCALLDELAYRETSTATUS4:;南北红灯,东西绿灯MOVDPTR,#8300HMOVR3,#03H;绿灯闪3次FLASH1:MOVA,#6FHMOVX@DPTR,AMOVR2,#03HLCALLDELAYMOVA,#69HMOVX@DPTR,AMOVR2,#03HLCALLDE