音乐蜂鸣器实现

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;
    }
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值