我是靠谱客的博主 活泼哈密瓜,最近开发中收集的这篇文章主要介绍单片机中断原理——以外部中断为例,代码详写,你“一看就懂”中断系统原理外部中断1代码举例,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

中断系统原理

何为中断?

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

何为中断系统?

中断系统原理:
计算机在执行某程序时,发生了紧急事件或有特殊请求,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 <reg52.h>
#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相同。
大家快去动手实现一下吧~~

最后

以上就是活泼哈密瓜为你收集整理的单片机中断原理——以外部中断为例,代码详写,你“一看就懂”中断系统原理外部中断1代码举例的全部内容,希望文章能够帮你解决单片机中断原理——以外部中断为例,代码详写,你“一看就懂”中断系统原理外部中断1代码举例所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部