【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	P1

void 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;  // 开外部中断0
	while(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;  // 开外部中断1
	GPIO_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);
}

仿真结果:

中断优先级应用仿真

  • 13
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值