题目要求:
设计一个中断嵌套程序, 要求当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);
}
}
注意:
- 中断初始化中——允许请求时:不能忘记开总中断
EA = 1
。 - 中断返回这里要理解:从中断1返回中断0,这里是用的for循环,循环可以结束,所以能够返回中断0;如果用的while循环,一直在循环,无法跳出中断1,从而无法实现中断返回。