1、呼吸灯常用方法 实现呼吸灯效果的方法主要有以下几种: 硬件 PWM 实现,利用定时器的 PWM 功能生成可控的占空比信号,直接驱动 LED。通过改变 PWM 占空比,控制 LED 的亮度。具有硬件独立运行占用 CPU 资源少、调节精度高亮度变化平滑和硬件实现简单但需要 MCU 提供 PWM 外设等特点 软件模拟 PWM,通过软件控制 LED 的点亮时间和熄灭时间比例(类似 PWM 的占空比),从而模拟亮度变化。具有不需要硬件 PWM 外设适用于资源有限的 MCU、占用 CPU 时间较多、实时性较差和易于实现等特点。 查表法,预先生成一组符合呼吸灯亮度规律的表(如正弦波或指数变化的亮度值),通过定时器或软件逐步读取表中数据,改变 LED 的亮度。具有亮度变化平滑、可实现复杂的亮度曲线、占用存储空间较大、运行效率高和適合需要复杂亮度曲线场景等特点。 本文使用了 软件模拟 PWM的方法来实现呼吸灯效果。 2、程序 #include "at32l021_board.h"
#include "at32l021_clock.h"
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] main function.
* @param none
* @retval none
*/
int main(void)
{
// 变量声明必须在代码块起始位置
int brightness = 0; // 当前亮度
int direction = 1; // 亮度变化方向(1:增加,-1:减少)
const int max_brightness = 100; // 最大亮度值
int i; // `for` 循环中使用的变量
system_clock_config(); // 配置系统时钟
at32_board_init(); // 初始化开发板
while (1)
{
// 模拟亮度变化
for (i = 0; i < max_brightness; i++) // 循环变量 `i` 在外部声明
{
// LED2 的亮度与 brightness 成正比
if (i < brightness)
at32_led_on(LED2);
else
at32_led_off(LED2);
// LED3 的亮度与 brightness 成反比
if (i < max_brightness - brightness)
at32_led_on(LED3);
else
at32_led_off(LED3);
// LED4 的亮度介于两者之间
if (i < (brightness + (max_brightness - brightness) / 2))
at32_led_on(LED4);
else
at32_led_off(LED4);
delay_us(100); // 延迟 100 μs,控制亮度变化速度
}
// 调整亮度值
brightness += direction;
if (brightness >= max_brightness || brightness <= 0)
{
direction = -direction; // 到达最大或最小亮度时反向
}
}
}
3、效果
|