中断

stc51单片机的cpu只有一个核,也就是一次只能执行一段代码。

中断就是当我们在正常执行代码的过程中间,如果触发了中断,就是cpu会马上停止执行当前的代码,就算当前的代码没有执行完比如循环还有没有跳出等,然后去执行另外一段我们要求去执行代码,等那段代码执行完后在回来接着执行原本的代码。

stc89c52中的中断方式有三个,外部中断,定时器中断和串口中断。

中断相关的配置也放在了特殊寄存器中。并且不同类型的中断也配置了不止一个。比如有外部中断1,外部中断2等,他们之间的原理一样但控制的引脚和各自存储数据的地址不同。

特殊寄存器中配置的中断间也可以相互打断,只要是根据中断的优先级,优先级高的可以打断优先级低的。优先级也是可以通过改变对应位的值由用户自行配置。

同一优先级的定时器之间不能相互打断。但是当两个同优先级的打断在同一时间触发的时候,会按中断器的编号由小到大执行,这个编号也就是cpu遍历这几个中断器的顺序,是定死了的。

1.外部中断

外部中断的触发方式类型也有两种,一种是下降沿触发,另外一种是低电平触发。下降沿触发就是当对应引脚由高电平变为低电平的时候触发。低电平触发就是对应引脚输入低电平的时候触发。

下面的示例是使用外部中断0,用下降沿触发的方式。外部中断0对应的引脚是P3^2,在我的机器上对应最后一个按钮,中断编号是0。

#include <reg52.h>

sbit LED0 = P0^0;
sbit KEY = P3^2;
unsigned char flag = 0;

void Int0() interrupt 0 //表示定义一个叫做Int0的方法,当0号编号的打断被触发的时候执行这个方法。
{
if(0 == KEY)//再这个方法里面我们判断了按键是否被按下即对应引脚的值是否为0,如果为0则将标志flag的值设置为1。
{
flag = 1;
}

}

void main()
{
IT0 = 1;//IT0用于配置外部中断0的触发方式,为1的时候是下降沿触发,0是低电平触发
EX0 = 1;//EX0用于配置外部中断0是否可用,只有设置为1时外部中断0才能被触发
EA = 1;//EA用于配置是否触发中断,只有配置为1时才能触发,配置为0时所有的中断都不会触发包括定时器中断和串口中断
KEY = 1;//将P3^2引脚值默认设置为1,这样当我们按下按钮时就变为0,就可以用下降沿触发的方式触发外部中断0
LED0 = 1;//led灯设置为灭的状态
while(1)
{
if(1 == flag)//当flag为1的时候即打断的代码执行后,将flag置为0,led灯状态取反。实现按一下灯亮,再按一下灯灭...
{
flag = 0;
LED0 = ~LED0;
}
}
}

低电平触发


#include <reg52.h>
#include <intrins.h>

sbit LED0 = P0^0;
sbit KEY = P3^2;


void delay_ms(unsigned int n)
{
unsigned int i=0,j=0;
for(i=0; i<n; i++)
for(j=0; j<123; j++);
}

void Int0() interrupt 0
{
EX0 = 0; //关闭外部中断0,防止按键抖动多次进入
delay_ms(20);
if(0 == KEY)
{
LED0 = ~LED0;
while(0 == KEY); //等待按键释放,如果此次不检测按键释放,则由于中断允许迅速,会造成多次进入。
}
EX0 = 1; //开启外部中断0
}

void main()
{
IT0 = 0;
EX0 = 1;
EA = 1;
KEY = 1;
LED0 = 1;
while(1) ;
}

posted @ 2020-08-29 16:36  maycpou  阅读(462)  评论(0编辑  收藏  举报