制作流水灯,原理电路见下图,8个发光二极管LED0~LED7经限流电阻分别接至P1口的P1.0~P1.7引脚上,阳极共同接高电平。编写程序来控制发光二极管由下至上的反复循环流水点亮,每次点亮一个发光二极管。(要求用循环移位函数及数组两种方法编程)51单片机
时间: 2024-10-16 16:17:53 浏览: 45
单片机课程设计—8个按键控制8个LED自动设定控制流水灯.doc
制作流水灯的基本原理是利用51单片机的I/O口P1来控制LED灯,通过逐个改变每个LED的连接状态达到轮流点亮的效果。这里我们有两種方法:
**方法一:使用循环移位函数**
首先,你需要设置一个数组来代表LED的状态,比如`unsigned char ledArray[8] = {0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40};`,然后使用循环结构和位操作(如左移位)来改变数组,模拟LED的亮灭。
```c
#include <reg52.h>
sbit LED0 = P1^0; // 将LED0映射到P1.0
void displayLed(int index) {
ledArray[index] = (ledArray[index] << 1) | 0x01; // 左移一位并置最高位
if(index == 7) { // 如果到达最后一个LED,重置回第一个
LED0 = ~ledArray[0]; // 翻转第一个LED关闭其他
} else {
LED0 = ledArray[index]; // 只打开当前LED
}
}
int main(void) {
unsigned char i;
for(i = 0; i < 8; ++i) {
delay_ms(50); // 暂停一段时间以便观察
displayLed(i);
}
while(1); // 无限循环保持流水灯效果
}
```
**方法二:使用数组和for循环**
另一种方法是直接用数组和for循环控制LED灯的状态。初始化LED状态,然后在一个循环中更新LED状态,并将索引递增。
```c
#include <reg52.h>
sbit LED[8] = {P1^0, P1^1, P1^2, P1^3, P1^4, P1^5, P1^6, P1^7};
void setNextLed() {
LED[(index + 1) % 8] = 1; // 更新下一个LED为1,取模防止超出范围
LED[index] = 0; // 关闭当前LED
}
void main(void) {
int index = 0;
for(;;) {
setNextLed();
delay_ms(50); // 暂停一段时间
}
}
```
在这个例子中,`delay_ms(50)`用于延长每个LED的点亮时间,让视觉上有流动的效果。
阅读全文