1、关于51单片机的中断系统
中断矢量
MCS-51单片机的 5 个中断源分别对应有各自的中断服务程序入口地址——中断矢量.
中断相关的寄存器:
中断系统硬件结构:
2、 关于中断服务函数的编写
1 中断初始化函数;2 中断服务函数
中断服务函数没有返回值,也不能带参数;函数名后面加关键字interrupt;关键字interrupt后加中断号,说明这个中断服务函数是为那个中断服务的。
例如:
//=============初始化定时器0===================
void Init_INT0() //初始化中断
{
IT0 = 1; //下降沿触发
EX0 = 1; //外部中断使能打开
EA = 1;
}
unsigned char stat_int = 0;
//==========定时器0中断服务函数================
void ServiceINT0() interrupt 0 //中断服务函数
{
stat_int = 1;
}
3、应用举例
首先将J5处的跳帽接到2~3引脚,即S5按键接到P32/INT0,S4按键接到P33/INT1。定义一个Working()函数,使L1指示灯不断闪烁。将P32引脚定义成外部中断功能,按键S5按键就会产生外部中断触发信号,在中断响应函数中,点亮L8指示灯,延时一段较长的时间后熄灭:在中断服务函数中标志变量,在外部执行延时。
#include "reg52.h"
sbit L1 = P0^0;
sbit L8 = P0^7;
void Delay(unsigned int t) //延时函数
{
while(t--); //空指令,延迟时间
while(t--); //延时时间更长
while(t--);
}
void SelectHC573()
{
P2 = (P2 & 0x1f) | 0x80; //将4通道打开
}
void Working() //灯的闪烁
{
SelectHC573(); //灯的调用
L1 = 0;
Delay(60000);
L1 = 1;
Delay(60000);
}
//=============初始化定时器0===================
void Init_INT0() //初始化中断
{
IT0 = 1; //下降沿触发
EX0 = 1; //外部中断使能打开
EA = 1;
}
unsigned char stat_int = 0;
//==========定时器0中断服务函数================
void ServiceINT0() interrupt 0 //中断服务函数
{
stat_int = 1;
}
void LEDINT()
{
if(stat_int == 1)
{
L8 = 0; //点亮L8
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
L8 = 1;
}
stat_int = 0;
}
//================================
void main()
{
Init_INT0();
while(1)
{
Working();
LEDINT();
}
}