外部中断未发生时,系统通过定时器完成定时0.5s的延时,使发光二极管呈从左到右的顺序一次被点亮,当有中断产生时,发光二极管则闪烁。按下P3.3所接按键,触发外部中断。 编写汇编语言或C51程序,用按键模拟单片机外部中断输入源,当按键按下时产生中断。外部中断未发生时,系统通过定时器完成定时0.5s的延时,使八个发光二极管呈从左到右的顺序一次被点亮,当有中断产生时,发光二极管则闪烁。
时间: 2024-03-16 14:41:09 浏览: 13
以下是基于C语言的程序实现:
```
#include <reg52.h>
// 定义发光二极管的端口
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;
sbit LED5 = P1^4;
sbit LED6 = P1^5;
sbit LED7 = P1^6;
sbit LED8 = P1^7;
// 定义按键的端口
sbit KEY = P3^3;
// 定义计数器和延时变量
int count = 0;
int delay = 0;
// 定义中断处理函数
void external_interrupt() interrupt 0 {
// 闪烁发光二极管
while(1) {
LED1 = !LED1;
LED2 = !LED2;
LED3 = !LED3;
LED4 = !LED4;
LED5 = !LED5;
LED6 = !LED6;
LED7 = !LED7;
LED8 = !LED8;
// 延时一段时间
for(delay=0; delay<5000; delay++);
}
}
// 主函数
void main() {
// 初始化按键端口
KEY = 1;
// 初始化发光二极管端口
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 0;
LED5 = 0;
LED6 = 0;
LED7 = 0;
LED8 = 0;
// 设置外部中断0的触发方式为下降沿触发
IT0 = 1;
// 开启中断总开关
EA = 1;
// 开启外部中断0
EX0 = 1;
while(1) {
// 如果有外部中断产生,则跳出循环
if(count > 0) {
break;
}
// 发光二极管从左到右依次点亮
LED1 = 1;
for(delay=0; delay<5000; delay++);
LED1 = 0;
LED2 = 1;
for(delay=0; delay<5000; delay++);
LED2 = 0;
LED3 = 1;
for(delay=0; delay<5000; delay++);
LED3 = 0;
LED4 = 1;
for(delay=0; delay<5000; delay++);
LED4 = 0;
LED5 = 1;
for(delay=0; delay<5000; delay++);
LED5 = 0;
LED6 = 1;
for(delay=0; delay<5000; delay++);
LED6 = 0;
LED7 = 1;
for(delay=0; delay<5000; delay++);
LED7 = 0;
LED8 = 1;
for(delay=0; delay<5000; delay++);
LED8 = 0;
}
}
```
程序的实现思路是:首先初始化发光二极管和按键的端口,并设置外部中断的触发方式为下降沿触发。然后进入一个无限循环,循环内部通过定时器完成发光二极管从左到右的顺序点亮,并延时0.5秒。当检测到有外部中断产生时,跳出循环,进入中断处理函数。中断处理函数中通过循环闪烁发光二极管。