51单片机往返流水灯代码
时间: 2023-11-12 17:03:35 浏览: 170
以下是51单片机往返流水灯的代码实现:
```c
#include<reg52.h>
void Delay(int xms);
void main()
{
char i;
while(1)
{
//LED灯自上而下亮
for(i=0;i<8;i++)
{
P1=~(0x01 << i);
Delay(100);
}
//LED灯自下而上亮
for(i=0;i<8;i++)
{
P1=~(0x80 >> i);
Delay(100);
}
}
}
void Delay(int xms) //xms控制函数循环次数,一次延时1ms
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
```
该代码实现了51单片机往返流水灯的效果,即LED灯从上到下依次亮起,然后从下到上依次亮起,如此往复。其中,通过Delay函数实现了延时效果,使得LED灯的亮灭有一定的时间间隔。
相关问题
c51实现往返流水灯代码
C51单片机实现往返流水灯代码可以通过以下步骤实现:
1. 定义需要使用的IO口,例如P1口,可以定义为: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;
2. 初始化端口,例如可以在主函数中使用LED1-LED8对应的IO口设置为输出模式,例如:LED1=LED2=LED3=LED4=LED5=LED6=LED7=LED8=0;
3. 编写流水灯往返的代码,例如:
void main() {
unsigned char i, j;
while (1) {
for (i = 0; i < 8; i++) {
LED1 = LED2 = LED3 = LED4 = LED5 = LED6 = LED7 = LED8 = 0;
switch (i) {
case 0: LED1 = 1; break;
case 1: LED2 = 1; break;
case 2: LED3 = 1; break;
case 3: LED4 = 1; break;
case 4: LED5 = 1; break;
case 5: LED6 = 1; break;
case 6: LED7 = 1; break;
case 7: LED8 = 1; break;
}
for (j = 0; j < 20; j++) {
delay(100);
}
}
for (i = 7; i > 0; i--) {
LED1 = LED2 = LED3 = LED4 = LED5 = LED6 = LED7 = LED8 = 0;
switch (i) {
case 0: LED1 = 1; break;
case 1: LED2 = 1; break;
case 2: LED3 = 1; break;
case 3: LED4 = 1; break;
case 4: LED5 = 1; break;
case 5: LED6 = 1; break;
case 6: LED7 = 1; break;
case 7: LED8 = 1; break;
}
for (j = 0; j < 20; j++) {
delay(100);
}
}
}
}
4. 程序中delay函数需要自行编写,例如可以使用以下代码实现:
void delay(unsigned int t) {
unsigned int i, j;
for (i = t; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
8051单片机+三个按 钮输入, 输出为两组每组8个的 流水灯往返闪烁
以下是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的亮灭。在本例中,我们使用了一个简单的延时函数,通过循环计数的方式来实现延时。由于循环次数的不同,延时的时间也不同,因此需要根据实际情况来调整延时函数的参数,以达到预期的效果。
阅读全文