第五章中断5-1中断的概念5-2MCS-51中断系统5-3MCS-51中断设计实例本章要点中断的概念MCS-51的中断源MCS-51的中断向量地址中断控制寄存器中断是计算机的重要指标之一。一、中断概念某人看书执行主程序日常事务电话铃响中断信号INT=0中断请求暂停看书暂停执行主程序中断响应书中作记号当前PC入栈保护断点电话谈话执行I/O程序中断服务继续看书返回主程序中断返回日常事务程序中断服务程序5-1中断的概念三、中断优先权1.当同时有多个中断请求信号,先响应优先级别高的中断请求。2.高优先级中断请求信号可中断低优先级中断服务。四、中断源能发出中断请求信号的各种事件。如I/O设备、定时时钟、系统故障、软件设定等。单片机中也有一些可以引起中断的事件,8031中一共有5个:两个外部中断,两个计数/定时器中断,一个串行口中断。执行主程序二、中断过程中断系统工作可由中断申请、中断响应、中断服务、中断返回四个阶段组成。继续执行主程序中断服务程序5-2MCS-51中断系统中断系统内部结构一.中断源信号二.中断允许控制2个外部中断源信号:INT0、INT12个定时器T0、T1溢出中断请求:TF0、TF11个串行口数据发送、接收结束中断请求:RI、TI。三.2级中断优先级控制优先级选择开关:PS、PT1、PX1、PT0、PX0总允许开关:EA源允许开关:ES、ET1、EX1、ET0、EX0如图所示,MCS-51中断系统由与中断有关的特殊功能寄存器、中断入口、顺序查询逻辑电路等组成,包括5个中断请求源,4个用于中断控制的寄存器IE、IP、ECON和SCON来控制中断类弄、中断的开、关和各种中断源的优先级确定。5-2-1.中断源(1)外部中断源:即外中断0和1,经由外部引脚引入的,在单片机上有两个引脚,名称为INT0、INT1,也就是P3.2、P3.3这两个引脚。在内部的TCON中有四位是与外中断有关的。IT0:INT0触发方式控制位,可由软件进和置位和复位,IT0=0,INT0为低电平触发方式,IT0=1,INT0为负跳变触发方式。IE0:INT0中断请求标志位。当有外部的中断请求时,这位就会置1(这由硬件来完成),在CPU响应中断后,由硬件将IE0清0。IT1、IE1的用途和IT0、IE0相同。(2)内部中断源TF0:定时器T0的溢出中断标记,当T0计数产生溢出时,由硬件置位TF0。当CPU响应中断后,再由硬件将TF0清0。TF1:与TF0类似。TI、RI:串行口发送、接收中断,在串口中再讲解。5-2-2中断操作1、中断响应的条件:我们人可以响应外界的事件,是因为我们有多种“传感器“――眼、耳可以接受不同的信息,计算机是如何做到这点的呢?MCS51工作时,在每个机器周期中都会去查询一下各个中断标记,看他们是否是“1“,如果是1,就说明有中断请求了,所以所谓中断,其实也是查询,不过是每个周期都查一下而已。这要换成人来说,就相当于你在看书的时候,每一秒钟都会抬起头来看一看,查问一下,是不是有人按门铃,是否有电话。。。。8051CPU在每个机器周期顺序采取每一个中断源,在下一个机器周期S6期间按优先级顺序处理所有的中断请求,如果满足下面的要求,CPU将在下一个机器周期的状态S1响应最高优先级的中断请求。1、CPU开放中断(即EA=1)2、有中断源向CPU提出中断申请3、相应的中断允许位为1(EX0=1)当满足以上条件时,中断系统通过硬件自动将响应的中断向量地址装入PC,转入中断服务程序。有些中断源与中断响应后由硬件自动清除,而有些中断源则需要在中断服务程序执行完之前由软件清除(RI、TI)。1、中断响应5-2-2中断操作2、中断处理CPU响应中断后转入中断服务程序,从中断服务程序的第一条指令一直执行到RETI指令为止,具体执行过程如下:1、保护断点、以便返回2、按中断向量的地址转到相应的中断服务程序去处理3、在中断服务开始时撤销本次中断请求4、在中断程序末尾,执行中断返回指令RETI,取出断点值,使CPU返回到原来的程序继续执行若执行当前中断服务程序时,禁止更高优先级中断,应用软件关闭中断总允许或通过编辑屏蔽更高优先级中断源的中断请求,但在中断返回前应开放中断。大家应当明白,为什么前面有一些程序一始我们这样写:ORG0000HLJMPSTARTORG0030HSTART:。。。5-2-3、五个中断源的中断向量地址与向量空间外中断0:0003H定时器0:000BH外中断1:0013H定时器1:001BH串口:0023H这样写的目的,就是为了让出中断源所占用的向量地址。当然,在程序中没用中断时,直接从0000H开始写程序,在原理上并没有错,但在实际工作中最好不这样做。中断服务入口地址它们的自然优先级由高到低排列。这里还有个问题,大家是否注意到,每个中断向量地址只间隔了8个单元,如0003-000B,在如此少的空间中如何完成外部0中断服务程序呢?很简单,你在中断处安排一个LJMP指令,不就可以把中断程序跳转到任何地方了吗?一个完整的主程序看起来应该是这样的:ORG0000HLJMPSTARTORG0003HLJMPINT0;转外中断0ORG000BHLJMPINT1;转外中断1ORG0030HSTART:。。INT0:….RETI中断源中断入口地址INT00003HT0000BHINT10013HT1001BHSIO0023H5-2-3、五个中断源的中断向量地址与向量空间5-2-4.中断对现场的保护和恢复中断程序完成后,一定要执行一条RETI指令,执行这条指令后,CPU将会把堆栈中保存着的地址取出,送回PC,那么程序就会从主程序的中断处继续往下执行了。注意:CPU所做的保护工作是很有限的,只保护了一个程序计数器PC地址(即断点)压入堆栈保护,而其它的所有东西都不保护,所以如果你在主程序中用到了如A、PSW等,在中断程序中又要用它们,还要保证回到主程序后这里面的数据还是没执行中断以前的数据,就得自己保护起来。CPU响应中断时,首先把当前指令的下一条指令(就是中断返回后将要执行的指令)的地址送入堆栈,然后根据中断标记,将相应的中断入口地址送入PC,PC是程序指针,CPU取指令就根据PC中的值,PC中是什么值,就会到什么地方去取指令,所以程序就会转到中断入口处继续执行。现场保护和恢复举例:ext0:pushacc;将累加器的值压入堆栈保存pushpsw;将PSW的值压入堆栈保存setbrs0;保护工作寄存器组clrrs1;mova,#00h;为使LED端口全亮movr2,#10;闪烁五次(亮灭十次)loop3:movled_port,a;将A输出calldelay2s;延时秒cpla;将A的值反相djnzr2,loop3;闪烁五次(亮灭十次)?poppsw;从堆栈取回PSW的值popacc;从堆栈取回ACC的值reti外部中断的使用:外部中断0从P3.2/INT0输入外部中断1从P3.3/INT1输入1、设置外部中断触发方式(TCON.0和.2)2、设置外部中断允许位(IE.0和IE.2)3、设置中断总控制位(IE.7)1、设置中断触发方式(TCON.0和.2)外部中断0设置为下降沿触发;movTCON,#01h;外部中断1设置为下降沿触发;movTCON,#04h;同时两个外部中断都用下降沿触发则为05h如为低电平触发可不用设置2、开外部中断允许、总中断允许;(IE.0和.2和.7)使用外部中断0时,应为movIE,#81h;使用外部中断1时,应为movIE,#84h;同时两个外部中断都用则为85h//以下为上述两句的另外一种写法,更清晰明了。用哪种写法都可以,看个人喜好,推荐使用下面的这种写法SETBIT0;IT0=1;外部中断0,设置为下降沿触发SETBEX0;EX0=1;允许外部中断0//IT1=1;//外部中断1,设置为下降沿触发//EX1=1;//允许外部中断1SETBEA;EA=1;开总中断例:把按键接成外部中断模式,按键K1按下,则D8亮,再按下K1,D8熄灭;再按下再熄灭。。。。1、外部中断0入口地址2、外部中断0初始化3、外部中断0服务程序中断系统应用举例要求每次按动按键,使外接发光二极管LED改变一次亮灭状态。解:INT0输入按键信号,P1.0输出改变LED状态。1.跳变触发:每次跳变引起一次中断请求。ORG0000H;复位入口AJMPMAINORG0003H;外部中断0入口AJMPPINT0ORG0030H;主程序MAIN:MOVP1,#0FFH;设P1为输入,置高电平SETBIT0;负跳变触发中断SETBEX0;开INT0中断SETBEA;开总允许开关SJMP$;原地等待,也可执行其它任务;中断服务程序PINT0:CPLP2.5;改变LEDRETI;返回主程序END处理外部中断ORG0000H;复位入口AJMPMAINORG0003H;中断入口AJMPPINT0ORG0030H;主程序MAIN:MAIN:MOVP1,#0FFH;设P1为输入,置高电平CLRIT0;低电平触发中断SETBEX0;开INT0中断SETBEA;开总允许开关SJMP$;执行其它任务;中断服务程序1.软件消除按键抖动。2.软件等待按键释放。2.电平触发:避免一次按键引起多次中断响应。PINT0:CALLDelay10ms;延时10ms消除抖动JBP1.3,EXIT;延时后第二次判断是否按键真的按下CPLP2.5;改变LEDWAIT:JNBP1.3,WAIT;等按键释放EXIT:RETI;返回主程序END
本文标题:第五章中断.
链接地址:https://www.777doc.com/doc-2083552 .html