我的板子是天嵌科技的TQ2440,自己用PWM制作的播放《祝你生日快樂》歌曲,程序下載地址如下:
這個程序是根據(jù)天嵌的TQ2440 3.5英寸板子做的,參照《裸奔三部曲》中的PWM播放音樂來實現(xiàn)的,我在作者的基礎(chǔ)上優(yōu)化了程序,減少了不必要的分支判斷,利用宏定義還實現(xiàn)。宏定義了音符的高低和長短,宏定義如下:
////////////////低音/////////////////////////
#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
//////////////////節(jié)拍數(shù)/////////////////////
#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
然后歌曲數(shù)組直接使用宏名就可以了,這個我自己寫的生日快樂的數(shù)組:
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
=
四分之一拍
三十二分音符
八分之一拍
我在原作者基礎(chǔ)上使用宏定義來實現(xiàn)音符的高低和長短的定義,并自定義了休止符,吼吼
通過修改Buzzer_Freq_Set( )函數(shù)可以調(diào)節(jié)音符和音量,并可以在頻率為零時,停止頻率輸出(模擬休止符),修改后的函數(shù)為:
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
}
} |