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,从而无法实现中断返回。
  • 13
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zzztutu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值