里面有五首歌(都是一部分,非整首歌),第一首播放青花瓷,讓你感受單片機(jī)的強(qiáng)大魅力。注意:由于本人第一次畫仿真電路圖,所以仿真有瑕疵,但是在普中51單片機(jī)開發(fā)板上播放流暢,感興趣的朋友可以根據(jù)普中51的電路圖(壓縮包中已提供)自己再畫一個(gè)仿真。
單片機(jī)源程序如下:
- #include "init.h" //初始化庫(kù)函數(shù)
- #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; //記錄播放哪一首歌的標(biāo)志位
- uchar pause=0; //暫停/播放標(biāo)志位
- 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, //生日快樂(lè)音調(diào)
- 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代表不發(fā)聲,即停頓;數(shù)字即為音調(diào)
- };
- uchar code shengri_beat[]={24,1,24,48,48,48,72,5,//節(jié)拍
- 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 //節(jié)拍,即tone表各音調(diào)的延時(shí)
- };
- uchar code laohu_tone[]={1,2,3,1,0,1,2, //兩只老虎樂(lè)譜 40個(gè)音符
- 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,//節(jié)拍
- 24,48,5,24,24,48,5,24,24,72,5,24,24,24,24,//節(jié)拍
- 24,48,5,24,24,24,24,24,72, 5,24,24,48,5,24,24,//節(jié)拍
- 72,5//節(jié)拍 //節(jié)拍,即tone表各音調(diào)撓
- };
- uchar code yishan_tone[]={1,1,5,5,6,6,5, //星星樂(lè)譜 54個(gè)音符
- 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,//節(jié)拍
- 5,24,24,24,24,24,24,72,5,24,24,24,24,24,24,//節(jié)拍
- 48,5,24,24,24,24,24,24,72,5,24,24,24,24,24,24,//節(jié)拍
- 48,5,24,24,24,24,24,24,72,5//節(jié),紅one敢艫韉難郵?
- };
- 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個(gè)二維數(shù)組
- {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]={//定義曲譜數(shù)組,前數(shù)為音律,后數(shù)為音符節(jié)拍 ,要換歌改變簡(jiǎn)譜對(duì)應(yīng)的音律號(hào)即可
- {24,4},{24,4},{21,4},{19,4},{21,4},{14,8},{19,4},{21,4},{24,4},{21,4},{19,16},//記錄菊花臺(tái)簡(jiǎn)譜歌詞:0553236 23532 天青色等煙雨 而我在等你
- {24,4},{24,4},{21,4},{19,4},{21,4},{12,8},{19,4},{21,4},{24,4},{19,4},{17,16},//簡(jiǎn)譜歌詞:0553235 23521 炊煙裊裊升起 隔江千萬(wàn)里
- {17,4},{19,4},{21,4},{24,4},{26,4},{24,4},{22,4},{24,4},{21,4},{21,4},{19,4},{19,16},//簡(jiǎn)譜歌詞: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},//簡(jiǎn)譜歌詞:就當(dāng)我為遇見你伏筆
- {24,4},{24,4},{21,4},{19,4},{21,4},{14,8},{19,4},{21,4},{24,4},{21,4},{19,16}, //簡(jiǎn)譜歌詞:0553236 23532 天青色等煙雨 而我在等你
- {24,4},{24,4},{21,4},{19,4},{21,4},{12,8},{19,4},{21,4},{24,4},{19,4},{17,16}, //簡(jiǎn)譜歌詞:0553235 23521 月色被打撈起 掩蓋了結(jié)局
- {17,4},{19,4},{21,4},{24,4},{26,4},{24,4},{22,4},{24,4},{21,4},{21,4},{19,4},{19,12},//簡(jiǎn)譜歌詞:0123 5654 5332 25 322 11 如傳世的青花瓷在獨(dú)自美麗
- {12,4},{21,8},{19,8},{19,4},{17,20}, //簡(jiǎn)譜歌詞:你眼帶笑意
- {0xFF,0xFF}}; //歌曲結(jié)尾標(biāo)識(shí)
- //兩只蝴蝶
- 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}};
- //函數(shù)聲明
- void play(void); //音樂(lè)播放控制函數(shù)
- void key(); //判斷按鍵函數(shù)
- void stop(); //暫停/播放函數(shù)
- void display(); //液晶顯示函數(shù)
- void delay(uchar p); //歌曲延時(shí)函數(shù)
- void pause1(); //歌曲演示函數(shù)
- void main()
- {
- TMOD=0x01;
- TH0=a;
- TL0=b;
- ET0=1;//打開定時(shí)器,但是未允許中斷
- 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; //贊同是斷開定時(shí)器中斷
- 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]; //取節(jié)拍
- 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]; //取節(jié)拍
- 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]; //取節(jié)拍
- 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)
- { //下面這兩首歌與前面的播放方式一樣,因?yàn)槲沂窃诰W(wǎng)上搜集整合的
- display();
- while(flag)
- {
- EA=0;
- c=qing_beat[m][0]; //取音符
- s=qing_beat[m][1]; //取節(jié)拍
- 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]; //取節(jié)拍
- 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)
- { //播放低音,高音的音樂(lè)
- display();
- while(flag)
- {
- EA=0;
- c=yinlv[m][0]; //取音符
- s=yinlv[m][1]; //取節(jié)拍
- 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)
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
51hei.png (14.2 KB, 下載次數(shù): 98)
下載附件
2019-12-28 12:49 上傳
所有資料51hei提供下載:
音樂(lè)播放器.7z
(493.28 KB, 下載次數(shù): 111)
2021-6-21 16:04 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|