龙空技术网

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

老马识途单片机 156

前言:

此时朋友们对“c语言proteus的操作顺序”大体比较注意,各位老铁们都需要剖析一些“c语言proteus的操作顺序”的相关文章。那么小编同时在网络上汇集了一些对于“c语言proteus的操作顺序””的相关资讯,希望兄弟们能喜欢,咱们一起来学习一下吧!

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 <AT89x52.h>//共阳极数码管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电路中的单片机内,开始仿真,分别观察没有按键按下、低优先级按键按下、低优先级按键按下显示数字过程中按下高优先级按键;高优先级控制的数码管显示数字过程中在按下低优先级按键等情况下,三个数码管的变化情况。

视频加载中...

1.7. 总结

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

标签: #c语言proteus的操作顺序