單片機控制蜂鳴器和弦音發音程序



//文件buz.h

#ifndef _BUZ_H_
#define _BUZ_H_

//SetupBzhx(M_BZ_KEY) ;	
//=====buz 驅動頻率定義==============
//聲音結束符定義==
#define		VFR0	0
#define		VFR1	VP3K3
#define		VFR2	VP4K1
#define		VFR3	VP4K9

#define		VP2K3	2609  //2k
#define		VP2K6	2308  	
#define		VP2K9	2069  //

#define		VP3K3	1818//12000/2/3.3  //4K
#define		VP4K1	1463//12000/2/4.1  	
#define		VP4K9	1224//12000/2/4.9  //


	
//=====buz 驅動port定義==============
sbit	P_BZV = P2^6 ;   //BUZ 充電
sbit	P_BUZ = P0^2 ;  //BUZ 驅動

//=====BUZ port操作==================
#define		BUZ_ON		P_BUZ = 1
#define		BUZ_OFF		P_BUZ = 0//

#define     BuzVcc_ON       P_BZV = 0
#define     BuzVcc_OFF      P_BZV = 1


//=====蜂鳴器聲音種類================
#define	 	M_BZ			(unsigned char)0    //無
#define	 	M_BZ_KEY 	    (unsigned char)1	//按鍵音
#define	 	M_BZ_ON		    (unsigned char)2	//開機音
#define	 	M_BZ_OFF	    (unsigned char)3	//關機音


//=====蜂鳴器工作過程狀態==========
#define	    MBZ_RST     (unsigned char)0    
#define	    MBZ_P1      (unsigned char)1   
#define	    MBZ_P2      (unsigned char)2    
#define	    MBZ_P3      (unsigned char)3    
#define	    MBZ_P4      (unsigned char)4    


//=====蜂鳴器聲音結構定義=====
typedef	struct tBUZHX
{
	uint16 BzFre ;	//蜂鳴器 頻率
	uint8 T_BzO ; //蜂鳴間 頻率輸出時間
	uint8 T_BzV  ; //蜂鳴器 VCC供電時間
		
}tBuzHx ;


//====函數聲明=====
extern void SetupBzhx(uint8 MBz) ;
extern void CmdBzhx(void) ;


#endif



//文件buz.c
#include "global.h"
#include "hxbuz.h"

tBuzHx	*tBzHx ;

#define     VTB1      20  //20
#define     VTB2      6 //20
#define     VTB3      100 //50

const tBuzHx Bzx0[]={{VFR0,0,0}} ;
const tBuzHx Bzx1[]={{VFR2,VTB3,VTB2},{VFR0,0,0}} ;
//const tBuzHx Bzx2[]={{VP2K3,20,20},{VP2K6,20,20},{VP2K9,210,10},{VFR0,0,0}} ;
//const tBuzHx Bzx3[]={{VP2K9,20,20},{VP2K6,20,20},{VP2K3,210,10},{VFR0,0,0}} ;

const tBuzHx Bzx2[]={{VFR1,VTB1,VTB2},{VFR2,VTB1,VTB2},{VFR3,VTB3,VTB2},{VFR0,0,0}} ;
const tBuzHx Bzx3[]={{VFR3,VTB1,VTB2},{VFR2,VTB1,VTB2},{VFR1,VTB3,VTB2},{VFR0,0,0}} ;

uint8 RBzStatus = 0 ;
//***************************************
// 函數名稱:SetupBzhx
// 函數功能:設置蜂鳴器模式
// 入口參數:該模式下的蜂鳴次數 蜂鳴相關數據清0
// 出口參數:無
// 返 回 值:無
//***************************************
void SetupBzhx(uint8 MBz)
{	   
    RBzStatus = MBZ_P1 ;	
    BuzVcc_OFF ; 
    BUZ_OFF ;
    TIMER5_IE_DIS ;
    
    switch(MBz)
    {
        case M_BZ_KEY:
            tBzHx = Bzx1 ; 
            break ;
        case M_BZ_ON:
            tBzHx = Bzx2 ;  
            break ;      
        case M_BZ_OFF:
            tBzHx = Bzx3 ; 
            break ;  
        default :
            tBzHx = Bzx0 ; 
            RBzStatus = MBZ_RST ;	
            break ;     
    }     
} 
//*************************************
// 函數名稱:CmdBzhx
// 函數功能:蜂鳴器控制			 -
// 入口參數:無
// 出口參數:無
// 返 回 值:無
//***************************************
void CmdBzhx(void)
{
    static tBuzHx  Bx1 ;            

    switch(RBzStatus)
    {
        case MBZ_P1 : 
            Bx1 = *tBzHx  ;
            Timer5_Reload(Bx1.BzFre) ;//設置頻率
            if(Bx1.BzFre != VFR0) //非結束符
            {
                RBzStatus = MBZ_P2 ; 
                
                if(Bx1.T_BzV != 0)
                {
                    Bx1.T_BzV -- ;   
                    BuzVcc_ON ; 
                }     
                else        
                {
                //    BuzVcc_OFF ;                           
                }  
                  
                if(Bx1.T_BzO != 0)
                {
                    Bx1.T_BzO -- ;  
                    TIMER5_IE_ENB ;
                }     
                else
                {
                //    TIMER5_IE_DIS ;                       
                }           
            }
            else //為結束符
            {
                RBzStatus = MBZ_RST ;   
            }             
            
            
            break ;
        case MBZ_P2 : 

            if(Bx1.T_BzV != 0)
            {
                Bx1.T_BzV -- ;   
                BuzVcc_ON ; 
            }     
            else        
            {
                BuzVcc_OFF ;                           
            }  
              
            if(Bx1.T_BzO != 0)
            {
                Bx1.T_BzO -- ;  
                TIMER5_IE_ENB ;
            }     
            else
            {
                TIMER5_IE_DIS ;
                BUZ_OFF ;  
                tBzHx ++ ; //取下一個音調
                RBzStatus = MBZ_P1 ;            
            }                   
             
            break ;
            
        default :
            break ;                               
    }

}




//======簡易例程===========
void main(void)
{

	Delay() ;

	SetupBzhx(M_BZ_KEY) ; //調用音調程序-按鍵音

	while(1)
	{
		if(F_10MS)
		{
			F_10MS = 0 ;

			CmdBzhx() ;   //10MS調用一次程序

		}
		
	}

}

//-----定時器5中斷程序------- 產生所須要的頻率
 // [定時器5中斷入口]
void Timer5Interrupt() interrupt 1 //timer5
{
//    P0 ^= SETB3 ;

	Bank1;
    ClrTF5  ;   //Bank1;
	Bank0;

    P_BUZ ^= P_BUZ ;

}




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM