基于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);
}
六、调试与优化建议
示波器观察:检查PWM波形占空比是否准确
电流检测:串联采样电阻监测LED电流
低功耗优化:
// 进入睡眠模式 __HAL_RCC_PWR_CLK_ENABLE(); HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
参考代码 带单片机8位全彩流水灯程序模板V1 www.youwenfan.com/contentalf/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配置,并通过示波器验证时序参数。