1. 基于proteus的51单片机开发实例(14)中断嵌套和中断优先级

1.1. 实验目的

在前面实例中我们已经学习了51单片机的定时器/计数器中断,外部中断,通过这些实例,知道了中断电路的设计,中断编程的方法。本实例中我们继续深入学习中断:学习一下中断的嵌套和优先级。通过连接单片机两个外部中断引脚的按键,以及电路中的三个数码管,形象演示中断的嵌套和优先级。

图1 中断嵌套和中断优先级演示电路

1.2. 设计思路

单片机的两个外部中断引脚分别接两个按键,同时单片机的P0,P1,P2口分别接3个共阳极数码管。将单片机的两个外部中端INT1(P3.3)和INT0(P3.2)设定为优先级不一样的配置,其中INT1设置为高优先级,INT0设置为低优先级。外部中断触发条件设置为负边沿触发(下降沿触发)。

中断是如何打断CPU正在进行的工作

电路中的3个数码管分别对应于主程序中的数码管,高优先级数码管,低优先级数码管。当没有中断触发时,主程序的数码管循环显示数字“0~9”,当触发低优先级中断时,主程序中的数码管显示的数字不再变化,低优先级数码管开始从0显示到9,然后退出中断,这时主程序中的数码管继续变化。这一过程主要演示了中断是如何打断CPU正在进行的工作,以及中断处理结束后,CPU还会回到中断时的操作继续执行。

高优先级中断是如何打断低优先级中断

当低优先级中断触发后,在显示数字过程中,如果高优先级中断触发,则低优先级数码管停止变化,高优先级数码管显示数字“0~9”,显示结束后,低优先级数码管继续显示。这一过程主要演示了低优先级中断处理过程中,是如何被高优先级中断打断的,以及高优先级中断处理结束后,低优先级会继续从被打断的位置执行。

低优先级中断无法打断高优先级中断

如果高优先级中断先被触发,则高优先级数码管数字变化时,按下低优先级中断的按键,高优先级数码管的显示不会被打断。这一过程演示了在高优先级中断执行过程中,低优先级中断无法打断高优先级中断。

1.3. 基础知识

1.3.1. 边沿触发

前面说了一个概念:负边沿触发。我们来了解一下这个负边沿触发是什么意思?

首先来看看着几个名词:负边沿触发,负跳变,下降沿触发;正边沿触发,正跳变,上升沿触发。

负边沿触发,负跳变,下降沿触发是同一个概念,都是指脉冲从高电平到低电平变化的一个过程。

正边沿触发,正跳变,上升沿触发是同一个概念,都是指脉冲从低电平到高电平变化的一个过程。

图2 边沿触发

1.3.2. 电平触发

边沿触发需要脉冲有一个高到底(或低到高)的变化过程,而电平触发不需要脉冲的变化过程,例如低电平触发,则如果脉冲处于低电平,就会触发中断。

1.3.3. 中断优先级

51单片机的中断系统具有两个中断优先级,对于每一个中断请求源可编程设置中断优先级为高或者低。以实现两级中断嵌套。

中断源的优先级有特殊功能寄存器IP控制。如下图所示。

图3 中断优先级寄存器

IP寄存器中的某个控制位置1,则相应中断源就被设定为高优先级中断;反之,若该位置0,则为低优先级中断。

1.3.4. 中断嵌套

一个正在执行的低优先级中断能被高优先级中断所中断,这就形成了中断嵌套。相同级别的中断源不能相互中断其服务程序,也不能被低优先级中断所打断。

图3 中断嵌套

需要注意的是,51单片机有5个中断源,但是只有两个中断优先级,因此必然会有多个中断源处于相同的中断优先级别。当同级别的中断同时发生,CPU该如何处理?在这种情况下,51单片机内部有一个固定的中断查询次序,当出现同级别的中断申请时,就按照这个次序来处理。

图4 51单片机默认的中断查询次序

1.4. 电路设计

本实例的电路图如图1所示。单片机的外部中断引脚P3.2和P3.3分别连接两个按键。单片机的P0,P1,P2,则连接三个共阳极数码管。分别对应于主程序控制的数码管,高优先级控制的数码管,低优先级控制的数码管。

1.5. 程序设计

本实例的程序代码如下。

#include //共阳极数码管0~9数字段码表unsigned char SegBuf[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//延时函数void Delay(void){   unsigned int li=0,lj=0;    for(li=0;li<300;li++)    for(lj=0;lj<322;lj++);}//外部中断0的中断服务程序EX_INT0() interrupt 0 using 1 { unsigned char i=0;    for(i=0;i<=9;i++)   {      P2 = SegBuf[i];//显示一遍0~9后退出中断     Delay();   }}//外部中断1的中断服务程序EX_INT1() interrupt 2 using 2 { unsigned char i=0; for(i=0;i<=9;i++)   {      P1 = SegBuf[i];//显示一遍0~9后退出中断     Delay();    } }void main(void){    unsigned char i=0; //开中断,配置中断源基础法方式,配置中断优先级   IE = 0x85;//   TCON = 0x05;//   PX1 = 1;//   while(1) { for(i=0;i<=9;i++) { P0 = SegBuf[i];//循环显示0~9,直到被中断打断,中断完成后,继续显示 Delay(); } }}

可以看到,本实例在配置中断时,不但配置了两个外部中断,还配置了外部中断的触发条件,并且还设置了这两个中断的优先级。

1.6. 实例仿真

编译程序代码,生成HEX文件,把HEX文件“装进”proteus电路中的单片机内,开始仿真,分别观察没有按键按下、低优先级按键按下、低优先级按键按下显示数字过程中按下高优先级按键;高优先级控制的数码管显示数字过程中在按下低优先级按键等情况下,三个数码管的变化情况。

播放 暂停进入全屏 退出全屏00:00 00:00重播请刷新试试

1.7. 总结

本实例使用三个数码管来演示CPU是如何被中断打断,低优先级如何被高优先级中断打断,高优先级中断不会被低优先级中断打断。使我们直观而又形象的充分理解中断嵌套和中断优先级的概念。

c51中断优先级c语言,基于proteus的51单片机开发实例(14)中断嵌套和中断优先级...相关推荐

  1. c++程序设计_基于proteus的51单片机开发实例30-模块化程序设计

    1. 基于proteus的51单片机开发实例30-模块化程序设计 1.1. 实验目的 模块化程序设计 不知不觉我们的51单片机开发实例已经进行到第三十篇了,是时候进行一个总结和反思了,总结什么?反思什 ...

  2. hc05与单片机连接图_基于proteus的51单片机开发实例(13)-LED指示那个按键被按下

    1. 基于proteus的51单片机开发实例(13)-LED指示那个按键被按下 1.1. 实验目的 本实例将实现两路外部中断的检测和识别,让我们能够更好地理解51单片机的外部中断以及中断优先级的概念. ...

  3. hc05与单片机连接图_基于proteus的51单片机开发实例37-DAC0832

    学习手记 1. 基于proteus的51单片机开发实例37-DAC0832 1.1. 实验目的 之前我们学习了数模转换芯片DAC0808,今天我们继续学习另一种D/A转换芯片DAC0832. 1.2. ...

  4. 基于proteus的51单片机仿真实例二、关于proteus

    一.proteus的使用 proteus软件能对单片机系统同时进行软件和硬件仿真.是初学单片机而又没有硬件工具的一个很好的选择. 后面的学习将以protwus 7.4中文版为学习平台. 1.软件的下载 ...

  5. 51单片机蜂鸣器播放音乐C语言程序实例,基于proteus的51单片机仿真实例八十八、用蜂鸣器播放一段音乐应用实例...

    1.前面我们已经学习了如何让单片机控制蜂鸣器发出不同的声音.现在我们更进一步,让单片机控制蜂鸣器发出再复杂一些的声音:模拟乐音输出 2.关于音乐的乐谱和节拍这些知识,我们将在下一节进一步说明 3.在k ...

  6. proteus矩阵按键计算机,基于proteus的51单片机仿真实例八十二、4X4矩阵键盘应用实例...

    1.矩阵键盘的工作原理: 1)接口电路:在单片机系统中,当按键数量较多时,为了减少IO口的使用,通常将按键排列成矩阵型式,例如本例中的16个按键,被排列成了如下图所示的4X4矩阵方式.即由4根行线和4 ...

  7. 基于proteus的51单片机仿真实例五十七、定时器/计数器T0的定时实例

    1.本例使用定时器T0的定时中断来控制P1.0端口的LED闪烁,定时周期为100MS,LED点亮50MS,熄灭50ms. 2.实现方法:首先将定时器设置为定时方式,然后选择工作方式,在使用定时中断前要 ...

  8. 基于proteus的51单片机仿真实例七十六、8-3编码芯片74HC148应用实例

    1.本例使用8-3编码芯片74HC148实现外部中断扩展,可以实现对8路外部中断信号按优先级进行处理 2.74HC148是带优先级的编码芯片,对于外部的8根数据输入线,只要有一根或者几根被置0,编码芯 ...

  9. 基于proteus的51单片机仿真实例七十二、并口转串口器件74HC165应用实例(续)

    1.本例使用单片机的串口,使串口工作于移位寄存器模式,165的串行输出端口连接到单片机的串行数据输入端,单片机的串行数据发送端负责发送移位时钟脉冲,与165的CLK引脚相连.学要注意的是SH/LD引脚 ...

最新文章

  1. oracle urlencode 中文,Python2和Python3中urllib库中urlencode的使用注意事项
  2. 设计模式之facade模式
  3. 学计算机的快毕业要学论文吗,学计算机的好写毕业论文吗?
  4. Java高并发程序设计前言
  5. python中end 1 意思_python中“end=”是什么意思?_后端开发
  6. 错误: 找不到或无法加载主类 helloworld_你还不知道Java的类加载机制?
  7. PHPExcel读取excel文件
  8. 吐槽Javascript系列三:数组的陷阱
  9. 机器学习基础:朴素贝叶斯(Machine Learning Fundamentals: Naive Bayes)
  10. UGUI Text组件扩展
  11. java 观察者模式_设计模式-Java-观察者模式-RxJava
  12. Vuex持久化,刷新,vuex-along最详细教程
  13. 第二课 小企鹅迷宫探宝
  14. 最重要的100個英文字首字根 -- 字根 (3)
  15. CentOS安装NETCDF
  16. Windows10系统添加打印机步骤
  17. 去掉mysql u0000_js对于\u0000的处理
  18. PHPWord生成文档 表格,复制模板文档
  19. NOKOV动作捕捉系统使多场协同无人机自主建造成为可能
  20. 神码ai人工智能写作机器人_从云到设备到边缘的人工智能和机器学习的未来

热门文章

  1. 公众号查题接口 搜题搭建
  2. 计算机二级Python学习笔记(三):天天向上的力量
  3. Linkis简单版安装教程
  4. CDLinux U盘制作教程
  5. 最近这只狗狗,真的很忙
  6. 使用gitee仓库管理项目中的一些常见小问题
  7. Windows内核开发调试环境配置详解
  8. html5 播放进度,获取并设置HTML5 Video的当前进度
  9. 前端做CA认证碰到的坑
  10. Phaser并发阶段器