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


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


  • 相关阅读:
    POJ1422 Air Raid 【DAG最小路径覆盖】
    Android studio ElasticDownloadView
    POJ 1753 Flip Game
    Ogre嵌入MFC傻瓜全然教程(三)
    你的水桶有多满
    uva 10581
    map 解析
    In-Out Parameters inout keyword
    Associated Values & enum
    函数式编程 归档
  • 原文地址:https://www.cnblogs.com/aukle/p/3221717.html
Copyright © 2020-2023  润新知