单片机外部中断—中断嵌套

1. 首先了解单片机外部中断之前应该明白一些与之相关的寄存器**

  • 中断允许寄存器IE在这里插入图片描述

1.EA:cpu总中断允许控制位。EA=1,cpu开放中断。
2.ET0/ET1:定时器T0和定时器T1溢出中断允许位。ET0/ET1=1;允许中断。
3.EX0/EX1:外部中断0和外部中断1中断允许位。EX0/ET1=1;允许中断。

  • 定时器/计数器控制寄存器TCON
    在这里插入图片描述

与外部有关的仅仅是后四位,前四位与定时器有关,在这不做描述。
IE0:外部中断0请求标志,IE0=1外部中断0向cpu请求中断,响应中断后硬件自动清0;
IE1:外部中断1请求标志,IE0=1外部中断1向cpu请求中断,响应中断后硬件自动清0;
IT0:外部中断0中断源类型选择位,IT0=0;低电平触发方式。IT0=1;下降沿触发方式。
IT1:外部中断0中断源类型选择位,IT1=0;低电平触发方式。IT1=1;下降沿触发方式。

  • 中断优先级寄存器IP
    在这里插入图片描述

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

2.外部中断0的使用


1.简单的通过外部中断控制P0^0口LED灯的亮灭

sbit led=P0^0;
void Init0();
void delayms(unsigned int ms);
int main()
{
	Init0();
	while(1);
}
void delayms(unsigned int ms)//延迟函数
{
	int i,j;
	for(i=0;i<ms;i++)
	 for(j=100;j>0;j--);
}
void Init0()//外部中断0的初始化
{
	IT0=1;//选择跳沿触发方式
	EX0=1;
	EA=1;
}
void Int0() interrupt 0
{
	delayms(5);//按键的消抖
	if(P3^2==0)//外部中断0的管脚在P3^2
	{
		led=~led;
	}

}

3.中断优先级的配置

51单片机的默认(此时的IP寄存器不做设置)中断优先级为:
外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断;
但这种优先级只是逻辑上的优先级,当同时有几种中断到达时,高优先级中断会先得到服务。这种优先级实际上是中断同时到达的情况下,谁先得到服务的优先级,而不是可提供中断嵌套能力的优先级。这种优先级被称为逻辑优先级。[^1]

要实现真正的嵌套形式的优先级,也即高优先级中断服务可以打断低优先级中断服务的情况,必须通过设置中断优先级寄存器IP来实现;这种优先级被称为物理优先级。

扫描二维码关注公众号,回复: 10244211 查看本文章

  • 例如:当计数器0中断和外部中断1(优先级 计数器0中断>外部中断1)同时到达时,会进入计时器0的中断服务函数;但是在外部中断1的中断服务函数正在服务的情况下,这时候任何中断都是打断不了它的,包括逻辑优先级比它高的外部中断0计数器0中断。
    要实现真正的嵌套形式的优先级,也即高优先级中断服务可以打断低优先级中断服务的情况,必须通过设置中断优先级寄存器IP来实现;这种优先级被称为物理优先级。

- 设置外部中断1优先级大于外部中断0优先级。实现二级中断嵌套,当执行外部中断0的时候外部中断1能打断外部中断0程序的运行。

void Init();
void delayms(unsigned int ms);
int main()
{
	Init();
	while(1);
}
void delayms(unsigned int ms)//延迟函数
{
	int i,j;
	for(i=ms;i>0;i--)
	 for(j=100;j>0;j--);
}
void Init()//外部中断初始化
{
	IT0=1;//选择跳沿触发方式
	EX0=1;//打开外部中断0允许位
	IT1=1;//选择跳沿触发方式
	EX1=1;//打开外部中断1允许位
	EA=1;//打开总中断
    IP=0X01;//设置外部中断0的优先级大于外部中断1
}

void Int0() interrupt 0 using 0//外部中断0的执行程序。
{ 
	unsigned char i;
	delayms(5);
	if(P3^2==0)
	{
		for(i=0;i<8;i++)
		{
			P0=~(0x01<<i);
			delayms(1000);
		}
			
	}

}
void Int1() interrupt 2 using 1//外部中断1的执行程序。using x代表用那个工作区。
{
	unsigned char i;
	delayms(5);
	if(P3^3==0)
	{
			for(i=8;i>0;i--)
		{
			P0=~(0x01<<i);
			delayms(500);
		}
	}
}

- 外部中断的主要内容

在这里插入图片描述
接下来让我们做一个中断嵌套的小练习吧。链接: link.
如果这篇文章对你有帮助,就点个小♥吧!

发布了2 篇原创文章 · 获赞 5 · 访问量 186

猜你喜欢

转载自blog.csdn.net/qq_46292418/article/details/105121876