本章概述思维导图:

51单片机实现外部中断功能
外部中断简介
外部中断是单片机实时处理外部事件的核心机制。当外部设备(如按键、传感器)产生特定信号(电平变化或边沿跳变)时,单片机会暂停当前程序,转去执行对应的中断服务程序(ISR),处理完后再返回原程序继续执行。其核心作用是快速响应外部事件,提升系统实时性和效率。
外部中断触发方式分类
1、电平触发
原理:当外部引脚电平持续满足设定条件(如低电平或高电平)时触发中断。
特点:
响应速度快,但需确保中断服务程序返回前,外部信号恢复无效状态(如低电平变高),否则会重复触发。
适用于需要持续监测电平状态的场景(如低电平有效的紧急停止信号)。
2、边沿触发
原理:当引脚电平发生跳变(上升沿或下降沿)时触发中断。
特点:
通过锁存跳变信号,确保中断请求不会丢失,适合脉冲信号输入。
需满足最小脉冲宽度(如51单片机要求负脉冲宽度≥12个时钟周期)。
适用于按键检测、传感器脉冲捕获等场景。
外部中断配置
配置51外部中断是我们要查看数据手册,查找对应的寄存器位,进行操作。
51单片机外部中断配置步骤:
1、配置中断源触发方式:
TCON寄存器中IT0或IT1位和XICON寄存器中IT2或IT3,写0为低电平触发,写1为下降沿触发
2、配置中断源允许位启用中断:
IE寄存器中EX0或EX1和XICON寄存器中EX2或EX3,写0为禁止外部中断,写1为允许外部中断。
3、开启MCU总中断
IE寄存器中EA位,写0屏蔽所有的中断申请,写1开放总中断。即各中断源首先受EA控制,其次还受各种中断源自己的中断源允许位控制
4、编写中断服务函数
用来编写触发中断所要执行的任务的程序
开启外部中断0代码示例
cpp
#include"reg52.h"
sbit LED=P2^0; //LED连接引脚
void EXIO_init(void)//函数封装:外部中断0配置步骤
{
IT0=1; //设置触发方式为:下降沿触发
EX0=1; //开启外部中断0允许位
EA=1; //开启总中断
}
void Extern_ISR() interrupt 0 //中断服务函数
{
LED=!LED; //触发外部中断0执行LED灯状态切换
}
int main()
{
EXIO_init();
while(1)
{
}
}
外部中断硬件电路原理图分析

如图为LED灯模块电路和独立按键模块电路图,小伙伴们对这两个模块知识点不熟悉的话可以点击蓝色字体进行对应章节学习。本章我们依靠这两个模块实现我们的外部中断学习;
在我们51芯片中P32引脚和P33引脚是可以对应设置为外部中断0和外部中断1功能,在电路图中我们通过K3和K4按键按下实现对LED灯模块的点亮和熄灭;
按键按下P32和P33可检测到低电平说明按键按下。就可设置为下降沿触发外部中断条件。
LED灯的左侧接入高电平,要使LED点亮,右侧P2端口输出低电平,形成电势差。要使LED灯熄灭右侧P2端口输出高电平,电路截止。
小伙伴们在这里会有一个疑问,为什么外部中断触发条件不设置低电平触发,而设置下降沿触发呢?
是因为设置低电平触发:会导致重复触发,按键按下后不松开保持低电平,导致中断服务程序(ISR)被反复调用,引发多次响应(如LED频繁闪烁)。原理:当外部引脚保持低电平时,每次扫描周期都会触发中断。设置下降沿触发:仅在电平变化的瞬间(如下降沿)触发一次中断,无论按键保持按下多久。
外部中断实现软件编程设计
实现外部中断模块步骤:
第一步:进行外部中断的设置,开启外部中断0和外部中断1;
第二步:进行外部中断服务函数的编写,触发外部中断1点亮LED灯,触发外部中断0关闭LED灯;
第三步:主函数的编写
代码示例:
cpp
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
void Delay_10us(u16 us)//延时函数:输入1大概延时时间为10us
{
while(us--);
}
void Delay_ms(u16 ms) //毫秒延时函数:输入1大概延时时间为1ms
{
u16 i,j;
for(i=ms;i>0;i--)
{
for(j=110;j>0;j--)
{
}
}
}
#define LED_Init P2
sbit KEY3=P3^2;
sbit KEY4=P3^3;
void EXTI_KEY3(void) //函数封装:配置外部中断0
{
IT0=1; //配置中断源触发方式:下边沿触发
EX0=1; //配置外部中断0允许外部中断
EA=1; //开启总中断
}
void EXTI_KEY4() //函数封装:配置外部中断1
{
IT1=1; //配置中断源触发方式:下边沿触发
EX1=1; //配置外部中断1允许外部中断
EA=1; //开启总中断
}
void KEY3_JC() interrupt 0 //函数封装:外部中断0服务函数
{
Delay_ms(15); //延时消抖
if(KEY3 == 0) //二次判断
{
LED_Init=0x00; //按键3按下,点亮LED灯
}
}
void KEY4_JC() interrupt 2 //函数封装:外部中断1服务函数
{
Delay_ms(15); //延时消抖
if(KEY4 == 0) //二次判断
{
LED_Init=0xff; //按键4按下,熄灭LED灯
}
}
int main()
{
EXTI_KEY3(); //配置外部中断0
EXTI_KEY4(); //配置外部中断1
while(1)
{
}
}
按键3按下效果展示图:

按键4按下效果展示图:

制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!