单片机中断原理 您所在的位置:网站首页 中断程序 单片机中断原理

单片机中断原理

#单片机中断原理| 来源: 网络整理| 查看: 265

中断系统原理 何为中断?

生活中的例子: 生活中常见的例子,一个正在写寒假作业的孩子突然听到一阵敲门声,原来是父母下班回来了,孩子说:“等会,我来了”。于是,他记住当下页码放下作业去开门,然后回来再接着写作业。 简单来说,在这个例子中,放下作业去开门就是“中断”。

何为中断系统?

中断系统原理: 计算机在执行某程序时,发生了紧急事件或有特殊请求,CPU暂停某程序的执行,转而去处理上述事件或请求,处理完毕后再重新执行某程序的过程叫做中断。 在单片机中,中断过程一般可分为四步:中断请求->中断响应->中断处理->中断返回。在上述例子中,“敲门声”是中断请求,“答应去开门”是中断响应,“把门打开”是中断处理,“接着写作业”是中断返回。 中断系统结构示意图 引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构)。 51单片机允许5个中断源,2个外部中断源:INT0(外部中断0);INT1(外部中断1)和三个内部中断源。 51单片机中断系统内部结构示意图 对上图中的EA、EX0、EX1、INT0、INT1作说明。 EA:CPU的总中断允许控制位,EA=1,CPU开放中断;EA=0,CPU屏蔽所有的中断申请。所以,各中断源首先受到EA的控制,其次受到各中断源自己的中断允许控制位控制。当所有的中断源都开放时,整个中断服务成立。 EX0:外部中断0中断允许位。EX0=1,允许中断;EX0=0,屏蔽中断。 EX1:外部中断1中断允许位。EX1=1,允许中断;EX1=0,屏蔽中断。 INT0:由P3.2端口线引入,低电平或下降沿信号引发。当等于0时,P3.2引脚上的低电平可触发外部中断0;当等于1时,外部中断0为下降沿触发方式。 INT1:由P3.3端口线引入,低电平或下降沿信号引发。当等于0时,P3.3引脚上的低电平可触发外部中断1;当等于1时,外部中断1为下降沿触发方式。 触发方式为低电平时,只有低电平才能触发而且只能触发一次中断;当触发方式为下降沿时,只有下降沿才能引起触发而且只能触发一次中断。 中断优先级: 内部查询顺序: 在同时收到几个同一优先级的中断请求时,哪一个中断请求能优先得到响应,取决于内部的查询顺序。这相当于在同一优先级内,还同时存在另一辅助优先级结构: 内部查询顺序 外部中断处理函数——外部中断0和外部中断1 void int0() interrupt 0 //中断处理函数,加关键字interrupt和入口号0 { 中断处理语句; }

void int1() interrupt 2 //中断处理函数,加关键字interrupt和入口号2 { 中断处理语句; }

外部中断1代码举例

了解完中断原理后,我们来实际编写一个程序。 我们用下降沿引起外部中断1的触发,实现led有规律地亮灭。亮灭的具体流程我已写在下面代码的注释中。独立键盘S3键用于实现提供给外部中断源的触发信号。

#include #define unchar unsigned char #define unint unsigned int unchar count; sbit S3_key = P3^1; sbit sign = P3^7; //实现下降沿,提供给外部中断1的信号,单片机上,此引脚要用杜邦线与外部中断1 P3.3相连。 void delay(unint z) //自定义的延迟函数 { unint x,y; for(x=z; x>0;x--) for(y=114;y>0;y--); } void int1_init() // 预处理,打开中断允许控制位 { EA = 1; //打开总中断 EX1 = 1; // 打开外部中断1 IT1 = 1; // 选择下降沿触发方式 } void main() { int1_init(); while(1) { if(S3_key == 0) // 判断S3是否被按下 { delay(15); // 调用延迟函数,意为消除按下按键时的抖动 if(S3_key == 0) // 再判断一次 { sign = 1; sign = 0; // 制造下降沿 count += 1; } while(!S3_key); // 如果一直按下不松手,则一直在此while循环里。实际效果为:按下一次后松手,才能变化一次。 } } } void dealing() interrupt 2 // 外部中断1处理函数,可以写在主函数下面 { switch(count % 10) //10 11 12 13 14 15 { // a b c d e f case(0): P1 = 0xff; break; //1111 1111 case(1): P1 = 0xfe; break; //1111 1110 case(2): P1 = 0xfd; break; //1111 1101 case(3): P1 = 0xfb; break; //1111 1011 case(4): P1 = 0xf7; break; //1111 0111 case(5): P1 = 0xef; break; //1110 1111 case(6): P1 = 0xdf; break; //1101 1111 case(7): P1 = 0xbf; break; //1011 1111 case(8): P1 = 0x7f; break; //0111 1111 case(9): P1 = 0x00; break; //0000 0000 } }

这里是用外部中断1为例,而外部中断0的使用方式和外部中断1相同。 大家快去动手实现一下吧~~



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有