中断系统的基本概念
五个中断源及其基本结构
51单片机一共有五个中断源
按优先级从上到下
中断系统的结构 中断向量就是中断号,就是下图最左边的标号(在写中断服务函数的时候有用)
中断的处理函数
一般情况下,中断的处理函数有两个,其一为中断初始化函数,其二为中断服务函数。
中断服务函数的结构:
中断相关的4个寄存器
写程序的时候会用到
分为两个控制寄存器和两个中断请求标志
一个例题
代码如下:
方式一:
#include <reg52,h>
sbit L1=P0^0;
sbit L2=P0^7;
//中断系统的基本使用
void Delay(unsigned int t)//延时函数
{
while(t--);
}
void SelectHC573()//
{
P2=(P2&0x1f)|0x80;
}
void Working()
{
SelectHC573();
L1=0;
Delay(60000);
L1=1;
Delay(60000);
}
//***********************
void Init_INT0()//中断初始化函数
{
IT0=1;//外部中断0的触发方式
EX0=1;//中断使能打开
EA=1;//总中断开关打开
}
void ServiceINT0() interrupt 0//中断服务函数 这里面是中断后应该执行的代码
{
L8=0;
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
L8=1;
}
void main()//
{
void Init_INT0()
while(1){
Working();
}
}
方式二:
#include <reg52,h>
sbit L1=P0^0;
sbit L2=P0^7;
//中断系统的基本使用 把中断服务函数之中的行为放在函数外面 用一个变量来标识有没有发生中断
void Delay(unsigned int t)
{
while(t--);
}
void SelectHC573()
{
P2=(P2&0x1f)|0x80;
}
void Working()
{
SelectHC573();
L1=0;
Delay(60000);
L1=1;
Delay(60000);
}
//***********************
void Init_INT0()//中断初始化函数
{
IT0=1;//外部中断0的触发方式
EX0=1;//中断使能打开
EA=1;//总中断开关打开
}
unsigned char stat_int=0;//判断有没有发生中断响应
void ServiceINT0() interrupt 0//中断服务函数
{
stat_int=1;
}
void LEDINT()//中断产生的时候去执行
{
if(stat_int=1)
{
L8=0;
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
L8=1;
}
stat_int=0;
}
//*********************************
void main()
{
void Init_INT0()
while(1){
Working();//在LEDINT函数之前发生
LEDINT();
}
}
注意事项
方法一中,当满足中断条件后,中断服务函数会自动调用,不需要写在主函数里
方法二中,是把中断服务函数之中的行为放在函数外面 用一个变量来标识有没有发生中断
最后,最好不要将要执行的代码放在中断服务函数中(我也不知为什么,视频里讲的,我也没百度到,以后会讲清楚,如果有大佬知道,麻烦评论一下)