单片机程序,用两个开关模拟按键分别连接到外部中断0和外部中断1,分别书写按键中断程序,按照要求的方式进行流水灯控制。两个中断通过调整优先级,可以进行中断的嵌套,要求高优先级的中断可以打断低优先级的动作
时间: 2023-05-31 17:06:54 浏览: 127
单片机的流水灯控制程序
以下是一个基本的单片机程序,用两个开关模拟按键分别连接到外部中断0和外部中断1,分别书写按键中断程序,按照要求的方式进行流水灯控制。两个中断通过调整优先级,可以进行中断的嵌套,要求高优先级的中断可以打断低优先级的动作。
```c
#include <reg52.h>
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;
sbit KEY1 = P3^2;
sbit KEY2 = P3^3;
void delay(unsigned int xms) {
unsigned int i, j;
for (i = xms; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
void main() {
EA = 1; // 开总中断
EX0 = 1; // 开外部中断0
IT0 = 1; // 外部中断0下降沿触发
EX1 = 1; // 开外部中断1
IT1 = 1; // 外部中断1下降沿触发
while(1) {
LED1 = 0;
delay(500);
LED1 = 1;
LED2 = 0;
delay(500);
LED2 = 1;
LED3 = 0;
delay(500);
LED3 = 1;
LED4 = 0;
delay(500);
LED4 = 1;
}
}
void Ex0() interrupt 0 {
unsigned int i;
for (i = 0; i < 3; i++) {
LED1 = 0;
delay(100);
LED1 = 1;
delay(100);
}
}
void Ex1() interrupt 2 {
unsigned int i;
for (i = 0; i < 3; i++) {
LED4 = 0;
delay(100);
LED4 = 1;
delay(100);
}
}
```
这个程序中,我们定义了四个LED灯和两个按键(开关)。在主函数中,我们通过一个 while 循环控制四个LED灯的流水灯效果。在两个中断函数中,我们分别实现了按下按键时的动作。
外部中断0的中断函数中,我们让LED1闪烁3次。外部中断1的中断函数中,我们让LED4闪烁3次。这两个中断函数都是比较简单的,只是让LED闪烁几次而已。
但是,我们需要注意到这两个中断函数的优先级问题。在这个程序中,我们将外部中断0的优先级设置为高于外部中断1的优先级。因此,当外部中断0被触发时,它会打断主函数中流水灯的动作,执行自己的中断函数。而当外部中断1被触发时,它只会在外部中断0的中断函数执行完毕之后才会执行。这就是中断函数的嵌套效果。
在中断函数中执行延时操作是不太好的做法,因为这样会阻塞其他中断。在实际的应用中,我们应该尽量避免在中断函数中执行延时操作,而是应该尽量让中断函数执行得快速简洁。如果需要进行延时等操作,可以使用定时器中断来实现。
阅读全文