#有奖活动#
目的:①实现呼吸灯效果;②呼吸灯呈现出正弦效果;③LED3和LED4亮度互补
1、程序设计思路
该程序的目的是通过使用GPIO控制,实现两个LED灯(LED3和LED4)的呼吸灯效果,其中两个LED的亮度是互补变化的。程序使用正弦函数来计算亮度值,以达到平滑的亮度变化效果。以下是程序的整体设计思路:
1.包含必要的头文件:
- 引入控制LED和系统时钟配置的头文件。
- 引入数学库头文件用于计算正弦函数。
2. 定义常量:
- 定义PI的值用于角度到弧度的转换。
- 定义最大亮度值(255),表示LED全亮的情况。
3. 初始化系统:
- 调用函数`system_clock_config()`配置系统时钟。
- 调用函数`at32_board_init()`初始化开发板,设置GPIO引脚。
4. 主循环设计:
- 使用`while(1)`进入无限循环,使程序能够持续运行,实现连续的呼吸灯效果。
5. 正弦波亮度控制:
- 通过一个外部`for`循环从0到360度,遍历一个完整的正弦周期。
- 在每个角度下计算对应的正弦波亮度值,并将其转换到0到255范围内。
- 通过正弦函数计算LED3的亮度,同时计算LED4的互补亮度。
6. 模拟LED亮度:
- 通过内部`for`循环和延迟函数`delay_us`来模拟LED的亮度变化。
- 控制每个LED的亮度,通过快速开关LED实现不同的亮度效果。
7. 平滑过渡:
- 使用`delay_ms`函数在每个角度计算后延迟一段时间,使亮度变化更加平滑,避免视觉上的突变。
2、程序
#include "at32f402_405_board.h" // 包含AT32F402/405开发板的头文件,提供LED控制和初始化等功能
#include "at32f402_405_clock.h" // 包含AT32F402/405的时钟配置头文件
#include <math.h> // 包含数学库头文件,用于计算正弦函数
#define PI 3.14159265
#define MAX_BRIGHTNESS 255
int main(void)
{
int i;
int j; // 将变量j的声明移到for循环外
double brightness;
int led3_brightness, led4_brightness;
int delay_time = 10; // 调整此值以控制呼吸灯的速度
system_clock_config();
at32_board_init();
while(1) // 无限循环
{
// 从0到360度变化,相当于一个完整的正弦周期
for(i = 0; i < 360; i++)
{
// 计算正弦波对应的亮度值,范围从0到MAX_BRIGHTNESS
brightness = (sin(i * PI / 180) + 1) / 2 * MAX_BRIGHTNESS;
led3_brightness = (int)brightness; // 将计算的亮度值赋给LED3亮度
led4_brightness = MAX_BRIGHTNESS - led3_brightness; // LED4亮度与LED3互补
// 模拟LED3的亮度
for(j = 0; j < led3_brightness; j++)
{
at32_led_on(LED3); // 打开LED3
delay_us(10); // 延迟10微秒,控制亮度
at32_led_off(LED3); // 关闭LED3
}
// 模拟LED4的亮度
for(j = 0; j < led4_brightness; j++)
{
at32_led_on(LED4); // 打开LED4
delay_us(10); // 延迟10微秒,控制亮度
at32_led_off(LED4); // 关闭LED4
}
delay_ms(delay_time); // 延迟一段时间,平滑过渡
}
}
}
3、效果
|