8051单片机+三个按 钮输入, 输出为两组每组8个的 流水灯往返闪烁
时间: 2023-06-24 20:08:14 浏览: 56
以下是8051单片机实现三个按键控制的两组每组8个流水灯往返闪烁的代码:
```c
#include<reg51.h> // 头文件
// 定义I/O口
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 LED9=P2^0;
sbit LED10=P2^1;
sbit LED11=P2^2;
sbit LED12=P2^3;
sbit LED13=P2^4;
sbit LED14=P2^5;
sbit LED15=P2^6;
sbit LED16=P2^7;
sbit KEY1=P3^0;
sbit KEY2=P3^1;
sbit KEY3=P3^2;
void delay(unsigned int i) // 延时函数
{
unsigned int j,k;
for(j=0;j<i;j++)
for(k=0;k<125;k++);
}
void main()
{
unsigned char i,flag=0; // 定义变量
while(1)
{
if(KEY1==0) // 检测按键1是否按下
{
delay(10); // 延时去抖动
if(KEY1==0) // 再次检测按键1是否按下
{
flag=1; // 设置标志位为1
while(KEY1==0); // 等待按键1松开
}
}
if(KEY2==0) // 检测按键2是否按下
{
delay(10);
if(KEY2==0)
{
flag=2; // 设置标志位为2
while(KEY2==0);
}
}
if(KEY3==0) // 检测按键3是否按下
{
delay(10);
if(KEY3==0)
{
flag=3; // 设置标志位为3
while(KEY3==0);
}
}
switch(flag) // 根据标志位控制LED灯
{
case 1:
for(i=0;i<8;i++)
{
LED1=1;
delay(100);
LED1=0;
LED2=1;
delay(100);
LED2=0;
LED3=1;
delay(100);
LED3=0;
LED4=1;
delay(100);
LED4=0;
LED5=1;
delay(100);
LED5=0;
LED6=1;
delay(100);
LED6=0;
LED7=1;
delay(100);
LED7=0;
LED8=1;
delay(100);
LED8=0;
}
for(i=0;i<8;i++)
{
LED8=1;
delay(100);
LED8=0;
LED7=1;
delay(100);
LED7=0;
LED6=1;
delay(100);
LED6=0;
LED5=1;
delay(100);
LED5=0;
LED4=1;
delay(100);
LED4=0;
LED3=1;
delay(100);
LED3=0;
LED2=1;
delay(100);
LED2=0;
LED1=1;
delay(100);
LED1=0;
}
flag=0; // 清除标志位
break;
case 2:
for(i=0;i<8;i++)
{
LED9=1;
delay(100);
LED9=0;
LED10=1;
delay(100);
LED10=0;
LED11=1;
delay(100);
LED11=0;
LED12=1;
delay(100);
LED12=0;
LED13=1;
delay(100);
LED13=0;
LED14=1;
delay(100);
LED14=0;
LED15=1;
delay(100);
LED15=0;
LED16=1;
delay(100);
LED16=0;
}
for(i=0;i<8;i++)
{
LED16=1;
delay(100);
LED16=0;
LED15=1;
delay(100);
LED15=0;
LED14=1;
delay(100);
LED14=0;
LED13=1;
delay(100);
LED13=0;
LED12=1;
delay(100);
LED12=0;
LED11=1;
delay(100);
LED11=0;
LED10=1;
delay(100);
LED10=0;
LED9=1;
delay(100);
LED9=0;
}
flag=0;
break;
case 3:
for(i=0;i<8;i++)
{
LED1=1;
delay(100);
LED1=0;
LED9=1;
delay(100);
LED9=0;
LED2=1;
delay(100);
LED2=0;
LED10=1;
delay(100);
LED10=0;
LED3=1;
delay(100);
LED3=0;
LED11=1;
delay(100);
LED11=0;
LED4=1;
delay(100);
LED4=0;
LED12=1;
delay(100);
LED12=0;
LED5=1;
delay(100);
LED5=0;
LED13=1;
delay(100);
LED13=0;
LED6=1;
delay(100);
LED6=0;
LED14=1;
delay(100);
LED14=0;
LED7=1;
delay(100);
LED7=0;
LED15=1;
delay(100);
LED15=0;
LED8=1;
delay(100);
LED8=0;
LED16=1;
delay(100);
LED16=0;
}
flag=0;
break;
default:
break;
}
}
}
```
在上述代码中,我们通过三个按键来控制LED的亮灭,其中KEY1控制第一组流水灯往返闪烁,KEY2控制第二组流水灯往返闪烁,KEY3控制两组流水灯同时往返闪烁。当按下某个按键后,会设置标志位flag,然后根据标志位的值来执行相应的操作。
需要注意的是,由于8051单片机的时钟频率较低,因此需要通过延时函数来控制LED的亮灭。在本例中,我们使用了一个简单的延时函数,通过循环计数的方式来实现延时。由于循环次数的不同,延时的时间也不同,因此需要根据实际情况来调整延时函数的参数,以达到预期的效果。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)