当前位置: 首页 > news >正文

玩转单片机之智能车小露——七彩LED呼吸灯

如果LED闪烁(玩转单片机之智能车小露——LED闪烁实战)不能满足你,那么七彩LED呼吸灯绝对可以给你带来足够的乐趣。
七彩LED呼吸灯一般都需要PWM进行调光,所以编程有无限的灵活性。本文七彩呼吸灯可以实现彩虹单色显示、RGB任意颜色显示、单色亮度呼吸、七彩颜色转换呼吸:

//呼吸灯模式:关闭呼吸、单色呼吸、七彩转换呼吸
#define	BLED_MODE_OFF			0X00
#define	BLED_MODE_SINGLE		0X01
#define	BLED_MODE_COLOR			0X02//颜色:关闭及RGB组合彩虹颜色
#define	BLED_COLOR_OFF			0X00
#define	BLED_COLOR_RED			0X01
#define	BLED_COLOR_ORANGE		0X02
#define	BLED_COLOR_YELLOW		0X03
#define	BLED_COLOR_GREEN		0X04
#define	BLED_COLOR_CYAN			0X05
#define	BLED_COLOR_BLUE			0X06
#define	BLED_COLOR_PURPLE		0X07
#define	BLED_COLOR_WHITE		0X08//亮度:0x0100~0x1000;
#define BLED_BRIGHT				0x0fffvoid BLEDTurnOn(unsigned char color);
void BLEDDisplayColor(unsigned char red,unsigned char green,unsigned char blue);
void BLEDBreath(unsigned char mode,unsigned char color);
void BLEDTurnOff(void);

STC32G单片机PWM初始化

控制七彩LED前先要初始化PWM(GPIO设置、PWM设置、端口切换):

void BLEDInit(void){GPIO_InitTypeDef gpio;PWMx_InitTypeDef pwm;gpio.Mode = GPIO_OUT_PP;gpio.Pin = GPIO_Pin_LOW;GPIO_Inilize(GPIO_P2,&gpio);pwm.PWM_Mode = CCMRn_PWM_MODE1;pwm.PWM_Duty = 0x0000;pwm.PWM_EnoSelect = ENO5P;PWM_Configuration(PWM5, &pwm);pwm.PWM_EnoSelect = ENO6P;PWM_Configuration(PWM6, &pwm);pwm.PWM_EnoSelect = ENO7P;PWM_Configuration(PWM7, &pwm);pwm.PWM_Period = 0x1000; pwm.PWM_DeadTime = 0;pwm.PWM_MainOutEnable= ENABLE;pwm.PWM_CEN_Enable   = ENABLE; PWM_Configuration(PWMB, &pwm);PWM5_SW(PWM5_SW_P20);PWM6_SW(PWM5_SW_P21);PWM7_SW(PWM5_SW_P22);NVIC_PWM_Init(PWMB,DISABLE,Priority_0);
}

彩虹单色显示

为简化代码,彩虹颜色的显示使用二维数组记录RGB占空比,通过color参数直接定位到ColorRaw数组中对应颜色的占空比。

unsigned char BLEDBreathMode;
unsigned char BLEDColor;
unsigned int BLEDScanCycle;unsigned int code ColorRaw[9][3] = {{0x0000,0x0000,0x0000},					//OFF{BLED_BRIGHT,0x0000,0x0000},			//RED{BLED_BRIGHT,BLED_BRIGHT >> 2,0x0000},	//ORANGE{BLED_BRIGHT,BLED_BRIGHT,0x0000},		//YELLOW{0x0000,BLED_BRIGHT,0x0000},			//GREEN{0x0000,BLED_BRIGHT,BLED_BRIGHT},		//CYAN{0x0000,0x0000,BLED_BRIGHT},			//BLUE{BLED_BRIGHT,0x0000,BLED_BRIGHT},		//PURPLE{BLED_BRIGHT,BLED_BRIGHT,BLED_BRIGHT}};	//WHITEvoid BLEDTurnOn(unsigned char color){unsigned int *pDuty;BLEDColor = color;BLEDBreathMode = BLED_MODE_OFF;pDuty = ColorRaw[color];PWMB_Duty5(pDuty[0]);PWMB_Duty6(pDuty[1]);PWMB_Duty7(pDuty[2]);
}

RGB任意颜色显示

RGB任意颜色显示也很简单,将RGB颜色三个分量参数(0x00~0xFF)缩放到占空比量程后直接输出:

void BLEDDisplayColor(unsigned char red,unsigned char green,unsigned char blue){PWMB_Duty5((unsigned int)red << 4);PWMB_Duty6((unsigned int)green << 4);PWMB_Duty7((unsigned int)blue << 4);
}

单色亮度呼吸和七彩颜色转换呼吸

呼吸思路仍然是在定时中断中按呼吸相应的呼吸规律更新RGB三种颜色的PWM占空比。
单色亮度呼吸熄灭效果不佳所以呼吸周期内只降低到最低亮度(0x0100)不会全熄。
七彩颜色转换呼吸按红->黄->绿->青->蓝->紫->红...依次循环转换。

void BLEDBreath(uint8 mode,uint8 color){BLEDColor = color;BLEDBreathMode = mode;BLEDScanCycle = 0;
}//Systick callback(20ms)
void SystickCallbackBLED(void){unsigned int *pDuty;if(BLEDBreathMode == BLED_MODE_SINGLE){pDuty = ColorRaw[BLEDColor];if(++BLEDScanCycle > 128)BLEDScanCycle = 0;if(BLEDScanCycle < 64){PWMB_Duty5(pDuty[0] - ((BLED_BRIGHT - 0x0100) >> 6) * BLEDScanCycle);PWMB_Duty6(pDuty[1] - ((BLED_BRIGHT - 0x0100) >> 6) * BLEDScanCycle);PWMB_Duty7(pDuty[2] - ((BLED_BRIGHT - 0x0100) >> 6) * BLEDScanCycle);}else{PWMB_Duty5(pDuty[0] - ((BLED_BRIGHT - 0x0100) >> 6) * (128 - BLEDScanCycle));PWMB_Duty6(pDuty[1] - ((BLED_BRIGHT - 0x0100) >> 6) * (128 - BLEDScanCycle));PWMB_Duty7(pDuty[2] - ((BLED_BRIGHT - 0x0100) >> 6) * (128 - BLEDScanCycle));}}else if(BLEDBreathMode == BLED_MODE_COLOR){if(++BLEDScanCycle > 448)BLEDScanCycle = 0;if(BLEDScanCycle < 64){PWMB_Duty5(BLED_BRIGHT);PWMB_Duty6((BLED_BRIGHT >> 6) * BLEDScanCycle);PWMB_Duty7(0x0000);}else if(BLEDScanCycle < 128){PWMB_Duty5(BLED_BRIGHT - (BLED_BRIGHT >> 6) * (BLEDScanCycle-64));PWMB_Duty6(BLED_BRIGHT);PWMB_Duty7(0x0000);}else if(BLEDScanCycle < 192){PWMB_Duty5(0x0000);PWMB_Duty6(BLED_BRIGHT);PWMB_Duty7((BLED_BRIGHT >> 6) * (BLEDScanCycle-128));}else if(BLEDScanCycle < 256){PWMB_Duty5(0x0000);PWMB_Duty6(BLED_BRIGHT - (BLED_BRIGHT >> 6) * (BLEDScanCycle-192));PWMB_Duty7(BLED_BRIGHT);}else if(BLEDScanCycle < 320){PWMB_Duty5((BLED_BRIGHT >> 6) * (BLEDScanCycle-256));PWMB_Duty6(0x0000);PWMB_Duty7(BLED_BRIGHT);}else if(BLEDScanCycle < 384){PWMB_Duty5(BLED_BRIGHT);PWMB_Duty6(0x0000);PWMB_Duty7(BLED_BRIGHT - (BLED_BRIGHT >> 6) * (BLEDScanCycle-320));}}elseBLEDScanCycle = 0;
}
  • 本文采用的单片机为STC32G系列,感兴趣的朋友可以参考测试,或去Gitee上下载例程。
  • 下载地址:https://gitee.com/loganxiang/lgxsmartcar ,参考breathled.h/breathled.c。
http://www.hskmm.com/?act=detail&tid=38438

相关文章:

  • 上海市计算机学会2025.10月赛丙组T5
  • 2025年微信编辑器年度测评:8款工具横评,谁才是内容创作者的效率神助攻?
  • windows 发现音量按键调值不够顺畅
  • CUDA C++ 入门:矩阵乘法
  • 在C语言中,定义常量的方法有哪几种?
  • docker 艹哥笔记
  • 4090显卡安装DCNv2
  • 在windows 上用GPIO定义几个按键
  • 第二十三篇
  • OUC第一周WP
  • [KaibaMath]1014 基于取整函数[x]的定义求解一道特殊的一元二次方程
  • 基础题目
  • ABP - 事件总线(Event Bus)[IEventBus、LocalEventBus、IntegrationEvent]
  • 【ArcMap】基本操作1:查看属性表Table、测量路线长度、打断点
  • 三种 Badcase 精度验证方案详解与 hbm_infer 部署实录
  • CF512E. Cycling City
  • 好想成为人类啊——2025 . 10 . 24
  • 10 24(+第14场补题)
  • 详细介绍:C++ 位运算 高频面试考点 力扣 268. 丢失的数字 题解 每日一题
  • 详细介绍:第十六届蓝桥杯软件赛C组省赛C++题解(京津冀)
  • OOP实验二
  • ABP - 缓存(Caching)[IDistributedCache、ICacheManager、ICacheKeyNormalizer、[Cache]、[CacheInvalidate]]
  • 《打造自己的 DeepSeek》第 1 期:为什么要打造自己的 DeepSeek?
  • ret2text
  • ABP - 异常处理(Exception Handling)[AbpExceptionFilter、UserFriendlyException、IExceptionSubscriber]
  • 2025年沸腾干燥机厂家权威推荐榜单:专业直销与高效节能技术深度解析,提供优质沸腾干燥设备及定制方案
  • CF Round 1046(#2135) 总结
  • 重组蛋白表达的几种类型介绍
  • ABP - 接口授权 [Authorize、AllowAnonymous、IPermissionChecker]
  • 日总结 17