当前位置: 首页 > 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.xdnf.cn/news/1355257.html

相关文章:

  • SpringBoot3整合dubbo3客户端【最佳实践】
  • 编程刷题-染色题DFS
  • 【C标准库】详解<stdio.h>标准输入输出库
  • CUDA和torch的安装
  • 什么是多元线性回归,系数、自变量、因变量是什么,多元线性回归中的线性是什么
  • 多光谱相机检测石油石化行业的跑冒滴漏的可行性分析
  • 【yocto】Yocto Project 配置层(.conf)文件语法详解
  • calchash.exe和chckhash.exe计算pe文件hash值的两个实用小工具
  • 智慧零售漏扫率↓79%!陌讯多模态融合算法在智能收银与货架管理的实战解析
  • 双目密集匹配(stereo dense matching)
  • stack,queue以及deque的介绍
  • 深度学习中主流激活函数的数学原理与PyTorch实现综述
  • 【字母异位分组】
  • 随机森林1
  • 【机器学习深度学习】多模态学习
  • 【GaussDB】使用MySQL客户端连接到GaussDB的M-Compatibility数据库
  • 【85页PPT】数字化转型LIMS大型企业智能制造之LIMS实验室管理系统产品解决方案(附下载方式)
  • MVC模式在个人博客系统中的应用
  • 简单介绍计算机的工作过程
  • 激光雷达工作原理
  • 算法训练营day59 图论⑨ dijkstra(堆优化版)精讲、Bellman_ford 算法精讲
  • C++初阶(2)C++入门基础1
  • 第1篇:走进日志框架的世界 - 从HelloWorld到企业级应用
  • 为什么在WHERE子句里使用函数,会让索引失效
  • 复杂工业场景误报率↓85%!陌讯多模态火焰识别算法实战解析
  • Codeforces Round 1043 (Div. 3)(A-E)
  • 历史数据分析——半导体
  • 【科研绘图系列】浮游植物的溶解性有机碳与初级生产力的关系
  • 【Game】Powerful——Punch and Kick(12.2)
  • ComfyUI Portrait Master肖像大师中文版