51单片机中中断的学习

发布时间:2024年01月09日

在单片机或处理器里面,中断系统是非常重要的,它可以大大提高单片机或处理器的处理效率,那么,我们要如何正确学习中断呢?接下里以一个简单的题目为例该题目有2种做法,但是比较推荐用第二种,因为以后学32的时候会经常使用,养成习惯。

首先我们先把那些最老生常谈的代码写出来,这并不麻烦,所以,我便直接进入中断系统的讲解。借助B站小蜜蜂老师的话,轮询就相于你有一个快递快到了,快递会送到快递柜,但是你没有手机没有电话,你无法知道快递什么时候到,所以你每几分钟就得下去看一下快递是否到了,费时费力(内存),而如果是中断的话,你就相当于有了电话,可以接到快递员的电话,于是你就可以准时去拿快递了。

在51中,有4个中断源,从上到下分别是0,1,2,3。每两个类似名字中断源间有优先级,0>1。而且,如果我们想要中断成立的话,我们需要让EA,EX0分别等于1,然后我们通过让IT0等于1或者等于0来决定触发方式(下降沿的意思是从高电平降低到低电平的是过程)

而中断代码由两部分组成,分别是初始化中断与中断服务函数,初始化中断就是在里面写上那些引脚等于0或者1.而服务函数里面写的是中断以后执行的指令。注意,中断服务函数里面的代码越少越好,这样才能提高效率。

在引脚群中经常出现共用引脚的现象,比如S5与INT0共用了P3^2,这就导致了按下S5的意思就是INT0触发。

最后,我们代码如图所示

#include "reg52.h"

sbit L1 = P0^0;
sbit L8 = P0^7;

unsigned int i = 0;
void Delay(unsigned int n)
{
	while(n--);
	while(n--);
}

void Show_LED1()
{
	P2 = (P2 & 0x1f) | 0x80;
	L1 = 0;
	Delay(60000);
	Delay(60000);
		L1 = 1;
	Delay(60000);

}
void Init_INT0()
{
	EA = 1;
	IT0 = 1;
	EX0 = 1;
}

void serve_INT0() interrupt 0
{
	i = 1;
}

void DelayLED1()
{
	if(i == 1)
	{
	L8 = 0;
	Delay(60000);
	Delay(60000);
	Delay(60000);		
	Delay(60000);
	L8 = 1;
	}	
	i = 0;
}

void main()
{

	Init_INT0();
	while(1)
	{
		Show_LED1();
		DelayLED1();
		
	}
}

文章来源:https://blog.csdn.net/weixin_69318410/article/details/135441962
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。