文档详情

第四章1外部中断.ppt

发布:2018-06-17约5.38千字共35页下载文档
文本预览下载声明
四、中断的返回 中断服务程序的最后一条指令为将压栈保护的PC的内容弹出,送回PC。 CPU可由被中断的位置继续执行原有程序。 返回 主程序在运行过程中 中断源出现中断信号(P3.2引脚出现下降沿信号) 相应的中断标志(IE0)硬件自动置1 向CPU申请中断 CPU根据IE( EA=1,EX0=1 )、IP的设置决定是否相应中断 相应的中断标志位(IE0)自动复位 将断点的地址存入堆栈 将相应的中断服务的入口地址0003H赋予程序计数器PC,执行中断程序 执行完中断程序后,堆栈中断点地址由硬件自动赋予PC,程序返回主程序继续执行。 C51编译器支持在C源程序中直接以函数形式编写中断服务程序。常用的中断函数定义语法如下: void 函数名() interrupt n n为中断类型号,C51编译器允许0~31个中断,n取值范围0~31。下面给出了8051控制器所提供的5个中断源所对应的中断类型号和中断服务程序入口地址: 中断源 n 入口地址 外部中断0 0 0003H 定时/计数器0 1 000BH 外部中断1 2 0013H 定时/计数器1 3 001BH 串行口 4 0023H void time0(void)interrupt 1 using 0 //定时器T0的中断服务函数,T0的编号为1,使用第0组工作寄存器 { ……//中断服务程序 } main( ) { IT0=1;//中断边沿触发 EX0=1;//允许外部中断0 EA=1;//总允许 while(1);//等待中断 } int0() interrupt 0 { P2_0=!P2_0;//中断内容 } 前面不需要函数说明 不能有返回值 不能有形参 主程序中没有调用中断函数的语句 main( ) { IT0=1;//中断边沿触发 EX0=1;//允许外部中断0 EA=1;//总允许 while(1);//等待中断 } int0() interrupt 0 { P2_0=!P2_0;//中断内容 } 前面不需要函数说明 不能有返回值 不能有形参 主程序中没有调用中断函数的语句 中断函数 一般函数 前面不需要函数说明 前面需要函数说明 不能有返回值 可以有返回值 不能有形参 可以有形参 主程序中不需要调用语句 主程序中需要调用语句 函数执行时间是随机的 函数执行时间是确定的 函数的入口地址是固定的 函数的入口地址是随机的 1. 用外部中断0测量负跳变信号的累计数,同时在LED数码管上显示出来。 #include reg51.h #define uchar unsigned char uchar code led[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//各数字的数码管段码 uchar counter=0; main() { EA=1; EX0=1; IT0=1; while(1) {P1=led[counter];} } void int0() interrupt 0 { counter++; if(counter==10)counter=0; } 程序要求: 中断前: P0.0~P0.7的8个灯依次亮。 外部中断0: P0.0~P0.7的左右4个灯闪烁亮8次 外部中断1: P0.0~P0.7的8个灯间隔闪烁8次 ⑴ 设定外部中断0为高优先级,先执行外部1中断,过程中用外部0中断来将其中断,反之不行。注意保护现场。 ⑵ 设定外部中断1为高优先级,先执行外部0中断,过程中用外部1中断来将其中断,反之不行。注意保护现场。 在中断服务程序中,通常首先要保护现场,然后才是真正的中断处理程序。中断返回时需要恢复现场。在保护和恢复现场时,为了不使现场的数据遭到破坏,一般规定此时CPU不再响应新的中断请求。 在编写中断服务程序的过程中,要注意在保护现场前关中断,在保护现场后若允许高优先级中断,则应开中断。同样,在恢复现场前也应先关中断,恢复之后再开中断。 1)若要在执行当前中断程序时禁止更高优先级中断,可先用软件关闭CPU对中断的响应,在中断返回前再开放中断。 2)注意外部电平触发的中断不锁存。若在外部电平出现时被中断屏蔽,而在中断识别之前电平消失,它被完全忽略——中断处理本身不能锁存外部电平请求。 3)外部中断0、1及定时器0、1的中断
显示全部
相似文档