程序:
1.png (2.08 KB, 下載次數: 63)
下載附件
2019-3-18 10:11 上傳
0.png (7.44 KB, 下載次數: 47)
下載附件
2019-3-18 18:11 上傳
musicPlayerMain.c
- /*************************************************
- *實例名稱:音樂播放器
- *實例功能:通過分解存儲音樂節拍數組中的信息,實現音
- 樂的方波
- *作者:yd
- *時間:09.06.20
- *************************************************/
- #include "music.h"
- #include "musicCode.h"
- void main()
- {
- InitialPlayer(); //播放器初始化
- sei(); //開總中斷
- while(1)
- {
- Play(Music_Girl,0,3,360); //播放第一首歌
- Delay1ms(500);
- Play(Music_Same,0,3,360); //播放第二首歌
- Delay1ms(500);
- Play(Music_Two,0,3,360); //播放第二首歌
- Delay1ms(500);
- }
- }
復制代碼
music.c
- #define MUSIC_GLOBAL 1
- #include "music.h"
- /********************************************
- *函數名稱:InitialPlayer(void)
- *函數功能:初始化音樂播放器
- *函數入口:無
- *函數出口:無
- ********************************************/
- void InitialPlayer(void)
- {
- PlayIO = 0;
- Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256; // 計算TL1應裝入的初值 (10ms的初裝值)
- Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256; // 計算TH1應裝入的初值
- TH1 = Sound_Temp_TH1;
- TL1 = Sound_Temp_TL1;
- TMOD|= 0x11; //定時器0和定時1工作在模式1
- ET0=1; //定時器0溢出中斷使能
- TR0= 0; //啟動定時器0
- TR1= 0; //啟動定時器1
- }
- /************************************
- *函數名稱:Delay1ms(uint count)
- *函數功能:ms級延時
- *函數入口:延時計數count
- *函數出口:無
- ************************************/
- void Delay1ms(uint count)
- {
- unsigned int i,j;
- for(i=0;i<count;i++)
- for(j=0;j<120;j++);
- }
- /**********************************************
- *函數名稱:MusicTimer0
- *函數功能:timer0溢出中斷入口,產生音符中斷
- *函數入口:無
- *函數出口:無
- **********************************************/
- void MusicTimer0(void) interrupt 1
- {
- PlayIO = !PlayIO;
- TH0 = Sound_Temp_TH0;
- TL0 = Sound_Temp_TL0;
- }
- /************************************************
- *函數名稱:Play(uchar *Sound,uchar Signature,
- uchar Octachord,uint Speed)
- *函數功能:播放音樂函數
- *函數入口:樂曲數組指針Sound;調號(0-11)Signature,
- *樂曲升多少個半音演奏;升降八度(1-3)Octachord,
- *1:降八度, 2:不升不降, 3:升八度;
- *演奏速度(1-12000)Speed,值越大速度越快
- *函數出口:無
- *************************************************/
- void Play(uchar *Sound,uchar Signature,uchar Octachord,uint Speed)
- {
- uint NewFreTab[12]; //新的頻率表
- uchar i,j;
- uint Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;
- uchar Tone,Length,SL,SH,SM,SLen,XG,FD;
- for(i=0;i<12;i++) // 根據調號及升降八度來生成新的頻率表
- {
- j = i + Signature;
- if(j > 11)
- {
- j = j-12;
- NewFreTab[i] = FreTab[j]*2;
- }
- else
- NewFreTab[i] = FreTab[j];
- if(Octachord == 1)
- NewFreTab[i]>>=2;
- else if(Octachord == 3)
- NewFreTab[i]<<=2;
- }
-
- SoundLength = 0;
- while(Sound[SoundLength] != 0x00) //計算歌曲長度
- {
- SoundLength+=2;
- }
- Point = 0;
- Tone = Sound[Point];
- Length = Sound[Point+1]; // 讀出第一個音符和它時時值
- LDiv0 = 12000/Speed; // 算出1分音符的長度(幾個10ms)
- LDiv4 = LDiv0/4; // 算出4分音符的長度
- LDiv4 = LDiv4-LDiv4*SOUND_SPACE; // 普通音最長間隔標準
- TR0 = 0;
- TR1 = 1;
- while(Point < SoundLength)
- {
- SL=Tone%10; //計算出音符
- SM=Tone/10%10; //計算出高低音
- SH=Tone/100; //計算出是否升半
- CurrentFre = NewFreTab[SignTab[SL-1]+SH]; //查出對應音符的頻率
- if(SL!=0)
- {
- if (SM==1) CurrentFre >>= 2; //低音
- if (SM==3) CurrentFre <<= 2; //高音
- Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//計算計數器初值
- Sound_Temp_TH0 = Temp_T/256;
- Sound_Temp_TL0 = Temp_T%256;
- TH0 = Sound_Temp_TH0;
- TL0 = Sound_Temp_TL0 + 12; //加12是對中斷延時的補償
- }
- SLen=LengthTab[Length%10]; //算出是幾分音符
- XG=Length/10%10; //算出音符類型(0普通1連音2頓音)
- FD=Length/100;
- LDiv=LDiv0/SLen; //算出連音音符演奏的長度(多少個10ms)
- if (FD==1)
- LDiv=LDiv+LDiv/2;
- if(XG!=1)
- if(XG==0) //算出普通音符的演奏長度
- if (SLen<=4)
- LDiv1=LDiv-LDiv4;
- else
- LDiv1=LDiv*SOUND_SPACE;
- else
- LDiv1=LDiv/2; //算出頓音的演奏長度
- else
- LDiv1=LDiv;
- if(SL==0) LDiv1=0;
- LDiv2=LDiv-LDiv1; //算出不發音的長度
- if (SL!=0)
- {
- TR0=1;
- for(i=LDiv1;i>0;i--) //發規定長度的音
- {
- while(TF1==0);
- TH1 = Sound_Temp_TH1;
- TL1 = Sound_Temp_TL1;
- TF1=0;
- }
- }
- if(LDiv2!=0)
- {
- TR0=0;
- PlayIO=0;
- for(i=LDiv2;i>0;i--) //音符間的間隔
- {
- while(TF1==0);
- TH1 = Sound_Temp_TH1;
- TL1 = Sound_Temp_TL1;
- TF1=0;
- }
- }
- Point+=2;
- Tone=Sound[Point];
- Length=Sound[Point+1];
- }
- PlayIO = 0;
- }
復制代碼
0.png (4.5 KB, 下載次數: 36)
下載附件
2019-3-18 18:12 上傳
全部資料51hei下載地址:
音樂播放器.zip
(10.76 KB, 下載次數: 121)
2019-3-18 10:13 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|