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

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

/*

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

	}

	

}


你可能感兴趣的:(程序)