51单片机|keilc51|实例|中断嵌套

题目要求:

设计一个中断嵌套程序, 要求当S1和S2都未按下时,P1口的8只LED灯呈流水灯显示;
当S1按下再松开时,产生一个低优先级的外中断0请求(下降沿触发),进入外中断0服务程序,左右4只LED交替闪烁;
当S2按下再松开时,产生一个高优先级的外中断1请求(下降沿触发),进入外中断1服务程序,P1口的8只LED等闪烁6次;
当闪烁完之后,再从外中断1返回继续执行外中断0.

  • Proteus画图

在这里插入图片描述

  • Keilc51编程
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
	
uchar liushui_code[9] = {0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//定义流水灯数组

//延迟函数
void Delay_ms(uint ms)
{
	uchar i;
	while(ms--)
		for(i=0;i<123;i++);
}

void main()
{
	//-----中断初始化-----
	EX0 = 1;//中断0请求允许
	EX1 = 1;//中断1请求允许
	EA = 1;//总中断打开
	
	//设置优先级
	PX0 = 0;//中断0为低优先
	PX1 = 1;//中断1为高优先

	//选择触发方式
	IT0 = 1;//选择下降沿触发
	IT1 = 1;//选择下降沿触发
	
	//-----流水灯(没有按键按下)-----
	while(1)
	{
		uint i;
		for(i=0;i<9;i++)
		{
			Delay_ms(500);
			P1 = liushui_code[i];
		}
	
	}
}

//中断0(低)左右4只LED交替闪烁
void int0(void)  interrupt 0 using 0
{
	while(1)
	{
		P1 = 0x0f;
		Delay_ms(500);
		
		P1 = 0xf0;
		Delay_ms(500);
	
	}

}


//中断1(高)LED闪烁6次
void int1(void)  interrupt 2 using 1
{
	uint m;
	for(m=0;m<6;m++)
	{
		P1 = 0xff;
		Delay_ms(500);
		P1 = 0;
		Delay_ms(500);
	}

}

注意

  1. 中断初始化中——允许请求时:不能忘记开总中断EA = 1
  2. 中断返回这里要理解:从中断1返回中断0,这里是用的for循环,循环可以结束,所以能够返回中断0;如果用的while循环,一直在循环,无法跳出中断1,从而无法实现中断返回。

版权声明:本文为zzztutu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。