【51单片机实验笔记】中断篇(一) 外部中断

目录

  • 前言
  • 中断系统概述
  • 寄存器说明
    • 中断优先级寄存器(IP)
    • 中断允许控制寄存器(IE)
    • 中断请求标志寄存器(TCON)
  • 外部中断配置
  • 软件实现
    • 按键事件的外部中断实现
  • 遇到的问题
  • 总结


前言

中断是单片机非常重要的概念,类似于软件中回调的作用。前面几章我们都是主动驱动元器件工作,但如果单片机需要被动地响应外部的信息时,中断的重要性就凸显出来了。从本章节开始,我们要开始直接操作中断相关的寄存器,由于偏底层,学起来可能没有之前几章那么轻松。


中断系统概述

中断涉及的概念比较多,先阐释如下:

  • 轮询依次询问每一个IO设备,如果检测到需要提供服务,立刻执行服务,再询问下一个设备。
    • 适用场景频繁需要服务的外设
    • 特点
      • 优点:实现简单
      • 缺点:消耗大量CPU资源。慢速的IO交互无需大量频繁的检测
  • 中断:当外部设备需要服务时,CPU接收到中断请求立刻停止当前程序,转而执行中断服务程序,执行结束后,回到原先处继续执行。
    • 适用场景慢速交互的情况
    • 特点
      • 优点实时性高、即刻响应、节约CPU资源
      • 缺点:实现稍复杂
  • 中断源:发生中断的源头传统51单片机中一般至少有5个基础的中断源(按自然优先级排列)。
    • 外部中断0INT0
    • 定时器0中断T0
    • 外部中断1INT1
    • 定时器1中断T1
    • 串口中断UART
  • 中断优先级
    • 自然优先级:当几个中断同时向CPU发出请求,CPU会根据中断自然优先级依次处理。
    • 抢占优先级:当进入某个中断时,发生了优先级更高中断,CPU会打断低优先级中断,转而执行高优先级中断,形成中断嵌套同级不会打断传统51单片机只有2个优先级,设置寄存器IP即可更改默认排序,一般保持默认即可。
  • 中断嵌套:在执行中断服务函数的过程中,有优先级更高中断发生,会暂停当前中断执行,转而执行更高级中断程序。即形成嵌套
  • 中断请求中断源CPU申请中断
  • 中断响应CPU接收到中断请求转去执行中断服务程序的行为。
  • 中断服务程序:由开发者预先定义(关键字interrupt + 中断号),处理相应的中断事件。原则上,不要在中断中写任何阻塞程序,以保证其实时性
  • 中断号:是CPU进入对应中断服务程序重要标志,不同的中断源对应不同的中断号
  • 中断返回:执行完对应中断服务程序后,返回中断点处继续往下执行。
  • 中断点:主函数被中断的地方。
中断源优先级中断请求标志位中断允许标志位中断号
I N T 0 ‾ \overline{INT0} INT00IE0EX0/EA0
T 0 T0 T01TF0ET0/EA1
I N T 1 ‾ \overline{INT1} INT12IE1EX1/EA2
T 1 T1 T13TF1ET1/EA3
U A R T UART UART4RI/TIES/EA4
T 2 T2 T25TF2ET2/EXF2/EA5
I N T 2 ‾ \overline{INT2} INT26IE2EX2/EA6
I N T 3 ‾ \overline{INT3} INT37IE3EX3/EA7

注:T2定时器,外部中断INT2INT3STC89C52RC系列新增外设

以上那么多概念,其实都是很重要的,所以建议大家好好读一读,能对中断系统有一个总体的感知。虽然理论上,上述寄存器都会用到,但也没有必要强行记忆,多写两次,你就会看这些寄存器非常眼熟了,实在记不清也可以来我的博客再回忆一遍哈~

下面对中断系统做一个小结
中断系统主要是解决高速CPU慢速人机交互所造成的CPU资源浪费问题。适用于被动响应场景。试想,对于按键检测,如果将它放在循环里不断检测,人按下按键的过程至少是毫秒级别的,而等待按下的时间更是漫长,而此刻CPU已经循环检测了上万次,这显然是一种无意义的检测。

而这时中断的优势就体现出来了,将按键响应的代码放在中断服务函数里,只有当按键被按下时,才会执行。这样大大节约了CPU的资源。

那么我们怎么去利用中断呢,需要介绍以下几种寄存器


寄存器说明

中断优先级寄存器(IP)

寄存器76543210
IP--PT2PSPT1PX1PT0PX0
  • 中断优先级寄存器(IP)控制中断的抢占优先级。字节地址B8H
    • PX0:外部中断INT0中断优先级控制位,置1为高优先级,置0为低优先级。
    • PT0:外部定时器T0中断优先级控制位
    • PX1:外部中断INT1中断优先级控制位
    • PT1:外部定时器T1中断优先级控制位
    • PS串口中断优先级控制位
    • PT2:外部定时器T2中断优先级控制位(新增)

注:STC89C52单片机可以通过配置 IP寄存器IPH寄存器实现4个抢占优先级。详见芯片手册,本文不做介绍。


中断允许控制寄存器(IE)

寄存器76543210
IEEA-ET2ESET1EX1ET0EX0
  • 中断允许控制寄存器(IE)控制中断的使能开关。字节地址A8H
    • EX0:外部中断INT0允许位,置1(高)开,置0(低)关。
    • ET0:外部定时器T0允许位
    • EX1:外部中断INT1允许位
    • ET1:外部定时器T1允许位
    • ES串口中断允许位
    • ET2:外部定时器T2允许位(新增)
    • EA关总中断允许位,是控制所有中断使能的总开关。

中断请求标志寄存器(TCON)

寄存器76543210
TCONTF1TR1TF0TR0IE1IT1IE0IT0
  • 中断请求标志寄存器(TCON)设置中断的发生方式。字节地址88H
    • IT0:外部中断INT0触发方式控制位,置0为低电平触发,置1为下降沿触发(常用
    • IE0:外部中断INT0请求标志位,发生中断请求时,由硬件自动置1,响应后自动置0
    • IT1: 外部中断INT1触发方式控制位
    • IE1:外部中断INT1请求标志位
    • TR0:定时器T0运行控制位置1为开始运行,置0停止运行。
    • TF0:定时器T0溢出中断请求标志位,发生溢出中断请求时,硬件自动置1,响应后自动置0
    • TR1:定时器T1运行控制位
    • TF1:定时器T1溢出中断请求标志位

外部中断配置

STM32系列单片机每个引脚都可以配置中断,而传统的51单片机只有2个引脚外部中断STC89C52单片机共有4个外部中断引脚,分别为P3.2–INT0、P3.3–INT1、P4.3–INT2、P4.2–INT3,其中,外部中断2和3的配置还需要用到XICON寄存器)。

了解了上述3个寄存器之后,配置引脚外部中断其实很简单。具体配置流程如下(以INT0为例):

  1. 设置外部中断触发方式为下降沿触发 IT0 = 1;
  2. 使能外部中断 EX0 = 1;
  3. 打开关总中断 EA = 1;

软件实现

按键事件的外部中断实现

实验现象为,按下第四个独立按键P3.3),第一个LEDP2.0亮灭翻转

delay.h

#ifndef _DELAY_H_
#define _DELAY_H_#include <REGX52.H>#define false 0
#define true 1typedef unsigned char u8;
typedef unsigned int u16;void delay_10us(u16);
void delay_ms(u16);#endif

delay.c

#include "delay.h"
/** **  @brief    通用函数**  @author   QIU**  @data     2023.08.23**//*-------------------------------------------------------------------*//****  @brief   延时函数(10us)**  @param   t:0~65535,循环一次约10us**  @retval  无**/
void delay_10us(u16 t){while(t--);
}/****  @brief   延时函数(ms)**  @param   t:0~65535,单位ms**  @retval  无**/
void delay_ms(u16 t){while(t--){delay_10us(100);}
}

interrupt.h

#ifndef __INTERRUPT_H__
#define __INTERRUPT_H__#include "delay.h"void INT0_init();
void INT1_init();#endif

interrupt.c

#include "interrupt.h"
/** **  @brief    外部中断封装**  @author   QIU**  @data     2023.08.23**//*-------------------------------------------------------------------*//****  @brief   配置外部中断0**  @param   无**  @retval  无**/
void INT0_init(){IT0 = 1; // 设置外部中断0触发方式,下降沿触发EX0 = 1; // 使能外部中断0EA = 1;  // 使能总中断
}/****  @brief   配置外部中断1**  @param   无**  @retval  无**/
void INT1_init(){IT1 = 1; // 设置外部中断1触发方式,下降沿触发EX1 = 1; // 使能外部中断1EA = 1;  // 使能总中断
}// 外部中断0的中断服务程序模板
//void INT1_serve() interrupt 0{
//	;
//}// 外部中断1的中断服务程序模板
//void INT1_serve() interrupt 2{
//	;
//}

main.c

#include "delay.h"
#include "interrupt.h"
/** **  @brief    以外部中断方式响应按键事件**  @author   QIU**  @data     2023.08.31**//*-------------------------------------------------------------------*/// 定义引脚
sbit btn4 = P3^3;
sbit LED1 = P2^0;void main(){INT1_init();while(1);
}void INT1_serve() interrupt 2{if(btn4 == 0){delay_ms(10);// 按下消抖if(btn4 == 0){LED1 = !LED1;	}}
}

本例简单演示了如何使能外部中断,其意义在于,将慢速的按键响应放在中断中而非主程序中检测处理,这显然比轮询方法更加高效,节约了CPU的资源。

但与此同时,我们知道,中断服务程序中不宜处理耗时的程序,这也是本例存在的缺陷,仅仅使用外部中断不能完美解决按键检测的问题,因为按键存在抖动这一客观事实。在下一个章节,我们将使用定时器完成按键消抖。它比延时函数更加优雅,且进一步提升由于延时所消耗的性能


遇到的问题

  • 如果使能中断就必须书写中断服务程序,并正确书写中断号。否则程序进入中断卡死
  • 开发板上P3.2引脚外部中断INT0,除了接独立按键,还接了红外接收装置,可能会产生串扰。建议查看开发板原理图

总结

外部中断使得CPU可以免于无谓等待的消耗,从而集中处理更加重要事情上。单片机的性能得以充分利用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/71034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2021江苏省赛热身赛 C Magic Rabbit(数形结合)

2021江苏省赛热身赛 C Magic Rabbit(数形结合) Magic Rabbit 非常好且巧妙地一道题。 大意&#xff1a;给出三种溶液 &#xff0c; 三种溶液分别含有不同浓度的 x &#xff0c;y 两种物质。 溶液x (mg/ml)y (mg/ml)溶液1x1y1溶液2x2y2溶液3x3y3 给出 Q 组询问 &#xff0c…

MySQL 8.0.34安装教程

一、下载MySQL 1.官网下载 MySQL官网下载地址&#xff1a; MySQL :: MySQL Downloads &#xff0c;选择下载社区版&#xff08;平时项目开发足够了&#xff09; 2.点击下载MySQL Installer for Windows 3.选择版本8.0.34&#xff0c;并根据自己需求&#xff0c;选择下载全社区安…

flutter报错-cmdline-tools component is missing

安装完androidsdk和android studio后&#xff0c;打开控制台&#xff0c;出现错误 解决办法 找到自己安装android sdk的位置&#xff0c;然后安装上&#xff0c;并将下面的勾选上 再次运行 flutter doctor 不报错&#xff0c;出现以下画面 Doctor summary (to see all det…

WebSocket的那些事(5-Spring中STOMP连接外部消息代理)

目录 一、序言二、开启RabbitMQ外部消息代理三、代码示例1、Maven依赖项2、相关实体3、自定义用户认证拦截器4、Websocket外部消息代理配置5、ChatController6、前端页面chat.html 四、测试示例1、群聊、私聊、后台定时推送测试2、登录RabbitMQ控制台查看队列信息 五、结语 一、…

超图嵌入论文阅读2:超图神经网络

超图嵌入论文阅读2&#xff1a;超图神经网络 原文&#xff1a;Hypergraph Neural Networks ——AAAI2019&#xff08;CCF-A&#xff09; 源码&#xff1a;https://github.com/iMoonLab/HGNN 500star 概述 贡献&#xff1a;用于数据表示学习的超图神经网络 (HGNN) 框架&#xf…

【高阶数据结构】红黑树 {概念及性质;红黑树的结构;红黑树的实现;红黑树插入操作详细解释;红黑树的验证}

红黑树 一、红黑树的概念 红黑树&#xff08;Red Black Tree&#xff09; 是一种自平衡二叉查找树&#xff0c;在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有…

旅游APP外包开发注意事项

旅游类APP通常具有多种功能&#xff0c;以提供给用户更好的旅行体验。以下分享常见的旅游类APP功能以及在开发和使用这些APP时需要注意的问题&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 常见功能…

八大排序算法----堆排序

堆排序的基本步骤&#xff1a;&#xff08;以从大到小的顺序排序为例&#xff09; 1.构建大顶堆&#xff08;每个结点的值都大于或等于其左右孩子结点的值&#xff09; 2.排序&#xff1a;每次堆顶的元素取出来&#xff08;整个堆中值最大&#xff09;&#xff0c;与最后一个…

drf之--认证组件、权限组件(django项目国际化)、频率组件、排序

视图集回顾 # 1 9 个视图子类-GenericAPIView5个视图扩展类的组合-ListAPIView,CreateAPIView,DestroyAPIView,RetrieveAPIView,UpdateAPIView-ListCreateAPIView-RetrieveDestroyAPIView,RetrieveUpdateAPIView,RetrieveUpdateDestroyAPIView-class TestView(ListAPIView):qu…

数学建模圈养湖羊的空间利用率

数学建模圈养湖羊的空间利用率 问题&#xff1a;规模化的圈养养殖场通常根据牲畜的性别和生长阶段分群饲养&#xff0c;适应不同种类、不同阶段的牲畜对空间的不同要求&#xff0c;以保障牲畜安全和健康&#xff1b;与此同时&#xff0c;也要尽量减少空间闲置所造成的资源浪费…

Code Inspector:点击页面元素自动定位到代码

Code Inspector是一个开发提效的神器 点击页面上的 DOM 元素&#xff0c;它能自动打开 IDE 并定位到 DOM 对应源代码位置 文档 https://inspector.fe-dev.cn/https://github.com/zh-lx/code-inspector 目录 1、安装2、配置2.1、webpack2.2、vue2.3、vite 3、使用 1、安装 n…

入栏需看——学习记忆

记忆方法千千种&#xff0c;本栏意在梳理其中道道来&#xff0c;旦有小得&#xff0c;肥肠幸耶。从不同角度分析学习记忆。 逻辑篇 有逻辑 用思维导图 思维导图记忆有逻辑的文本/内容 理论 巧记书本结构–思维导图 模仿 HCIE-Cloud Computing LAB备考第一步&#xff1a…

Python基于Mirai开发的QQ机器人保姆式教程(亲测可用)

在本教程中&#xff0c;我们将使用Python和Mirai来开发一个QQ机器人&#xff0c;本文提供了三个教学视频&#xff0c;包教包会&#xff0c;本文也很贴心贴了代码和相关文件。话不多说&#xff0c;直接开始教学。 目录 一、安装配置MIrai 图片验证码报错&#xff1a; 二、机器…

vue-cli中总提示组件没有正确注册

这里写目录标题 一、报错提示二、修改办法 一、报错提示 二、修改办法 <template><div><aside-component style"width: 15%"></aside-component></div> </template><script> import AsideComponent from /components/Asi…

【学习方法论】学习的三种境界、三种习惯、三个要点,三个心态

学习的三种境界、三种习惯、三个要点&#xff0c;三个心态 三种学习境界 苦学 古人云&#xff1a;“头悬梁、锥刺股”&#xff0c;勤学苦练是第一境界。处于这种层次的同学&#xff0c;觉得学习枯燥无味&#xff0c;对他们来说学习是一种被迫行为&#xff0c;体会不到学习中的…

NATAPP使用详细教程(免费隧道内网映射)

NATAPP - https://natapp.cn/tunnel/lists NATAPP 在开发时可能会有将自己开发的机器上的应用提供到公网上进行访问&#xff0c;但是并不想通过注册域名、搭建服务器&#xff1b;由此可以使用natapp&#xff08;内网穿透&#xff09; 购买免费隧道 修改隧道配置 看自己的web…

JAVA毕业设计096—基于Java+Springboot+Vue的在线教育系统(源码+数据库+18000字论文)

基于JavaSpringbootVue的在线教育系统(源码数据库18000字论文)096 一、系统介绍 本系统前后端分离 本系统分为管理员、用户两种角色(管理员角色权限可自行分配) 用户功能&#xff1a; 注册、登录、课程预告、在线课程观看、学习资料下载、学习文章预览、个人信息管理、消息…

【计算机视觉项目实战】中文场景识别

✨专栏介绍&#xff1a; 经过几个月的精心筹备&#xff0c;本作者推出全新系列《深入浅出OCR》专栏&#xff0c;对标最全OCR教程&#xff0c;具体章节如导图所示&#xff0c;将分别从OCR技术发展、方向、概念、算法、论文、数据集等各种角度展开详细介绍。 &#x1f468;‍&…

【Two Stream network (Tsn)】(二) 阅读笔记

贡献 将深度神经网络应用于视频动作识别的难点&#xff0c;是如何同时利用好静止图像上的 appearance information以及物体之间的运动信息motion information。本文主要有三点贡献&#xff1a; 1.提出了一种融合时间流和空间流的双流网络&#xff1b; 2.证明了直接在光流上训…

【C++精华铺】10.STL string模拟实现

1. 序言 STL&#xff08;标准模板库&#xff09;是一个C标准库&#xff0c;其中包括一些通用的算法、容器和函数对象。STL的容器是C STL库的重要组成部分&#xff0c;它们提供了一种方便的方式来管理同类型的对象。其中&#xff0c;STLstring是一种常用的字符串类型。 STLstrin…