码迷,mamicode.com
首页 > 其他好文 > 详细

单片机控制蜂鸣器和弦音发音程序

时间:2014-10-31 20:40:50      阅读:956      评论:0      收藏:0      [点我收藏+]

标签:单片机   蜂鸣器驱动   和弦音   

bubuko.com,布布扣


//文件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 驱动端口定义==============
sbit	P_BZV = P2^6 ;   //BUZ 充电
sbit	P_BUZ = P0^2 ;  //BUZ 驱动

//=====BUZ 端口操作==================
#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 ;

}



单片机控制蜂鸣器和弦音发音程序

标签:单片机   蜂鸣器驱动   和弦音   

原文地址:http://blog.csdn.net/libiaojs/article/details/40660085

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!