输出:硬件PWM——无源蜂鸣器2——哔哔

#ifndef __BSP_BEEP_H
#define __BSP_BEEP_H

// 硬件PWM,根据IO口选择模式与PWM
#define BeepPwmGPIO P24 // 输出PWM GPIO端口

typedef enum
{
    BEEP_OFF = 0,      // 熄灭
    BEEP_ON,           // 全亮
    BEEP_BLINKING,     // 闪烁(1Hz)
} BEEP_Type;

// 定义蜂鸣器的状态
enum
{
    S_BEEP_INIT,             // 初始状态
    S_BEEP_ON,               // 常响状态
    S_BEEP_OFF,              // 不响状态
    S_BEEP_BLINK_START,      // 闪烁起始
    S_BEEP_BLINK_ON,         // 闪烁中响
    S_BEEP_BLINK_OFF,        // 闪烁中不响
    S_BEEP_BLINK_END,        // 闪烁终止
};

typedef struct
{
    unsigned char state;     // 蜂鸣器当前状态
    BEEP_Type Type;          // 蜂鸣器模式
    unsigned char count;     // 蜂鸣器响次数
    unsigned short ticks;    // 当前状态的时间计数(以10ms为单位)
    unsigned short ticksCnt; // 状态改变的时间间隔(以10ms为单位)
} BEEP_T;

extern BEEP_T beep_t;

/* 外部函数声明 */
void BEEP_On(void);
void BEEP_Off(void);
void BEEP_InitHard(void);
void BEEP_update(BEEP_T *beep);
void BEEP(BEEP_T *beep, BEEP_Type Type, unsigned char count, unsigned char ticks);

#endif
/*****************************  (END OF FILE) *********************************/
// 每隔10ms调用一次该函数,用于控制蜂鸣器的行为
void BEEP_update(BEEP_T *beep)
{
    static bit BEEP_OnOff = 0;

    // 初始化
    if (beep->state == S_BEEP_INIT)
    {
        if (beep->Type == BEEP_OFF)
        {
            beep->state = S_BEEP_OFF;
        }
        else if (beep->Type == BEEP_ON)
        {
            beep->state = S_BEEP_ON;
        }
        else if (beep->Type == BEEP_BLINKING)
        {
            beep->state = S_BEEP_BLINK_START;
        }
    }

    // 不响的状态
    if (beep->state == S_BEEP_OFF)
    {
        BEEP_OnOff = 0;
    }
    // 常响的状态
    else if (beep->state == S_BEEP_ON)
    {
        BEEP_OnOff = 1;
    }

    // 闪烁起始状态
    else if (beep->state == S_BEEP_BLINK_START)
    {
        if (beep->count > 0)
        {
            beep->count--;
            beep->ticks = beep->ticksCnt;
            beep->state = S_BEEP_BLINK_ON;
        }
        else
        {
            beep->state = S_BEEP_BLINK_END;
        }
    }
    // 闪烁中响状态
    else if (beep->state == S_BEEP_BLINK_ON)
    {
        BEEP_OnOff = 1;
        if (--beep->ticks == 0)
        {
            beep->ticks = beep->ticksCnt; //重置计时
            beep->state = S_BEEP_BLINK_OFF;
        }
    }
    // 闪烁中不响状态
    else if (beep->state == S_BEEP_BLINK_OFF)
    {
        BEEP_OnOff = 0;
        if (--beep->ticks == 0)
        {
            beep->state = S_BEEP_BLINK_START; //返回闪烁起始状态
        }
    }
    // 闪烁结束状态
    else if (beep->state == S_BEEP_BLINK_END)
    {
        BEEP_OnOff = 0;
        beep->state = S_BEEP_INIT; //重置为初始状态
        beep->Type = BEEP_OFF; //设置类型为熄灭
    }

    // 根据蜂鸣器响或不响来执行对应的开启或关闭的硬件操作
    if (BEEP_OnOff)
    {
        BEEP_On();
    }
    else
    {
        BEEP_Off();
    }
}

你可能感兴趣的:(输出设备,嵌入式硬件)