如果你需要用蜂鸣器制造一段有节奏音乐的需求,则可以移植代码进行使用:
- 代码所占code少于0.5K
- 可移植性高,只需要提供底层PWM_Set()和配置对应音乐节奏节点
注意:系统需要存在一个至少为10ms的时钟中断
01 - Buzzer.h
#ifndef \_\_BUZZER\_H\_\_
#define \_\_BUZZER\_H\_\_
#include "MCU.h"
typedef enum {
beepOff = 0,
beepButton,
beepAlarm,
beepMax
} buzzerMode_t;
typedef void (\*fpBuzzerCallBack)(void);
/\* 可以在SetMode后调用,每次SetMode会把cb置为NULL。设置后可以在对应Mode蜂鸣结束后回调函数cb \*/
extern void buzzerSetCallBackFunc(fpBuzzerCallBack cb);
extern void buzzerService\_10ms(void);
extern void buzzerSetMode(buzzerMode_t Mode);
#endif
02 - Buzzer.c
#include "buzzer.h"
extern void PWM\_SetFreq(uint16\_t FreqHZ);
#define BuzzerMaxNode 4
/\* 自定义音频节点 \*/
typedef struct {
uint16\_t FreqHZ; /\* 蜂鸣器频率 \*/
uint8\_t On; /\* 打开时间(10ms单位) \*/
uint8\_t Off; /\* 关闭时间(10ms单位) \*/
} buzzerNode;
/\* 自定义一段音频 \*/
typedef struct {
uint8\_t DataLen; /\* Data的使用长度 \*/
uint8\_t RepeatCounter; /\* 重复的次数 \*/
uint8\_t RepeatIntervalTime; /\* 每次重复的间隔(10ms单位) \*/
buzzerNode Data[BuzzerMaxNode]; /\* 音频节点数组 \*/
} buzzerInfo_t;
code buzzerInfo_t buzzerButton = {
1,
0,
0,
{
{ 2600, 10, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
},
};
code buzzerInfo_t buzzerAlarm = {
2,
3,
50,
{
{ 1400, 50, 50 },
{ 2600, 50, 50 },
{ 0, 0, 0 },
{ 0, 0, 0 },
},
};
buzzerInfo_t code \*buzzerTask[beepMax] = {
NULL,
&buzzerButton,
&buzzerAlarm,
};
typedef struct {
buzzerInfo_t Info;
uint8\_t DataIdx;
uint8\_t Status;
uint8\_t OnOffTimer;
buzzerMode_t Mode;
fpBuzzerCallBack CallBackFunc;
} buzzer_t;
buzzer_t buzzer;
void buzzerService\_10ms(void)
{
if (buzzer.DataIdx < buzzer.Info.DataLen) {
buzzer.OnOffTimer++;
switch (buzzer.Status) {
case 0:
PWM\_SetFreq(buzzer.Info.Data[buzzer.DataIdx].FreqHZ);
buzzer.OnOffTimer = 0;
buzzer.Status++;
break;
case 1:
if (buzzer.OnOffTimer >= buzzer.Info.Data[buzzer.DataIdx].On) {
PWM\_SetFreq(0);
buzzer.OnOffTimer = 0;
buzzer.Status++;
}
break;
case 2:
if (buzzer.OnOffTimer >= buzzer.Info.Data[buzzer.DataIdx].Off) {
buzzer.DataIdx++;
if (buzzer.DataIdx < buzzer.Info.DataLen) {
PWM\_SetFreq(buzzer.Info.Data[buzzer.DataIdx].FreqHZ);
buzzer.OnOffTimer = 0;
buzzer.Status = 1;
} else {
PWM\_SetFreq(0);
if (buzzer.Info.RepeatCounter) {
buzzer.OnOffTimer = 0;
buzzer.DataIdx = 0;
buzzer.Status = 3;
} else {
if (buzzer.CallBackFunc) {
buzzer.CallBackFunc();
}
memset(&buzzer, 0, sizeof(buzzer_t));
}
}
}
break;
case 3:


**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**