您的位置:首页 > 其它

蜂鸣器驱动方式源程序--有源无源通用

2013-07-28 21:17 489 查看


/*
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
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: