中断是指 CPU 在处理某一事件 A 时,发生了另一事件 B,请求 CPU 迅速去处理(中断发生);CPU 暂时停止当前的工作(中断响应), 转去处理事件 B(中断服务);待 CPU 将事件 B 处理完毕后,再回到原来事件 A 被中断的地方继续处理事件 A(中断返回)
1、中断结构
中断源 | 对应的管脚 | 中断号 | 中断允许标志位 |
INT0 | P3.2 | 0 | EX0 |
T0 | P3.3 | 1 | ET0 |
INT1 | P3.4 | 2 | EX1 |
T1 | P3.5 | 3 | ET1 |
RI、TI | P3.0 P3.1 | 4 |
2、中断相关寄存器
(1)中断允许控制
EA:中断总开关
(2)中断请求标志 TCON
IT0/IT1=0,电平触发;IT0/IT1=1,下降沿触发
(T0,T1)定时器中断0/1:TF0,TF1 ——中断请求控制位 ET0,ET1——中断允许标志位
(INT0,INT1)外部中断0/1:IT0,IT1——中断请求控制位 EX0,EX1——中断允许标志位
3、外部中断配置
51 单片机发生中断必须要满足以下3个条件
①中断源有中断请求;
②此中断源的中断允许位为 1;
③CPU 开中断(即 EA=1)。
比如我们配置外部中断 0,对应的配置程序如下:
EA=1;//打开总中断开关
EX0=1;//开外部中断 0
IT0=0/1;//设置外部中断的触发方式 0——电平触发 1——下降沿触发
void exti0_init(void)
{
IT0=1;//跳变沿触发方式(下降沿)
EX0=1;//打开 INT0 的中断允许
EA=1;//打开总中断
}
当触发中断后即会进入中断服务函数,外部中断 0 中断服务函数如下:
void exti0() interrupt 0 //外部中断 0 中断函数
{
//执行所需的功能
}
注:interrupt 是一个关键字,表示 51 单片机中断,后面的“0”是中断号
外部中断实验: 使用独立按键 K3 控制D6指示灯亮灭
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
void delay_10us(u16 ten_us){
while(ten_us--);
}
sbit KEY3=P3^2;
sbit LED6=P2^5;//外部中断0的配置函数
void exti0_init(){
EA=1;//打开总开关
EX0=1;//中断允许位 EX0—外部中断0允许位 EX1—外部中断1允许位
IT0=1;//下降沿触发有效
}
void main(){
while(1){
exti0_init();
}
}
//外部中断0的服务函数
void exti0() interrupt 0{
delay_10us(1000); //按键消抖
if(KEY3==0){
LED6=!LED6;
}
}