【应用C】C语言实现可配置带回调函数的蜂鸣器驱动_压电式蜂鸣器驱动 c程序(1)

64 阅读2分钟

  如果你需要用蜂鸣器制造一段有节奏音乐的需求,则可以移植代码进行使用:

  • 代码所占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:


![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/f0c165e393f4443bb8d91f8d82828da0~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771251370&x-signature=sGEQDBUm7YBPGbQaVKL44oTT5fA%3D)
![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/4965d18c7a3e423e9431a3f264e819bc~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771251370&x-signature=fo2NqSSJ7tKkPf8OyqKcbdrPDp8%3D)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**