/*
1、此程序适用有源和无源蜂鸣器的驱动
2、可自由定义多种蜂鸣声音
3、只需传递一个参数就能达到让BUZ的声音重复响几次
4、程序结构清晰 操作方便
*/
//=====蜂鸣器驱动寄存器定义=====
typedef struct tBUZ
{
uint8 RM_BZ ; //蜂鸣器模式
uint16 T_BzFre ; //蜂鸣间隔时间
uint8 T_BBNum ; //蜂鸣器在模式下的蜂鸣次数
uint8 F_Buz ; //驱动信号标志
}tBuz ;
tBuz tBz ; //定义结构体
#define RM_BZ tBz.RM_BZ
#define T_BzFre tBz.T_BzFre
#define T_BBNum tBz.T_BBNum
#define F_Buz tBz.F_Buz
//=====buz 驱动端口====
#define P_BUZ PC7_OUT
#define BUZ_PCPL PC_OUT ^= SETB7 ; //BUZ IO 取反
//=====BUZ 端口操作==== 有效端口为1 0
#define OFFIO_BUZ {P_BUZ = 0 ; F_Buz = 0 ;}//
#define ONIO_BUZ F_Buz = 1//
//----------------------------------
#define VT_BUZ(x) (x)
//宏定义 BUZ的几中常见声音
#define M_BZ (unsigned char)0
#define M_BZ_KEY (unsigned char)1 //短响
#define M_BZ_BB (unsigned char)3 //滴..滴 定时音
#define M_BZ_LKEY (unsigned char)4 //长响
#define M_BZ_ERR (unsigned char)5 //报警
//*************************************
// 函数名称:SetBuz
// 函数功能:设置蜂鸣器模式
// 入口参数:该模式下的蜂鸣次数
// 出口参数:无
// 返 回 值:无
//***************************************
void SetupBz(uint8 RM_BZIn,uint8 BNum)
{
T_BzFre = 0 ; //蜂鸣频率
T_BBNum = BNum ;//该蜂鸣模式的蜂鸣总次数
RM_BZ = RM_BZIn ; //蜂鸣模式
OFFIO_BUZ ;
}
//*************************************
// 函数名称:CmdBuz
// 函数功能:蜂鸣器控制
// 入口参数:无
// 出口参数:无
// 返 回 值:无
// 备注 :以下编写了四种常用的蜂鸣器的提示音 读者可自行修改声音及再增加声音类型
//***************************************
void CmdBz(void)
{
switch(RM_BZ)
{
case M_BZ:
SetupBz(M_BZ,0);
break ;
//--------------------
case M_BZ_KEY: // 计1次
T_BzFre ++ ;
if(T_BzFre <= VT_BUZ(10))//5
{
ONIO_BUZ ;
}
else
{
SetupBz(M_BZ,0);
}
break ;
//----------------------------
case M_BZ_BB : //定时音提示-翻炒提示音
if(T_BBNum != 0)
{
T_BzFre ++ ;
if(T_BzFre<= VT_BUZ(20))
{
ONIO_BUZ ;
}
else if(T_BzFre <= VT_BUZ(30))
{
OFFIO_BUZ ;
}
else if(T_BzFre <= VT_BUZ(50))
{
ONIO_BUZ ;
}
else if(T_BzFre <= VT_BUZ(100))
{
OFFIO_BUZ ;
}
else
{
T_BzFre = 0 ;
T_BBNum -- ;
}
}
else
{
SetupBz(M_BZ,0);
}
break ;
//----------------------------
case M_BZ_LKEY ://关机 长响音
if(T_BBNum != 0)
{
T_BzFre ++ ;
if(T_BzFre <= VT_BUZ(80))//BZ_T1
{
ONIO_BUZ ;
}
else if(T_BzFre <= VT_BUZ(100))//BZ_T2
{
OFFIO_BUZ ;
}
else
{
T_BzFre = 0 ;
T_BBNum -- ;
}
}
else
{
SetupBz(M_BZ,0);
}
break ;
//-------------------
case M_BZ_ERR :
if(T_BBNum != 0)
{
T_BzFre ++ ;
if(T_BzFre <= VT_BUZ(12))
{
ONIO_BUZ ;
}
else if(T_BzFre <= VT_BUZ(20))
{
OFFIO_BUZ ;
}
else
{
T_BzFre = 0 ;
T_BBNum -- ;
}
}
else
{
SetupBz(M_BZ,0);
}
break ;
//-------------------
default :
SetupBz(M_BZ,0);
break ;
}
}
//---应用实例-----
void main(void)
{
SetupBz(M_BZ_LKEY,2) ;//上电蜂鸣器长响两声
while(1)
{
while(!F_10MS) ; //10MS跑一次主程序
F_10MS = 0 ;
CmdBz() ;
}
}
//中断服务程序
void interrupt server(void)
{
//定时125U中断一次
if(F_Buz)
{
BUZ_PCPL ; //BUZ 取反 针对无源BUZ -- 4K
//ONIO_BUZ ; // BUZ直驱 针对有源BUZ
}
}
浙公网安备 33010602011771号