1、基础知识
欧老师的资料https://bbs.21ic.com/icview-2477100-1-1.html
(1)关于51单片机的中断系统
基础知识
a 中断源
一般来说,51单片机有5个中断源(忽略定时/计数器2),分2个优先级,这个5个中断源按照自然优先级从高到低依次为:
外部中断0:INT0
定时/计数器0:TF0
外部中断1:INT1
定时/计数器1:TF1
串口中断:RI/TI
如果想让优先级低的先相应,可以提前设置
b 中断向量
要记住每一个中断源对应的中断号
0 0x0003: INT0
1 0x000B: TF0
2 0x0013: INT1
3 0x001B: TF1
4 0x0023: RI/TI
c 中断相关的寄存器
d 中断服务函数的编写
电路图分析
有6个引脚,最后两个是串口输入(RX)和串口输出(TX)
T0:计数器输入端。TF0是定时或计数器输入端,什么时候定时什么时候计数?要对外部计数,引脚就是T0和T1
INT0:外部中断。里面有两个选择,外部中断信号的选择,在TCOM里面由IT这个位来控制。当IT=1,是边缘中断,IT=0,是电平中断。有了中断请求之后,我们内核什么时候可以实现中断请求呢?
IE:中断控制寄存器(中断的开关),EA是中断的总开关,EXO、ETO,EX1…是每个中断源的开关。
2、代码实现
实现的效果:在主程序中,L1一直闪烁。当按下S8,执行中断服务程序,L8亮
(1)灯的定义
sbit L1 = P0^0;
sbit L8 = P0^7;
(2)HC573的选择
void SelectHC573()
{
P2 = (P2 & 0x1f) | 0x80;
}
(3)延时函数
void Delay(unsigned int t)
{
while(t--);
while(t--);
while(t--);
}
(4)主程序
void Working()
{
SelectHC573();
L1 = 0;
Delay(60000);
L1 = 1;
Delay(60000);
}
(5)中断
执行中断的第一种方式
void Init_INTO() //中断初始化
{
IT0 =1; //设置寄存器,中断的方式
EX0=1; //设置寄存器,每个中断的开关打开
EA=1; //中断的总开关打开
}
void ServiceINTO() interrupt 0 //中断服务函数,为中断号为0的中断源服务
{
L8 = 0;
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
L8=1;
}
执行中断的第二种方式
void Init_INTO()
{
IT0 =1; //Ñ¡ÔñÖжϵĴ¥·¢·½Ê½
EX0=1; //ÖжÏ0µÄÕâ¸ö¿ª¹Ø´ò¿ª
EA=1; //ÖжÏ×Ü¿ª¹Ø´ò¿ª
}
unsigned char stat_int = 0; //设置一个状态量
void ServiceINTO() 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;
}
整体代码
#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;
}
void Working()
{
SelectHC573();
L1 = 0;
Delay(60000);
L1 = 1;
Delay(60000);
}
//==========================
void Init_INTO()
{
IT0 =1;
EX0=1;
EA=1;
}
unsigned char stat_int = 0;
void ServiceINTO() 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()
{
Init_INTO();
while(1)
{
Working();
LEDINT();
}
}