外部中断练习
内容来自B站小蜜蜂老师 yyds
一、什么是中断
通俗的来讲中断就是当我们正在执行一件事件的时候,被另外一件突发事件所打断,
紧接着去处理该突发事件 在返回接着做我们正在执行的事情。
二、51的中断系统
中断名称 | 符号表示/中断号 |
---|---|
外部中断0 | INT0 、0 |
定时/计数器0 | TF0 、1 |
外部中断1 | INT1 、2 |
定时/计数器1 | TF1 、3 |
串口中断 | RI/TI 、4 |
三、中断相关寄存器
四、中断函数编写规则
对于每个中断函数我们都可以将其分为两个部分
1.相关配置初始化 2.中断功能执行函数
中断函数框架
void 函数名() interrupt 中断号
{
}
中断的优先级:
外部中断0 > 定时/计数器0 >外部中断1 > 定时/计数器1 >串口中断
每个中断源都对应着一个固定的入口地址,也就是中断向量,它们依次是:
0 0x0003: INT0
1 0x000B: TF0
2 0x0013: INT1
3 0x001B: TF1
4 0x0023: RI/TI
practise
从原理图可以看出控制外部中断0和外部中断1的两个引脚分别是P3^2 P3^3
#include "reg52.h"
//定义两个led
sbit L1 = P0^0;
sbit L8 = P0^7;
//-----------------------------简单延时函数---------------------------
void Delay(unsigned int t)
{
unsigned int i,j;
for(i = 0; i< t;i++)
{
for(j =0;j< 12000;j++);
}
}
//--------------------------------------------------------------------
//------------------------74HC138初始化--------------------------------
void Init_74HC138(unsigned char n)
{
switch(n)
{
case 4: P2 = P2 |0x1f; P2 = 0x80; break;
case 5: P2 = P2 |0x1f; P2 = 0xa0; break;
case 6: P2 = P2 |0x1f; P2 = 0xc0; break;
case 7: P2 = P2 |0x1f; P2 = 0xe0; break;
}
}
//----------------------------------------------------------------------
//-----------------------------外部中断0初始化函数-----------------------
void Init_INT0(void)
{
EX0 = 1; //使能外部中断0
IT0 = 1; //下降沿触发
EA = 1; //中断总开关
}
//------------------------------------------------------------------------
//---------------------------------led1功能函数---------------------------
void LED1_Work(void)
{
L1 = 0;
Delay(10);
L1 = 1;
Delay(10);
}
//------------------------------主函数------------------------------------
void main(void)
{
Init_INT0();
Init_74HC138(4);
P0 = 0xff; //关闭所有led
while(1)
{
LED1_Work();
}
}
//------------------------------中断服务函数------------------------------
void ServerINT0() interrupt 0
{
L8 = 0;
Delay(10);
L8 = 1;
Delay(10);
}