基于51單片機的電子八音盒詳細設計步驟_第1頁
基于51單片機的電子八音盒詳細設計步驟_第2頁
基于51單片機的電子八音盒詳細設計步驟_第3頁
基于51單片機的電子八音盒詳細設計步驟_第4頁
基于51單片機的電子八音盒詳細設計步驟_第5頁
已閱讀5頁,還剩8頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、精選優質文檔-傾情為你奉上1、 設計目的利用8052單片機結合內部定時器設計一個八音盒,按下單鍵可以演奏預先設置的歌曲旋律。2、 設計要求 其基本功能為:1,使用LED顯示器來顯示目前演奏的歌曲編號;2,具有8個按鍵操作來選擇演奏哪一首歌曲;3,內建8首歌曲旋律,按下單鍵可以演奏歌曲。3、 設計器材 T89C52單片機、晶振、八個按鍵、二位一體共陽極數碼管、電阻電容若干、導線。4、 設計方案及分析設計思路:(1) 選擇8052單片機,通過T0定時中斷,并配合P2.0引腳輸出音頻頻率。(2) P2.0引腳輸出接蜂鳴器。(3) 通過P0口接LED。(4) P1口接鍵盤,輸入歌曲號。音符產生方法:不

2、同的音調有不同的頻率。頻率不同,音調也就不同。利用定時器,使其工作在模式1,定時中斷,然后控制P2.0引腳的輸出每次取反,就可以在P2.0的引腳輸出相應的方波頻率。改變計數初值,就改變了頻率。定時器的定時時間等于半個周期,定時時間到就輸出脈沖取反,重復此過程,就可在P2.0引腳得到一音頻的脈沖。如:中音1的頻率=523HZ,周期T=1/523=1912us;定時器的定時時間為:T/2=1912/2us=956us;計算得TH0,TL0的計數初值THTL=64580下面是個音符計數初值音符THTL音符編碼低音50F66FH1低音60F724H2低音70F81BH3中音10F88FH4中音20F9

3、5EH5中音30FA17H6中音40FA6BH7中音50FB08H8中音60FB92H9中音70FC0EHA高音10FC4BHB高音20FCAFHC高音30FD0CHD高音40FD36HE高音50FD84HF節拍產生方法:音樂中的節拍用延時時間產生。假設1/4拍執行一次延時程序,這1/2拍就執行兩次延時程序,所以只要求出1/4延時時間,其余的節拍就是他的倍數。為方便記譜,將節拍數也進行編碼,如下:節拍編碼節拍11/421/233/441建立曲譜編碼表:編譜用8位編碼,高4位代表音符,低4位代表節拍。如5 6中音5,中音6,都是1/2拍,則編碼為:82H 92H程序清單:#include <

4、;reg52.h>#define uchar unsigned char#define uint unsigned int#define ulong unsigned longsbit SPEAK = P20;/接蜂鳴器管腳uchar th0_f; uchar tl0_f; uchar code SEG10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67;uchar code jie88=12,14,16,17,19,21,23,24;/*中斷函數*/timer0() interrupt 1 TL0=tl0_f;TH0=th0_f; S

5、PEAK =SPEAK; /取反音樂輸出IO/*T0的值,及輸出頻率對照表*/uchar code freq36*2=0xA9,0xEF,/00220HZ ,1 /00x93,0xF0,/00233HZ ,1#0x73,0xF1,/00247HZ ,20x49,0xF2,/00262HZ ,2#0x07,0xF3,/00277HZ ,30xC8,0xF3,/00294HZ ,40x73,0xF4,/00311HZ ,4#0x1E,0xF5,/00330HZ ,50xB6,0xF5,/00349HZ ,5#0x4C,0xF6,/00370HZ ,60xD7,0xF6,/00392HZ ,6#0x

6、5A,0xF7,/00415HZ ,70xD8,0xF7,/00440HZ 1 /120x4D,0xF8,/00466HZ 1# /130xBD,0xF8,/00494HZ 2 /140x24,0xF9,/00523HZ 2# /150x87,0xF9,/00554HZ 3 /160xE4,0xF9,/00587HZ 4 /170x3D,0xFA,/00622HZ 4# /180x90,0xFA,/00659HZ 5 /190xDE,0xFA,/00698HZ 5# /200x29,0xFB,/00740HZ 6 /210x6F,0xFB,/00784HZ 6# /220xB1,0xFB,/0

7、0831HZ 7 /230xEF,0xFB,/00880HZ 10x2A,0xFC,/00932HZ 1#0x62,0xFC,/00988HZ 20x95,0xFC,/01046HZ 2#0xC7,0xFC,/01109HZ 30xF6,0xFC,/01175HZ 40x22,0xFD,/01244HZ 4#0x4B,0xFD,/01318HZ 50x73,0xFD,/01397HZ 5#0x98,0xFD,/01480HZ 60xBB,0xFD,/01568HZ 6#0xDC,0xFD,/01661HZ 7 /35 ;/*音樂符號串解釋函數*/入口:要解釋的音樂符號串,輸出的音調串,輸出的時

8、長串changedata(uchar *song,uchar *diao,uchar *jie)uchar i,i1,j;char gaodi; /高低+/-12音階uchar banyin;/有沒有半個升音階uchar yinchang;/音長uchar code jie78=0,12,14,16,17,19,21,23; /C調的7個值*diao=*song;for(i=0,i1=0;)gaodi=0; /高低=0banyin=0;/半音=0yinchang=4;/音長1拍if(*(song+i)='|') | (*(song+i)=' ') i+; /拍子

9、間隔和一個空格過濾switch(*(song+i)case ',': gaodi=-12;i+;/低音break;case '': gaodi=12;i+; /高音break;if(*(song+i)=0) /遇到0結束*(diao+i1)=0; /加入結束標志0*(jie+i1)=0;return;j=*(song+i)-0x30; i+; /取出基準音j=jie7j+gaodi; /加上高低音yinc: switch(*(song+i)case '#': /有半音j加一個音階i+;j+;goto yinc;case '-':

10、/有一個音節加長yinchang+=4;i+;goto yinc;case '_': /有一個音節縮短yinchang/=2;i+;goto yinc;case '.': /有一個加半拍yinchang=yinchang+yinchang/2;i+;goto yinc;*(diao+i1)=j; /記錄音符*(jie+i1)=yinchang; /記錄音長i1+; /*奏樂函數*/入口:要演奏的音樂符號串void play(uchar *songdata)uchar i,c,j=0;uint n;uchar diaodata48; /音調緩沖uchar jied

11、ata48; /音長緩沖changedata(songdata,diaodata,jiedata); /解釋音樂符號串TR0=1;while(P1=0xff)for(i=0;diaodatai!=0;i+) /逐個符號演奏tl0_f=freqdiaodatai*2; /取出對應的定時值送給T0th0_f=freqdiaodatai*2+1;for(c=0;c<jiedatai;c+) /按照音長延時for(n=0;n<29500;n+); /29500if(P1!= 0xff)/(!K1)|(!K2)|(!K3)|(!K4)/發現按鍵,立即退出播放TR0=0;return; TR0

12、=0;for(n=0;n<460;n+); /音符間延時TR0=1;TR0=0;/茉莉花uchar code molihua="33_5_6_1_1_6_|55_6_5-|33_5_6_1_1_6_|55_6_5-|" "5553_5_|665-|32_3_53_2_|11_2_1|" /"3_2_1_3_2.3_|56_1_5-|23_5_2_3_1_,6_|,5-,61|" /"2.3_1_2-1_,6_|,5-" ;/世上只有媽媽好 uchar code mamahao= "6.5_35|16

13、_5_6-|35_6_53_2_|1_,6_5_3_2-|" "2.3_55_6_|321-|5.3_2_1_,6_1_|,5-" ;/小毛驢uchar code xiaomaolv="1_1_1_3_|5_5_5_5_|6_6_6_1|5-|" "4_4_4_6_|3_3_3_3_|2_2_2_2_|5-"/我是一只菠蘿uchar code boluo="1-|2_4_3_2_55|5_6_3_4_22|2_4_3_2_1_1_7_6_|5_4_2_3_11|""2_4_3_2_55|5_6_

14、3_4_22|2_4_3_2_1_5_2_3_|1-|"/小星星uchar code xiaoxingxing="1155|665-|4433|221-|""5544|332-|5544|332-|""1155|665-|4433|221-|"/春天在哪里uchar code chuntian="3_3_3_1_|,5,5_|3_3_3_1_|3-|5_5_3_1_|,5_,5_,5|,6_,7_1_3_|2-|" "3_3_3_1_|,5,5_|3_3_3_1_|3-|5_6_5_6_|5_4

15、_3_1_|,5_3_|2_1_"/兩只老虎uchar code laohu="1231|1231|345-|345-|" "5_6_5_4_31|5_6_5_4_31|" "151-|151-"/就是愛你uchar code jiushiaini="3_2_3_4_5,7_1_|11_7_7 5_6_|66_5_5_3_2_1_3_|4_,6_,7_1_32|""3_2_3_4_5,7_1_|11_7_7_3_|3-6_|5_4_.4_5_5-|4_,6_ ,7_1_32._1_|"

16、/黑白配uchar code heibai="32345-|1,7123-|3,5,611-|"/找朋友uchar code zhaopeng="5_6_5_6_|5_6_5|5_1_7_6_|5_6_5"/數鴨子uchar code shuya="313_3_1|3_3_5_6_5-|6_6_5_5_4_4_4|2_3_2_1_2"/歡樂頌uchar code huanle="3345|5432|1123|322-|3345|5432|1123|211-|"/一分錢uchar code yifen="5

17、1|6_1_5|3_5_2_3_|5|3_5_6_1_|5_6_5_3_|5_13_2"/樂譜方式輸入的音樂播放/*主函數*/void main(void)P1=0xff;P0=SEG0;TMOD = 0x01; /使用定時器0的16位工作模式TR0 = 0;ET0 = 1;EA = 1;while(1) switch(P1) case 0xfe: while(P1=0xfe);P0=SEG1;play(molihua);SPEAK=0;break;/0 按下相應的鍵顯示相對應的碼值 case 0xfd: while(P1=0xfd);P0=SEG2;play(yifen);SPEA

18、K=0;break;/1 case 0xfb:while(P1=0xfb) ;P0=SEG3;play(mamahao);SPEAK=0;break;/2 case 0xf7:while(P1=0xf7) ;P0=SEG4;play(xiaomaolv);SPEAK=0;break;/3 case 0xef:while(P1=0xfe) ;P0=SEG5;play(laohu);SPEAK=0;break;/4 case 0xdf:while(P1=0xdf) ;P0=SEG6;play(huanle);SPEAK=0;break;/5 case 0xbf:while(P1=0xbf) ;P0=SEG7;play(chuntian);SPEAK=0;break;/6 case 0x7f:while(P1=0x7f) ;P0=SEG8;play(zhaopeng);SPEAK=0;break;/7 default: break; TR0 = 0;5、 問題分析與解決方法問題一:仿真問題 仿真圖畫好之后,開始運行,數碼管和發光二極管都沒有反應。仔細檢查了下,是因為仿真圖部分電路沒有連接完整,不能接收數據,所以數碼管和發光二極管都不工作。當我們把仿真圖完善好了,數碼管顯示的是亂碼,發光二極管也不按順序發光,經檢

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論