查看: 3071|回复: 0

S3c2440播放音乐

[复制链接]
发表于 2011-5-5 22:02:16 | 显示全部楼层 |阅读模式
我的板子是天嵌科技的TQ2440,自己用PWM制作的播放《祝你生日快乐》歌曲,程序下载地址如下:
                                                
这个程序是根据天嵌的TQ2440 3.5英寸板子做的,参照《裸奔三部曲》中的PWM播放音乐来实现的,我在作者的基础上优化了程序,减少了不必要的分支判断,利用宏定义还实现。宏定义了音符的高低和长短,宏定义如下:

////////////////低音/////////////////////////
#define LDO 260
#define LRE 294
#define LMI 328
#define LFA 347
#define LSO 390
#define LLA 438
#define LSI 490
/////////////////中音//////////////////////////
#define MDO 520
#define MRE 581
#define MMI 657
#define MFA 694
#define MSO 781
#define MLA 892
#define MSI 1000
////////////////高音////////////////////////////
#define HDO 1041
#define HRE 1190
#define HMI 1315
#define HFA 1388
#define HSO 1562
#define HLA 1785
#define HSI 1923
///////////////休止符////////////////////////
#define STP 0
//////////////////节拍数/////////////////////
#define ONEIGHT 96
#define ONEFOUR 192
#define TWOFOUR 384
#define THRFOUR 576
#define ONE 768
#define TWO 1536
#define THREE 2304
#define FOUR 3072
//////////////////////////////////////////////
#define VOLUME 2



然后歌曲数组直接使用宏名就可以了,这个我自己写的生日快乐的数组:

unsigned int SONG[]={ //祝你生日快乐
LSO,TWOFOUR,LSO,TWOFOUR,LLA,ONE,    LSO,ONE,    MDO,ONE,    LSI,TWO,    LSO,TWOFOUR,LSO,TWOFOUR,LLA,ONE,
LSO,ONE,    MRE,ONE,    MDO,TWO,    LSO,TWOFOUR,LSO,TWOFOUR,MSO,ONE,    MMI,ONE,    MDO,ONE,    LSI,ONE,
LLA,ONE,    MFA,TWOFOUR,MFA,TWOFOUR,
///////////////////////////////////////////////////////////////////////////////////////////////////////////
MMI,ONE,    MDO,ONE,    MRE,ONE,    MDO,TWO,    LSO,TWOFOUR,LSO,TWOFOUR,MSO,ONE,    MMI,ONE,    MDO,ONE,
LSI,ONE,    LLA,ONE,    MFA,TWOFOUR,MFA,TWOFOUR,MMI,ONE,    MDO,ONE,    MRE,ONE,    MDO,TWO    ,STP,ONE,
///////////////////////////////////////////////////////////////////////////////////////////////////////////
STP,TWOFOUR,MRE,TWOFOUR,MSO,TWOFOUR,MFA,TWOFOUR,MMI,TWOFOUR,MRE,TWOFOUR,LSI,TWOFOUR,LSO,TWOFOUR,LLA,TWOFOUR,
LSI,TWOFOUR,STP,ONE,    STP,TWOFOUR,MMI,TWOFOUR,MSO,TWOFOUR,MFA,TWOFOUR,MMI,TWOFOUR,MRE,TWOFOUR,MDO,TWOFOUR,
LSO,TWOFOUR,LLA,TWOFOUR,MDO,TWOFOUR,STP,ONE,    STP,TWOFOUR,MMI,TWOFOUR,MSO,TWOFOUR,MLA,TWOFOUR,MSO,TWOFOUR,
MFA,TWOFOUR,
///////////////////////////////////////////////////////////////////////////////////////////////////////////
MMI,TWOFOUR,MRE,TWOFOUR,MMI,TWOFOUR,MSO,TWOFOUR,MFA,TWOFOUR,MRE,TWOFOUR,MDO,TWOFOUR,MMI,TWOFOUR,MFA,TWOFOUR,
MLA,TWOFOUR,MSO,TWOFOUR,MFA,TWOFOUR,MMI,ONE,    MDO,ONE,    MSO,THRFOUR,MSO,ONEFOUR,MLA,ONE,    MSO,ONE,  
HDO,ONE,    MSI,TWO,    MSO,THRFOUR,MSO,ONEFOUR,
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
MLA,ONE,    MSO,ONE,    HRE,ONE,    HDO,TWO,    MSO,TWOFOUR,MSO,TWOFOUR,HSO,ONE,    HMI,ONE,    HDO,ONE,   
MSI,ONE,    MLA,ONE,    HFA,TWOFOUR,HFA,TWOFOUR,HMI,ONE,    HDO,ONE,    HRE,ONE,    HDO,TWO
};

音符的高低表示:在音符的上面加一小圆点,即表示高八度演唱,加两个圆点表示高两个八度;反之,在下面加一个圆点,即表示低八度演唱,加两个圆点表示低两个八度。

音符的长短表示:



音符们各有不同,音符有不同的长度,如下表。

音符名称
       

写 法
       

时 值

全音符
       

5 — — —
       

四拍

二分音符
       

5 —
       

二拍

四分音符
       

5  
       

一拍

八分音符
       

       

半拍

十六分音符
       

5
=
       

四分之一拍

三十二分音符
       

       

八分之一拍



我在原作者基础上使用宏定义来实现音符的高低和长短的定义,并自定义了休止符,吼吼

通过修改Buzzer_Freq_Set(  )函数可以调节音符和音量,并可以在频率为零时,停止频率输出(模拟休止符),修改后的函数为:

void Buzzer_Freq_Set( U32 freq,U32 vol )
{
rGPBCON &= ~3;   //set GPB0 as tout0, pwm output
rGPBCON |= 2;
  
rTCFG0 &= ~0xff;
rTCFG0 |= 15;   //prescaler = 15+1
rTCFG1 &= ~0xf;
rTCFG1 |= 2;
if(freq == 0)
Buzzer_Stop() ;
else{   //mux = 1/8
rTCNTB0 = (PCLK>>7)/freq;
rTCMPB0 = rTCNTB0>>vol; // 50%
rTCON &= ~0x1f;
rTCON |= 0xb;   //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
rTCON &= ~2;   //clear manual update bit
}
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表