编写单个按键控制 LED 流水灯实验程序。要求单片机 上电复位后,8 位 LED 灯隔一个亮一个,当按下接在外部中断 1 管脚上的按 键时,8 位 LED 从左向右做单灯亮的流水效果;再次按下该按键时,LED 做 从右向左单灯亮流水效果;第三次按下该按键时,8 位 LED 灯间隔闪烁(肉 眼可见);第四次按下该按键时,8 位 LED 灯回到单片机复位时的状态。在 任何状态下,按下外部中断 0 管脚上所接按键时,8 位 LED 灯处于全灭的状 态。
时间: 2023-06-10 07:08:17 浏览: 940
以下是基于8051单片机的程序代码:
```c
#include<reg51.h>
sbit LED=P0; // 8位LED的控制端口
sbit KEY1=P3^3; // 外部中断1的管脚
sbit KEY2=P3^2; // 外部中断0的管脚
unsigned char mode=0; // 模式变量,用于切换LED灯的显示模式
void delay(unsigned int t) // 延时函数
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++);
}
void main()
{
unsigned char led_state=0x55; // 初始状态为隔一个亮一个
IT1=1; // 设置外部中断1的触发方式为下降沿触发
EX1=1; // 打开外部中断1
IT0=1; // 设置外部中断0的触发方式为下降沿触发
EX0=1; // 打开外部中断0
EA=1; // 打开总中断开关
while(1)
{
switch(mode)
{
case 0: // 隔一个亮一个
LED=led_state;
delay(500);
led_state=~led_state; // 状态翻转,实现隔一个亮一个
break;
case 1: // 从左向右流水灯
for(int i=0;i<8;i++)
{
LED=0x01<<i; // 依次点亮每个LED
delay(200);
}
for(int i=0;i<8;i++)
{
LED=0x80>>i; // 依次熄灭每个LED
delay(200);
}
break;
case 2: // 从右向左流水灯
for(int i=0;i<8;i++)
{
LED=0x80>>i; // 依次点亮每个LED
delay(200);
}
for(int i=0;i<8;i++)
{
LED=0x01<<i; // 依次熄灭每个LED
delay(200);
}
break;
case 3: // 闪烁
LED=0x00; // 全灭
delay(500);
LED=0xFF; // 全亮
delay(500);
break;
}
}
}
void ISR_Key1() interrupt 2 // 外部中断1的中断服务程序
{
mode++;
if(mode>3)
mode=0;
}
void ISR_Key2() interrupt 0 // 外部中断0的中断服务程序
{
LED=0x00; // 全灭
}
```
该程序中,首先定义了8位LED的控制端口和两个外部中断的管脚。接着定义一个模式变量`mode`,用于切换LED灯的显示模式。程序中的`delay()`函数用于延时,使LED灯的显示效果更加明显。
在主函数中,首先设置外部中断的触发方式和打开总中断开关。然后进入一个循环中,在不同的模式下,LED灯显示不同的效果。使用`switch`语句实现不同模式下的显示。
在程序的最后,定义了两个中断服务程序,分别对应外部中断1和外部中断0的触发。在外部中断1触发时,模式变量`mode`加1,实现LED灯显示模式的切换;在外部中断0触发时,LED灯全灭。
需要注意的是,该程序中使用了定时器延时,因此需要根据实际硬件情况调整`delay()`函数中的参数,以实现所需的延时效果。同时,需要根据实际硬件连接情况修改代码中的端口定义。
阅读全文