波特律动
课程中心/51单片机教程/【20】PWM-呼吸灯

【20】PWM-呼吸灯

本课资源下载
共 1 个资源
P20PWM呼吸灯

本节课的标准源代码工程/可供参考

V1.0压缩包63 KB
下载

课程笔记


本节目标概括

创建main.c > 编写点灯代码 > 编译HEX文件 > 下载到学习板 > 呼吸灯亮灭

注意:下载时需要在STC-ISP软件中勾选“ALE脚用作P4.5”选项(DAC输出,即呼吸灯)


PWM驱动库代码介绍
C语言
1/*
2 * @brief 初始化PWM功能
3 * @param freq_hz PWM频率 单位Hz(变量范围0~65535Hz)
4 * @param resolution PWM分辨率 即每个周期分成多少步(变量范围1~255,步数越多占空比调整越细腻,但CPU占用越高)
5 * @note ⚠️注意:建议频率*分辨率不超过10KHz(极限),否则CPU占用过高,几乎卡死其他逻辑⚠️
6 */
7void PWM_Init(unsigned int freq_hz, unsigned char resolution);
8// 设置各通道的占空比
9void PWM_SetDuty(unsigned char channel, unsigned int duty);
10// 设置个通道占空比百分比 0~100
11void PWM_SetDutyPercent(unsigned char channel, unsigned char percent);
12// 获取单个通道占空比
13unsigned int PWM_GetDuty(unsigned char channel);


主函数:

  • 现象:右下角LED呈现呼吸灯效果
C语言
1#include <stc89c5xrc.h>
2#include "Delay.h"
3#include "UART.h"
4#include "PWM.h"
5
6#define LED_BREATHING_MIN 25 // 呼吸灯最小占空比(过低会导致LED完全熄灭)
7#define LED_BREATHING_MAX 95 // 呼吸灯最大占空比(过高会导致LED完全点亮)
8#define LED_BREATHING_DELAY_TIME 3 // 呼吸灯调光间隔延时时间
9
10void main()
11{
12 unsigned char p;
13
14 PWM_Init(100, 100); // PWM频率100Hz,分辨率100步(每步1%占空比)
15
16 PWM_SetDutyPercent(3, 0); // P45 即DAC输出通道(连接右下角LED呼吸灯)
17
18 while (1)
19 {
20 // 呼吸灯(P4.5)
21 for (p = LED_BREATHING_MIN; p < LED_BREATHING_MAX; p++)
22 {
23 PWM_SetDutyPercent(3, p);
24 delay(LED_BREATHING_DELAY_TIME);
25 }
26 for (p = LED_BREATHING_MAX; p > LED_BREATHING_MIN; p--)
27 {
28 PWM_SetDutyPercent(3, p);
29 delay(LED_BREATHING_DELAY_TIME);
30 }
31 }
32}