当前位置: 首页 > news >正文

51单片机-实现外部中断模块教程

本章概述思维导图:

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代码示例

#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灯;

第三步:主函数的编写

代码示例:

#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();			 //配置外部中断0EXTI_KEY4();			 //配置外部中断1while(1){}
}

按键3按下效果展示图:

按键4按下效果展示图:


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

http://www.dtcms.com/a/347403.html

相关文章:

  • 力扣hot100 | 图论 | 200. 岛屿数量、994. 腐烂的橘子、207. 课程表、208. 实现 Trie (前缀树)
  • 【数据分享】2025年全国路网矢量数据道路shp数据
  • Ubuntu 系统中解压 ZIP 文件可以通过图形界面或命令行操作
  • 【设计模式08】组合模式
  • LLaMA-Factory 中配置文件或命令行里各个参数的含义
  • 深度集成Dify API:基于Vue 3的智能对话前端解决方案
  • Maven仓库与Maven私服架构
  • Vue 3 useModel vs defineModel:选择正确的双向绑定方案
  • 自然语言处理——05 Transformer架构和手写实现
  • 微前端架构核心要点对比
  • 小区物业对大楼顶面的巡查通常是定期巡查+特殊情况下的临时巡查相结合
  • 认识模块化及常见考点
  • 【秋招笔试】2025.08.23京东秋招笔试题
  • onnx入门教程(二)—— PyTorch 转 ONNX 详解
  • C#多线程同步利器:Monitor全解析
  • 安卓10.0系统修改定制化____如何修改固件 去除开机后默认的屏幕锁定
  • AcWing 114. 【0x07】国王游戏
  • C代码学习笔记(一)
  • Windows打开命令窗口的几种方式
  • 使用 PSRP 通过 SSH 建立 WinRM 隧道
  • 注意力机制中为什么q与k^T相乘是注意力分数
  • 每日定投40刀BTC(22)20250802 - 20250823
  • 编程刷题-染色题DFS
  • 03_数据结构
  • 在 CentOS 7 上搭建 OpenTenBase 集群:从源码到生产环境的全流程指南
  • MSPM0G3507工程模板创建
  • 微信小程序自定义组件开发(上):从创建到数据通信详解(五)
  • 纠删码技术,更省钱的分布式系统的可靠性技术
  • 使用springboot开发-AI智能体平台管理系统,统一管理各个平台的智能体并让智能体和AI语音设备通信,做一个属于自己的小艾同学~
  • Dubbo vs Feign