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

【51单片机系列】中断优先级介绍及使用

文章来源:《51单片机原理及应用(第3版)》5.4节。

51单片机采用了自然优先级和人工设置高、低优先级的策略。

当CPU处理低优先级中断,又发生更高级中断时,此时中断处理过程如下图所示。

一个正在执行的低优先级中断服务程序能被高优先级中断源的中断申请所中断,形成中断嵌套。
相同级别的中断源不能相互中断其服务程序,也不能被另一个低优先级的中断源所中断。
如果CPU正在执行高优先级的中断服务子程序,不能被任何中断源所中断。

中断嵌套

上电时,中断优先级寄存器IP被清零,每个中断源都处于同一个优先级,这时如果其中几个中断同时产生中断请求,则CPU按照片内硬件优先级链路的顺序即自然优先级响应中断,硬件优先级有高到低的顺序如下表所示:

中断源默认中断级别中断号
外部中断0——INT0最高0
定时/计数器0中断——T0第21
外部中断1——INT1第32
定时/计数器1中断——T1第43
串口中断——TI/RI第54
定时/计数器2中断——INT2(52独有)第65

如果希望某个中断源有更高的优先级,可以通过设置中断优先级寄存器IP指定更高优先级的中断。IP各位如下表:

位序D7D6D5D4D3D2D1D0
位名称///PSPT1PX1PT0PX0

IP中的某位设置为,则相应的中断就是高优先级;否则就是低优先级;在同一个优先级下,中断响应的顺序和自然优先一样。IP可位寻址。

各个位说明:

  • PS:串口中断优先级控制位
  • PT1:定时器1优先级控制位
  • PX1:外部中断1优先级控制位
  • PT0:定时器0优先级控制位
  • PX0:外部中断0优先级控制位

比如要求将外部中断1,定时器0设为高优先级,其它为低优先级,那么应该置PT0=1,PX1=1,高三位取任意值,设置为0,那么IP的值应该为00000110B=06H,此时如果5个中断同时发生,中断响应的次序为:定时器0中断→外部中断1→外部中断0→定时器1→串口中断。

中断优先级应用示例

设置外部中断1为高优先级,在两个外部中断引脚(P3.2和P3.3)接两个按键,P1口连接LED。连接P3.2口的按键按下后,LED循环点亮;连接P3.3口的按键按下后,LED全部点亮-熄灭,连续3次。

Proteus设计原理电路图如下:

中断优先级应用示例原理电路图

软件设计

源程序清单:

/*实现功能:中断优先级使用示例,设置外部中断1为高优先级,P1口连接LED,P3.2和P3.3分别连接两个按键连接P3.2的按键INT0按下后LED循环点亮,连接P3.3的按键INT1按下后LED全部点亮-熄灭,闪烁3次。通过先按下按键INT0,然后再按下按键INT1可以看到LED依次点亮-全部点亮熄灭闪烁3次-依次点亮,直观显示中断优先级的作用。[2024-01-31] zoya
*/#include <reg51.h>
#include <intrins.h>typedef unsigned char uchar;#define GPIO_LED	P1void delay(uchar c)
{uchar i,j;for(;c>0;c--){for(i=0;i<142;i++)for(j=0;j<2;j++);}
}void main()
{EX0=1;  // 外部中断0允许位EX1=1;  // 外部中断1允许位IT0=1;  // 定时器0允许位IT1=1;  // 定时器1允许位EA=1;  // 总中断允许位IP=0x04;  // 中断优先级设置,外部中断1高优先级GPIO_LED=0xff;while(1);
}void Int0() interrupt 0
{uchar i, tmp;EX0=0;  // 关闭外部中断0,防止执行过程中再次发生中断delay(20);EX0=1;  // 开外部中断0while(1){tmp=0xFE;GPIO_LED=tmp;for(i=0;i<8;i++){tmp=_crol_(tmp,1);delay(100);GPIO_LED=tmp;}}
}void Int1() interrupt 2
{EX1=0;  // 关闭外部中断1,防止执行过程中再次发生中断delay(20);EX1=1;  // 开外部中断1GPIO_LED=0x00; delay(100);GPIO_LED=0xff; delay(100);GPIO_LED=0x00; delay(100);GPIO_LED=0xff; delay(100);GPIO_LED=0x00; delay(100);GPIO_LED=0xff; delay(100);
}

仿真结果:

中断优先级应用仿真

http://www.lryc.cn/news/293786.html

相关文章:

  • .net core 6 集成 elasticsearch 并 使用分词器
  • Unity项目从built-in升级到URP(包含早期版本和2023版本)
  • 2月4号作业
  • 瑞_23种设计模式_建造者模式
  • GA/T 1707-2019 防爆安全门检测
  • k8s学习-数据管理
  • java hutool工具类实现将数据下载到excel
  • 【C/Python】Gtk部件ListStore的使用
  • Swift 入门之自定义类型的模式匹配(Pattern Matching)
  • MySQL-----DML基础操作
  • 提前祝大家新年好!来看看社区 2023 都得了哪些奖吧
  • Redis核心技术与实战【学习笔记】 - 19.Pika:基于SSD实现大容量“Redis”
  • qt-C++笔记之contains()和isEmpty()函数、以及部分其他函数列举
  • 极速搭建幻兽帕鲁私服,叫上好友春节假期一起联机畅玩帕鲁
  • MagicVideo-V2:多阶段高保真视频生成框架
  • 【三】【C++】类与对象(二)
  • ffmpeg 输入文件,输入出udp-ts 指定pid
  • 自研人工智能小工具-小蜜蜂(国外ChatGpt的平替)
  • Stable Diffusion 模型下载:ReV Animated
  • 某赛通电子文档安全管理系统 PolicyAjax SQL注入漏洞复现
  • Prometheus 采集Oracle监控数据
  • 【ARM Trace32(劳特巴赫) 使用介绍 3.1 -- 不 attach core 直接访问 memory】
  • MySQL事务和SQL优化
  • [C语言]结构体初识
  • 跨平台开发:浅析uni-app及其他主流APP开发方式
  • MyBatis常见面试题汇总
  • juc并发线程学习笔记(一)
  • 力扣热门100题刷题笔记 - 3.无重复字符的最长子串
  • 达梦数据库死锁排查与解决
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TextClock组件