基于51单片机写一个流水灯
时间: 2023-12-07 22:03:12 浏览: 31
以下是基于51单片机的流水灯代码:
```c
#include <reg51.h>
void main() {
unsigned char i;
while(1) {
for (i = 0; i < 8; i++) {
P1 = (1 << i);
delay(500);
}
}
}
void delay(unsigned int time) {
unsigned int i, j;
for (i = 0; i < time; i++) {
for (j = 0; j < 125; j++);
}
}
```
解释:
1. 首先,定义了一个无限循环的 `while` 循环。
2. 在循环中,使用一个 `for` 循环,依次点亮 P1 端口的每个 LED 灯,实现了流水灯的效果。
3. `delay` 函数用于添加延时,参数 `time` 指定了延时时间,单位为毫秒。在该函数中,使用了两个嵌套的 `for` 循环来实现延时,具体的延时时间需要根据实际情况进行调整。
注意:该代码中的 P1 端口需要连接到 8 个 LED 灯,且需要通过外部电路提供适当的电流限制保护。
相关问题
基于51单片机写按键控制流水灯
好的,下面是一段基于51单片机的按键控制流水灯的代码:
```c
#include <reg52.h> // 引入51单片机头文件
sbit LED1 = P2^0; // 定义LED1引脚,P2.0
sbit LED2 = P2^1; // 定义LED2引脚,P2.1
sbit LED3 = P2^2; // 定义LED3引脚,P2.2
sbit LED4 = P2^3; // 定义LED4引脚,P2.3
sbit KEY = P3^2; // 定义按键引脚,P3.2
void main() {
unsigned char flag = 0; // 定义标志变量,用于控制流水灯的移动
unsigned char i = 0; // 定义计数器变量,用于控制流水灯的亮灭
LED1 = LED2 = LED3 = LED4 = 0; // 将所有LED引脚设置为输出模式,并且初始化为低电平
KEY = 1; // 将按键引脚设置为输入模式,并且初始化为高电平
while (1) { // 进入主循环
if (KEY == 0) { // 如果按键被按下
flag++; // 标志变量自增1
if (flag > 3) { // 如果标志变量大于3,则重置为0,从头开始移动流水灯
flag = 0;
}
switch (flag) { // 根据标志变量的不同值,控制不同的流水灯效果
case 0: // LED1 -> LED2 -> LED3 -> LED4 -> LED1 ...
for (i = 0; i < 4; i++) {
switch (i) {
case 0:
LED1 = 1;
LED2 = LED3 = LED4 = 0;
break;
case 1:
LED2 = 1;
LED1 = LED3 = LED4 = 0;
break;
case 2:
LED3 = 1;
LED1 = LED2 = LED4 = 0;
break;
case 3:
LED4 = 1;
LED1 = LED2 = LED3 = 0;
break;
default:
break;
}
delay(200); // 延时一段时间,控制流水灯的移动速度
}
break;
case 1: // LED1 -> LED3 -> LED2 -> LED4 -> LED1 ...
for (i = 0; i < 4; i++) {
switch (i) {
case 0:
LED1 = 1;
LED2 = LED4 = 0;
LED3 = 1;
break;
case 1:
LED1 = LED4 = 0;
LED2 = 1;
LED3 = 1;
break;
case 2:
LED1 = LED3 = 0;
LED2 = 1;
LED4 = 1;
break;
case 3:
LED2 = LED3 = 0;
LED1 = 1;
LED4 = 1;
break;
default:
break;
}
delay(200);
}
break;
case 2: // LED1 -> LED4 -> LED3 -> LED2 -> LED1 ...
for (i = 0; i < 4; i++) {
switch (i) {
case 0:
LED1 = LED2 = LED3 = 0;
LED4 = 1;
break;
case 1:
LED1 = LED2 = 0;
LED3 = 1;
LED4 = 1;
break;
case 2:
LED1 = 0;
LED2 = LED3 = 1;
LED4 = 1;
break;
case 3:
LED2 = LED3 = LED4 = 0;
LED1 = 1;
break;
default:
break;
}
delay(200);
}
break;
case 3: // LED1 -> LED4 -> LED2 -> LED3 -> LED1 ...
for (i = 0; i < 4; i++) {
switch (i) {
case 0:
LED1 = LED2 = LED3 = 0;
LED4 = 1;
break;
case 1:
LED1 = LED3 = 0;
LED2 = 1;
LED4 = 1;
break;
case 2:
LED1 = LED4 = 0;
LED2 = 1;
LED3 = 1;
break;
case 3:
LED2 = LED4 = 0;
LED1 = 1;
LED3 = 1;
break;
default:
break;
}
delay(200);
}
break;
default:
break;
}
}
}
}
void delay(unsigned int time) { // 延时函数
unsigned int i, j;
for (i = 0; i < time; i++) {
for (j = 0; j < 125; j++);
}
}
```
这段代码中,我们定义了四个LED引脚`LED1`、`LED2`、`LED3`、`LED4`和一个按键引脚`KEY`,并将所有LED引脚设置为输出模式,并初始化为低电平;将按键引脚设置为输入模式,并初始化为高电平。在主循环中,我们不断读取按键的状态,并根据状态控制流水灯的亮灭。当按键被按下时,我们先将标志变量`flag`自增1,然后根据不同的标志变量的值,控制不同的流水灯效果。具体实现可以参考代码中的注释。最后,我们使用一个延时函数`delay()`来控制流水灯的移动速度。
写一个基于51单片机的两组流水灯
以下是基于51单片机的两组流水灯代码:
```
#include <reg51.h>
void delay(unsigned int time) {
unsigned int i, j;
for(i = 0; i < time; i++) {
for(j = 0; j < 125; j++);
}
}
void main() {
unsigned char i;
while(1) {
for(i = 0x01; i <= 0x80; i <<= 1) {
P1 = i;
delay(200);
}
for(i = 0x80; i >= 0x01; i >>= 1) {
P1 = i;
delay(200);
}
for(i = 0x01; i <= 0x80; i <<= 1) {
P2 = i;
delay(200);
}
for(i = 0x80; i >= 0x01; i >>= 1) {
P2 = i;
delay(200);
}
}
}
```
其中,P1和P2分别代表两组灯的控制端口,通过for循环控制灯的亮灭顺序,delay函数用于延时控制流水灯效果。注意,需要根据硬件连接情况修改控制端口。