51单片机程序,用两个开关模拟按键分别连接到外部中断0和外部中断1,分别书写按键中断程序,按照要求的方式进行流水灯控制。两个中断通过调整优先级,可以进行中断的嵌套,要求高优先级的中断可以打断低优先级的动作
时间: 2023-05-31 22:06:54 浏览: 65
以下是基于STC89C52单片机的程序示例:
```c
#include <reg52.h>
sbit LED = P1^0; // 控制流水灯的LED引脚
sbit KEY1 = P3^2; // 模拟按键1引脚,连接到外部中断0
sbit KEY2 = P3^3; // 模拟按键2引脚,连接到外部中断1
void delay(unsigned int ms) // 延时函数
{
unsigned int i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 125; j++);
}
void main()
{
EA = 1; // 开启总中断
EX0 = 1; // 开启外部中断0
IT0 = 1; // 设置外部中断0为下降沿触发
EX1 = 1; // 开启外部中断1
IT1 = 1; // 设置外部中断1为下降沿触发
while(1) // 循环执行流水灯
{
LED = 1;
delay(100);
LED = 0;
delay(100);
}
}
void Key1_ISR() interrupt 0 // 外部中断0中断服务函数,按键1
{
unsigned int i;
for(i = 0; i < 5; i++) // 快速闪烁5次
{
LED = 1;
delay(50);
LED = 0;
delay(50);
}
}
void Key2_ISR() interrupt 2 // 外部中断1中断服务函数,按键2
{
unsigned int i;
for(i = 0; i < 10; i++) // 慢速闪烁10次
{
LED = 1;
delay(200);
LED = 0;
delay(200);
}
}
```
在上述程序中,我们首先定义了控制流水灯的LED引脚和模拟按键1、2的引脚,并编写了一个简单的延时函数。在主函数中,我们开启了总中断并分别设置了外部中断0和1的触发方式和中断服务函数。在while循环中,我们不断执行流水灯的操作。
在按键1的中断服务函数中,我们快速闪烁LED5次,而在按键2的中断服务函数中,我们慢速闪烁LED10次。这样,当按下按键1时,流水灯会快速闪烁5次,而当按下按键2时,则会慢速闪烁10次。
由于外部中断0的优先级比外部中断1的优先级高,因此当同时按下按键1和按键2时,按键1的中断服务函数会先被执行,直到执行完毕后才会执行按键2的中断服务函数。如果需要改变中断的优先级,可以通过设置IP寄存器的相应位来实现。