51单片机实现流水灯完整c语言代码
时间: 2023-06-25 20:05:11 浏览: 144
下面是一个基于51单片机的流水灯的完整C语言代码:
```c
#include <reg51.h>
#define LED P0 // 将P0端口定义为LED输出端口
sbit KEY1 = P1^0; // 定义按键1的输入端口
sbit KEY2 = P1^1; // 定义按键2的输入端口
sbit KEY3 = P1^2; // 定义按键3的输入端口
sbit KEY4 = P1^3; // 定义按键4的输入端口
void delay(unsigned int t) // 延时函数
{
unsigned int i, j;
for(i = t; i > 0; i--)
for(j = 110; j > 0; j--);
}
void main()
{
unsigned char flag = 0; // 定义标志位
LED = 0xfe; // 初始状态下,P0口输出11111110,即只有第一个LED亮
while(1) // 主循环
{
if(KEY1 == 0) // 按键1按下
{
delay(100); // 延时去抖动
if(KEY1 == 0) // 确认按键1按下
{
flag = 0; // 标志位清零
LED = 0xfe; // 初始状态下,P0口输出11111110,即只有第一个LED亮
}
}
if(KEY2 == 0) // 按键2按下
{
delay(100); // 延时去抖动
if(KEY2 == 0) // 确认按键2按下
{
flag = 1; // 标志位置1,表示正向流水灯
}
}
if(KEY3 == 0) // 按键3按下
{
delay(100); // 延时去抖动
if(KEY3 == 0) // 确认按键3按下
{
flag = 2; // 标志位置2,表示反向流水灯
}
}
if(KEY4 == 0) // 按键4按下
{
delay(100); // 延时去抖动
if(KEY4 == 0) // 确认按键4按下
{
flag = 3; // 标志位置3,表示所有LED同时亮
LED = 0xff; // 所有LED同时亮
}
}
switch(flag) // 根据标志位来判断流水灯的方向
{
case 0: // 初始状态下,只有第一个LED亮
break;
case 1: // 正向流水灯
LED = LED << 1; // 左移一位
if(LED == 0xff) // 如果所有LED都亮了,则从头开始
LED = 0xfe;
break;
case 2: // 反向流水灯
LED = LED >> 1; // 右移一位
if(LED == 0x7f) // 如果所有LED都亮了,则从头开始
LED = 0xfe;
break;
case 3: // 所有LED同时亮
break;
}
delay(500); // 延时一段时间,以控制LED灯的闪烁速度
}
}
```
该代码中使用了51单片机的GPIO口来控制LED的亮灭,并通过按键输入来控制流水灯的流动方向。其中,flag是一个标志位,用来记录当前流水灯的状态。根据不同的状态,通过左移、右移等操作来控制LED的亮灭情况。同时,为了控制LED灯的闪烁速度,还使用了一个延时函数。
阅读全文