2301_81140486 2023-11-15 16:12 采纳率: 0%
浏览 28

51单片机流水灯循环

系统上电后,按照D8~D1的顺序循环点亮每一个LED灯;当K1按下时,控制2个LED灯为一组交替点亮并循环(1D2,灯3 D4,D5 D6,D7D8);当K2按下时,控制流水灯在全亮和全熄灭之间循环;当任何按键松开时,恢复循环初始状态

  • 写回答

1条回答 默认 最新

  • 厉昱辰 新星创作者: 嵌入式与硬件开发技术领域 2023-12-05 18:37
    关注
    
    #include <stdio.h>
    #include <stdbool.h>
    #include <wiringPi.h>
    
    #define K1_PIN  0
    #define K2_PIN  1
    #define D1_PIN  2
    #define D2_PIN  3
    #define D3_PIN  4
    #define D4_PIN  5
    #define D5_PIN  6
    #define D6_PIN  7
    #define D7_PIN  8
    #define D8_PIN  9
    
    void setup()
    {
        wiringPiSetup();
        pinMode(K1_PIN, INPUT);
        pinMode(K2_PIN, INPUT);
        pinMode(D1_PIN, OUTPUT);
        pinMode(D2_PIN, OUTPUT);
        pinMode(D3_PIN, OUTPUT);
        pinMode(D4_PIN, OUTPUT);
        pinMode(D5_PIN, OUTPUT);
        pinMode(D6_PIN, OUTPUT);
        pinMode(D7_PIN, OUTPUT);
        pinMode(D8_PIN, OUTPUT);
    }
    
    void turnOnLEDs(bool led1_status, bool led2_status, bool led3_status, bool led4_status)
    {
        digitalWrite(D1_PIN, led1_status);
        digitalWrite(D2_PIN, led2_status);
        digitalWrite(D3_PIN, led3_status);
        digitalWrite(D4_PIN, led4_status);
    }
    
    void cycleLEDs()
    {
        for (int i = 0; i < 8; i++)
        {
            int led_index = i + 1;
            bool led_status = true;
            turnOnLEDs(led_index == 1, led_index == 2, led_index == 3, led_index == 4);
            delay(500);  // 点亮每个LED的时间间隔为500ms
        }
    }
    
    void alternateLEDs()
    {
        int led_group = 1;
        while (digitalRead(K1_PIN) == 0)  // 按下K1时持续循环
        {
            if (led_group == 1)
            {
                turnOnLEDs(false, false, true, true);  // 点亮D5和D6
                led_group = 2;
            }
            else if (led_group == 2)
            {
                turnOnLEDs(true, true, false, false);  // 点亮D7和D8
                led_group = 1;
            }
            delay(500);  // 点亮每个组的LED的时间间隔为500ms
        }
    }
    
    void cycleLights()
    {
        bool lights_on = true;
        while (digitalRead(K2_PIN) == 0)  // 按下K2时持续循环
        {
            turnOnLEDs(lights_on, lights_on, lights_on, lights_on);  // 全亮或全熄灭
            lights_on = !lights_on;
            delay(500);  // 变化的时间间隔为500ms
        }
    }
    
    int main()
    {
        setup();
    
        while (true)
        {
            bool k1_state = digitalRead(K1_PIN);
            bool k2_state = digitalRead(K2_PIN);
    
            if (k1_state == 0)
            {
                alternateLEDs();
            }
            else if (k2_state == 0)
            {
                cycleLights();
            }
            else
            {
                cycleLEDs();
            }
    
            turnOnLEDs(false, false, false, false);  // 恢复循环初始状态
        }
    
        return 0;
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 11月15日