在单片机或处理器里面,中断系统是非常重要的,它可以大大提高单片机或处理器的处理效率,那么,我们要如何正确学习中断呢?接下里以一个简单的题目为例该题目有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();
}
}