Files
GarbageCanCenter_Woer_stm/STM32_4路称重_Git提交精简工程/src/HARDWARE/BUZZER/buzzer.c
T

670 lines
14 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*************************** (C) COPYRIGHT 2017 CXHY ****************************
* 文件名 buzzer.c
* 描 述 :蜂鸣器驱动程序
* 版 本 V1.0
* 作 者 XuZhongPing
* 日 期 2017/03/06
*********************************************************************************/
#include "buzzer.h"
#include "timer.h"
#define BEEP_PeriphClock RCC_APB2Periph_GPIOB
#define BEEP_PORT GPIOB
#define BEEP_PIN GPIO_Pin_2
uint8_t beep_startUpMark = 0; //开机提示标志
uint8_t beep_shortBeepMark = 0; //蜂鸣器短响标志
uint8_t beep_longBeepMark = 0; //蜂鸣器长响标志
uint8_t beep_closeDoorBeepMark = 0; //蜂鸣器关门响标志
uint8_t beep_warningBeepMark = 0; //蜂鸣器错误警告提示响标志
uint8_t beep_contSlowBeepMark = 0; //蜂鸣器连续慢响标志
uint8_t beep_contFastBeepMark = 0; //蜂鸣器连续快响标志
/*
***********************************************************************
* 函 数 名: KeyInit
* 功能说明: 开关IO口初始化
* 形 参:无
* 返 回 值: 无
***********************************************************************
*/
void BeepInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(BEEP_PeriphClock, ENABLE);
GPIO_InitStructure.GPIO_Pin = BEEP_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(BEEP_PORT, &GPIO_InitStructure);
GPIO_ResetBits(BEEP_PORT, BEEP_PIN);
beep_startUpMark = 1; //标志正在开机启动提示
}
/*
***********************************************************************
* 函 数 名: SetBuzzerStatus
* 功能说明: 设置蜂鸣器工作状态
* 形 参:param -> 设置的状态,0关,1:开
* 返 回 值: 无
***********************************************************************
*/
void SetBuzzerStatus(uint8_t param)
{
if(param)
{
GPIO_SetBits(BEEP_PORT, BEEP_PIN);
// printf("\r\n开蜂鸣器\r\n");
}else{
GPIO_ResetBits(BEEP_PORT, BEEP_PIN);
// printf("\r\n关蜂鸣器\r\n");
}
}
/*
***********************************************************************
* 函 数 名: BEEP_ShortBeep
* 功能说明: 蜂鸣器短响
* 形 参:无
* 返 回 值: 无
***********************************************************************
*/
static void BEEP_ShortBeep(void)
{
static uint8_t beepStatus = 0x00;
static timer beepOnTimer;
static uint8_t timer_ok = 0;
if(timer_ok == 0)
{
timer_ok = 1;
timer_set(&beepOnTimer, 2);
}
switch(beepStatus)
{
case 0x00:
if(beep_shortBeepMark == 1)
{
beep_shortBeepMark = 0;
SetBuzzerStatus(1); //打开蜂鸣器
timer_restart(&beepOnTimer);
beepStatus = 0x01;
break;
}
break;
case 0x01:
if(timer_expired(&beepOnTimer))
{
SetBuzzerStatus(0); //关闭蜂鸣器
beepStatus = 0x00;
break;
}
break;
default:
SetBuzzerStatus(0); //关闭蜂鸣器
beepStatus = 0x00;
break;
}
}
/*
***********************************************************************
* 函 数 名: BEEP_LongBeep
* 功能说明: 蜂鸣器长响
* 形 参:无
* 返 回 值: 无
***********************************************************************
*/
static void BEEP_LongBeep(void)
{
static uint8_t beepStatus = 0x00;
static timer beepOnTimer;
static uint8_t timer_ok = 0;
if(timer_ok == 0)
{
timer_ok = 1;
timer_set(&beepOnTimer, 20);
}
switch(beepStatus)
{
case 0x00:
if(beep_longBeepMark == 1)
{
beep_longBeepMark = 0;
SetBuzzerStatus(1); //打开蜂鸣器
timer_restart(&beepOnTimer);
beepStatus = 0x01;
break;
}
break;
case 0x01:
if(timer_expired(&beepOnTimer))
{
SetBuzzerStatus(0); //关闭蜂鸣器
beepStatus = 0x00;
break;
}
SetBuzzerStatus(1); //打开蜂鸣器
break;
default:
SetBuzzerStatus(0); //关闭蜂鸣器
beepStatus = 0x00;
break;
}
}
/*
***********************************************************************
* 函 数 名: BEEP_StartUpBeep
* 功能说明: 蜂鸣器开机提示声
* 形 参:无
* 返 回 值: 无
***********************************************************************
*/
static void BEEP_StartUpBeep(void)
{
static uint8_t beepStatus = 0x00;
static timer beepOnTimer1;
static timer beepOnTimer2;
static timer beepOffTimer1;
static timer beepOffTimer2;
static uint8_t timer_ok = 0;
if(timer_ok == 0)
{
timer_ok = 1;
timer_set(&beepOnTimer1, 1);
timer_set(&beepOnTimer2, 2);
timer_set(&beepOffTimer1, 1);
timer_set(&beepOffTimer2, 2);
}
switch(beepStatus)
{
case 0x00:
if(beep_startUpMark == 1)
{
beep_startUpMark = 0;
SetBuzzerStatus(1); //打开蜂鸣器
timer_restart(&beepOnTimer1);
beepStatus = 0x01;
break;
}
break;
case 0x01:
if(timer_expired(&beepOnTimer1))
{
SetBuzzerStatus(0); //关闭蜂鸣器
timer_restart(&beepOffTimer1);
beepStatus = 0x02;
break;
}
break;
case 0x02:
if(timer_expired(&beepOffTimer1))
{
SetBuzzerStatus(1); //打开蜂鸣器
timer_restart(&beepOnTimer2);
beepStatus = 0x03;
break;
}
break;
case 0x03:
if(timer_expired(&beepOnTimer2))
{
SetBuzzerStatus(0); //关闭蜂鸣器
timer_restart(&beepOffTimer2);
beepStatus = 0x04;
break;
}
break;
case 0x04:
if(timer_expired(&beepOffTimer2))
{
SetBuzzerStatus(1);
timer_restart(&beepOnTimer2);
beepStatus = 0x05;
break;
}
break;
case 0x05:
if(timer_expired(&beepOnTimer2))
{
SetBuzzerStatus(0); //关闭蜂鸣器
beep_startUpMark = 0;
beepStatus = 0x00;
break;
}
break;
default:
SetBuzzerStatus(0); //关闭蜂鸣器
beepStatus = 0x00;
break;
}
}
/*
***********************************************************************
* 函 数 名: BEEP_CloseDoorBeep
* 功能说明: 蜂鸣器关门提示声
* 形 参:无
* 返 回 值: 无
***********************************************************************
*/
static void BEEP_CloseDoorBeep(void)
{
static uint8_t beepStatus = 0x00;
static timer closeDoorBeepOnTimer;
static uint8_t timer_ok = 0;
if(timer_ok == 0)
{
timer_ok = 1;
timer_set(&closeDoorBeepOnTimer, 5);
}
switch(beepStatus)
{
case 0x00:
if(beep_closeDoorBeepMark == 1)
{
beep_closeDoorBeepMark = 0;
SetBuzzerStatus(1); //打开蜂鸣器
timer_restart(&closeDoorBeepOnTimer);
beepStatus = 0x01;
break;
}
break;
case 0x01:
if(timer_expired(&closeDoorBeepOnTimer))
{
SetBuzzerStatus(0); //关闭蜂鸣器
timer_restart(&closeDoorBeepOnTimer);
beepStatus = 0x02;
break;
}
break;
case 0x02:
if(timer_expired(&closeDoorBeepOnTimer))
{
SetBuzzerStatus(1); //打开蜂鸣器
timer_restart(&closeDoorBeepOnTimer);
beepStatus = 0x03;
break;
}
break;
case 0x03:
if(timer_expired(&closeDoorBeepOnTimer))
{
SetBuzzerStatus(0); //关闭蜂鸣器
timer_restart(&closeDoorBeepOnTimer);
beepStatus = 0x04;
break;
}
break;
case 0x04:
if(timer_expired(&closeDoorBeepOnTimer))
{
SetBuzzerStatus(1); //打开蜂鸣器
timer_restart(&closeDoorBeepOnTimer);
beepStatus = 0x05;
break;
}
break;
case 0x05:
if(timer_expired(&closeDoorBeepOnTimer))
{
SetBuzzerStatus(0); //关闭蜂鸣器
beep_closeDoorBeepMark = 0;
beepStatus = 0x00;
break;
}
break;
default:
SetBuzzerStatus(0); //关闭蜂鸣器
beepStatus = 0x00;
break;
}
}
/*
***********************************************************************
* 函 数 名: BEEP_WarningBeep
* 功能说明: 蜂鸣器警告提示声
* 形 参:无
* 返 回 值: 无
***********************************************************************
*/
static void BEEP_WarningBeep(void)
{
static uint8_t beepStatus = 0x00;
static timer warningBeepOnTimer;
static timer warningBeepOffTimer;
static uint8_t timer_ok = 0;
if(timer_ok == 0)
{
timer_ok = 1;
timer_set(&warningBeepOnTimer, 2);
timer_set(&warningBeepOffTimer, 2);
}
switch(beepStatus)
{
case 0x00:
if(beep_warningBeepMark == 1)
{
beep_warningBeepMark = 0;
SetBuzzerStatus(1); //打开蜂鸣器
timer_restart(&warningBeepOnTimer);
beepStatus = 0x01;
break;
}
break;
case 0x01:
if(timer_expired(&warningBeepOnTimer))
{
SetBuzzerStatus(0); //关闭蜂鸣器
timer_restart(&warningBeepOnTimer);
beepStatus = 0x02;
break;
}
break;
case 0x02:
if(timer_expired(&warningBeepOnTimer))
{
SetBuzzerStatus(1); //打开蜂鸣器
timer_restart(&warningBeepOnTimer);
beepStatus = 0x03;
break;
}
break;
case 0x03:
if(timer_expired(&warningBeepOnTimer))
{
SetBuzzerStatus(0); //关闭蜂鸣器
timer_restart(&warningBeepOnTimer);
beepStatus = 0x04;
break;
}
break;
case 0x04:
if(timer_expired(&warningBeepOnTimer))
{
SetBuzzerStatus(1); //打开蜂鸣器
timer_restart(&warningBeepOnTimer);
beepStatus = 0x05;
break;
}
break;
case 0x05:
if(timer_expired(&warningBeepOnTimer))
{
SetBuzzerStatus(0); //关闭蜂鸣器
timer_restart(&warningBeepOnTimer);
beepStatus = 0x06;
break;
}
break;
case 0x06:
if(timer_expired(&warningBeepOnTimer))
{
SetBuzzerStatus(1); //打开蜂鸣器
timer_restart(&warningBeepOnTimer);
beepStatus = 0x07;
break;
}
break;
case 0x07:
if(timer_expired(&warningBeepOnTimer))
{
SetBuzzerStatus(0); //关闭蜂鸣器
timer_restart(&warningBeepOnTimer);
beepStatus = 0x08;
break;
}
break;
case 0x08:
if(timer_expired(&warningBeepOnTimer))
{
SetBuzzerStatus(1); //打开蜂鸣器
timer_restart(&warningBeepOnTimer);
beepStatus = 0x09;
break;
}
break;
case 0x09:
if(timer_expired(&warningBeepOnTimer))
{
SetBuzzerStatus(0); //关闭蜂鸣器
beep_warningBeepMark = 0;
beepStatus = 0x00;
}
break;
default:
SetBuzzerStatus(0); //关闭蜂鸣器
beep_warningBeepMark = 0;
beepStatus = 0x00;
break;
}
}
/*
***********************************************************************
* 函 数 名: BEEP_ContSlowBeep
* 功能说明: 蜂鸣器连续慢响
* 形 参:无
* 返 回 值: 无
***********************************************************************
*/
static void BEEP_ContSlowBeep(void)
{
static uint8_t beepStatus = 0x00;
static timer beepOnTimer;
static timer beepOffTimer;
static uint8_t timer_ok = 0;
if(timer_ok == 0)
{
timer_ok = 1;
timer_set(&beepOnTimer, 2);
timer_set(&beepOffTimer, 8);
}
switch(beepStatus)
{
case 0x00:
if(beep_contSlowBeepMark == 1)
{
SetBuzzerStatus(1); //打开蜂鸣器
timer_restart(&beepOnTimer);
beepStatus = 0x01;
break;
}
break;
case 0x01:
if(timer_expired(&beepOnTimer))
{
SetBuzzerStatus(0); //关闭蜂鸣器
timer_restart(&beepOffTimer);
beepStatus = 0x02;
break;
}
if(beep_contSlowBeepMark == 0)
{
SetBuzzerStatus(0);
beepStatus = 0x00;
break;
}
break;
case 0x02:
if(timer_expired(&beepOffTimer))
{
beepStatus = 0x00;
break;
}
if(beep_contSlowBeepMark == 0)
{
SetBuzzerStatus(0);
beepStatus = 0x00;
break;
}
break;
default:
SetBuzzerStatus(0); //关闭蜂鸣器
beepStatus = 0x00;
break;
}
}
/*
***********************************************************************
* 函 数 名: BEEP_ContFastBeep
* 功能说明: 蜂鸣器连续快响
* 形 参:无
* 返 回 值: 无
***********************************************************************
*/
static void BEEP_ContFastBeep(void)
{
static uint8_t beepStatus = 0x00;
static timer beepOnTimer;
static timer beepOffTimer;
static uint8_t timer_ok = 0;
if(timer_ok == 0)
{
timer_ok = 1;
timer_set(&beepOnTimer, 1);
timer_set(&beepOffTimer, 2);
}
switch(beepStatus)
{
case 0x00:
if(beep_contFastBeepMark == 1)
{
SetBuzzerStatus(1); //打开蜂鸣器
timer_restart(&beepOnTimer);
beepStatus = 0x01;
break;
}
break;
case 0x01:
if(timer_expired(&beepOnTimer))
{
SetBuzzerStatus(0); //关闭蜂鸣器
timer_restart(&beepOffTimer);
beepStatus = 0x02;
break;
}
if(beep_contFastBeepMark == 0)
{
SetBuzzerStatus(0);
beepStatus = 0x00;
break;
}
break;
case 0x02:
if(timer_expired(&beepOffTimer))
{
beepStatus = 0x00;
break;
}
if(beep_contFastBeepMark == 0)
{
SetBuzzerStatus(0);
beepStatus = 0x00;
break;
}
break;
default:
SetBuzzerStatus(0); //关闭蜂鸣器
beepStatus = 0x00;
break;
}
}
/*
***********************************************************************
* 函 数 名: BeepTask
* 功能说明:
* 形 参:无
* 返 回 值: 返回对应开关的键值
***********************************************************************
*/
void BeepTask(void)
{
BEEP_ContSlowBeep();
BEEP_ContFastBeep();
BEEP_ShortBeep();
BEEP_LongBeep();
BEEP_StartUpBeep();
BEEP_CloseDoorBeep();
BEEP_WarningBeep();
}
/******************** (C) COPYRIGHT 2017 CXHY *****END OF FILE*******************/