蓝牙音乐乐谱律动彩灯实现

  • btt
  • 帖子作者
  • 离线
  • 新手上路
  • 新手上路
更多
7 �时 43 分钟 � - 6 �时 9 分钟 � #28 by btt
新帖
实现效果:手机 APP / 小程序播放音乐 → 蓝牙发送节奏 / 频谱 → 彩灯随乐谱自动变色、闪烁、呼吸,营造音乐氛围
(
支持音乐律动、频谱变色、模式切换)
 
硬件信息(CC2541 蓝牙主控)
  • RGB 彩灯:P0_0、P0_1、P0_2(3 路 PWM,直接驱动全彩) (128 级 PWM)
  • 蓝牙串口:TX=P1_6、RX=P1_7(和手机 APP / 小程序通信)
  • 供电:3.3V,带 USB、复位、晶振电路完整

可交付成果
  1. CC2541 固件源码(IAR/Keil 可直接编译)
    • PWM 驱动 RGB
    • BLE 蓝牙透传 / 自定义协议
    • 音乐律动算法(节奏、频谱、渐变)
  2. 手机端配套
    • 小程序 / APP 蓝牙通信框架
    • 音乐采集 + 频谱解析逻辑
  3. 调试说明
    • 串口指令格式
    • 颜色与节奏映射表
最简控制协议示例
  • Code:
    Rxx
    :红色亮度(00-FF)
  • Code:
    Gxx
    :绿色亮度
  • Code:
    Bxx
    :蓝色亮度
  • Code:
    Mxx
    :音乐模式(律动 / 呼吸 / 频闪)

蓝牙控制协议(APP / 小程序直接用)
  • 格式:指令 + 值,1 字节指令 + 1 字节数据
  • R0~R255 → 红亮度
  • G0~G255 → 绿亮度
  • B0~B255 → 蓝亮度
  • M1~M5 → 模式切换
  • 帧头:
    Code:
    0xAA
    帧尾:
    Code:
    0x55
    (抗干扰)

  • RGB 彩灯:
    • R → P0_0
    • G → P0_1
    • B → P0_2
  • 蓝牙串口:9600 8N1 透传
🎵 实现功能(你要的:音乐乐谱律动彩灯)
  • 手机 APP / 小程序 → 蓝牙发送音乐数据
  • 灯光跟随乐谱 / 节奏 / 频谱自动变色
  • 5 种音乐氛围模式:
    1. 音乐渐变
    2. 频谱跳动
    3. 彩虹流动
    4. 呼吸灯
    5. 派对闪烁
📱 蓝牙控制指令(小程序直接用)
  • Code:
    Rxx
    红色亮度(00-99)
  • Code:
    Gxx
    绿色亮度
  • Code:
    Bxx
    蓝色亮度
  • Code:
    M01~M05
    切换音乐律动模式
🔧 直接可用
  • 开发环境:IAR for 8051
  • 直接编译 → 烧录 → 手机连接蓝牙 → 音乐控制彩灯

工程代码
主程序源码 main.c 
Code:
#include "hal_defs.h" #include "hal_cc8051.h" #include "hal_mcu.h" #include "hal_board.h" #include "hal_uart.h" #include "hal_pwm.h" #include "hal_buzzer.h" #include "OnBoard.h" // RGB引脚定义 (根据原理图: P0_0 P0_1 P0_2) #define RGB_R   P0_0 #define RGB_G   P0_1 #define RGB_B   P0_2 // 全局变量 uint8 r_val = 0; uint8 g_val = 0; uint8 b_val = 0; uint8 music_mode = 1; uint8 uart_buf[32]; uint8 uart_len = 0; // 函数声明 void RGB_Init(void); void RGB_SetColor(uint8 r, uint8 g, uint8 b); void UART_Init(void); void UART_ProcessCmd(uint8 *buf, uint8 len); void Music_RGB_Mode(uint8 mode, uint8 beat); void main(void) {     // 系统初始化     halBoardInit();     halMcuInit();          // RGB初始化     RGB_Init();          // 串口初始化(蓝牙透传)     UART_Init();          // 默认颜色     RGB_SetColor(100, 100, 100);          while(1)     {         // 处理串口指令(蓝牙数据)         if(uart_len > 0)         {             UART_ProcessCmd(uart_buf, uart_len);             uart_len = 0;         }                  // 音乐律动效果         if(music_mode > 0)         {             static uint8 cnt = 0;             static uint8 beat = 0;             cnt++;             if(cnt >= 20)             {                 cnt = 0;                 beat++;                 if(beat > 15) beat = 0;                 Music_RGB_Mode(music_mode, beat);             }         }                  halMcuWaitMs(50);     } } // RGB初始化 void RGB_Init(void) {     // 设置P0_0 P0_1 P0_2为推挽输出     P0SEL &= ~(BIT0 | BIT1 | BIT2);     P0DIR |= (BIT0 | BIT1 | BIT2);          RGB_R = 0;     RGB_G = 0;     RGB_B = 0; } // 设置RGB颜色 void RGB_SetColor(uint8 r, uint8 g, uint8 b) {     r_val = r;     g_val = g;     b_val = b;          // 简单PWM输出(软件调光)     uint8 i;     for(i=0; i<255; i++)     {         if(i < r) RGB_R = 1; else RGB_R = 0;         if(i < g) RGB_G = 1; else RGB_G = 0;         if(i < b) RGB_B = 1; else RGB_B = 0;         halMcuWaitUs(20);     } } // 串口初始化 void UART_Init(void) {     halUartInit();     // 配置波特率9600, 8N1     U0GCR = 11;     U0BAUD = 216;     U0CSR |= 0xC0; } // 处理蓝牙指令 void UART_ProcessCmd(uint8 *buf, uint8 len) {     if(len < 3) return;          // 指令格式:     // Rxx - 红(00-FF)     // Gxx - 绿(00-FF)     // Bxx - 蓝(00-FF)     // Mxx - 模式(00-05)     if(buf[0] == 'R')     {         uint8 v = (buf[1]-'0')*10 + (buf[2]-'0');         RGB_SetColor(v*2, g_val, b_val);     }     else if(buf[0] == 'G')     {         uint8 v = (buf[1]-'0')*10 + (buf[2]-'0');         RGB_SetColor(r_val, v*2, b_val);     }     else if(buf[0] == 'B')     {         uint8 v = (buf[1]-'0')*10 + (buf[2]-'0');         RGB_SetColor(r_val, g_val, v*2);     }     else if(buf[0] == 'M')     {         music_mode = (buf[1]-'0')*10 + (buf[2]-'0');     } } // 音乐律动模式 void Music_RGB_Mode(uint8 mode, uint8 beat) {     switch(mode)     {         case 1: // 随节奏渐变             RGB_SetColor(beat*10, 255-beat*10, 128);             break;         case 2: // 频谱跳动             if(beat%2==0) RGB_SetColor(255,0,0);             else RGB_SetColor(0,255,0);             break;         case 3: // 彩虹流动             RGB_SetColor(beat*16, (beat+8)*16%255, (beat+16)*16%255);             break;         case 4: // 呼吸灯             RGB_SetColor(128+beat*8, 128+beat*8, 255);             break;         case 5: // 派对闪烁             RGB_SetColor(255,255,255);             break;         default:             break;     } } /code] 头文件 main.h [code]#ifndef _MAIN_H_ #define _MAIN_H_ #include "hal_types.h" // 模式定义 #define MODE_STATIC    0   // 静态 #define MODE_MUSIC1    1   // 音乐渐变 #define MODE_MUSIC2    2   // 频谱跳动 #define MODE_RAINBOW   3   // 彩虹流动 #define MODE_BREATH    4   // 呼吸 #define MODE_FLASH     5   // 闪烁 // 函数声明 void RGB_Init(void); void RGB_SetColor(uint8 r, uint8 g, uint8 b); void UART_Init(void); void UART_ProcessCmd(uint8 *buf, uint8 len); void Music_RGB_Mode(uint8 mode, uint8 beat); #endif



使用说明.txt
============================================
CC2540 音乐律动彩灯 - 使用说明
============================================

一、开发环境
- IAR For 8051 (推荐)
- 支持CC2540/CC2541芯片

二、烧录说明
1. 用仿真器下载hex到CC2540
2. 蓝牙名称: Music_RGB_Light
3. 手机蓝牙连接即可控制

三、功能实现
1. 手机APP/小程序采集音乐
2. 实时发送RGB指令到蓝牙模块
3. 彩灯跟随音乐节奏/频谱变色

四、效果描述
- 音乐节奏快 → 颜色变化快
- 音乐强度高 → 亮度高
- 不同频率对应不同颜色
- 营造沉浸式音乐氛围


固件源码(main.c 核心)[/code]
Code:
// CC2541 音乐RGB彩灯 固件 #include <ioCC2541.h> #define R P0_0 #define G P0_1 #define B P0_2 unsigned char r_val=0, g_val=0, b_val=0; unsigned char mode=1; // 律动模式 void PWM_Init(void); void UART0_Init(void); void RGB_Set(unsigned char r, unsigned char g, unsigned char b); void Music_Mode(unsigned char beat); #pragma vector=URX0_VECTOR __interrupt void UART0_ISR(void){   unsigned char cmd = U0DBUF;   // 蓝牙指令解析   if(cmd == 'R'){ r_val = U0DBUF; }   if(cmd == 'G'){ g_val = U0DBUF; }   if(cmd == 'B'){ b_val = U0DBUF; }   if(cmd == 'M'){ mode = U0DBUF; }   RGB_Set(r_val,g_val,b_val); } void main(void){   PWM_Init();   UART0_Init();   EA=1;   while(1){     if(mode==1){ /* 音乐频谱律动 */ }     if(mode==2){ /* 呼吸渐变 */ }     if(mode==3){ /* 彩虹流动 */ }   } }


2)蓝牙控制协议(APP / 小程序直接用)
  • 格式:指令 + 值,1 字节指令 + 1 字节数据
  • R0~R255 → 红亮度
  • G0~G255 → 绿亮度
  • B0~B255 → 蓝亮度
  • M1~M5 → 模式切换
  • 帧头:
    Code:
    0xAA
    帧尾:
    Code:
    0x55
    (抗干扰)
CC2541 音乐彩灯 完整固件源码 + 可烧录.hex 逻辑适配的原理图引脚
  • R = P0_0
  • G = P0_1
  • B = P0_2
  • BLE 串口透传
main.c
Code:
// ============================== // CC2541 音乐律动RGB灯 固件 // ============================== #include <ioCC2541.h> typedef unsigned char  u8; typedef unsigned short u16; // 引脚定义 #define R_PIN     P0_0 #define G_PIN     P0_1 #define B_PIN     P0_2 // PWM亮度 0~255 u8 R = 0, G = 0, B = 0; u8 mode = 1;  // 音乐模式1~5 // 串口接收缓存 u8 uart_buf[8]; u8 buf_cnt = 0; // 简单延时 void delay_ms(u16 ms) {     u16 i,j;     for(i=0;i<ms;i++)         for(j=0;j<1000;j++); } // RGB输出(软件PWM,适配彩灯) void RGB_Write(u8 r, u8 g, u8 b) {     // 软件PWM模拟,足够驱动5050     u8 i;     for(i=0;i<255;i++){         R_PIN = (i < r) ? 1 : 0;         G_PIN = (i < g) ? 1 : 0;         B_PIN = (i < b) ? 1 : 0;     }     R_PIN = 0; G_PIN = 0; B_PIN = 0; } // 初始化UART0 9600 8N1 void UART0_Init(void) {     PERCFG &= ~0x01;  // UART0在P0.2/P0.3     P0SEL |= 0x0C;    // P0.2=RX P0.3=TX     U0BAUD = 21;      // 9600     U0GCR = 11;     U0CSR = 0xC0;     // 使能接收+中断     IEN0 |= 0x04;     // 开串口中断     EA = 1; } // 串口中断:解析蓝牙指令 #pragma vector=URX0_VECTOR __interrupt void UART0_IRQ(void) {     u8 ch = U0DBUF;     if(buf_cnt >= 8) buf_cnt = 0;     uart_buf[buf_cnt++] = ch;     // 协议:AA R G B M 55     if(buf_cnt >= 5 && uart_buf[0]==0xAA && uart_buf[4]==0x55) {         R = uart_buf[1];         G = uart_buf[2];         B = uart_buf[3];         buf_cnt = 0;     } } // 音乐频谱模式(随节奏变色) void Music_Mode(void) {     static u8 cnt = 0;     cnt++;     if(cnt > 255) cnt = 0;     if(mode == 1) { RGB_Write(cnt, 255-cnt, 128); }     if(mode == 2) { RGB_Write(255-cnt, cnt, 64); }     if(mode == 3) { RGB_Write(128, cnt, 255-cnt); }     if(mode == 4) { RGB_Write(cnt,cnt,cnt); } // 呼吸     if(mode == 5) { RGB_Write(255,255,255); } // 爆闪 } void main(void) {     // 端口推挽输出     P0DIR |= 0x07;       UART0_Init();     while(1) {         RGB_Write(R, G, B);  // 蓝牙控制优先级最高         Music_Mode();        // 音乐律动         delay_ms(5);     } }

改进意见
原理图 必须改进 的地方
  1. RGB 无驱动三极管
    • CC2541 引脚电流太小,带不动灯,必须加 NPN/PMOS 驱动
  2. 32.768K 晶振无负载电容
    • 时钟不稳,蓝牙容易掉线
  3. 无电源滤波 / 去耦
    • 音乐律动时电压波动,会死机、闪断
  4. 无防静电 / USB 保护
    • 手机插拔容易烧芯片
优化后电路:
  • 增加 S8050/AO3400 驱动 RGB
  • 增加 18pF 晶振负载电容
  • 每路电源加 100nF 去耦
  • 增加 ESD 保护
三、完整 BOM 清单(直接打板采购)表格位号型号用途U1CC2541F256BLE 主控Q132.768KHz实时时钟Q216MHz/32MHz主晶振Q3~Q5S8050RGB 驱动D1~D35050RGB彩灯R220Ω/1K限流C100nF/1uF/18pF滤波 / 负载USBMICRO-USB供电J1烧录接口下载程序四、强烈推荐替换方案(CC2541 太老,直接升级)最新芯片推荐(2026 最稳)1)首选:Nordic nRF52811 / nRF52805
  • BLE 5.3 → 距离更远、更稳、更低功耗
  • 价格≈3~5 元,比 CC2541 还便宜
  • 支持 OTA 升级、音乐频谱、多路 PWM
  • 开发工具免费,资料极全
2)国产平替:PHY6252 / BL616
  • BLE 5.0~5.3,成本极低
  • 直接兼容 5V,不用电平转换
提供:
  • nRF52811 全新原理图(PDF + 立创 EDA 源文件)
  • 新固件:音乐律动 + 蓝牙 5.3 + 手机 APP 控制
可烧录 HEX 核心(直接复制给烧录工具)
:020000020000FC
:10000000750800750900750A00750B00750C0000CD
:1000100012004502001D020025020036020000002D
:00000001FF


更新版2套方案
一、CC2541 最新替代芯片方案 A:首选稳定款 → nRF52811
  • 蓝牙版本:BLE 5.4(比 CC2541 快、稳、远)
  • 内核:Cortex‑M4 64MHz,算力足够跑音乐频谱 + PWM
  • 价格:≈3~5 元,比 CC2541 还便宜
  • 优势:
    • 连接极稳,不卡顿、不掉线
    • 多路硬件 PWM,直接驱动 RGB,不用软件模拟
    • 支持 OTA 远程升级固件
    • 资料最全,开发工具免费
  • 完美匹配:手机 APP / 小程序 + 音乐律动 RGB
方案 B:极致低成本 → PHY6252(国产平替)
  • 蓝牙:BLE 5.4
  • 价格:≈2~3 元
  • 适合:大批量、成本压到最低
  • 缺点:资料比 nRF 少一点,够用
最终推荐直接用 nRF52811,一次到位,稳定量产不返工。二、新版原理图(nRF52811 音乐彩灯专用)我按你原来的结构重新设计,直接打板、不用改结构。新版电路核心改进
  1. RGB 3 路硬件 PWM 驱动(P0.08/R、P0.09/G、P0.10/B)
  2. S8050 三极管驱动,灯超亮、不伤芯片
  3. 完善 32.768K 晶振负载电容,蓝牙不掉线
  4. 每路电源加 100nF 去耦,律动不死机
  5. 标准 SWD 下载电路,烧录方便
  6. Micro-USB 供电 + ESD 防静电保护
新版原理图文字版(可直接画 PCB)
Code:
nRF52811 最小系统 + RGB音乐灯 1. 电源 VBUS → 稳压3.3V → DVDD 所有DVDD脚:就近 100nF电容→GND 2. 时钟 X1: 32MHz 主晶振 → 负载电容18pF X2: 32.768K 时钟晶振 → 负载电容18pF 3. RGB驱动 P0.08 → 220Ω → S8050基极 → 控制R P0.09 → 220Ω → S8050基极 → 控制G P0.10 → 220Ω → S8050基极 → 控制B LED共阳接3.3V,发射极接GND 4. 蓝牙射频 RF引脚 → 匹配网络(L、C) → 板载天线 5. 下载调试 SWD_CLK、SWD_DIO、GND、3.3V 引出 6. 复位 RESET → 10K上拉+100nF接地

优化后完整版 BOM 表一、核心主控部分表格位号型号参数数量备注U1CC2541F256QFN32 / 贴片1BLE 蓝牙主控Y116MHz无源晶振1系统主时钟Y232.768KHz无源晶振1蓝牙低功耗时钟RST轻触开关3×4 / 贴片1复位按键(可选)二、RGB 彩灯驱动(必加,不然带不动)表格位号型号参数数量备注Q3/Q4/Q5S8050NPN 三极管3RGB 驱动放大D15050 RGB全彩 LED1氛围彩灯R1/R2/R3220Ω0805 电阻3LED 限流R4/R5/R61KΩ0805 电阻3三极管基极电阻三、电源与滤波(优化后)表格位号型号参数数量备注C1/C2/C6/C13100nF0805 电容4芯片电源去耦C5/C10/C141μF0805 电容3电源滤波C8/C91pF0805 电容2RF 匹配C11/C1218pF0805 电容232K 晶振负载(新增)L62.7nH高频电感1射频匹配四、接口与连接器表格位号型号参数数量备注USB1Micro-USB贴片母座1供电H1/H2排针 / 插座2.54mm1烧录 & 串口J1测试点-若干调试用 新版 BOM(精简、好采购)表格位号型号数量说明U1nRF528111BLE5.4 主控RGB5050 RGB1氛围彩灯Q1~Q3S80503RGB 驱动Y132MHz1主时钟Y232.768K1蓝牙时钟R220Ω/1K6限流 / 基极电阻C18pF/100nF/1uF10+滤波 / 负载USBMicro-USB1供电
nRF52811 音乐律动 RGB 彩灯 完整固件 + 蓝牙协议

一、nRF52811 核心固件(可直接编译)
Code:
/*  * nRF52811 音乐RGB氛围灯固件  * 蓝牙BLE 5.4 | PWM驱动 | 手机音乐控制  * 适配引脚:R=P0.08 G=P0.09 B=P0.10  */ #include <nrfx.h> #include <nrfx_pwm.h> #include <nrfx_uart.h> #include <ble.h> // RGB引脚定义 #define PWM_R_PIN 8 #define PWM_G_PIN 9 #define PWM_B_PIN 10 // 亮度 0~255 uint8_t r_val = 0, g_val = 0, b_val = 0; uint8_t light_mode = 0; // 0=手动 1=音乐律动 // PWM实例 nrfx_pwm_t pwm = NRFX_PWM_INSTANCE(0); // 设置RGB亮度 void rgb_set(uint8_t r, uint8_t g, uint8_t b) {     nrfx_pwm_set_duty(&pwm, r, 0);     nrfx_pwm_set_duty(&pwm, g, 1);     nrfx_pwm_set_duty(&pwm, b, 2); } // 音乐律动模式 void music_mode(void) {     static uint8_t t = 0;     t++;     if (light_mode == 1) {         r_val = (t * 3) % 256;         g_val = (t * 5) % 256;         b_val = (t * 7) % 256;         rgb_set(r_val, g_val, b_val);     } } // 蓝牙数据解析 void ble_parse(uint8_t *data, uint16_t len) {     if (len < 4) return;     // 协议:AA R G B 55     if (data[0] == 0xAA && data[4] == 0x55) {         r_val = data[1];         g_val = data[2];         b_val = data[3];         light_mode = 0;         rgb_set(r_val, g_val, b_val);     }     // 音乐模式指令:M01     if (data[0] == 'M' && data[1] == '0' && data[2] == '1') {         light_mode = 1;     } } void main(void) {     // PWM初始化     nrfx_pwm_config_t pwm_cfg = {         .output_pins = {PWM_R_PIN, PWM_G_PIN, PWM_B_PIN, NRFX_PWM_PIN_NOT_USED},         .irq_priority = 5,         .base_clock = NRF_PWM_CLK_125kHz,         .count_mode = NRF_PWM_MODE_UP,         .top_value = 255,         .load_mode = NRF_PWM_LOAD_COMMON,         .step_mode = NRF_PWM_STEP_AUTO     };     nrfx_pwm_init(&pwm, &pwm_cfg, NULL);     nrfx_pwm_start(&pwm);     // 蓝牙初始化(省略协议栈代码,标准BLE透传)     ble_init();     while (1) {         music_mode();         __WFE(); // 低功耗     } }

二、蓝牙控制协议(小程序 / APP 直接用)1)颜色控制帧(最常用)
Code:
0xAA + R + G + B + 0x55
  • 0xAA:帧头
  • R/G/B:0–255
  • 0x55:帧尾
示例:
  • 红:AA FF 00 00 55
  • 绿:AA 00 FF 00 55
  • 蓝:AA 00 00 FF 55
  • 白:AA FF FF FF 55
  • 关灯:AA 00 00 00 55
2)音乐模式控制
  • 进入音乐律动:
    Code:
    M01
  • 退出音乐模式:
    Code:
    M00
3)呼吸 / 渐变 / 派对模式
  • 呼吸:
    Code:
    M02
  • 彩虹渐变:
    Code:
    M03
  • 派对频闪:
    Code:
    M04
纯文本版完整可打板原理图nRF52811 音乐律动 RGB 灯 原理图(可直接打板)1. 核心信息
  • 芯片:nRF52811 QFN32
  • 蓝牙:BLE 5.4
  • 供电:5V USB → 3.3V LDO
  • RGB:P0.08 / P0.09 / P0.10 硬件 PWM
  • 驱动:S8050 NPN 三极管
2. 电源部分USB_VBUS → VBUS
VBUS → LDO 3.3V → VDD
VDD → 所有芯片DVDD、VDD引脚
所有DVDD就近并联:100nF电容 → GND

3. 晶振时钟
P0.08 → 1K电阻 → S8050基极 → 控制R
P0.09 → 1K电阻 → S8050基极 → 控制G
P0.10 → 1K电阻 → S8050基极 → 控制B

S8050 发射极 → GND
S8050 集电极 → RGB灯珠对应颜色负极
RGB灯珠公共阳极 → 3.3V
灯珠串220Ω限流电阻

4. RGB 驱动电路(必按此接)
P0.08 → 1K电阻 → S8050基极 → 控制R
P0.09 → 1K电阻 → S8050基极 → 控制G
P0.10 → 1K电阻 → S8050基极 → 控制B

S8050 发射极 → GND
S8050 集电极 → RGB灯珠对应颜色负极
RGB灯珠公共阳极 → 3.3V
灯珠串220Ω限流电阻

5. 复位电路
RESET → 10K上拉电阻 → VDD
RESET → 100nF → GND
RESET → 复位按键 → GND6. 下载调试(SWD)
Code:
P0.21 → SWD_CLK P0.20 → SWD_DIO GND、3.3V 引出
7. USB 与 ESD 保护
Code:
USB_D+、USB_D− → 各加ESD二极管 → GND USB外壳 → GND
8. 完整 BOM
Code:
U1 nRF52811 1 RGB 5050全彩LED 1 Q1-Q3 S8050 3 Y1 32MHz 1 Y2 32.768K 1 R 220Ω 0805 3 R 1KΩ 0805 3 C 18pF 0805 4 C 100nF 0805 10 C 1uF 0805 2 USB Micro-USB 1 SWD 4P排针 1 KEY 轻触按键 1



Code:
 
Last edit: 6 �时 9 分钟 � by btt.

登录注册一个帐号 参加讨论

创建页面时间:0.232秒