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

简介:


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

}





本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5243067.html,如需转载请自行联系原作者
相关文章
|
6月前
|
存储 算法 编译器
如何优化单片机程序里面的C代码方法
如何优化单片机程序里面的C代码方法
55 0
|
数据处理 C语言
侃侃单片机的裸奔程序的框架
侃侃单片机的裸奔程序的框架
103 0
【单片机】按键声光报警实验(蜂鸣器)
【单片机】按键声光报警实验(蜂鸣器)
616 0
|
3月前
51单片机用汇编语言实现独立按键检测,每个按键有不同功能,包含按键消抖程序
51单片机用汇编语言实现独立按键检测,每个按键有不同功能,包含按键消抖程序
111 3
|
3月前
|
人工智能 开发者 芯片
【51单片机】单片机开发者的福音: 让AI看电路图帮你编写程序(使用ChatGPT 中训练好的单片机工程师模型)
使用AI大语言模型编写 单片机程序. 使用的是 OpenAI公司发布的 ChatGPT .在ChatGPT上有别人训练好的 单片机工程师 with Keil uVision 5 - C Code Explainer模型, 可以上传电路图改模型可以通过这个用户所给的电路图进行编程.
271 0
【51单片机】单片机开发者的福音: 让AI看电路图帮你编写程序(使用ChatGPT 中训练好的单片机工程师模型)
|
5月前
技术心得记录:单片机开发过程中使用结构体简化程序
技术心得记录:单片机开发过程中使用结构体简化程序
32 0
|
6月前
基于51单片机的简单交通灯程序
基于51单片机的简单交通灯程序
83 2
【单片机】延迟程序&延迟子程序的设计(入门)
【单片机】延迟程序&延迟子程序的设计(入门)
【单片机期中测试】9.定时器实现简单的秒表程序
【单片机期中测试】9.定时器实现简单的秒表程序
150 0
|
6月前
|
缓存 编译器 程序员
嵌入式开发环境Vscode开发STM32单片机程序
嵌入式开发环境Vscode开发STM32单片机程序
162 0