51单片机流水灯实现循环左移,循环右移,奇偶闪烁
时间: 2023-09-27 15:05:38 浏览: 119
用51单片机控制流水灯的各种闪
好的,以下是51单片机控制8个灯的流水灯程序,可以实现循环左移、循环右移、奇偶闪烁等效果:
```
#include<reg51.h>
// 灯的状态
unsigned char light[8] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};
// 延时函数
void delay(unsigned int t)
{
unsigned int i, j;
for (i = 0; i < t; i++)
for (j = 0; j < 120; j++);
}
// 循环左移函数
void shiftLeft()
{
unsigned char i;
unsigned char temp = light[0];
for (i = 0; i < 7; i++)
light[i] = light[i+1];
light[7] = temp;
}
// 循环右移函数
void shiftRight()
{
unsigned char i;
unsigned char temp = light[7];
for (i = 7; i > 0; i--)
light[i] = light[i-1];
light[0] = temp;
}
// 奇偶闪烁函数
void oddEvenBlink()
{
unsigned char i;
for (i = 0; i < 8; i++)
{
if (i % 2 == 0)
light[i] = 0x00;
else
light[i] = 0xFF;
}
}
// 主函数
void main()
{
unsigned char i, j;
while (1)
{
// 循环左移
for (i = 0; i < 8; i++)
{
P1 = light[i];
delay(50);
shiftLeft();
}
// 循环右移
for (i = 0; i < 8; i++)
{
P1 = light[i];
delay(50);
shiftRight();
}
// 奇偶闪烁
for (i = 0; i < 8; i++)
{
P1 = light[i];
delay(50);
}
oddEvenBlink();
for (i = 0; i < 8; i++)
{
P1 = light[i];
delay(50);
}
oddEvenBlink();
// 停止一段时间
delay(1000);
}
}
```
该程序中新增了三个函数:`shiftLeft()`、`shiftRight()`和`oddEvenBlink()`,分别实现了循环左移、循环右移和奇偶闪烁的功能。主函数中通过调用这些函数实现了不同的流水灯效果。需要注意的是,为了实现循环移位的效果,程序中使用了一个临时变量`temp`来保存灯的状态。
阅读全文