中断
CPU正在在执行一个程序,突然接到中断请求,然后就放下手中的工作取执行中断程序,然后再回来继续手头的工作。
框前面的数字是中断向量号
这个图并不完整,比如计时器/定时器的功能设置没画出来
看外部中断
串口中断的标志位必须通过软件置0,其他好像是自动的,不嫌麻烦就都用软件置0
外部中断代码
低电平触发
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit key_s2 = P3^0;//独立按键S2
sbit flag = P3^7; //外部中断信号产生脚
/*====================================
函数 : delay(uint z)
参数 :z 延时毫秒设定,取值范围0-65535
返回值 :无
描述 :12T/Fosc11.0592M毫秒级延时
====================================*/
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
//外部中断0初始化
void int0Init()
{
EA = 1; //开总中断
EX0 = 1;//开外部中断0
IT0 = 0;//外部中断0低电平触发
}
void main()//main函数自身会循环
{
int0Init();//外部中断0初始化
while(1)
{
if(key_s2 == 0)//判断S2是否被按下
{
delay(20);//按键消抖
if(key_s2 == 0)
{
flag = 0;
flag = 0;//产生低电平,CPU会采样2次P3.2的状态,两次都为低才触发
flag = 1;//结束低电平
while(!key_s2);//松手检测
}
}
}
}
//外部中断1中断服务程序,加interrupt 和中断向量号
void int0() interrupt 0
{
P1 = ~P1;//P1的状态按位取反
}
这个就是一直检测按键有无按下,有的话就改变引脚来触发中断,其实直接将对应引脚置搞,然后将引脚与开关连在一起会更好,但是开发板它已经固定死了,没办法连接。
再看一下下降沿触发的:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit key_s2 = P3^0;//独立按键S2
sbit flag = P3^7; //外部中断信号产生脚
/*====================================
函数 : delay(uint z)
参数 :z 延时毫秒设定,取值范围0-65535
返回值 :无
描述 :12T/Fosc11.0592M毫秒级延时
====================================*/
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
//外部中断1初始化
void int1Init()
{
EA = 1; //开总中断
EX1 = 1;//开外部中断1
IT1 = 1;//外部中断1下降沿触发
}
void main()//main函数自身会循环
{
int1Init();//外部中断1初始化
while(1)
{
if(key_s2 == 0)//判断S2是否被按下
{
delay(20);//按键消抖
if(key_s2 == 0)
{
flag = 1;
flag = 0;//产生下降沿
while(!key_s2);//松手检测
}
}
}
}
//外部中断1中断服务程序
void int1() interrupt 2
{
P1 = ~P1;
}