第5章 单片机的中断系统

5.1 中断的概念

5.2 中断控制系统

5.3 中断处理过程

5.4 中断的编程及应用举例

5.1 中断的概念

日常生活的中断现象举例

中断是指在突发事件到来时先中止当前正在进行的工作,转而去处理突发事件。待处理完成后,再返回到原先被中止的工作处,继续进行随后的工作。

中断的一般概念

中断响应过程:由中断管理系统处理突发事件的过程;

中断源:中断管理系统能够处理的突发事件;

中断请求:中断源向CPU提出的处理请求;

中断函数:针对中断源和中断请求提供的服务函数;

中断嵌套:在中断服务过程中执行

更高级别的中断服务。

中断过程与调用一般函数过程的相似性:

        两者都需要保护断点,都可实现多级嵌套等。

中断过程与调用一般函数过程的差异性:

1、前者是程序设计者事先安排的(断点位置是明确的),而后者却是系统根据工作环境随机决定的(断点位置是随机的)。

2、主函数与一般函数之间具有主从关系,而主函数与中断函数之间则是平行关系(中断函数只能被系统调用);

3、一般函数调用是纯粹软件处理过程,而中断函数调用却是需要软、硬件配合才能完成的过程。

中断能实现的功能:

1分时操作CPU可以使多个外设同时工作,并分时为各外设提供服务,从而大大提高了CPU的利用率和输入/输出的速度。

2实时处理:当计算机用于实时控制时,请求CPU提供服务是随机发生的。有了中断系统,CPU就可以立即响应并加以处理。

3故障处理:当计算机运行中出现如电源断电、存储器校验出错、运算溢出等错误时,CPU可及时转去执行故障处理程序,减小或消除故障产生的影响。

在计算机与外部设备交换信息时,存在高速的CPU和低速的外设之间的矛盾。为了保证CPU送来的数据不至于丢失,可以采取两种办法:查询方式和中断方式。

中断法编程的思路:

让系统在后台等待被测源P3.2的状态变化,一旦有变就中止主函数的任务,转而执行P2.0的输出。

程序由主函数和中断函数组成,中断函数int0_srv( )完成p2_0电平翻转作用,主函数中的while(1)语句则模拟任意任务的语句。

主函数中没有检测语句,不会消耗主函数的机时,可提高检测效率。

疑问

1、中断函数为何能自动执行?

2、主函数中变量赋值语句的作用?

答案

1P3.2的负脉冲信号是约定的中断源信息,可硬件激活中断响应;

2、中断系统的相关初始化工作。

5.2 中断控制系统

 5.2.1 中断系统的结构

1、中断源(哪些信号可以作为51单片机中断源?)

中断源数量和种类越多,MCU处理突发事件的能力就越强。

80C51单片机共有5种中断源。

  1. 中断事件出现后,系统将调用与该中断源相对应的中断函数进行中断处理。
  2. 汇编语言中规定了5个特殊的ROM单元用于引导中断程序的调用,这些单元的地址称为中断向量。
  3. 汇编编程时,需要在此单元处放置一条指向中断程序入口地址的跳转语句,以便引导中断程序的执行。
  4. 对于C51语言,调用中断函数时不用中断向量,而要用到与中断源相应的中断号。
  5. 80C51的中断源、中断向量及中断号的对应关系如下表所示。

2、中断请求标志(单片机如何得知中断信号出现?)

当中断信号出现时,单片机中某些寄存器位(中断请求标志位)可被硬件置1

CPU通过定期查看中断请求标志位是否为1,便可知道有无中断请求出现。

中断请求标志的置1原理

5.2.2 中断控制

中断系统的组成(影响中断的因素?)

中断信号分别沿5条水平路径由左向右进行传送。

其中,TCONSCONIEIP是相关SFR

1TCON寄存器

定时/计数器的控制寄存器Timer/Counter Control Register字节地址为88H可位寻址

2SCON寄存器

串口控制寄存器(Serial control register),字节地址为98H,可位寻址。

注意TIRI虽然是2个中断请求标志位,但在SCON之后经或门电路合成为1个信息,统一接受中断管理。

3IE寄存器

中断允许寄存器(Interrupt Enable Register),字节地址为A8H,可位寻址。

注意单片机复位后IE初值为0——默认为禁止所有中断

4IP 寄存器

中断优先级寄存器(Interrupt Priority Registers),字节地址为B8H,可位寻址。

注意每个中断源的优先级都有两种选择,可被选入两个队列之一

优先级原则:

1)高级中断请求可以打断正在执行的低级中断;

2)同级或低级中断请求不能打断正在执行的中断;

3)同级中断源同时提出请求时按自然优先级响应:

     /INT0→ T0 → /INT1→T1→TI/RI

4)单片机复位时,IP初值为0——默认

     所有中断源均为低级中断

中断标志汇总

中断管理寄存器汇总

中断系统汇总

5.3 中断处理过程

中断处理包括中断请求、中断响应、中断服务等环节。

1.中断响应

中断响应是指CPU从发现中断请求,到开始执行中断函数的过程。CPU响应中断的基本条件为:

① 有中断源发出中断请求;

② 中断总允许位EA=1,即CPU开中断;

③ 申请中断的中断源的中断允许位为1,即没有被屏蔽。

满足以上条件后,CPU一般都会响应中断。但如果遇到一些特殊情况,中断响应还将被阻止,例如CPU正在执行某些特殊指令,或CPU正在处理同级的或更高优先级的中断等。待这些中断情况撤销后,若中断标志尚未消失,则CPU还可继续响应中断请求,否则中断响应将被中止。

CPU响应中断后,由硬件自动执行如下功能操作:

① 中断优先级查询,对后来的同级或低级中断请求不予响应;

② 保护断点,即把程序计数器PC的内容压入堆栈保存;

③ 清除可清除的中断请求标志位(见中断撤销);

④ 调用中断函数并开始运行;

⑤ 返回断点继续运行。

可见,除中断函数运行是软件方式外,其余中断处理过程都是由单片机硬件自动完成的。

2.响应时间

从查询中断请求标志到执行中断函数第一条语句所经历的时间,称为中断响应时间。

不同中断情况,中断响应时间是不一样的,以外部中断为例,最短的响应时间为3个机器周期。

这是因为,CPU在每个机器周期的S6期间查询每个中断请求的标志位。如果该中断请求满足所有中断条件,则CPU从下一个机器周期开始调用中断函数,而完成调用中断函数的时间需要2个机器周期。这样中断响应共经历了1个查询机器周期加2个调用中断函数周期,总计3个机器周期,这也是对中断请求作出响应所需的最短时间。

如果中断响应受阻,则需要更长的响应时间,最长响应时间为8个机器周期。一般情况下,在一个单中断系统里,外部中断的响应时间在38个机器周期之间。如果是多中断系统,且出现了同级或高级中断正在响应或正在服务中,则需要等待响应,那么响应时间就无法计算了。

这表明,即使采用中断处理突发事件,CPU也存在一定的滞后时间。在可能的范围内提高单片机的时钟频率(缩短机器周期),可减少中断响应时间。

3.中断撤销

中断响应后,TCONSCON中的中断请求标志应及时清0,否则中断请求将仍然存在,并可能引起中断误响应。不同中断请求的撤销方法是不同的。

对于定时/计数器中断,中断响应后,由硬件自动对中断标志位TF0TF10,中断请求可自动撤销,无须采取其他措施。

对于脉冲触发的外部中断请求,在中断响应后,也由硬件自动对中断请求标志位IE0IE10,即中断请求的撤销也是自动的。

对于电平触发的外部中断请求,情况则不同。中断响应后,硬件不能自动对中断请求标志位IE0IE10。中断的撤销,要依靠撤除引脚上的低电平,并用软件使中断请求标志位清0才能有效。由于撤除低电平需要有外加硬件电路配合,比较烦琐,因而采用脉冲触发方式便成为常用的做法。

对于串口中断,其中断标志位TIRI不能自动清0。因为在中断响应后,还要测试这两个标志位的状态,以判定是接收操作还是发送操作,然后才能清除。所以串口中断请求的撤销是通过软件方法实现的。

4.中断函数

中断服务是针对中断源的具体要求进行设计的,需要用户自己编写。C51中断函数采用如下定义格式:

void 函数名 (void) interrupt nusing m

{ 函数体语句 }

这里interruptusing都是C51扩展的关键词,其中:

整数n是与中断源相对应的中断号,使用interrupt n可以让编译器知道相应中断向量地址(=8n+3),并在这个地址上自动安排一个指向该中断函数首地址的无条件跳转指令。由于无须人工处理跳转,编写C51中断函数要比编写汇编语言中断服务程序更加简明快捷

整数m是工作寄存器组的组号,C51组号m80C51工作寄存器组的关系如表5.4所示。使用using m可以切换工作寄存器组,省去中断响应时为保护断点进行的压栈操作,从而提高中断处理的实时性。using m省略时默认采用当前工作寄存器组(由特殊功能寄存器PSWRS1RS0位设定)。

C51一般函数的定义格式:

 〔返回值类型〕函数名(形式参数〕)〔编译模式〕〔reentrant〕〔interrupt xusing y

C51中断函数的定义格式:

  void 函数名 (void) interrupt nusing m

可见,C51中断函数是C51一般函数的一个特例:

① 中断函数是没有返回值的void型函数;

② 中断函数是没有形参的无参函数;

③ 中断函数采用系统默认编译模式;

④ 中断函数不是可重入的函数;

使用C51中断函数还需要注意以下几点:

① 允许在中断函数中使用return语句(表示结束中断),但不能使用带有表达式的return语句,如return(z)

② 可以通过使用全局变量,将变量值传入或传出中断函数,以此弥补无参和无返回值的使用限制;

③ 中断函数只能被系统调用,不能被其他任意函数调用。

④ 为提高中断响应的实时性,中断函数应尽量简短,并尽量使用简单变量类型及简单算术运算。一种常用的编程做法是,在中断函数中仅更新全局性标志变量值,而在主函数或其他函数中根据该标志变量值再做相应处理,这样就能较好地发挥中断对突发事件的应急处理能力。

5.4 中断编程及应用

5.4.1 中断的编程和应用举例

实例2】中断扫描法行列式键盘

试比较查询法键盘和中断法键盘的差异,并完成中断法键盘的硬件设计和软件编程工作。

分析:

在单片机应用系统中,键盘扫描只是CPU工作的内容之一。CPU在忙于各项工作任务时,需要兼顾键盘扫描,既保证不失时机地响应键操作,又不过多地占用CPU时间。

因此,可以采用中断扫描方式来提高CPU的效率,即只有在键盘有键按下时,才执行键盘扫描程序;如果无键按下,则将键盘视为不存在。

相比可知,中断法中当各列电平都为0时,无论压下哪个按键,与门的输出端都可形成/INT0的中断请求信号。这样便可将按键的扫描查询工作放在中断函数中进行,从而就能达到既快速响应按键动作,又提高CPU工作效率的目的。

硬件更改

增加一个4输入与门器件U3→行线分接输入端,输出端接P3.2INT0)

软件更改

①主函数中进行中断初始化,中断函数中查找闭合键号并刷新LED显示

每次中断返回前都应将列电平置为全低,行电平置为全高,为下次中断做准备 。

实例2源程序

【实例3中断方式的键控流水灯

试将第4章实例2的查询法进行按键检测的流水灯示例,改为用中断法进行按键检测的流水灯示例(包括硬件电路和软件编程)。

实例2的问题:当CPU运行于LED循环环节时,将因不能及时检测按键状态,而使按键操作不灵敏。

硬件改动:增加一只4输入与门电路,使按键闭合电平作为外部中断信号。

软件改动:将标志位修改功能放在中断函数中进行

实例3源程序

实例4 观察两级中断嵌套效果

根据如图所示的数码管显示与按键电路图,编程实现两级外部中断嵌套演示效果。其中K0定为低优先级中断源,K1为高优先级中断源。此外,利用发光二极管D1验证外部中断请求标志IE0在脉冲触发中断时的硬件置位与撤销过程。

分析

利用3只数码管分别进行字符19的循环显示,其中由主函数对LED0进行无限计数显示,由中断函数K0K1分别对LED1LED2进行单圈计数显示。由此观察中断及中断嵌套现象。

②为观察IE0的撤销过程,在K1中断函数里将IE0值送P3.0输出。由此观察IE0的变化。

实例4源程序

5.4.2 扩展外部中断源

MCS-51系列单片机只有两个外部中断源输入端。当所设计的应用系统需要两个以上外部中断源时,就要进行外部中断源的扩展。

利用定时器扩展外部中断源参见第6章的实例3

利用查询法扩展外部中断源

基本思路是,每根中断输入线可以通过“线或”的关系连接多个外部中断源,同时利用输入端口线作为各个中断源的识别线。

采用优先权解码芯片74LS148扩展外部中断源

8个任意按键按下时,解码芯片的GS引脚都将使80C51        引脚产生中断请求。中断函数只需保存解码芯片形成的中断分支码,并置位自定义中断标志位即可返回。在主函数中,则可根据中断标志位判断有无中断发生,并根据中断分支码判断中断请求分支号,据此可实现8路外部中断源的扩展。

在主函数中,则可根据中断标志位判断有无中断发生,根据中断分支码判断中断请求分支号,据此可实现8路外部中断

【实例5扩展8路外部中断源

下图为模拟解码芯片74LS148扩展8路外部中断源应用的电路图。试编写程序,实现用数码管的显示值模拟扩展后的中断分支程序的功能。

【解】分析:

P2中包含了解码芯片74LS1483位编码输出值7~05位悬空引脚的高电平。为使其变换为0~7的编码信息,可以对P2进行取反后屏蔽高5位的运算,即~P2&0x07。然后将变换结果作为分支跳转条件和数码管字模数组指针,实现模拟扩展外部中断函数的效果。

实例5源程序

本章小结

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

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

相关文章

【STM32】LED闪烁LED流水灯蜂鸣器(江科大)

LED正极:外部长脚、内部较小 LED负极:外部短脚、内部较大 LED电路 限流电阻:保护LED,调节LED亮度(本实验用面包板为了方便,省去了限流电阻,设计电路时要加上) 左上图:低…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十六章 Linux驱动初探

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

阿尔泰科技工业电脑IPC-8363工控机

概述: IPC-8363是一款支持 LGA 1200 Intel 10th/11th Generation Core™ i9/i7/i5/i3, Celeron and Pentium processor 的工业电脑。配置2组独立 SO-DIMM DDR4 2666/2933MHz内存,最大可扩展至128GB。 主要技术指标: 产品图示: 系…

Codeforces Round 672 (Div. 2) C1. Pokémon Army (easy version) (DP)

不知道能不能用贪心,反正我是没看出来,所以用DP求解。 首先分析一下题意,我们要在一段序列中取出一段子序列,然后让这段子序列按顺序逐个先加后减最终得到的结果最大。 如果要用DP,那么我们首先就要思考怎么表示状态…

Apache SeaTunnel——OLAP 引擎的数据动脉

导读本文将分享如何利用 Apache SeaTunnel 将各个业务系统的数据同步到 OLAP 引擎。 主要内容包括以下六大部分: 1. Apache SeaTunnel 项目介绍 2. Apache SeaTunnel 核心功能 3.SeaTunnel 在 OLAP 场景下的应用 4. 社区近期计划 5. WhaleTunnel 产品特性 6. …

idea怎么配置gradle多个版本

1.背景 gradle版本很多,而且很多时候版本是不兼容的,我们希望拉取下来的代码就包含已经配置好的版本,而不是去配置本机的gradle版本..... 意思就是要实现项目A可以用6.X版本 项目B可以使用7.X版本 项目C可以用9.X版本..... 2.配置方式 步骤一:项目根路径下保留一个文件夹…

MySQL事务管理详解:特性、问题与解决方案

什么是事务? 事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。 事务的四大特…

Docker搭建Harbor

1.什么是Harbor Harbor 是 vMware 公司开源的企业级 Docker 〖egistry 项日,其日标是帮助用户迅速搭建一个企业级的 Docker Registry 服务。Harbor以 Docker 公司开源的 Registry 为基础,提供了图形管理UI 、基于角色的访问控制(Role Based Accesscontr…

活动回顾 | AutoMQ 联合 GreptimeDB 共同探讨新能源汽车数据基础设施

7 月 13 日,AutoMQ 携手 GreptimeDB“新能源汽车数据基础设施” 主题 meetup 在上海圆满落幕。本次论坛多角度探讨如何通过创新的数据管理和存储架构,提升汽车系统的性能、安全性和可靠性,从而驱动行业的持续发展和创新,涵盖 Auto…

PHP萌宠之家微信小程序系统源码

🐾萌宠之家微信小程序🐾 —— 铲屎官们的温馨小窝✨ 🏠【一键开启萌宠乐园】🏠 亲们,是不是每次刷手机都忍不住想看看那些软萌可爱的毛孩子?现在,有了“萌宠之家”微信小程序,你的…

LeetCode 3112.访问消失节点的最少时间:单源最短路的Dijkstra算法

【LetMeFly】3112.访问消失节点的最少时间:单源最短路的Dijkstra算法 力扣题目链接:https://leetcode.cn/problems/minimum-time-to-visit-disappearing-nodes/ 给你一个二维数组 edges 表示一个 n 个点的无向图,其中 edges[i] [ui, vi, l…

【深度学习】【Lora训练4】StabelDiffusion,人物lora训练

启动: docker run -it --gpus all --net host -v /ssd/xiedong/xiezhenceshi/lora_train:/ssd/xiedong/xiezhenceshi/lora_train kevinchina/deeplearning:pytorch2.3.0-cuda12.1-cudnn8-devel-xformers-lora-train bashrootgpu16:/workspace/lora-scripts# python…

6. JavaSE ——【深入理解Java中的按位运算符】

💻 开场白 欢迎来到我的技术博客!在这里,我们将一起探索编程的奥秘,分享代码的智慧,让技术改变生活。让我们开始这段精彩的旅程吧!🚀💻🌐 📖个人主页&#xf…

untiy 竖排文字

使用的tmp文本&#xff0c;启用富文本&#xff0c;默认就是启用的 然后在要竖排的文本前边拼接 效果如下 如果用代码拼接 text.text "<rotate90>""内容";

深入Redis集群部署:从安装配置到测试验证的完整指南

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️创作…

Linux应用——网络基础

一、网络结构模型 1.1C/S结构 C/S结构——服务器与客户机&#xff1b; CS结构通常采用两层结构&#xff0c;服务器负责数据的管理&#xff0c;客户机负责完成与用户的交互任务。客户机是因特网上访问别人信息的机器&#xff0c;服务器则是提供信息供人访问的计算机。 例如&…

C++仓库管理系统

功能 代码在效果图后面 1.添加物品 2.删除物品 3.更新物品数量 4.查询物品 5.列出所有物品 6.保存并退出 注意事项&#xff1a;退出要输入“6”退出才能保存数据&#xff0c;不要直接按X关掉窗口&#xff08;不会保存数据&#xff09;。 效果图 源代码 编…

安全防御2

实验要求&#xff1a; 实验过程&#xff1a; 7&#xff0c;办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换)&#xff1a; 新建电信区&#xff1a; 新建移动区&#xff1a; 将对应接口划归到各自区域&#xff1a; 新建…

JVM--自动内存管理--JAVA内存区域

1. 运行时数据区域 灰色的线程共享&#xff0c;白色的线程独享 白色的独享就是根据个体"同生共死" 程序计数器&#xff1a; 是唯一一个没有OOM(内存溢出)的地方 是线程独享的 作用&#xff1a; 是一块较小的内存空间,是当前线程所执行的字节吗的行号指示器 由于…

云监控(华为) | 实训学习day2(10)

spring boot基于框架的实现 简单应用 - 用户数据显示 开发步骤 第一步&#xff1a;文件-----》新建---项目 第二步:弹出的对话框中,左侧选择maven,右侧不选任何内容. 第三步&#xff0c;选择maven后&#xff0c;下一步 第4步 &#xff1a;出现对话框中填写项目名称 第5步&…