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

news/2025/10/24 22:50:31/文章来源:https://www.cnblogs.com/loganxiang/p/19164241

如果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.mzph.cn/news/945730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows Update - Part 3: Patch Management

The Four Phases of Patch Management:Assess Identify Evaluate and Plan Deploy2014 ~ 2025: cloud-first, WaaS decadeWindows as a ServiceServicing channelsGeneral Availability Channel Long-Term Servicing C…

windows 发现音量按键调值不够顺畅

一波未平,一波又起 同事在windows GPIO driver 里修改 power button delay 引起了音量按键的不正常,快速按一下,颗粒度从之前的2变成了4根据gpioint 的定义,是可以定义debounce 的值的,但是不知道是多少 https://…

CUDA C++ 入门:矩阵乘法

最近接触了 GPU 编程,尝试了用 CUDA 写一些并行计算案例,拿了矩阵乘法作为第一个练手项目。 过去的经验让我误以为这东西很 naive,但其实从并行的角度看,会发现很多串行思维所没有机会接触的细节——总体而言,虽然…

在C语言中,定义常量的方法有哪几种?

在C语言中,定义常量的方法主要有以下3种: 一、#define 预处理指令(宏定义) 通过预处理指令将符号替换为指定文本,是最基础的常量定义方式。 语法: #define 常量名 常量值 // 无分号,预处理阶段会直接替换示例:…

docker 艹哥笔记

docker 艹哥笔记[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# docke…

OUC第一周WP

Misc 签到题 扫码关注,回复flag就出来了ezBase64 base64加密,解密出来flagBaseCrack 经过多次base系列加密,赛博厨子试出来 最后经过base64->base32->base64解密得到flag ROT13 rot13加密,解密得到flag Rai…

在windows 上用GPIO定义几个按键

1. ACPI button 文档ACPI 按钮设备 - Windows drivers | Microsoft Learn 2. acpi button 的acpi dochttps://uefi.org/specs/ACPI/6.6/09_ACPI_Defined_Devices_and_Device_Specific_Objects.html#button-interrupts …

第二十三篇

今天是10月24号,没上课,爽。

扩展域并查集理解性总结

扩展域并查集理解性总结纯文字内容,较短,较枯燥,但感谢你能点进来并完成阅读。 前置:并查集 扩展域并查集(种类并查集) 理解思想 一.团伙给定若干满足如下两条的关系,求会构成多少个团伙:\(x\)、\(y\) 为朋友 \(…

软件工程学习日志2025.10.24

在当今快节奏的软件开发世界中,技术硬实力是入场券,而卓越的沟通协作能力,则是决定一个工程师能走多快、多远的隐形翅膀。为了弥合校园与职场之间的能力鸿沟,我深入调研了以高效协同著称的字节跳动,并以此为镜,反…

ABP - 种子数据 [IDataSeeder、DataSeedContext]

种子数据(Seed Data) 核心辅助类:IDataSeeder:数据种子接口。 DataSeedContext:种子数据上下文。种子数据是指项目启动时自动向数据库插入的初始化数据(比如默认管理员账号、基础配置项、测试数据等),核心作用…

[KaibaMath]1014 基于取整函数[x]的定义求解一道特殊的一元二次方程

[KaibaMath]1014 基于取整函数[x]的定义求解一道特殊的一元二次方程取整函数[x]的定义是[x]≤x<[x]+1. 下面基于运用此定义,求解一道特殊的一元二次方程:x^2-2[x]+0.9=0.

基础题目

超级基础的题虽然是数学,但是仍以 \(OI\) 的题为例,毕竟 \(OI\) 的组合计数题还是很高质的,但别担心,组合计数主要是数学推导,所以文中的题仅会推导数学的理论知识或公式,不会有代码实现。但为了方便,还是会把题…

完整教程:紫外UV相机在机器视觉检测方向的应用

完整教程:紫外UV相机在机器视觉检测方向的应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

三种 Badcase 精度验证方案详解与 hbm_infer 部署实录

在模型结构优化与部署量化过程中,开发者往往会遇到一个关键任务:​基于历史 Badcase 数据验证模型精度变化​,确保模型修改不会引入明显性能退化。 这类验证常见于感知、预测、行为识别等任务,尤其在客户交付或精度…

CF512E. Cycling City

题目传送门 十分有趣的题。 思路 三条路径,本质上其实就是 \(x,y\) 同时属于两个有交集(至少交一条边)的简单环,这个肯定没问题。 套路的跑一遍 dfs,然后就有了返祖边树边和横叉边,然后朴素的分讨然后用个数据结…

ABP - 事件总线(Event Bus)[IEventBus、LocalEventBus、IntegrationEvent]

(1)事件总线(Event Bus) 核心辅助类:IEventBus:发布/订阅事件。 LocalEventBus:本地事件总线(进程内)。 IntegrationEvent:跨服务集成事件。事件总线是一种“发布-订阅”模式的通信机制,用于解耦系统中的各…

【ArcMap】基本操作1:查看属性表Table、测量路线长度、打断点

1.查看 a.查看线段信息b.查看属性表Table c.查看坐标点 2.测量路线长度-简单 3.打断点 4.画线

CSP-S模拟37

T1:回文(string) 思路: 由于本题的数据范围较小,所以可能有多种 \(dp\) 状态,这里只呈现其中可能较典的两种外加一种暴搜最优解。 DP1: 我们设 \(f_{i,j,x,y}\) 表示使用 \(a\) 串的 \(i\) ~ \(j\) 和 \(b\) 串…