基于STM32和51单片机的8位全彩流水灯程序模板

一、硬件连接方案(以STM32为例)

1. 接口定义(RGB LED阵列)

LED编号 R引脚 G引脚 B引脚 控制引脚
LED0 PA0 PA1 PA2 PB0
LED1 PA3 PA4 PA5 PB1
... ... ... ... ...
LED7 PA18 PA19 PA20 PB7

2. 电路设计要点

  • 每个LED采用共阴极连接
  • 串联220Ω限流电阻
  • 使用WS2812B芯片实现级联控制(可选)

二、STM32实现代码(HAL库)

1. 初始化配置

// 定义LED控制结构体
typedef struct {
    GPIO_TypeDef* R_Port;
    uint16_t    R_Pin;
    GPIO_TypeDef* G_Port;
    uint16_t    G_Pin;
    GPIO_TypeDef* B_Port;
    uint16_t    B_Pin;
} RGB_LED;

RGB_LED leds[8] = {
    {GPIOA, GPIO_PIN_0, GPIOA, GPIO_PIN_1, GPIOA, GPIO_PIN_2},
    {GPIOA, GPIO_PIN_3, GPIOA, GPIO_PIN_4, GPIOA, GPIO_PIN_5},
    //...其他LED配置
};

// 定时器配置(用于流水控制)
void TIM3_Init(void) {
    TIM_HandleTypeDef htim3;
    htim3.Instance = TIM3;
    htim3.Init.Prescaler = 8400-1;  // 100kHz
    htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim3.Init.Period = 10000-1;    // 1秒周期
    HAL_TIM_Base_Init(&htim3);
    HAL_TIM_Base_Start_IT(&htim3);
}

2. 核心控制算法

volatile uint8_t current_led = 0;
volatile uint8_t direction = 1;

// 中断服务程序
void TIM3_IRQHandler(void) {
    if(__HAL_TIM_GET_FLAG(&htim3, TIM_FLAG_UPDATE)) {
        // 关闭所有LED
        for(int i=0; i<8; i++) {
            HAL_GPIO_WritePin(leds[i].R_Port, leds[i].R_Pin, GPIO_PIN_RESET);
            HAL_GPIO_WritePin(leds[i].G_Port, leds[i].G_Pin, GPIO_PIN_RESET);
            HAL_GPIO_WritePin(leds[i].B_Port, leds[i].B_Pin, GPIO_PIN_RESET);
        }
        
        // 设置当前LED颜色(示例:彩虹渐变)
        set_led_color(current_led, rainbow_color(current_led));
        
        // 更新流水方向
        current_led += direction;
        if(current_led == 8 || current_led == -1) {
            direction ^= 1;
            current_led = (current_led == -1) ? 7 : 0;
        }
    }
}

// 颜色设置函数
void set_led_color(uint8_t index, uint32_t color) {
    leds[index].R_Pin = (color & 0xFF0000) >> 16;
    leds[index].G_Pin = (color & 0x00FF00) >> 8;
    leds[index].B_Pin = (color & 0x0000FF);
}

// 彩虹色生成算法
uint32_t rainbow_color(uint8_t pos) {
    pos &= 0x0F;  // 限制在0-15色相范围
    return HSV_TO_RGB(pos * 17, 255, 255);  // 饱和度255,亮度255
}

三、51单片机实现代码(传统寄存器操作)

#define LED_PORT P1
#define DELAY_MS 100

unsigned char code rainbow[] = {
    0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80  // 位掩码数组
};

void main() {
    unsigned char i = 0;
    unsigned char dir = 1;
    
    while(1) {
        // 点亮当前LED
        LED_PORT = rainbow[i];
        DelayMs(DELAY_MS);
        
        // 流水控制
        i += dir;
        if(i == 8 || i == 0) dir = -dir;
    }
}

// 精确延时函数(12MHz晶振)
void DelayMs(unsigned int ms) {
    unsigned int i, j;
    for(i = 0; i < ms; i++)
        for(j = 0; j < 123; j++);
}

四、多模式控制方案

1. 模式切换逻辑

typedef enum {
    MODE_STATIC,
    MODE_SCROLL,
    MODE_FADE,
    MODE_RAINBOW
} DisplayMode;

DisplayMode current_mode = MODE_SCROLL;

// 模式切换函数
void switch_mode(DisplayMode new_mode) {
    current_mode = new_mode;
    HAL_TIM_Base_Stop_IT(&htim3);  // 停止定时器
    HAL_TIM_Base_Start_IT(&htim3); // 重启定时器
}

2. 渐变效果实现

void fade_effect() {
    static uint8_t brightness = 0;
    static int8_t step = 1;
    
    for(int i=0; i<8; i++) {
        uint16_t duty = (brightness * 255) / 100;
        set_led_pwm(i, duty);
    }
    
    brightness += step;
    if(brightness == 100 || brightness == 0) step = -step;
}

五、硬件加速方案

1. DMA传输配置(STM32)

void DMA1_Init(void) {
    DMA_HandleTypeDef hdma1;
    hdma1.Instance = DMA1_Channel2;
    hdma1.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma1.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma1.Init.MemInc = DMA_MINC_ENABLE;
    HAL_DMA_Init(&hdma1);
    
    // 配置DMA传输
    HAL_DMA_Start(&hdma1, (uint32_t)color_buffer, 
                 (uint32_t)GPIOA_BASE, 24);
}

2. PWM调光配置

void PWM_Init(void) {
    TIM_OC_InitTypeDef sConfigOC = {0};
    
    // 配置通道1为PWM模式
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 1000;  // 50%占空比
    HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
    
    HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
}

六、调试与优化建议

  1. 示波器观察:检查PWM波形占空比是否准确

  2. 电流检测:串联采样电阻监测LED电流

  3. 低功耗优化

    // 进入睡眠模式
    __HAL_RCC_PWR_CLK_ENABLE();
    HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
    

参考代码 带单片机8位全彩流水灯程序模板V1 www.youwenfan.com/contentcnm/70075.html

七、完整工程结构

LED_Project/
├── Core/
│   ├── Inc/
│   │   ├── main.h
│   │   ├── led.h
│   │   └── color.h
│   └── Src/
│       ├── main.c
│       ├── led.c
│       └── color.c
├── Drivers/
│   ├── CMSIS/
│   └── STM32F1xx_HAL_Driver/
└── Middlewares/
    └── USB_Device/  // 可选调试接口

八、扩展功能实现

1. 手机APP控制(蓝牙)

// HC-05蓝牙模块配置
void BT_Init() {
    UART_HandleTypeDef huart1;
    huart1.Instance = USART1;
    huart1.Init.BaudRate = 9600;
    HAL_UART_Init(&huart1);
}

// 命令解析
void parse_command(char *cmd) {
    if(strcmp(cmd, "RED_ON") == 0) {
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, SET);
    }
    //...其他命令处理
}

2. 物联网对接(WiFi)

// ESP8266模块配置
void WIFI_Init() {
    UART_HandleTypeDef huart2;
    huart2.Instance = USART2;
    huart2.Init.BaudRate = 115200;
    HAL_UART_Init(&huart2);
    
    // 发送AT指令
    HAL_UART_Transmit(&huart2, (uint8_t*)"AT+MQTTCONNECT\r\n", 17, 1000);
}

通过上述模板,可快速实现8位全彩流水灯系统。建议根据实际硬件调整GPIO配置,并通过示波器验证时序参数。

posted @ 2025-12-05 11:51  小前端攻城狮  阅读(0)  评论(0)    收藏  举报