【MCS-51】中断系统原理及应用

news2024/11/25 3:05:03

中断是单片机中一个十分重要的功能,它的出现能够让我们的单片机在顺序执行命令时,具备应对特殊情况的能力。

目录

🌙通信方式

🍃无条件传送

🍃有条件传送

🍃DMA通信

🍃中断传送

🌊中断系统结构

🍈中断类型

🍈中断入口

🍈中断寄存器

🍎中断处理过程

🐱应用案例


🌙通信方式

在我们学习中断之前,我们需要去了解一下数据在51单片机两个通信端之间通信的方式,通信的方式分为4类。

🍃无条件传送

所谓无条件信息传输就是指信息的发送端不会照顾信息的接收端,差不多就是:我只负责发送,你能不能收到不归我管,就算你收不到和我也无关,反正我的工作完成了。这种传送方式不需要检查通信双方的状态,直接利用访问指令就可以实现通信,类似于UDP协议,这种通信方式最简单最快捷。

🍃有条件传送

而有条件传输与无条件相反,它会在通信的时候检查接收端的状态以保证信息的正确性。它在发送信息前会向接收端发送检查信息询问接收端是否已经开启可接收状态。发送端只有在确定接收端可以后才发送数据。

🍃DMA通信

DMA是在单片机和外设进行信息传输的一种特殊方式,当选择DMA通信时,CPU会让出数据总线,让外设的数据直接和存储器进行连接,这样就跳过了CPU这个中介。这种情况只符合于外设的运行速度很快,并且需要大量的数据传输的情况下。

🍃中断传送

接下来就是大头:中断传送。当CPU按顺序将我们存储器内的程序执行时,如果外部的某个特定的事件发生,并且向CPU发送处理请求,那么CPU会停下当前的工作而转而去处理某个指令,当处理完后CPU会继续回去之前跳转的地方继续按顺序执行,这个外部的请求就是中断请求。这种跳跃到外部处理事件的方式就被称为中断响应。

并且中断也会进行分类,不然的话会造成不必要的麻烦。例如我们有2个中断源,在某一个时刻它们都被同时触发了,那么系统会选择去执行哪一个呢?这是一个不可避免的问题。为了解决这个问题,51单片机系统给中断进行了分类,按照重要性分好类(有高级的中断和低级的中断),当主程序运行时,高级中断和低级中断同时触发,那么优先响应高级中断。而当高级中断和高级中断都被触发,那么按照中断优先权来决定,具体的优先级顺序如下:

优先权顺序:\overline{INT0}、T0、\overline{INT1}、T1、串行口

同时如果在我们处理低级中断的时候有一个高级中断被触发,那么我们会停下当前的中断程序而去执行高级中断程序的内容;不同的是,如果高级中断响应程序执行时,有低级中断被触发那么就不会去执行低级中断;但是中断不会打断之前同优先级的中断,这就体现出中断的优先级问题。

⭐中断响应和转进子程序的差异

既然中断响应和转进子程序都是从主程序跳转到某一个响应程序中执行的动作,那么他们之间有什么不同呢?中断响应是未知的,就是我们不知道中断何时会发生,何时会到来,而子程序跳转是定死的,我们设定主程序走到这一步后就会跳进子程序。所以两者的意义差异是巨大的。

🌊中断系统结构

🍈中断类型

在我们考虑中断结构之前,我们先来看看有什么东西可以触发中断。单片机统计起来总共有5个中断源,包括2个外部中断3个内部中断

首先是外部的输入;AT89C51芯片有两个引脚\overline{INT0}(P3.2)、\overline{INT1}(P3.3),这两个引脚是中断输入的引脚,当从该引脚输入的外部的信号发生某种特定的变化时就会触发中断。而这种特殊的变化是低电平或则下降沿,至于是哪一种则是由TCON特殊寄存器里面的ITx决定。

其次是内部的中断触发;内部的中断触发有定时器Tx两个和串行IO口中断一个。其中定时器中断则是定时器计数溢出后引起的,而串行IO口中断则是完成字符的传输后引起的。

🍈中断入口

但是又有问题了,中断响应后系统怎么知道将要执行的中断响应程序在哪里呢?其实中断响应后系统会进入的程序的首地址会被放到中断入口那里。即一旦响应中断就会转入到固定的入口地址。

不同的中断对应不同的入口地址:

中断源入口地址
外部中断00003H
定时器T0中断000BH
外部中断1

0013H

定时器T1中断001BH
串行口中断0023H

我们可以直接将中断响应程序写在这里,但是这几个地方都比较相近,所以我们一般选择在这里放一个跳转指令,然后再跳转到某个地方去执行。内容管理

🍈中断寄存器

8051中和中断有关的特殊功能寄存器有3-4个。其中包括定时器和外部中断发送中断请求的TCON,还有进行串行发送中断的控制寄存器SCON。以及终端开启寄存器IE、设置中断优先级寄存器IP。我们来仔细看一下这几个寄存器和这几个寄存器中比较重要的几个位以及它们的名称(下图来自老师课件)

🍉TCON寄存器

我们看前面知道TCON寄存器还用于定时器中设置溢出标志位,在前一篇定时器中我们说过留着后面的4位用于中断用。现在我们就来看看这几个中断位是怎么使用的:

TCON寄存器只用于定时器和外部中断标志位的设置,其中定时器0、1的中断标志位就是TF0和TF1,当T1计数溢出就让TF1=1、T0计数溢出就TF0=1

而外部中断\overline{INT0}\overline{INT1}的标志位就是IE0和IE1。也就是说TCON寄存器里面的TF0、TF1、IE0和IE14个位分别就用于设置5个中断源里面4个的标志位,4个中一旦有一个中断被触发,它所对应的标志位就会被置1。

而IT0和IT1就是用于设置\overline{INT0}\overline{INT1}的中断触发方式,因为只有外部中断才分下降沿触发或者低电平触发,而内部中断一般都由下降沿触发。相对应的,当T1=1是下降沿触发而当T1=0低电平触发,而采集方式依旧是CPU在每个机器周期的S5P2期间采集。(我们常用的是下降沿触发方式,因为电平触发如果一直是低电平会导致一直中断被检测到开启)

🍉SCON寄存器

而SCON寄存器是常用于设置串口所触发的中断,其中就是设置RI和TI位来表示中断的状态。接收完毕一个串行帧,则RI置1,当发送完毕一个串行帧,则TI置1

🍉IE寄存器

注意这里是IE寄存器而不是IE位!!之前我们提到的IE位是TCON里面的设置\overline{INTx}的标志位,而这里的IE是一个寄存器。

该寄存器有8位,其中比较常用到的激素D7、D4、D3、D2、D1和D0位,该寄存器的作用是控制CPU对总的中断源的开关以及对单个中断源的开关。

EA表示CPU对5个中断源是否开启;

EXx表示对外部输入中断\overline{INTx}是否开启;

ETx表示对内部定时器中断是否开启;

ES表示对串口中断是否开启。

而我们要想开启一个中断源,需要设置两层数值,一层是总的中断EA要开启,另一层是我们选择要使用的中断源要开启。

🍉IP寄存器

除了上面的寄存器外,还有一个IP寄存器,该寄存器用于设置我们的中断的优先级,既然是用来设置中断的优先级,那自然是由5个控制位(5个中断源),实际上也是,该寄存器有5位用于设置中断的优先级,并且所有设置为1的位对应的中断优先级最高,而设置为0的位中断优先级最低。

寄存器中PS位控制串行口的中断优先级;

PTx位控制定时器Tx的中断优先级;

PXx位控制外部中断的优先级。

上面我们所设置的这些中断优先级将决定当大量中断来临时我们选择使用哪个中断。

🍎中断处理过程

说了中断的原理和结构,下面我们来看看有一个中断来了后单片机是如何处理的:

🍒首先是外部输入信号变化或者内部定时器溢出等导致中断源发出中断请求,然后该中断源对应的中断标志位将会被置为1(如T0就是TF0、\overline{INT0}就是IE0)

🍒然后CPU查询到有中断标志位后,不会立即触发中断响应,而是需要查询是否满足:

①首先检查中断是否开启,IE寄存器对应的EA和相应位是否开启;

②然后再检验是否有比此时响应的中断更高级的中断正在执行;

③其次再检查CPU此时是否是上一个指令的最后一个机器周期;

④最后再检查是否没有在执行RETI或者一些访问IE和IP的指令。

只有满足了上面的所有条件才会触发中断响应。

🍒中断响应时主程序会停止执行,首先保留断点(即跳出点)的位置,然后再撤销掉该中断的响应标志位(说明我们现在开始响应中断,如果不认为撤销该位,那么将会一直引起中断。但是对于像定时器和外部下降杨这类触发的中断,那么就不需要软件清零,因为它会硬件自动清零,而对于串行导致的中断则需要软件清除),再关闭和它一个等级的中断,最后再将相应中断源的入口发送给PC,让它下一条执行该位置,所以系统会跳到中断服务程序的地方,然后再执行中断服务函数。

🍒最后当中断服务函数执行完后,将会有一条RETI的指令帮助我们跳回原来的断点,程序接下来将会沿着原本跳出来的断点继续往下执行,同时开启其它的中断源的中断请求。

🐱应用案例

下面举一个比较常用的定时器触发中断的案例:

我们用定时器1的工作模式1设置一个定时50ms的定时器,再设置一个50ms定时触发的中断,单片机的晶振是12MHz。

测试电路:

 测试代码:

	ORG 00H
	LJMP MAIN
	ORG 001BH
	AJMP INT_1
	ORG 30H			
MAIN:
	MOV TMOD, #10H
	MOV TL1, #0B0H
	MOV TH1, #03CH
	SETB TR1
	SETB ET1
	SETB EA
LOOP:
	LJMP LOOP
INT_1:
	PUSH ACC
	PUSH PSW
	MOV TL1, #0B0H
	MOV TH1, #03CH
	CPL P2.2
	POP ACC
	POP PSW
	RETI
END

测试结果: 


参考资料:

老师上课的课件

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

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

相关文章

python计算程序开始、结束以及运行的时间

python 计算程序运行的耗时,主要有三种方法: time.time() 、 time.perf_counter() 和 datetime.datetime.now()方法 使用方法如下: 1. time.time() import time start time.time() # 程序开始时间,单位为秒 print("start_time:&…

C++ [STL之list的使用]

本文已收录至《C语言和高级数据结构》专栏! 作者:ARMCSKGT 前言 vector是一片连续的空间,在数据访问上性能较好,但是任意位置插入删除性能较低,头插头删性能亦是如此;此时在这种需要频繁插入的场景下&…

PCL计算法向量结果不对的问题

一、点云(高程渲染。CC计算的法向量,Z分量渲染) 高程渲染 法向量Z分量的绝对值渲染 二、PCL计算法向量 下面是PCL计算法向量的代码(点类型自己设置的) 计算出的法向量有正有负 void pclNormalEstimation(pcl::Point…

【C++】构造函数初始化列表的特性以及注意事项

文章目录 一、1.1构造函数体赋值:二、 初始化列表2.1初始化基本形式,注意:3. 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。4. 成员变量…

JavaScript教程(二)

BOM浏览器对象模型 什么是BOM BOM(Browser Object Model)即浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是 window;BOM由一系列相关的对象构成,并且每个对象都提供了很多方…

deepfloyd/IF

Stable Diffusion团队放大招!新绘画模型直出AI海报,实现像素级图像生成AI画文字终于能画对了https://mp.weixin.qq.com/s/_pwBD4-wLA9zNHBpD6WdNgDeepFloyd IF — DeepFloydhttps://deepfloyd.ai/deepfloyd-ifhttps://colab.research.google.com/#scroll…

微服务开发系列 第八篇:Elasticsearch

总概 A、技术栈 开发语言:Java 1.8数据库:MySQL、Redis、MongoDB、Elasticsearch微服务框架:Spring Cloud Alibaba微服务网关:Spring Cloud Gateway服务注册和配置中心:Nacos分布式事务:Seata链路追踪框架…

gradle快速入门

1.Gradle 入门 1.1 Gradle 简介 Gradle 是一款Google 推出的基于JVM、通用灵活的项目构建工具,支持Maven,JCenter 多种第三方仓库;支持传递性依赖管理、废弃了繁杂的xml 文件,转而使用简洁的、支持多种语言(例如:java、groovy 等…

如何成功申请计算机软件著作权【申请流程完整记录】

致谢 :此博文的编写包括软著的申请,均借鉴了大佬【万里守约】的博客,很幸运一次性通过 — 提示:此博文仅适合个人申请,因为我是自己一个人的项目,自己一个人申请软著 文章目录 前言:一、网站注册…

HCIA-RSTP,MSTP

目录 STP的不足 RSTP对STP的改进 1,配置BPDU的处理发生变化: 2,配置BPDU的格式发生变化,充分利用STP的flag字段,明确接口角色。 3,RSTP拓扑处理: 端口角色: MSTP(多…

Inline HOOK

一、Inline HOOK介绍 1、内联钩子简介 Inline hook(内联钩子)是一种在程序运行时修改函数执行流程的技术。它通过修改函数的原始代码,将目标函数的执行路径重定向到自定义的代码段,从而实现对目标函数的拦截和修改。 内联钩子通…

Flume学习笔记

1 简介 (1) Apache Flume是一个分布式、可信任的数据采集、日志收集弹性系统(框架),用于高效收集、汇聚和移动大规模日志信息从多种不同的数据源到一个集中的数据存储中心(HDFS、Hbase或者本地文件系统) (2) 可信任是指保证消息有效的处理和传递: 如果…

聊聊Go语言的控制语句

在高级编程语言中,控制流语句(control-flow statement)是一类用于控制程序执行流程的语句,以下简称为控制语句。它们可以根据条件或循环执行相应的代码块,或者跳转到指定位置执行代码。 常见的控制语句包括: 条件语句:…

【特征选择】基于二进制粒子群算法的特征选择方法(GRNN广义回归神经网络分类)【Matlab代码#32】

文章目录 【可更换其他算法,获取资源请见文章第6节:资源获取】1. 特征选择问题2. 二进制粒子群算法3. 广义回归神经网络(GRNN)分类4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法,获取资源请见文章第6节…

2023年Github学生包认证,提取JetBrains全家桶,认证Copilot 等多种权益

什么是GIthub学生包 1 Github学生包简而言之是可以白嫖100美刀的微软Azure(每年),200美刀的DigitalOcean金额(一年有效期)总计300刀可用来购买云服务器。 2 一年免费的.tech .me .live三种顶级域名(可以分…

Kubernetes 云原生 Gateway 网关

一、云原生定义 CNCF 对云原生的定义中提到了几个关键的点: 1、强调应用环境的动态性,像公有云、私有云、混合云等新型的动态环境已成为大多数应用的首选; 2、强调在跨多云部署应用时具备非云平台绑定的属性; 3、还强调了弹性扩展…

Python系列模块之标准库shutil详解

感谢点赞和关注 ,每天进步一点点!加油! 目录 一、shutil介绍 二 、使用详解 2.1 复制函数 2.1.1 shutil.copy 2.1.2 shutil.copy2 2.1.3 shutil.copyfile 2.1.4 shutil.copytree 2.2 移动文件 2.2.1 shutil.move 2.3 删除文件 2.3…

Vue-后台管理项目001---侧边栏

从浏览器上可以看出,他的返回值是promise(pending),所以我们可以用async,await来简化这个操作 await只能用在被async修饰的方法中,需要把仅挨着await的方法修饰成async 需要把仅挨着await的方法修饰成异步的async现在可以将这个da…

1-1 统计数字问题

题目: 我的答案: 一、信息 二、分析 1.如何选择数据结构? 2.如何选择算法有很多思路? 3.如何用文件实现输入输出? 三、思考 疑问1 我选择了一开始数组选择使用数组是一个不错的选择,尤其在这个问题中…

【网络协议详解】——DHCP系统协议(学习笔记)

目录 🕒 1. DHCP概述🕒 2. 工作过程🕒 3. DHCP的报文格式🕒 4. DHCP中继代理🕒 5. 实验:DHCP配置 🕒 1. DHCP概述 动态主机配置协议DHCP(Dynamic Host Configuration Protocol&…