开发版小张 2023-09-23 23:14 采纳率: 0%
浏览 10
已结题

蓝桥杯c51单片机问题

蓝桥杯c51实现这个功能。
实现LED小灯(L1~L8)组成的流水灯效果,并利用按键控制方向,
a)按S4,流水灯走左往右,
b)按S5,流水灯走右往左,
c)按S6,流水灯从中间往两边
d)按S7,流水灯熄灭
#单片机

  • 写回答

15条回答 默认 最新

  • 专家-赤兔[在线] 2023-09-23 23:17
    关注
    获得0.45元问题酬金

    引用 皆我百晓生 小程序回复内容作答:

    下面是一个使用C语言在蓝桥杯C51单片机上实现该功能的示例代码:

    #include <reg51.h>
    
    #define uint unsigned int
    #define uchar unsigned char
    
    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;
    
    sbit S4 = P3^2;
    sbit S5 = P3^3;
    sbit S6 = P3^4;
    sbit S7 = P3^5;
    
    void delay(uint ms)   //延时函数
    {
        uint i, j;
        for(i=ms;i>0;i--)
            for(j=110;j>0;j--);
    }
    
    void main()
    {
        while(1)
        {
            if(S4==0)   //按下S4,流水灯从左往右
            {
                LED1 = 0;
                delay(100);
                LED1 = 1;
                LED2 = 0;
                delay(100);
                LED2 = 1;
    
                //...
                //依次控制其他灯的显示状态,以此类推
            }
            else if(S5==0)   //按下S5,流水灯从右往左
            {
                LED8 = 0;
                delay(100);
                LED8 = 1;
                LED7 = 0;
                delay(100);
                LED7 = 1;
    
                //...
                //依次控制其他灯的显示状态,以此类推
            }
            else if(S6==0)   //按下S6,流水灯从中间往两边
            {
                LED4 = 0;
                delay(100);
                LED4 = 1;
                LED5 = 0;
                delay(100);
                LED5 = 1;
                LED3 = 0;
                delay(100);
                LED3 = 1;
                LED6 = 0;
                delay(100);
                LED6 = 1;
    
                //...
                //依次控制其他灯的显示状态,以此类推
            }
            else if(S7==0)   //按下S7,流水灯熄灭
            {
                LED1 = 1;
                LED2 = 1;
                LED3 = 1;
                LED4 = 1;
                LED5 = 1;
                LED6 = 1;
                LED7 = 1;
                LED8 = 1;
            }
        }
    }
    

    在以上代码中,我们使用了P2口的8个引脚来控制8个LED灯的显示状态。而使用P3口的4个引脚来检测按键输入。

    当按下不同的按键时,根据按键的状态不同,控制LED灯的显示状态达到不同的效果。其中函数delay()用来实现延时效果,从而让LED灯的变化能够被人眼感知到。

    请注意,此示例代码仅为参考,实际运行时可能需要根据硬件连接和开发环境做一些调整。另外,此示例代码只实现了按键功能,并没有添加其他逻辑,如当按键按下后需要保持持续亮灭的效果等。如有需要,请根据实际需求修改代码。

    评论
  • 忧伤的玩不起 2023-09-23 23:28
    关注
    获得0.30元问题酬金

    蓝桥杯居然都有单片机比赛项目了么,我以前只有C和JAVA

    #include <reg52.h>
    
    // 定义流水灯的8个LED灯的引脚
    sbit L1 = P1^0;
    sbit L2 = P1^1;
    sbit L3 = P1^2;
    sbit L4 = P1^3;
    sbit L5 = P1^4;
    sbit L6 = P1^5;
    sbit L7 = P1^6;
    sbit L8 = P1^7;
    
    // 定义按键引脚
    sbit S4 = P2^0; // 流水灯向右
    sbit S5 = P2^1; // 流水灯向左
    sbit S6 = P2^2; // 流水灯中间往两边
    sbit S7 = P2^3; // 熄灭流水灯
    
    void delay() {
        unsigned int i;
        for (i = 0; i < 500; i++);
    }
    
    void main() {
        unsigned char led_sequence[8] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};
        unsigned char i;
    
        while (1) {
            if (S4 == 0) { // 按下S4,流水灯走左往右
                for (i = 0; i < 8; i++) {
                    P1 = led_sequence[i];
                    delay();
                }
            } else if (S5 == 0) { // 按下S5,流水灯走右往左
                for (i = 7; i > 0; i--) {
                    P1 = led_sequence[i];
                    delay();
                }
            } else if (S6 == 0) { // 按下S6,流水灯从中间往两边
                for (i = 0; i < 4; i++) {
                    P1 = led_sequence[i] & led_sequence[7 - i];
                    delay();
                }
            } else if (S7 == 0) { // 按下S7,流水灯熄灭
                P1 = 0xFF;
            }
        }
    }
    

    在这个简洁的代码示例中,我们使用了一个数组led_sequence存储流水灯的灯光序列。根据按钮的选择,我们使用循环遍历数组并依次点亮或关闭LED灯。delay()函数仍然用于添加一定的延迟。

    评论 编辑记录
  • 数据大魔王 2023-09-23 23:51
    关注
    获得0.60元问题酬金

    根据您的需求,可以使用C语言编写程序实现LED小灯(L1~L8)组成的流水灯效果,并利用按键控制方向。以下是一个可能的实现

    #include <reg51.hsbit1 = P1^0sbit LED2 = P1^1sbit3 = P1^2sbit LED4 = P1^3sbit LED5 P1^4sbit LED6 = P1^5sbit LED7 = P1^6sbit LED8 = P1^7sbit S4 = P2^4; // 左往右sbit S5 = P2^5; // 右往左sbit S6 = P2^6; // 中间往两边sbit S7 = P2^7; // 熄灭// 延时函数void delay(unsigned int ms)    unsigned int i, j    for(i = 0; i < ms; i++)        = 0; j < 120; j++)            // 空循环模拟延时          // 左往右流水灯void leftToRight()    int i    for(i = 0; i < 8; i++)        P1 = ~(1 << i); // 依次点亮LED        delay(500); // 延时500ms   // 右往左流水灯void rightToLeft()    int i    for(i = 7; i >= 0; i--)        P1 = ~(1 << i); // 依次点亮LED        delay(500); // 延时500ms   // 中间往两边流水灯void centerToSides()    i, j    for(i = 3, j = 4; i >= 0 && j 8;1 = ~(0x0F << i); // 依次点亮两边的LED        delay(500); // 延时500ms   // 熄灭流水灯void turnOff()    P1 = 0xFF; // 熄灭所有LEDvoid main()    while(1)        if(S4 == 0)            // 按下S4,流水灯走左往右            leftToRight               else if(S5 == 0)            // 按下S5,流水灯走右往左            rightToLeft               else if(S6 == 0)            // 按下S6,流水灯从中间往两边            centerToSides               else if(S7 == 0)            // 按下S7,流水灯熄灭            turnOff        
    

    以上是一个简单的单片机程序,实现了按键控制LED流水灯的不同方向。根据按下的不同按键,选择对应的流水灯函数进行调用。请确保将单片机连接正确,并根据实际硬件接口进行相应的修改。

    评论 编辑记录
  • 智者知已应修善业 2023-09-24 07:47
    关注
    获得0.60元问题酬金

    这些到我博客都有荔枝不用提问

    评论
  • 杨得江-君临天下wyj 2023-09-24 08:17
    关注
    获得0.45元问题酬金
    
    #include <reg51.h>
    #define uint unsigned int
    #define uchar unsigned char
    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;
    sbit S4 = P3^2;
    sbit S5 = P3^3;
    sbit S6 = P3^4;
    sbit S7 = P3^5;
    void delay(uint ms)   //延时函数
    {
        uint i, j;
        for(i=ms;i>0;i--)
            for(j=110;j>0;j--);
    }
    void main()
    {
        while(1)
        {
            if(S4==0)   //按下S4,流水灯从左往右
            {
                LED1 = 0;
                delay(100);
                LED1 = 1;
                LED2 = 0;
                delay(100);
                LED2 = 1;
                //...
                //依次控制其他灯的显示状态,以此类推
            }
            else if(S5==0)   //按下S5,流水灯从右往左
            {
                LED8 = 0;
                delay(100);
                LED8 = 1;
                LED7 = 0;
                delay(100);
                LED7 = 1;
                //...
                //依次控制其他灯的显示状态,以此类推
            }
            else if(S6==0)   //按下S6,流水灯从中间往两边
            {
                LED4 = 0;
                delay(100);
                LED4 = 1;
                LED5 = 0;
                delay(100);
                LED5 = 1;
                LED3 = 0;
                delay(100);
                LED3 = 1;
                LED6 = 0;
                delay(100);
                LED6 = 1;
                //...
                //依次控制其他灯的显示状态,以此类推
            }
            else if(S7==0)   //按下S7,流水灯熄灭
            {
                LED1 = 1;
                LED2 = 1;
                LED3 = 1;
                LED4 = 1;
                LED5 = 1;
                LED6 = 1;
                LED7 = 1;
                LED8 = 1;
            }
        }
    }
    
    
    评论
  • qllaoda 2023-09-24 08:24
    关注
    获得0.45元问题酬金

    这么基础的题目都不会的话,建议就不要去凑热闹了,多学点基础知识吧。

    评论
  • Jackyin0720 2023-09-24 14:15
    关注
    获得0.45元问题酬金

    参考结合GPT4.0、文心一言,如有帮助,恭请采纳。

    这是一个通用的实现方式,基本实现框架,供你参考:

    #include <reg51.h>  
      
    #define LED P0 //连接LED的IO口  
    #define BUTTON P1 //连接按键的IO口  
      
    void delay(unsigned int time) //延时函数  
    {  
        unsigned int i,j;  
        for(i = 0; i < time; i++)  
            for(j = 0; j < 1275; j++);  
    }  
      
    void main()  
    {  
        while(1)  
        {  
            if(BUTTON & 0x08) //S4按下,流水灯左往右  
            {  
                for(i = 0; i < 8; i++)  
                {  
                    LED = ~(0x01 << i); //将LED的第i位设为高电平,其他位设为低电平  
                    delay(1000); //延时  
                }  
            }  
            else if(BUTTON & 0x10) //S5按下,流水灯右往左  
            {  
                for(i = 7; i >= 0; i--)  
                {  
                    LED = ~(0x01 << i); //将LED的第i位设为高电平,其他位设为低电平  
                    delay(1000); //延时  
                }  
            }  
            else if(BUTTON & 0x20) //S6按下,流水灯从中间往两边  
            {  
                for(i = 3; i >= 0; i--)  
                {  
                    LED = ~(0x0F << i); //将LED的第i位到第i+3位设为高电平,其他位设为低电平  
                    delay(1000); //延时  
                }  
                for(i = 4; i < 8; i++)  
                {  
                    LED = ~(0x0F >> (8-i)); //将LED的第i位到第i+3位设为高电平,其他位设为低电平  
                    delay(1000); //延时  
                }  
            }  
            else if(BUTTON & 0x40) //S7按下,流水灯熄灭  
            {  
                LED = 0x00; //所有LED灯熄灭  
                delay(1000); //延时  
            }  
        }  
    }
    
    
    评论
  • coder_small_bell 2023-09-24 21:27
    关注
    获得0.30元问题酬金

    整个I循环mod一下。

    评论
  • bug菌¹ Java领域优质创作者 2023-09-24 22:03
    关注
    获得0.75元问题酬金

    该回答引用ChatGPT,希望对题主有所帮助,如有帮助,还望采纳。


    以下是蓝桥杯c51单片机实现该功能的代码:

    #include <reg51.h>
    
    sbit L1 = P1^0;
    sbit L2 = P1^1;
    sbit L3 = P1^2;
    sbit L4 = P1^3;
    sbit L5 = P1^4;
    sbit L6 = P1^5;
    sbit L7 = P1^6;
    sbit L8 = P1^7;
    
    sbit S4 = P0^4;
    sbit S5 = P0^5;
    sbit S6 = P0^6;
    sbit S7 = P0^7;
    
    void delay(unsigned int i)
    {
        while(i--);
    }
    
    void main()
    {
        unsigned char dir = 0;   // 0:左往右,1:右往左,2:中往两边
        unsigned char shift = 1; // LED流水灯移动的位数
        unsigned char pattern = 0x81; // LED流水灯模式:10000001
    
        while(1)
        {
            switch(dir)
            {
                case 0: // 左往右
                    pattern <<= shift; // 左移shift位,最高位变为0
                    if(pattern == 0x00) pattern = 0x01; // 如果所有位都移出去了,就重新从第一位开始
                    break;
                case 1: // 右往左
                    pattern >>= shift; // 右移shift位,最低位变为0
                    if(pattern == 0x00) pattern = 0x80; // 如果所有位都移出去了,就重新从最后一位开始
                    break;
                case 2: // 中往两边
                    pattern <<= shift / 2;
                    if(pattern == 0x00) pattern = 0x01; // 如果所有位都移出去了,就重新从第一位开始
                    unsigned char temp = pattern;
                    temp >>= 4 - shift / 2;
                    pattern |= temp; // 把pattern的最高位和最低位同时置1
                    break;
                case 3: // 熄灭
                    pattern = 0x00; // 所有灯都熄灭
                    break;
            }
    
            L1 = pattern & 0x01;
            L2 = pattern & 0x02;
            L3 = pattern & 0x04;
            L4 = pattern & 0x08;
            L5 = pattern & 0x10;
            L6 = pattern & 0x20;
            L7 = pattern & 0x40;
            L8 = pattern & 0x80;
    
            if(S4 == 0) dir = 0; // 左往右
            else if(S5 == 0) dir = 1; // 右往左
            else if(S6 == 0) dir = 2; // 中往两边
            else if(S7 == 0) dir = 3; // 熄灭
    
            delay(10000); // 延时一段时间,控制LED移动的速度
        }
    }
    

    这段代码使用了一个无限循环,不断地改变LED流水灯的模式和方向,并根据按键的状态来控制方向的变化。其中,delay()函数是一个简单的延时函数,用于控制流水灯移动的速度。

    评论
  • 心梓知识 2023-09-24 22:55
    关注
    获得0.45元问题酬金

    结合GPT给出回答如下请题主参考
    下面是一个示例代码:

    #include <reg52.h>
    
    typedef unsigned int uint;
    typedef unsigned char uchar;
    
    sbit L1 = P1^0;
    sbit L2 = P1^1;
    sbit L3 = P1^2;
    sbit L4 = P1^3;
    sbit L5 = P1^4;
    sbit L6 = P1^5;
    sbit L7 = P1^6;
    sbit L8 = P1^7;
    
    sbit S4 = P3^2;
    sbit S5 = P3^3;
    sbit S6 = P3^4;
    
    uint delay_time = 500; // 控制LED流水灯流动速度的延时时间
    uchar direction = 1; // 控制流水灯的方向,1表示从左往右,0表示从右往左
    uchar state = 0; // 控制流水灯方式,0表示从左往右,1表示从右往左,2表示从中间往两边
    
    void delay(uint time)
    {
        uint i, j;
        for (i = 0; i < time; i++)
            for (j = 0; j < 120; j++);
    }
    
    // 将流水灯从左往右移动
    void left_to_right()
    {
        uchar i;
        for (i = 1; i <= 8; i++)
        {
            switch (i)
            {
                case 1: L1 = 1; break;
                case 2: L2 = 1; break;
                case 3: L3 = 1; break;
                case 4: L4 = 1; break;
                case 5: L5 = 1; break;
                case 6: L6 = 1; break;
                case 7: L7 = 1; break;
                case 8: L8 = 1; break;
            }
            delay(delay_time);
            switch (i)
            {
                case 1: L1 = 0; break;
                case 2: L2 = 0; break;
                case 3: L3 = 0; break;
                case 4: L4 = 0; break;
                case 5: L5 = 0; break;
                case 6: L6 = 0; break;
                case 7: L7 = 0; break;
                case 8: L8 = 0; break;
            }
            delay(delay_time);
        }
    }
    
    // 将流水灯从右往左移动
    void right_to_left()
    {
        uchar i;
        for (i = 8; i >= 1; i--)
        {
            switch (i)
            {
                case 1: L1 = 1; break;
                case 2: L2 = 1; break;
                case 3: L3 = 1; break;
                case 4: L4 = 1; break;
                case 5: L5 = 1; break;
                case 6: L6 = 1; break;
                case 7: L7 = 1; break;
                case 8: L8 = 1; break;
            }
            delay(delay_time);
            switch (i)
            {
                case 1: L1 = 0; break;
                case 2: L2 = 0; break;
                case 3: L3 = 0; break;
                case 4: L4 = 0; break;
                case 5: L5 = 0; break;
                case 6: L6 = 0; break;
                case 7: L7 = 0; break;
                case 8: L8 = 0; break;
            }
            delay(delay_time);
        }
    }
    
    // 将流水灯从中间往两边移动
    void middle_to_sides()
    {
        uchar i;
        for (i = 1; i <= 4; i++)
        {
            switch (i)
            {
                case 1: L4 = 1; L5 = 1; break;
                case 2: L3 = 1; L6 = 1; break;
                case 3: L2 = 1; L7 = 1; break;
                case 4: L1 = 1; L8 = 1; break;
            }
            delay(delay_time);
            switch (i)
            {
                case 1: L4 = 0; L5 = 0; break;
                case 2: L3 = 0; L6 = 0; break;
                case 3: L2 = 0; L7 = 0; break;
                case 4: L1 = 0; L8 = 0; break;
            }
            delay(delay_time);
        }
    }
    
    void main()
    {
        while (1)
        {
            // 检测按键并改变流水灯的状态
            if (S4 == 0)
            {
                direction = 1;
                state = 0;
            }
            else if (S5 == 0)
            {
                direction = 0;
                state = 1;
            }
            else if (S6 == 0)
            {
                state = 2;
            }
    
            // 根据流水灯状态和方向来控制LED灯的流动效果
            switch (state)
            {
                case 0: // 从左往右
                    if (direction == 1)
                        left_to_right();
                    else
                        right_to_left();
                    break;
                case 1: // 从右往左
                    if (direction == 1)
                        right_to_left();
                    else
                        left_to_right();
                    break;
                case 2: // 从中间往两边
                    middle_to_sides();
                    break;
            }
        }
    }
    

    在上面的代码中,我们使用了一个 delay() 函数来控制 LED 灯流动速度。该函数接收一个延时时间参数,使用嵌套的循环来等待指定时间的延时。

    main() 函数中,我们不断地循环检测按键状态,根据按键状态来改变流水灯状态和方向。根据流水灯状态和方向来调用不同的函数来控制 LED 灯的流动效果。

    如果按下 S4,那么流水灯会从左往右移动;如果按下 S5,那么流水灯会从右往左移动;如果按下 S6,流水灯会从中间往两边移动。

    评论
  • CSDN-Ada助手 CSDN-AI 官方账号 2023-09-25 00:22
    关注
    获得0.75元问题酬金

    【以下回答由 GPT 生成】

    解决方案:

    首先,我们需要了解一下C51单片机的基本操作,特别是I/O端口的读取和设置。在C语言中,我们可以通过操作特定的寄存器来对I/O端口进行读写操作。

    接下来,我们需要明确流水灯的效果。流水灯是指一系列的LED灯依次点亮或熄灭,形成一个类似水流般移动的效果。

    根据问题要求,我们可以使用8个LED灯分别连接到P1口的8个引脚上,并使用按键连接到P0口的4个引脚上。

    下面是实现以上功能的程序示例:

    #include<reg51.h>   // 包含单片机寄存器定义的头文件
    
    sbit S4 = P0^4;      // 定义按键S4
    sbit S5 = P0^5;      // 定义按键S5
    sbit S6 = P0^6;      // 定义按键S6
    sbit S7 = P0^7;      // 定义按键S7
    
    void delay()  // 延时函数
    {
        unsigned int i,j;
        for(i=0;i<500;i++)
            for(j=0;j<300;j++);
    }
    
    void main()
    {
        unsigned char lights = 0x01;  // 初始流水灯状态,只点亮第一个灯
        unsigned char direction = 0;  // 初始移动方向为左
    
        while(1)
        {
            if(S4 == 0)  // 如果按下S4
            {
                direction = 0;  // 设置移动方向为左
            }
            else if(S5 == 0)  // 如果按下S5
            {
                direction = 1;  // 设置移动方向为右
            }
            else if(S6 == 0)  // 如果按下S6
            {
                direction = 2;  // 设置移动方向为中间向两边
            }
            else if(S7 == 0)  // 如果按下S7
            {
                lights = 0x00;  // 全部熄灭灯
            }
    
            if(direction == 0)  // 左移
            {
                lights <<= 1;  // 左移一位
                if(lights == 0x00)
                {
                    lights = 0x01;  // 当灯全部移出时,重新点亮第一个灯
                }
            }
            else if(direction == 1)  // 右移
            {
                lights >>= 1;  // 右移一位
                if(lights == 0x00)
                {
                    lights = 0x80;  // 当灯全部移出时,重新点亮最后一个灯
                }
            }
            else if(direction == 2)  // 中间向两边
            {
                unsigned char temp = 0x01;
                unsigned char i;
    
                for(i=0;i<8;i++)
                {
                    P1 = lights;
                    delay();
    
                    if(i < 3)
                    {
                        lights <<= 1;  // 左移一位
                    }
                    else if(i >= 3 && i < 5)
                    {
                        lights >>= 1;  // 右移一位
                    }
                    else if(i >= 5 && i < 7)
                    {
                        lights <<= 1;  // 左移一位
                    }
                    else if(i >= 7)
                    {
                        lights >>= 1;  // 右移一位
                    }
                }
    
                lights = temp;
            }
    
            P1 = lights;  // 更新LED灯的状态
            delay();  // 延时一段时间
        }
    }
    

    这段程序使用了循环来控制流水灯的移动,并通过判断按键的状态来设置移动方向和熄灭灯的状态。

    希望以上代码能够帮到你。如果还有其他问题,请随时提问。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论
  • weixin_44961692 2023-09-25 22:19
    关注
    获得0.15元问题酬金

    简单的一些功能可以用智能AI自动生成,你可以使用手机APP讯飞火星生成,如下是我生成的,但对不对需要你自己去识别。
    要实现这个功能,首先需要配置C51单片机的I/O口,然后编写按键扫描函数,根据按键的值来控制流水灯的方向。以下是实现这个功能的步骤和代码:

    配置C51单片机的I/O口,将LED小灯(L1~L8)连接到P1口的8个引脚上。
    编写按键扫描函数,检测S4、S5、S6、S7按键是否被按下。
    根据按键的值来控制流水灯的方向。

    以下是实现这个功能的C51代码:

    #include <reg52.h>
    
    sbit LED_L1 = P1^0;
    sbit LED_L2 = P1^1;
    sbit LED_L3 = P1^2;
    sbit LED_L4 = P1^3;
    sbit LED_L5 = P1^4;
    sbit LED_L6 = P1^5;
    sbit LED_L7 = P1^6;
    sbit LED_L8 = P1^7;
    sbit S4 = P3^2;
    sbit S5 = P3^3;
    sbit S6 = P3^4;
    sbit S7 = P3^5;
    
    void delay(unsigned int time) {
        while(time--);
    }
    
    void main() {
        unsigned char direction = 1; // 初始方向为从左到右
        while(1) {
            if(S4 == 0) { // 按下S4,流水灯走左往右
                direction = -1;
            } else if(S5 == 0) { // 按下S5,流水灯走右往左
                direction = 1;
            } else if(S6 == 0) { // 按下S6,流水灯从中间往两边
                direction = -1;
            } else if(S7 == 0) { // 按下S7,流水灯熄灭
                LED_L1 = 0;
                LED_L2 = 0;
                LED_L3 = 0;
                LED_L4 = 0;
                LED_L5 = 0;
                LED_L6 = 0;
                LED_L7 = 0;
            } else { // 其他情况,继续按照当前方向流动
                if(direction == -1) { // 向左流动
                    LED_L8 = ~LED_L8;
                    LED_L7 = ~LED_L7;
                    LED_L6 = ~LED_L6;
                    LED_L5 = ~LED_L5;
                    LED_L4 = ~LED_L4;
                    LED_L3 = ~LED_L3;
                    LED_L2 = ~LED_L2;
                    LED_L1 = ~LED_L1;
                } else { // 向右流动
                    LED_L8 = ~LED_L8;
                    LED_L7 = ~LED_L7;
                    LED_L6 = ~LED_L6;
                    LED_L5 = ~LED_L5;
                    LED_L4 = ~LED_L4;
                    LED_L3 = ~LED_L3;
                    LED_L2 = ~LED_L2;
                    LED_L1 = ~LED_L1;
                }
            }
            delay(500); // 延时,控制流水灯的速度
        }
    }
    
    
    评论
  • yy64ll826 2023-09-26 16:51
    关注
    获得0.30元问题酬金

    单片机 蓝桥杯c51实现这个功能。 实现LED小灯(L1~L8)组成的流水灯效果

    
    #include<reg52.h>
    #define uchar unsigned char
    sbit key1=P3^2;
    sbit key2=P3^3;
    sbit key3=P3^1;
    sbit beep=P0^0;
            int s=10;
            int x=0;
            int y=0;
    
    void delay(unsigned int a)   //延时函数
    {
        int b;
        for(;a>0;a--)
             for(b=1000;b>0;b--);
    }
    
    void delay__50us(unsigned int t)//按键消抖  延时函数
    {
    unsigned char j;
        for(;t>0;t--)
            for(j=19;j>0;j--);
    }
    void key_scan()
    {
        //参数判断
        if(key3==0)
        {
            delay__50us(200);
            if(key3==0)
            {
            y++;
            y=y%2;
            }
        }
        while(key3==0);
    }
    
    void main()    //主函数
    {
            EA=1;    //中断初始化
            EX0=1;
            IT0=0;
            EX1=1;
            IT1=0;
        beep=1;
        
        while(1)
        {
            key_scan();
            if(y == 1)    
                {
                    delay__50us(200);
                    if(y ==1 )
                    {
                        while(1)    
                        {
                            uchar k,i;
                            k=0xfe;
                            for(i=0;i<8;i++)
                                    {
        
                                            P2=k;
                                            delay(s);
                                          k=k<<1;
                                            k=k|0x01;
                                        if(x==1)
                                    {
                                        delay__50us(200);
                                        if(x==1)
                                        {
                                            beep=0;
                                            while(x==1);
                                            beep = 1;
                                        }
                                    }
                                        key_scan();
                                        if(y==0)
                                    {
                                        P2 = 0xff;
                                        s=10;
                                        break;
                                    }
                                    }
                                    key_scan();
                                    if(y==0)
                                    {
                                        P2 = 0xff;
                                        s=10;
                                        break;
                                    }
                            }
                        }
                }
            }
    }
    
    void int0 () interrupt 0
        {        
              x++;
                x=x%2;
            while(key1==0);
        }
    void int1 () interrupt 2
        {
            switch(s)
            {
                case 10:
                    s=50;
                break;
                case 50:
                    s=25;
                break;
                case 25:
                    s=10;
                break;
            }
            while(key2==0);
        }
    
    
    评论
  • Leodong. 2023-09-27 11:37
    关注
    获得0.45元问题酬金

    该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
    这个问题需要使用C51单片机的IO口控制LED灯的亮灭,并使用按键来改变流水灯的方向。以下是实现这个功能的步骤和代码:

    1. 首先,我们需要定义LED灯和按键的IO口。例如,我们可以将LED灯连接到P1口的第1~8位,将S4、S5、S6、S7按键分别连接到P3.2、P3.3、P3.4、P3.5口。

    2. 然后,我们需要初始化单片机的IO口和定时器。

    3. 在主循环中,我们需要检测按键的状态,并根据按键的状态来改变流水灯的方向。

    4. 最后,我们需要按照流水灯的方向来控制LED灯的亮灭。

    以下是实现这个功能的C51代码:

    #include <reg52.h>
    
    #define LED P1
    #define S4 P3_2
    #define S5 P3_3
    #define S6 P3_4
    #define S7 P3_5
    
    void delay(unsigned int xms) {
        unsigned int i, j;
        for (i = xms; i > 0; i--)
            for (j = 112; j > 0; j--);
    }
    
    void main() {
        unsigned char led = 0xFE; // 初始状态,所有LED灯熄灭
        P1 = led;
        while (1) {
            if (S4 == 0) { // 按下S4,流水灯走左往右
                led = ~led;
            } else if (S5 == 0) { // 按下S5,流水灯走右往左
                led = 1 << (7 - led);
            } else if (S6 == 0) { // 按下S6,流水灯从中间往两边
                led = ~(led | (1 << (7 - led)));
            } else if (S7 == 0) { // 按下S7,流水灯熄灭
                led = 0;
            }
            P1 = led;
            delay(100); // 延时一段时间,使得LED灯的变化更加明显
        }
    }
    

    注意:以上代码仅供参考,实际使用时可能需要根据具体的硬件连接和编译器进行修改。


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    评论
  • 关注
    获得0.45元问题酬金

    Gitee以及一些类似的开源社区都有类似代码可以参考

    评论

报告相同问题?

问题事件

  • 系统已结题 10月1日
  • 赞助了问题酬金15元 9月23日
  • 创建了问题 9月23日

悬赏问题

  • ¥20 有人能代写linux应用吗?有偿,酬金可商量,具体要求联系我
  • ¥15 神经网络建立应力预测模型
  • ¥20 反编译一款APP手游,解密出lua脚本。
  • ¥15 改一下,代码,让代码符合要求
  • ¥15 报错问题,只有两个错误,如图片所示,i多次初始化
  • ¥15 matlab runtime 如何收费
  • ¥15 Tpad api账户 api口令
  • ¥30 ppt进度条制作,vba语言
  • ¥15 生信simpleaffy包下载
  • ¥15 在二层网络中,掩码存在包含关系即可通信