概念
中断服务函数:内核响应中断后执行的相应的程序,每一个中断对应一个中断服务函数。
中断向量:中断服务程序的入口地址。每一个中断源对应一个固定的入口地址。
一般来说,51单片机有5个中断源,分2个优先级,从高到低依次为:外部中断0、定时/计数器0、外部中断1、定时/计数器1、串口中断。
中断源 | 中断号 | 中断级别 |
外部中断0 INT0 | interrupt 0 | 最高 |
定时器0中断 T0 | interrupt1 | 1 |
外部中断1 INT1 | interrupt2 | 2 |
定时器1中断 T1 | interrupt3 | 3 |
串口中断 Tx/Rx | interrupt4 | 4 |
关于中断服务函数的编写:
一般情况下,中断的处理函数有两个:中断初始化函数、中断服务函数
中断服务函数的格式为:
void 函数名( ) interrupt 中断号
例如:void InitTimer0() void ServiceTimer0() interrupt 1()
void Init_INT0() void Service_INT0() interrupt 0()
要求
在单片机综合训练平台上,首先将J5处的跳帽接到2~3引脚,即S5按键接到P32/INT0,S4按键接到P33/INT1。
1.定义一个Working()函数,使L1指示灯不断闪烁。
2.将P32引脚定义成外部中断功能,按S5就会产生外部中断触发信号。
3.在中断响应函数中,点亮L8指示灯,延时一段较长的时间后熄灭,该功能用两种方式实现:1-直接在中断服务函数中延时。2-在中断服务函数中标志变量,在外部执行延时。
电路图:
代码
方式一
方式一:直接在中断服务函数中延时(L8点亮时,L1可能处于熄灭状态,可能处于点亮状态)
#include"reg52.h"
//1.定义一个Working()函数,使L1指示灯不断闪烁。
//2.将P32引脚定义成外部中断功能,按S5就会产生外部中断触发信号。
//3.在中断响应函数中,点亮L8指示灯,延时一段较长的时间后熄灭,该功能用两种方式实现:1-直接在中断服务函数中延时。2-在中断服务函数中标志变量,在外部执行延时。
//定义灯的引脚
sbit L1 = P0^0;
sbit L8 = P0^7;
void Delay(unsigned int t)
{
while(t--);
while(t--);
while(t--);
}
//=======和LED连接的锁存器======
void SelectHC573()
{
P2 = (P2 & 0x1f) | 0x80;
}
//=======L1不断闪烁======
void Working()
{
SelectHC573();
L1 = 0;
Delay(60000);
L1 = 1;
Delay(60000);
}
//======================================
//中断部分,2个函数:初始化、服务函数
//=======外部中断0初始化函数======
void Init_INT0()
{
IT0=1; //下降沿触发
EX0=1; //打开INT0的中断允许
EA=1; //打开总中断
}
//==========外部中断0服务函数======
void Service_INT0() interrupt 0 //INT0对应中断0
{
L8=0;
Delay(60000);
Delay(60000);
L8=1;
}
//======================================
void main()
{
Init_INT0(); //中断初始化函数
while(1)
{
Working();
}
}
方式二
方式二:在中断服务函数中标志变量,在外部执行延时(L8点亮时,L1处于熄灭状态)
#include "reg52.h"
sbit L1=P0^0;
sbit L8=P0^7;
/*==========和LED灯连接的锁存==========*/
void Select_HC573()
{
P2=(P2&0x1f)|0x80;
}
/*==========延时函数==========*/
void delay(unsigned int t)
{
while(t--);
while(t--);
while(t--);
}
/*==========L1指示灯不断闪烁==========*/
void Working()
{
Select_HC573();
L1=0;
delay(60000);
L1=1;
delay(60000);
}
/*==========外部中断0初始化函数==========*/
void Init_INT0()
{
IT0=1; //下降沿触发
EX0=1; //打开INT0的中断允许
EA=1; //打开总中断
}
/*==========外部中断0服务函数==========*/
unsigned char stat_int=0; //中断标志变量
void Service_INT0() interrupt 0
{
stat_int=1;
}
void LED_L8()
{
if(stat_int==1)
{
L8=0;
delay(60000);
delay(60000);
L8=1;
}
stat_int=0;
}
void main()
{
Init_INT0();
while(1)
{
Working();
LED_L8();
}
}
总结
1.如题:将P32引脚定义成外部中断功能。这需要看电路图,可知P32对应INT0。则需要写2个中断函数:
初始化+服务函数
注意服务函数后面是interrupt 0!
void Init_INT0()
{
IT0=1; //下降沿触发
EX0=1; //打开INT0的中断允许
EA=1; //打开总中断
}
void Service_INT0() interrupt 0
{
}
2.当原本执行的是闪烁灯,中断也是闪烁灯时。可使用方式二:在中断服务函数中标志变量,在外部执行延时,可有效避免同时点亮的情况。