求51单片机复杂流水灯问题代码c语言

设计实现编程实现LED依次从左到右点亮,再依次从右到左熄灭,然后所有LED灯闪
烁5次,再分别实现P1口奇数位和偶数位交替闪烁5次,如此循环。每次亮灭间隔大
约1秒。

参考GPT和自己的思路:以下是51单片机复杂流水灯问题的代码,实现了LED依次从左到右点亮,再依次从右到左熄灭,然后所有LED灯闪烁5次,最后实现P1口奇数位和偶数位交替闪烁5次,如此循环。每次亮灭间隔大约1秒。

#include <reg52.h>

typedef unsigned char uchar;
typedef unsigned int uint;

sbit led1 = P2^0;
sbit led2 = P2^1;
sbit led3 = P2^2;
sbit led4 = P2^3;
sbit led5 = P2^4;
sbit led6 = P2^5;
sbit led7 = P2^6;
sbit led8 = P2^7;

void delay(uint i) // 延时函数
{
    uint j;
    while(i--)
        for(j=0; j<125; j++);
}

void flash(uint n) // 所有LED灯闪烁n次
{
    uint i, j;
    for(i=0; i<n; i++)
    {
        for(j=0; j<8; j++)
        {
            P2 = ~(1 << j);
        }
        delay(500);
        P2 = 0xff;
        delay(500);
    }
}

void odd_even_flash(uint n) // P1口奇数位和偶数位交替闪烁n次
{
    uint i, j;
    for(i=0; i<n; i++)
    {
        for(j=0; j<8; j+=2)
        {
            P1 = ~(1 << j);
            delay(500);
        }
        P1 = 0xff;
        for(j=1; j<8; j+=2)
        {
            P1 = ~(1 << j);
            delay(500);
        }
        P1 = 0xff;
    }
}

void main()
{
    uint i;

    // LED依次从左到右点亮
    for(i=0; i<8; i++)
    {
        P2 = ~(0xff << i);
        delay(200);
    }

    // LED依次从右到左熄灭
    for(i=0; i<8; i++)
    {
        P2 = ~(0xff >> i);
        delay(200);
    }

    // 所有LED灯闪烁5次
    flash(5);

    // P1口奇数位和偶数位交替闪烁5次
    odd_even_flash(5);

    while(1);
}

#include <reg51.h> // 引入8051单片机头文件

// 定义LED灯连接的IO口
#define LED P2

// 定义等待时间函数,延时约1秒
void delay() {
    unsigned int i, j;
    for (i = 0; i < 20; i++) { // 嵌套循环实现大约1秒的延时
        for (j = 0; j < 65535; j++);
    }
}

void main() {
    unsigned int i;

    while(1) {
        // 依次点亮LED从左到右
        for (i = 0; i < 8; i++) {
            LED = 0x01 << i;
            delay();
        }

        // 依次熄灭LED从右到左
        for (i = 7; i >= 0; i--) {
            LED = 0x01 << i;
            delay();
        }

        // 所有LED闪烁5次
        for (i = 0; i < 5; i++) {
            LED = 0xff; // 全部点亮
            delay();
            LED = 0x00; // 全部熄灭
            delay();
        }

        // P1口奇数位和偶数位交替闪烁5次
        for (i = 0; i < 5; i++) {
            LED = 0x55; // 奇数位点亮
            delay();
            LED = 0xaa; // 偶数位点亮
            delay();
        }
    }
}

8051单片机的GPIO口控制LED的点亮和熄灭。其中,依次点亮和熄灭LED的过程通过循环和位运算实现,所有LED闪烁的过程通过循环和全局变量实现。而交替闪烁的过程则通过设置不同的二进制位实现。程序的主循环通过不停地执行各种灯光效果,实现了按照要求循环执行不同的LED控制动作。

该回答引用ChatGPT

以下是实现该功能的C语言程序,需要在51单片机上编译运行:


#include <reg51.h>

#define LED P2  //LED连接的端口

void delay(unsigned int time) {  //延时函数
  unsigned int i, j;
  for (i = 0; i < time; i++) {
    for (j = 0; j < 125; j++);
  }
}

void main() {
  unsigned int i, j;
  while (1) {  //无限循环
    //依次从左到右点亮
    for (i = 0; i < 8; i++) {
      LED = ~(0x01 << i);
      delay(1000);
    }
    //依次从右到左熄灭
    for (i = 7; i >= 0; i--) {
      LED = ~(0x01 << i);
      delay(1000);
    }
    //所有LED灯闪烁5次
    for (i = 0; i < 5; i++) {
      LED = 0xFF;
      delay(500);
      LED = 0x00;
      delay(500);
    }
    //P1口奇数位和偶数位交替闪烁5次
    for (i = 0; i < 5; i++) {
      for (j = 0; j < 8; j += 2) {
        LED = ~(0x01 << j);
        delay(500);
        LED = ~(0x01 << (j + 1));
        delay(500);
      }
    }
  }
}

解释:

该程序通过循环控制LED灯的点亮、熄灭、闪烁等操作,其中 delay() 函数实现了延时,因为单片机执行程序非常快,需要加入适当的延时来控制LED灯的亮灭时间。程序中用到了移位运算符和按位取反运算符,对LED灯的状态进行控制。循环的次数通过计数器变量 i 和 j 实现。程序运行时,通过无限循环实现LED灯的不断变换。


int led = 0; // 声明LED灯变量
for (int i = 0; i < 5; i++) {
  for (int j = 0; j < 8; j++) {
    led |= 1 << j; // 设置灯从左到右依次亮起
    delay(1000); // 延时1秒
  }

  for (int k = 7; k >= 0; k--) {
    led &= ~(1 << k); // 设置灯从右到左依次熄灭
    delay(1000); // 延时1秒
  }
}

// 所有LED灯闪烁5for (int m = 0; m < 5; m++) {
  led = 0xff; // 设置全部LED灯亮起
  delay(500); // 延时0.5秒
  led = 0x00; // 设置全部LED灯熄灭
  delay(500); // 延时0.5秒
}

// 实现P1口奇数位和偶数位交替闪烁5次,如此循环
while (1) {
  for (int n = 0; n < 5; n++) {
    led = 0xaa; // 设置P1口奇数位灯亮起
    delay(500); // 延时0.5秒
    led = 0x55; // 设置P1口偶数位灯亮起
    delay(500); // 延时0.5秒
  }
}
```c


```

“Devil组”引证GPT后的撰写:

#include <reg52.h> // 51单片机头文件

#define LED P0 // 定义LED灯所接的端口为P0

void delay(unsigned int t) // 自定义延时函数,t为延时时间
{
    unsigned int i, j;
    for (i = t; i > 0; i--)
        for (j = 110; j > 0; j--);
}

void main()
{
    int i, j;

    while (1) // 循环执行
    {
        // LED从左到右点亮
        for (i = 0; i < 8; i++)
        {
            LED = 0x01 << i; // 依次点亮LED
            delay(1000); // 延时1秒
        }

        // LED从右到左熄灭
        for (i = 7; i >= 0; i--)
        {
            LED = 0x01 << i; // 依次熄灭LED
            delay(1000); // 延时1秒
        }

        // 所有LED灯闪烁5for (j = 0; j < 5; j++)
        {
            LED = 0xFF; // 全部点亮LED
            delay(500); // 延时0.5秒
            LED = 0x00; // 全部熄灭LED
            delay(500); // 延时0.5秒
        }

        // P1口奇数位和偶数位交替闪烁5for (j = 0; j < 5; j++)
        {
            for (i = 0; i < 8; i++)
            {
                if (i % 2 == 0) // 偶数位
                    P1 = 0x01 << i; // 点亮
                else // 奇数位
                    P1 = ~(0x01 << i); // 熄灭
            }
            delay(500); // 延时0.5for (i = 0; i < 8; i++)
            {
                if (i % 2 == 0) // 偶数位
                    P1 = ~(0x01 << i); // 熄灭
                else // 奇数位
                    P1 = 0x01 << i; // 点亮
            }
            delay(500); // 延时0.5秒
        }
    }
}

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
以下是51单片机复杂流水灯问题的代码实现。这里使用的是C语言对51单片机进行编程,使用了延时函数和控制IO口的语句,实现了LED闪烁的功能,具体如下:

#include<reg51.h> 

sbit LED1 = P1^0;    //定义各个LED灯
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;

void delay(unsigned int xms)    //延时函数
{
    unsigned int i,j;
    for(i=xms;i>0;i--)
    {
        for(j=112;j>0;j--)
        {
        }
    }
}

void main()    //主函数
{
    while(1)    //一直循环
    {
        unsigned char i;

        /* LED依次从左到右点亮,再依次从右到左熄灭 */
        for(i=0;i<8;i++)    //LED点亮循环
        {
            switch(i)
            {
                case 0: LED1=0;LED8=1;break;    //打开LED1,关闭LED8
                case 1: LED2=0;LED1=1;break;
                case 2: LED3=0;LED2=1;break;
                case 3: LED4=0;LED3=1;break;
                case 4: LED5=0;LED4=1;break;
                case 5: LED6=0;LED5=1;break;
                case 6: LED7=0;LED6=1;break;
                case 7: LED8=0;LED7=1;break;
            }
            delay(1000);    //延时1秒
        }
        for(i=0;i<8;i++)    //LED熄灭循环
        {
            switch(i)
            {
                case 0: LED8=0;LED7=1;break;    //打开LED7,关闭LED8
                case 1: LED7=0;LED6=1;break;
                case 2: LED6=0;LED5=1;break;
                case 3: LED5=0;LED4=1;break;
                case 4: LED4=0;LED3=1;break;
                case 5: LED3=0;LED2=1;break;
                case 6: LED2=0;LED1=1;break;
                case 7: LED1=0;LED8=1;break;
            }
            delay(1000);
        }

        /* 所有LED灯闪烁5次 */
        unsigned char j;
        for(j=0;j<5;j++)    //LED循环闪烁
        {
            LED1=LED2=LED3=LED4=LED5=LED6=LED7=LED8=0;    //关闭全部LED
            delay(500);    //延时0.5秒
            LED1=LED2=LED3=LED4=LED5=LED6=LED7=LED8=1;    //打开全部LED
            delay(500);
        }

        /* P1口奇数位和偶数位交替闪烁5次 */
        unsigned char k;
        for(k=0;k<5;k++)    //倒计时5次
        {
            LED1=LED3=LED5=LED7=0;    //关闭奇数位
            LED2=LED4=LED6=LED8=1;    //打开偶数位
            delay(500);
            LED1=LED3=LED5=LED7=1;
            LED2=LED4=LED6=LED8=0;
            delay(500);
        }
    }
}

这里注意到,延时函数的值与实际硬件对实现的细节相关,需要根据实际情况进行调整。
如果我的回答解决了您的问题,请采纳!

#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit LED1 = P2^0; // 定义LED1
sbit LED2 = P2^1; // 定义LED2
sbit LED3 = P2^2; // 定义LED3
sbit LED4 = P2^3; // 定义LED4
sbit LED5 = P2^4; // 定义LED5
sbit LED6 = P2^5; // 定义LED6
sbit LED7 = P2^6; // 定义LED7
sbit LED8 = P2^7; // 定义LED8
void delay(uint xms) // 延时函数,xms表示延时的毫秒数
{
    uint i, j;
    for (i = xms; i > 0; i--)
        for (j = 110; j > 0; j--);
}
void LED_Left_Right(void) // LED依次从左到右点亮,再依次从右到左熄灭
{
    uchar i;
    for (i = 0; i < 8; i++) // 从左到右点亮
    {
        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;
        }
        delay(1000); // 延时1秒
    }
    for (i = 7; i >= 0; i--) // 从右到左熄灭
    {
        switch (i)
        {
            case 0: LED1 = 0; break;
            case 1: LED2 = 0; break;
            case 2: LED3 = 0; break;
            case 3: LED4 = 0; break;
            case 4: LED5 = 0; break;
            case 5: LED6 = 0; break;
            case 6: LED7 = 0; break;
            case 7: LED8 = 0; break;
        }
        delay(1000); // 延时1秒
    }
}
void LED_Flash(void) // 所有LED灯闪烁5次
{
    uchar i, j;
    for (i = 0; i < 5; i++) // 闪烁5次
    {
        for (j = 0; j < 8; j++)
        {
            switch (j)
            {
                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;
            }
        }
        delay(500); // 延时0.5秒
        for (j = 0; j < 8; j++)
        {
            switch (j)
            {
                case 0: LED1 = 0; break;
                case 1: LED2 = 0; break;
                case 2: LED3 = 0; break;
                case 3: LED4 = 0; break;
                case 4: LED5 = 0; break;
                case 5: LED6 = 0; break;
                case 6: LED7 = 0; break;
                case 7: LED8 = 0; break;
            }
        }
        delay(500); // 延时0.5秒
    }
}
void LED_Alternate(void) // P1口奇数位和偶数位交替闪烁5次
{
    uchar i, j;
    for (i = 0; i < 5; i++) // 交替闪烁5次
    {
        for (j = 0; j < 8; j++)
        {
            switch (j)
            {
                case 0: LED1 = 1; break;
                case 2: LED3 = 1; break;
                case 4: LED5 = 1; break;
                case 6: LED7 = 1; break;
            }
        }
        delay(500); // 延时0.5秒
        for (j = 0; j < 8; j++)
        {
            switch (j)
            {
                case 0: LED1 = 0; break;
                case 2: LED3 = 0; break;
                case 4: LED5 = 0; break;
                case 6: LED7 = 0; break;
            }
        }
        delay(500); // 延时0.5秒
        for (j = 0; j < 8; j++)
        {
            switch (j)
            {
                case 1: LED2 = 1; break;
                case 3: LED4 = 1; break;
                case 5: LED6 = 1; break;
                case 7: LED8 = 1; break;
            }
        }
        delay(500); // 延时0.5秒
        for (j = 0; j < 8; j++)
        {
            switch (j)
            {
                case 1: LED2 = 0; break;
                case 3: LED4 = 0; break;
                case 5: LED6 = 0; break;
                case 7: LED8 = 0; break;
            }
        }
        delay(500); // 延时0.5秒
    }
}
void main()
{
    while (1)
    {
        LED_Left_Right(); // LED依次从左到右点亮,再依次从右到左熄灭
        LED_Flash(); // 所有LED灯闪烁5次
        LED_Alternate(); // P1口奇数位和偶数位交替闪烁5次
    }
}


你的问题解决分三步,1. 配置好各个LED的硬件配置, 2. 建立一个流程表,确定从开始到结束的led灯组变换规律输出值
3. 一个循环,依次控制LED灯组的输出,控制好延时。ok了