#有奖活动#
目的:①实现呼吸灯效果;②呼吸灯呈现出正弦效果;③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、效果
|