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

Posted on 2013-07-28 21:17  冰天雪域  阅读(1715)  评论(0编辑  收藏  举报

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


Copyright © 2024 冰天雪域
Powered by .NET 9.0 on Kubernetes