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



    //文件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 ;
    
    }
    



  • 相关阅读:
    git的基本使用流程
    进程号和端口的互查
    find: missing argument to `-exec'
    mysql 排除系统库的全部备份
    windows添加“以管理员身份运行”
    sftp服务器的搭建
    ubuntu的sudo免密
    深入理解Java:注解(Annotation)自定义注解入门
    MySQL常见的三种存储引擎
    Intellij Idea 2017 字体模糊解决方案
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5243067.html
Copyright © 2020-2023  润新知