buzzer.h
#ifndef BUZZ_H
#define BUZZ_H
typedef enum {
KEYTONE = 0,
ERRORTONE,
CONFIRMTONE,
}BEEPTYPE;
void buzzer_Init(void);
void buzzerPollint(void);
void buzzer(BEEPTYPE typ);
#endif
buzzer.c
uint16_t code BuzzerTypeTbl_keyTone[2+1] = {50, 50, 0};
uint16_t code BuzzerTypeTbl_ErrTone[10+1] = {100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 0};
uint16_t code BuzzerTypeTbl_ConTone[2+1] = {600, 100, 0};
static uint16_t *buzzerTbl;
static uint16_t xdata buzzerStep;
static uint16_t xdata buzzerTimeOut;
static void buzzerTurnOn(void)
{
BUZZER_EN = 1;
}
static void buzzerTurnOff(void)
{
BUZZER_EN = 0;
}
void buzzer_Init(void)
{
buzzerTurnOff();
buzzerTimeOut = 0;
buzzerStep = 0;
buzzerTbl = NULL;
}
void buzzerPollint(void)
{
if(buzzerTimeOut && (--buzzerTimeOut == 0)) //执行完定时时间
{
buzzerTbl++; //指向下一个参数
buzzerTimeOut = *buzzerTbl; //赋值
buzzerStep++; //步进值+1
if(buzzerTimeOut)
{
if(buzzerStep & 0x01) //蜂鸣器间隔开关
{
buzzerTurnOff();
}
else
{
buzzerTurnOn();
}
}
else
{
buzzerTurnOff();
}
}
}
void buzzer(BEEPTYPE typ)
{
switch(typ)
{
case KEYTONE:
buzzerTbl = BuzzerTypeTbl_keyTone;
break;
case ERRORTONE:
buzzerTbl = BuzzerTypeTbl_ErrTone;
break;
case CONFIRMTONE:
buzzerTbl = BuzzerTypeTbl_ConTone;
break;
default: return;
}
buzzerStep = 0;
buzzerTimeOut = *buzzerTbl;
buzzerTurnOn();
}
第二种音乐蜂鸣器程序
buz.h
/**********************************************************
File name: buzz.h
Description:
**********************************************************/
#ifndef _buzz_H_
#define _buzz_H_
#include "MC96F6432.h"
#include "globals.h"
/* 蜂鸣器控制寄存器BUZCR位定义 */
#define BUZEN 0x01
#define beepPwrOn() do{P12 = 1;}while(0)
#define beepPwrOff() do{P12 = 0;}while(0)
typedef enum {
MONO_LONG = 0, //
MONO_SHORT = 1, //
MONO_ALARM = 2, //
MONO_DOOR_OPEN = 3,
}Tone_Type; //蜂鸣器声音类型
typedef enum {
BEEP_FREQUENCY_0hz = 0,
BEEP_FREQUENCY_3k5hz = 37, //300us
BEEP_FREQUENCY_3k6hz = 35, //300us
BEEP_FREQUENCY_3k8hz = 32, //260us
BEEP_FREQUENCY_4khz = 30, //
}BEEP_frequency; //蜂鸣器频率类型
typedef struct{
BEEP_frequency Freq; //频率
u8 OSCTime; //振荡持续时间,最小单位为5ms
u8 PWRTime; //供电持续时间,最小单位为5ms
}TONE_Def; //音调结构体
void buzz_init(void);
void buzzer_start(Tone_Type ToneType);
void buzzer_ctrl(void);
#endif
buz.c
/**********************************************************
File name: buzz.c
Description:
**********************************************************/
#include "globals.h"
#include "MC96F6432.h"
#include "buzz.h"
/*******************************************************
code TONE_Def toneAlarm[]: {BEEP_FREQUENCY_4khz,54,40}依次是PWM频率,
PWM时长(BUZZ),电源供电时长(BUZZOUT);只需根据客户需求修改频率时长
即可得到不同音频。
*******************************************************/
TONE_Def const *pTone;
static u8 buzzerStatus = 0; //蜂鸣器启动,需要发声时调用
code TONE_Def toneShort[] = {{BEEP_FREQUENCY_4khz,54,40},{BEEP_FREQUENCY_0hz,0,0}}; //长按“调温”键进入展示模式声音
code TONE_Def toneLong[] = {{BEEP_FREQUENCY_4khz,180,140},{BEEP_FREQUENCY_0hz,0,0}}; //上电及按键声音
code TONE_Def toneOpenDoor[] = {
{BEEP_FREQUENCY_3k5hz,26,14}, {BEEP_FREQUENCY_3k6hz,24,12}, {BEEP_FREQUENCY_3k8hz,64,32},
{BEEP_FREQUENCY_0hz,0,0}
};
code TONE_Def toneAlarm[] = {{BEEP_FREQUENCY_4khz,200,60},{BEEP_FREQUENCY_4khz,200,60}, //开门大于90秒的报警声音
{BEEP_FREQUENCY_4khz,200,60},{BEEP_FREQUENCY_4khz,200,60},
{BEEP_FREQUENCY_4khz,200,60},{BEEP_FREQUENCY_0hz,0,0}};
//===================================
//蜂鸣器初始化
//===================================
void buzz_init(void)
{
// Frequency (Hz) = 4032.258065
BUZCR = 0x00; // clock source
BUZDR = 0x1E; // count value
}
//===================================
//打开关闭震荡体
//===================================
void BUZ_OnOff(uint8_t onOff)
{
BUZCR = (onOff & ((BUZCR & BUZEN) == 0)) ? (BUZCR |= BUZEN) : BUZCR;
BUZCR = ((onOff == 0) & (BUZCR & BUZEN)) ? (BUZCR &= ~BUZEN) : BUZCR;
}
//==========================================
//设置震荡输出频率
//==========================================
void beep_setFreq(BEEP_frequency freq)
{
u8 i = (u8)freq;
BUZDR = freq;
}
//========================================
//此函数在需要发生的地方调用
//========================================
void buzzer_start(Tone_Type ToneType)
{
switch (ToneType)
{
case MONO_LONG: pTone = toneLong; break;
case MONO_SHORT: pTone = toneShort;break;
case MONO_ALARM: pTone = toneAlarm;break;
case MONO_DOOR_OPEN : pTone = toneOpenDoor; break;
default: pTone = toneLong;break;
}
buzzerStatus = 0;
}
//===========================================
//蜂鸣器控制,每5ms执行一次
//===========================================
void buzzer_ctrl(void)
{
static TONE_Def Tone;
switch (buzzerStatus)
{
case 0:
Tone = *pTone;
if(Tone.Freq != BEEP_FREQUENCY_0hz) //非结束符
{//先判断供电持续时间
if (Tone.PWRTime != 0){
Tone.PWRTime--;
beepPwrOn();
}
else{
buzzerStatus = 2;
break;
}//再判断振荡持续时间
if (Tone.OSCTime != 0){
Tone.OSCTime--;
beep_setFreq(Tone.Freq);
BUZ_OnOff(ON);
}
else{
beepPwrOff();
buzzerStatus = 2;
break;
}//判断完成,开始递减计时
buzzerStatus = 1;
}
else /* Tone.Freq == FREQ_NO */ //是结束符
buzzerStatus = 2;
break;
case 1:
if (Tone.PWRTime != 0)
Tone.PWRTime --;
else
beepPwrOff();
if (Tone.OSCTime != 0)
Tone.OSCTime --;
else{
//GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_SLOW);
beepPwrOff();
BUZ_OnOff(OFF);
pTone++; //取下一个音调
buzzerStatus = 0;
}
break;
default:
break;
}
}