目录
前言
现在一些家电(空调,风扇,加湿器)按键时有悦耳的和弦音发出,特别是开关机或操作上下键时会有不同变调的和弦音,相比普通的嘀嘀声给人更愉悦的操作体验。
电路设计
原理说明
BUZ引脚负责输出PWM方波,BZV引脚负责充电控制。
例如,要发出“叮”的一声,在BUZ输出4KHz方波200ms,BZV输出低电平50ms。
先对电容充电;50ms后,BZV输出低电平,无源蜂鸣器由电容来提供驱动电流。
随著电容放电,声音逐渐减弱,产生类似风铃尾音的效果。
200ms后,关闭BUZ的输出。
变化不同频率,不同的时间,产生丰富和弦。
软件设计
头文件buz.h代码
//==========================================================
#ifndef _buz1_h_
#define _buz1_h_
//==========================================================
#define VTB0 0
#define VTB1 8
#define VTB2 20
#define VTB3 100
#define VPOFF 0
#define VP3K3 2424
#define VP4K1 1951
#define VP4K9 1632
//==========================================================
#define P_BZV PB4 //BUZ 充电
#define P_BUZ PC3 //BUZ 驱动
#define BUZ_ON FlagBuz = 1
#define BUZ_OFF FlagBuz = 0
#define BZV_ON P_BZV = 0
#define BZV_OFF P_BZV = 1
//==========================================================
typedef enum
{
BZ_NO = 0, //关
BZ_KEY, //按键音
BZ_ON, //开机音
BZ_OFF, //关机音
BZ_ERR, //报警音
BZ_PON,
} BUZ_MODE;
//==========================================================
extern bit FlagBuz;
//==========================================================
extern void BuzHz_In(u8 mode);
extern void Buz_Drive(void);
//==========================================================
#endif
//==========================================================
buz.c代码
//==========================================================
#include "main.h"
//==========================================================
bit FlagBuz;
//==========================================================
typedef struct
{
u16 Fre; //蜂鸣器 频率
u8 VOn; //蜂鸣器 VCC供电时间
u8 On; //蜂鸣间 频率输出时间
} BUZS;
//==========================================================
BUZS BuzD1;
//==========================================================
enum
{
BUZEND = 0,
BUZSTART = 1,
BUZING = 2,
} BuzState;
//==========================================================
const BUZS *BuzDP; //列表指针
//==========================================================
const BUZS BuzTabKey[] = {
{VP4K1, VTB1, VTB2},
{VPOFF, VTB0, VTB0}};
const BUZS BuzTabOn[] = {
{VP3K3, VTB1, VTB2},
{VP4K1, VTB1, VTB2},
{VP4K9, VTB1, VTB3},
{VPOFF, VTB0, VTB0}};
const BUZS BuzTabOff[] = {
{VP4K9, VTB1, VTB2},
{VP4K1, VTB1, VTB2},
{VP3K3, VTB1, VTB3},
{VPOFF, VTB0, VTB0}};
const BUZS BuzTabErr[] = {
{VP4K1, VTB1, VTB3},
{VP4K1, VTB1, VTB3},
{VP4K1, VTB1, VTB3},
{VPOFF, VTB0, VTB0}};
const BUZS BuzTabPon[] = {
{VP4K1, VTB2, VTB3},
{VPOFF, VTB0, VTB0}};
//==========================================================
//蜂鸣器一次参数输入
//指针指向对应的表取对应的时间
//==========================================================
void BuzHz_In(u8 mode)
{
switch (mode)
{
case BZ_KEY:
BuzDP = BuzTabKey;
break;
case BZ_ON:
BuzDP = BuzTabOn;
break;
case BZ_OFF:
BuzDP = BuzTabOff;
break;
case BZ_ERR:
BuzDP = BuzTabErr;
break;
case BZ_PON:
BuzDP = BuzTabPon;
break;
default:
BuzState = BUZEND;
break;
}
BuzState = BUZSTART;
}
//==========================================================
//BUZ的PWM是T1中断反转电平
//设置T1中断周期
//==========================================================
void Buz_Cycle(u16 Cycle)
{
T1UIE = 1;
TIM1ARRH = (Cycle - 1) >> 8; //周期
TIM1ARRL = (Cycle - 1) & 0xFF; //
}
//==========================================================
//蜂鸣器计时函数10ms调用
//==========================================================
void Buz_Drive(void)
{
switch (BuzState)
{
case BUZEND: //结束
T1UIE = 0;
BZV_OFF;
BUZ_OFF;
break;
case BUZSTART: //开始
BuzD1 = *BuzDP; //取音调数据
if (BuzD1.Fre != VPOFF) //非结束符
{
BuzState = BUZING;
Buz_Cycle(BuzD1.Fre); //设置频率
}
else
BuzState = BUZEND;
break;
case BUZING: //响中
if (BuzD1.VOn != 0)
{
BuzD1.VOn--;
BZV_ON;
}
else
{
BZV_OFF;
}
if (BuzD1.On != 0)
{
BuzD1.On--;
FlagBuz = 1;
}
else
{
BUZ_OFF;
BuzDP++; //指向下一个
BuzState = BUZSTART; //
}
break;
default:
BuzState = BUZEND;
break;
}
}
//==========================================================