里面有五首歌(都是一部分,非整首歌),第一首播放青花瓷,讓你感受單片機的強大魅力。注意:由于本人第一次畫仿真電路圖,所以仿真有瑕疵,但是在普中51單片機開發板上播放流暢,感興趣的朋友可以根據普中51的電路圖(壓縮包中已提供)自己再畫一個仿真。
單片機源程序如下:
- #include "init.h" //初始化庫函數
- #include "lcd.h"
- sbit speaker=P1^3;//蜂鳴器
- sbit key_next=P3^6; //下一首
- sbit key_last=P3^5; //上一首
- sbit key_pause=P3^7; //暫停/播放
- uchar a,b;
- uchar number=0; //記錄播放哪一首歌的標志位
- uchar pause=0; //暫停/播放標志位
- uchar code yinfu[]={0xfb,0xe9, //Do
- 0xfc,0x5c, //Re
- 0xfc,0xc1, //Mi
- 0xfc,0xef, //Fa
- 0xfd,0x45, //So
- 0xfd,0x92, //La
- 0xfd,0xd0, //Si
- 0xfd,0xee, //Do#
- 0x00,0x00, //間隔
- };
- uchar code shengri_tone[]={1,0,1,2,1,4,3,0, //生日快樂音調
- 1,0,1,2,1,5,4,0,
- 1,0,1,8,6,4,3,2,0,7,0,7,6,4,5,4,0 //0代表不發聲,即停頓;數字即為音調
- };
- uchar code shengri_beat[]={24,1,24,48,48,48,72,5,//節拍
- 24,1,24,48,48,48,72,5,
- 24,1,24,48,48,48,48,72,5,24,1,24,48,48,48,72,5 //節拍,即tone表各音調的延時
- };
- uchar code laohu_tone[]={1,2,3,1,0,1,2, //兩只老虎樂譜 40個音符
- 3,1,0,3,4,5,0,3,4,5,0,5,6,5,4,3,
- 1,0,5,6,5,4,3,1,0,3,2,1,0,3,2,1,0
- };
- uchar code laohu_beat[]={24,24,24,48,5,24,24,//節拍
- 24,48,5,24,24,48,5,24,24,72,5,24,24,24,24,//節拍
- 24,48,5,24,24,24,24,24,72, 5,24,24,48,5,24,24,//節拍
- 72,5//節拍 //節拍,即tone表各音調撓
- };
- uchar code yishan_tone[]={1,1,5,5,6,6,5, //星星樂譜 54個音符
- 0,4,4,3,3,2,2,1,0,5,5,4,4,3,
- 3,2,0,5,5,4,4,3,3,2,0,1,1,5,5,
- 6,6,5,0,4,4,3,3,2,2,1,0
- };
- uchar code yishan_beat[]={24,24,24,24,24,24,48,//節拍
- 5,24,24,24,24,24,24,72,5,24,24,24,24,24,24,//節拍
- 48,5,24,24,24,24,24,24,72,5,24,24,24,24,24,24,//節拍
- 48,5,24,24,24,24,24,24,72,5//節模tone敢艫韉難郵?
- };
- uchar code yinlv[][2]={
- {0,1},{1,1},{3,1},{5,1},{6,1},{8,1},{10,1},{12,1},{13,1},//演示超低音八度 123457671
- {0,1},{13,1},{15,1},{17,1},{18,1},{20,1},{22,1},{24,1},{25,1},//演示低音八度12345671
- {0,1},{25,1},{27,1},{29,1},{30,1},{32,1},{34,1},{36,1},{37,1},//演示中音八度12345671
- {0,1},{37,1},{39,1},{41,1},{42,1},{44,1},{46,1},{48,2},//演示高音八度 1234567
- };
- //青花瓷
- uchar code qing_tone[49][2]={{0,0},//定義音律49個二維數組
- {0xF9,0x1F},{0xF9,0x82},{0xF9,0xDF},{0xFA,0x37},{0xFA,0x8A},{0xFA,0xD8},{0xFB,0x23},{0xFB,0x68},{0xFB,0xAA},{0xFB,0xE9},{0xFC,0x24},{0xFC,0x5B},
- {0xFC,0x8F},{0xFC,0xC1},{0xFC,0xEF},{0xFD,0x1B},{0xFD,0x45},{0xFD,0x6C},{0xFD,0x91},{0xFD,0xB4},{0xFD,0xD5},{0xFD,0xF4},{0xFE,0x12},{0xFE,0x2D},
- {0xFE,0x48},{0xFE,0x60},{0xFE,0x78},{0xFE,0x86},{0xFE,0xA3},{0xFE,0xB6},{0xFE,0xC9},{0xFE,0xDA},{0xFF,0xEB},{0xFE,0xFA},{0xFF,0x09},{0xFF,0x17},
- {0xFF,0x24},{0xFF,0x30},{0xFF,0x3C},{0xFF,0x47},{0xFF,0x51},{0xFF,0x5B},{0xFF,0x64},{0xFF,0x6D},{0xFF,0x75},{0xFF,0x7D},{0xFF,0x84},{0xFF,0x8B}
- };
- uchar code qing_beat[][2]={//定義曲譜數組,前數為音律,后數為音符節拍 ,要換歌改變簡譜對應的音律號即可
- {24,4},{24,4},{21,4},{19,4},{21,4},{14,8},{19,4},{21,4},{24,4},{21,4},{19,16},//記錄菊花臺簡譜歌詞:0553236 23532 天青色等煙雨 而我在等你
- {24,4},{24,4},{21,4},{19,4},{21,4},{12,8},{19,4},{21,4},{24,4},{19,4},{17,16},//簡譜歌詞:0553235 23521 炊煙裊裊升起 隔江千萬里
- {17,4},{19,4},{21,4},{24,4},{26,4},{24,4},{22,4},{24,4},{21,4},{21,4},{19,4},{19,16},//簡譜歌詞:01235654 53322 在平地書刻你房間上的飄影
- {17,4},{19,4},{17,4},{17,4},{19,4},{17,4},{19,4},{19,4},{21,8},{24,4},{21,4},{21,12},//簡譜歌詞:就當我為遇見你伏筆
- {24,4},{24,4},{21,4},{19,4},{21,4},{14,8},{19,4},{21,4},{24,4},{21,4},{19,16}, //簡譜歌詞:0553236 23532 天青色等煙雨 而我在等你
- {24,4},{24,4},{21,4},{19,4},{21,4},{12,8},{19,4},{21,4},{24,4},{19,4},{17,16}, //簡譜歌詞:0553235 23521 月色被打撈起 掩蓋了結局
- {17,4},{19,4},{21,4},{24,4},{26,4},{24,4},{22,4},{24,4},{21,4},{21,4},{19,4},{19,12},//簡譜歌詞:0123 5654 5332 25 322 11 如傳世的青花瓷在獨自美麗
- {12,4},{21,8},{19,8},{19,4},{17,20}, //簡譜歌詞:你眼帶笑意
- {0xFF,0xFF}}; //歌曲結尾標識
- //兩只蝴蝶
- uchar code hudie_tone[49][2]={{0,0},
- {0xF8,0x8B},{0xF8,0xF2},{0xF9,0x5B},{0xF9,0xB7},{0xFA,0x14},
- {0xFA,0x66},{0xFA,0xB9},{0xFB,0x03},{0xFB,0x4A},{0xFB,0x8F},
- {0xFB,0xCF},{0xFC,0x0B},{0xFC,0x43},{0xFC,0x78},{0xFC,0xAB},
- {0xFC,0xDB},{0xFD,0x08},{0xFD,0x33},{0xFD,0x5B},{0xFD,0x81},
- {0xFD,0xA5},{0xFD,0xC7},{0xFD,0xE7},{0xFE,0x05},{0xFE,0x21},
- {0xFE,0x3C},{0xFE,0x55},{0xFE,0x6D},{0xFE,0x84},{0xFE,0x99},
- {0xFE,0xAD},{0xFE,0xC0},{0xFE,0x02},{0xFE,0xE3},{0xFE,0xF3},
- {0xFF,0x02},{0xFF,0x10},{0xFF,0x1D},{0xFF,0x2A},{0xFF,0x36},
- {0xFF,0x42},{0xFF,0x4C},{0xFF,0x56},{0xFF,0x60},{0xFF,0x69},
- {0xFF,0x71},{0xFF,0x79},{0xFF,0x81}
- };
- uchar code hudie_beat[][2]={{0,4},
- {23,4},{21,4},{23,16},{23,4},{21,4},{23,4},{21,4},{19,16},{16,4},
- {19,4},{21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{19,4},{14,24},
- {23,4},{21,4},{23,16},{23,4},{21,4},{23,4},{21,4},{19,24},{16,4},
- {19,4},{21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{19,4},{21,24},
- {23,4},{21,4},{23,16},{23,4},{21,4},{23,4},{21,4},{19,16},{16,4},
- {19,4},{21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{19,4},{14,24},
- {23,4},{26,4},{26,16},{26,4},{28,4},{26,4},{23,24},{21,4},{23,4},
- {21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{16,2},{19,2},{19,24},{0,20},
- {26,4},{26,4},{28,4},{31,4},{30,4},{30,4},{28,4},{23,4},{21,4},{21,4},
- {23,16},{23,4},{23,4},{26,4},{28,8},{28,12},{16,4},{23,4},{21,4},
- {21,24},{23,4},{26,4},{26,4},{23,4},{26,8},{31,8},{30,4},{28,4},
- {30,4},{23,8},{28,4},{28,4},{30,4},{28,4},{26,4},{23,4},{21,8},
- {23,4},{21,4},{23,4},{26,16},
- {0xFF,0xFF}};
- //函數聲明
- void play(void); //音樂播放控制函數
- void key(); //判斷按鍵函數
- void stop(); //暫停/播放函數
- void display(); //液晶顯示函數
- void delay(uchar p); //歌曲延時函數
- void pause1(); //歌曲演示函數
- void main()
- {
- TMOD=0x01;
- TH0=a;
- TL0=b;
- ET0=1;//打開定時器,但是未允許中斷
- TR0=1;
- number = 4; //首先播放青花瓷
- LcdInit();
- while(1)
- {
- play();
- }
- }
- void key()
- {
- if(key_next==0)
- {
- delay_ms(10);
- if(key_next==0)
- {
- number++;
- if(number>6)
- {
- number=1; //如果number>6,表示最后一首歌,返回第一首歌播放
- }
- }
- while(!key_next);
- }
- if(key_last==0)
- {
- delay_ms(10);
- if(key_last==0)
- {
- number--;
- if(number<1)
- { //如果number<1,表示第一首歌,返回最后一首歌播放
- number=6;
- }
- }
- while(!key_last);
- }
- if(key_pause==0)
- { //暫停、播放
- delay_ms(10);
- if(key_pause==0)
- {
- if(pause==1)
- {
- pause=0;
- }
- else
- {
- pause=1;
- }
- }
- while(!key_pause);
- }
- }
- void stop()
- {
- key();
- if(pause==1)
- {
- speaker=0;
- EA=0; //贊同是斷開定時器中斷
- while(1)
- {
- key();
- ShowString (0x01,"By:------ pause");
- if(pause==0)
- {
- ShowString (0x01,"By:------ ");
- EA=1;
- break;
- }
- }
- }
- }
- void play(void)
- {
- uchar m=0;
- char s;
- uchar flag=1;
- uchar c=1;
- if(number==1)
- {
- display(); //顯示歌名
- while(flag)
- {
- EA=0;
- c=shengri_tone[m]; //取音符
- s=shengri_beat[m]; //取節拍
- a=yinfu[2*c-2];
- b=yinfu[2*c-1];
- EA=1;
- while(s--)
- {
- delay1();
- stop();
- if(number!=1)
- {
- s=0;
- flag=0;
- break;
- }
- }
- P2=b;
- m++;
- if(m>=33){
- number=2;
- flag=0;
- }
- }
- }
- else if(number==2)
- {
- display();
- while(flag)
- {
- EA=0;
- c=laohu_tone[m]; //取音符
- s=laohu_beat[m]; //取節拍
- a=yinfu[2*c-2];
- b=yinfu[2*c-1];
- EA=1;
- while(s--)
- {
- delay1();
- stop();
- if(number!=2)
- {
- s=0;
- flag=0;
- break;
- }
- }
- P2=b;
- m++;
- if(m>=40){
- number=3;
- flag=0;
- }
- }
- }
- else if(number==3)
- {
- display();
- while(flag){
- EA=0;
- c=yishan_tone[m]; //取音符
- s=yishan_beat[m]; //取節拍
- a=yinfu[2*c-2];
- b=yinfu[2*c-1];
- EA=1;
- while(s--)
- {
- delay1();
- stop();
- if(number!=3)
- {
- s=0;
- flag=0;
- break;
- }
- }
- P2=b;
- m++;
- if(m>=48){
- number=4;
- flag=0;
- }
- }
- }
- else if(number==4)
- { //下面這兩首歌與前面的播放方式一樣,因為我是在網上搜集整合的
- display();
- while(flag)
- {
- EA=0;
- c=qing_beat[m][0]; //取音符
- s=qing_beat[m][1]; //取節拍
- a=qing_tone[c][0];
- b=qing_tone[c][1];
- EA=1;
- if(number!=4)
- {
- c=0;
- s=0;
- flag=0;
- break;
- }
- if(c==0xFF)
- {
- number=5;
- flag=0;
- break;
- }
- else if(c==qing_beat[m+1][0])
- {
- TR0=1;
- delay(s);
- TR0=0;
- pause1();
- m++;
- }
- else
- {
- TR0=1;
- delay(s);
- m++;
- }
- P2=b;
- }
- }
- else if(number==5)
- {
- display();
- while(flag){
- EA=0;
- c=hudie_beat[m][0]; //取音符
- s=hudie_beat[m][1]; //取節拍
- a=hudie_tone[c][0];
- b=hudie_tone[c][1];
- EA=1;
- if(number!=5)
- {
- s=0;
- flag=0;
- break;
- }
- if(c==0xFF)
- {
- number=6;
- flag=0;
- break;
- }
- else if(c==hudie_beat[m+1][0])
- {
- TR0=1;
- delay(s);
- TR0=0;
- pause1();
- m++;
- }
- else
- {
- TR0=1;
- delay(s);
- m++;
- }
- P2=b;
- }
- }
- else if(number==6)
- { //播放低音,高音的音樂
- display();
- while(flag)
- {
- EA=0;
- c=yinlv[m][0]; //取音符
- s=yinlv[m][1]; //取節拍
- a=qing_tone[c][0];
- b=qing_tone[c][1];
- EA=1;
-
- TR0=1;
- delay(s);
- m++;
- if(number!=6)
- {
- s=0;
- flag=0;
- break;
- }
- if(m>=36)
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
51hei.png (14.2 KB, 下載次數: 98)
下載附件
2019-12-28 12:49 上傳
所有資料51hei提供下載:
音樂播放器.7z
(493.28 KB, 下載次數: 111)
2021-6-21 16:04 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|