原创 今天在匠人那里发现了这个蜂鸣器播放音乐的帖子,转过来,有时间了自己搞一下

2008-3-6 12:13 2612 3 3 分类: MCU/ 嵌入式

用蜂鸣器实现音乐播放,虽然效果差了一点,但是当把你的思想(程序)用“芯”来播放的时候,是不是感觉也挺美妙的

/***************************************/
/*       CopyRight 2005            *
/****************************************
    
文件名称:Music.C
    
文件版本:V1.0
    
创建人员:剑寒情暖
    
创建日期:2005.6.28
    
功能描述:用蜂鸣器播放音乐的函数
    
相关硬件:at89s52兼容单片机,晶体11.0592M
    
修改记录:
***************************************/
#i nclude <regx52.H>
#i nclude "musicda.h"


#define uchar         unsigned char
#define uint         unsigned int

sbit BUZZER        =P1^5;

uchar g_ucMusicNo;        //
正在播放的曲目的序号
uint g_ucSoundLongCNT;    //
//uint  g_uTempo;    

/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

                
音乐数据
                
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/


/*************Music1: Happy birthday*********************/
uchar code SOUNDLONG1[]=
{
     _8d,_16,_4,_4,_4,_2,
     _8d,_16,_4,_4,_4,_2,
     _8d,_16,_4,_4,_4,_4,_4,
     _8d,_16,_4,_4,_4,_2,
    0
};
uint code SOUNDTONE1[]=
{
    _RE,_RE,_MI,_RE,_SO,_FAr,
    _RE,_RE,_MI,_RE,_LA,_SO,
    _RE,_RE,_RE1,_TI,_SO,_FAr,_MI,
    _DO1,_DO1,_TI,_SO,_LA,_SO,
    0
};
/*************Music2:
月朦胧鸟朦胧*******************/
uchar code SOUNDLONG2[]=
{
     _2,_4,_2,_4,_2,_4,_2d,
    _2,_4,_4,_4,_4,_1,
    _2,_4,_2,_8,_8,_2,_8,_8,_2d,
    _2,_4,_2,_4,_1,
    0
     
};
uint code SOUNDTONE2[]=
{
    _1SO,_DO,_MI,_DO,_1LA,_DO,_1SO,
    _MI,_MI,_MI,_RE,_DO,_RE,
    _SO,_SO,_SO,_LA,_SO,_MI,_RE,_DO,_1LA,
    _SO,_SO,_MI,_RE,_DO,
    0
};
/*************Music3:
郊游******************/
uchar code SOUNDLONG3[]=
{
     _4,_4,_4,_4,_4,
    _4d,_8,_4,_4,_4,_4,_4,
    _4,_4,_4,_4,_4,
    _4,_8,_8,_4,_4,_2,
    0
};
uint code SOUNDTONE3[]=
{
    _RE1,_RE1,_RE1,_TI,_RE1,
    _RE1,_TI,_SO,_TI,_LA,_SO,_RE,
    _MI,_SO,_RE,_SO,_TI,
    _RE1,_SO,_LA,_TI,_LA,_SO,
    0
};
/*************Music4: Three wheel******************/
uchar code SOUNDLONG4[]=
{
     _8,_8,_8d,_16,
     _8,_8,_4,
     _8,_8,_8,_8,
     _8,_8,_4,

     _8,_8,_8d,_16,
     _8,_8,_8d,_16,
     _8,_16,_16,_8,_16,_16,
     _8,_8,_4,
    0
};
uint code SOUNDTONE4[]=
{
    _DO,_DO,_RE,_MI,
    _SO,_SO,_MI,
    _SO,_SO,_LA,_TI,
    _DO1,_DO1,_SO,
    _DO1,_DO1,_LA,_SO,
    _MI,_LA,_SO,_MI,
    _DO,_RE,_MI,_SO,_LA,_SO,
    _MI,_RE,_DO,
    0
};
/**************
彩虹妹妹**********************/
uchar code SOUNDLONG5[]=
{
     _4,_8,_8,_4,_8,_8,
     _8,_4,_8,_2,
     _4,_8,_8,_4,_8,_8,
     _8,_4,_8,_2,
     _4,_8,_8,_8,_8,_8,_8,
     _8,_4,_8,_2,
     _4,_4,_4,_8,_8,
     _8,_4,_8,_2,
    0
};
uint code SOUNDTONE5[]=
{
    _LA,_SO,_MI,_LA,_SO,_MI,
    _LA,_LA,_SO,_LA,
    _LA,_SO,_MI,_LA,_SO,_MI,
    _RE,_RE,_DO,_RE,
    _MI,_MI,_SO,_LA,_DO1,_LA,_SO,
    _MI,_MI,_SO,_DO,
    _MI,_MI,_MI,_MI,_MI,
    _1LA,_1LA,_1SO,_1LA,
    0
};



/*************************************************
*    
函数名称:void T2Init(void)
*    
创建日期:2005.6.17
*    
功能描述:定时器T2初始化
*    
入口参数:uT2Reg:定时器初值
*    
返回值:     
*    
修改日志:
*************************************************/
void T2Init(uint uT2Reg)
{
    CP_RL2=0;    //16
位自动重载
    T2MOD=0x00;  //
计数增加,外部捕获禁止
    RCLK=0;
    TCLK=0;
    TL2=RCAP2L=uT2Reg&0x00ff;
    TH2=RCAP2H=uT2Reg>>8;
    TR2=1;            //
启动定时器
    ET2=1;        //t2
开中断
    EA=1;
}
/*************************************************
*    
函数名称:void MusicPlay(uchar ucSL[],uint uST[])
*    
创建日期:2005.7.12
*    
功能描述:播放某首音乐的函数
*    
入口参数:ucSL[]:音节长度的数组;uST[]:音乐频率的数组
*    
返回值:     
*    
修改日志:
*************************************************/
void MusicPlay(uchar ucSL[],uint uST[])
{
    uchar i="0";
    //float fTmp="0";
    while((ucSL!=0)||(uST!=0))
    {
        //fTmp=(float)11059/(float)12000;
        T2Init(0xffff-uST*((float)11059/(float)12000));        //11
0592M的晶体
        g_ucSoundLongCNT=((MODERATO*ucSL*1000L)/8)/uST;
        while(g_ucSoundLongCNT!=0);        //
等待计数器为0
        TR2=0;            //
暂时关闭定时器
        i++;
    }
}
/*************************************************
*    
函数名称:void EnjoyMusic(uchar ucNO,bit bOffMusic,bit bSigleFl)
*    
创建日期:2005.6.28
*    
功能描述:音乐播放的函数
*    
入口参数:ucNO:要播放的曲目序号。
*    
返回值:            
*    
修改日志:
*************************************************/
void EnjoyMusic(uchar ucNO)
{
    switch(ucNO)
    {
        /*******
1首音乐**********/
        case 0:
        {
            MusicPlay(SOUNDLONG1,SOUNDTONE1);    //
播放音乐1
            break;    
        }
        /*******
2首音乐**********/
        case 1:
        {
            MusicPlay(SOUNDLONG2,SOUNDTONE2);    //
播放音乐2
            break;    
        }
        /*******
3首音乐**********/
        case 2:
        {
            MusicPlay(SOUNDLONG3,SOUNDTONE3);    //
播放音乐3
            break;    
        }
        /*******
4首音乐**********/
        case 3:
        {
            MusicPlay(SOUNDLONG4,SOUNDTONE4);    //
播放音乐4
            break;    
        }
        /*******
5首音乐**********/
        case 4:
        {
            MusicPlay(SOUNDLONG5,SOUNDTONE5);    //
播放音乐5
            break;    
        }
        default:
            break;
    }
}

/*************************************************
*    
函数名称:void T2Init(void)
*    
创建日期:2005.7.11
*    
功能描述:用于音乐的音调半周期定时
*    
入口参数:无
*    
返回值:     
*    
修改日志:
*************************************************/
void T2ISR(void) interrupt 5 using 1
{
    TF2=0;                //
手动清除溢出标志
    if(g_ucSoundLongCNT!=0)
    {
        g_ucSoundLongCNT--;
    }
    BUZZER=~BUZZER;
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /3 下一条