單片機課程設計簡易電子琴設計_第1頁
單片機課程設計簡易電子琴設計_第2頁
單片機課程設計簡易電子琴設計_第3頁
單片機課程設計簡易電子琴設計_第4頁
單片機課程設計簡易電子琴設計_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、鄭州輕工業(yè)學院計算機與通信工程學院單片機與接口技術課程設計總結報告設計題目: 簡易電子琴設計 學生姓名: 毛二松系 別:計算機與通信工程學院專 業(yè):電子信息科學與技術班 級:09-01學 號:540907020127指導教師:韓雪琴 楊永雙2011年12月26日簡易電子琴設計電子琴概述 這次設計的電子琴與市場上的電子琴相比雖然音色遜了一點,但是其物美價廉,功能強大,攜帶方便,深受大家喜歡。此次課程設計的電子琴是有4*4矩陣鍵盤來實現(xiàn)發(fā)音,其中4個鍵是功能鍵,剩下的12鍵實現(xiàn)真正的發(fā)音。此外在電子琴的功能上又加上了音樂播放功能、選擇歌曲、暫停以及錄音回放功能,使電子琴變得更強大。讓電子琴不再是簡

2、單的彈出音調簡單的電子琴,而是一個功能齊全的電子琴。本設計功能1. 通過矩陣鍵盤能夠彈出美妙的音樂。2. 通過功能切換,能夠切換到音樂播放器功能3. 能夠把彈出的音樂錄制下來,并且還能夠回放出來。本設計的仿真圖引腳描述:矩陣鍵盤接的是P3口,顯示部分的段控制口接的是P0口,位控制口接的是P2.0、P2.1、P2.2、P2.4、P2.5,蜂鳴器接的P2.3口。各種功能鍵如圖所示。返回是否暫停是否選擇下一曲進入音樂播放返回是否錄音功能選擇是否回放通過鍵盤彈音樂進入電子琴功能初始化開始設計的流程圖我負責的模塊主程序:也就是本程序的整體構造、功能構造。主程序程序:void main()init();/

3、初始化while(1)keyscan();/調用鍵盤掃描display();/顯示if(key_function=1)/如果選擇音樂播放switch(count)case 1:play(music1,music1_L);break;/播放第一首case 2:play(music2,music2_L);break;/播放第二首case 3:play(music3,music3_L);break;/播放第三首else /否則選擇為電子琴if(key_record=2)/判斷是否回放replay(record,record_L); 錄音功能。錄音程序和鍵盤掃描再一個模塊中。功能描述:它能夠把你所彈的

4、音調、按下鍵盤的時間即音長以及鍵與鍵之間的時間給記錄下來,它完全模擬了現(xiàn)實中電子琴的功能,功能之強大。時間的記錄是利用定時器1實現(xiàn)的。定時器0是產生一定頻率的方波,使蜂鳴器發(fā)出不同的音調。本功能程序:void keyscan() /鍵盤掃描:線反轉法uchar h,l; /h:行 l:列if(key_record=1&&flag=0)/記錄鍵與鍵之間的時間TH1=(65536-5000)/256;TL1=(65536-5000)%256;TR1=1;flag=1;P3=0xf0; /列全置低電平,行全置高電平h=P3&0xf0;while(h!=0xf0) /若有鍵按下

5、則行會出現(xiàn)低電平delay(10); /按鍵去抖P3=0xf0; /列全置低電平,行全置高電平h=P3&0xf0;while(h!=0xf0) if(key_record=1)/如果有按鍵按下,則把按鍵前的時間記錄下來 TR1=0;/關閉計時record_Lb=a;/把按鍵前的時間記錄下來a=0;/時間次數(shù)清零b+;/下標加一 h=P3&0xf0; /讀入行值 P3=0x0f; /電平反轉 l=P3&0x0f; /讀入列值 k=h+l;switch(k) case 0xee:temp=0;key_function+; if(key_function=2)key_func

6、tion=0; break;/功能選擇按鈕 case 0xed:temp=0;count+;next_flag=1; if(count=4) count=1; break;/ 選曲按鈕 case 0xeb:temp=0;key_record+; if(key_record=3)key_record=0; break;/錄音、回放、返回 case 0xe7:temp=0;pause+; if(pause=2)pause=0; break; / case 0xde:temp=6;break; /6 case 0xdd:temp=7;break; /7 case 0xdb:temp=11;break

7、; /11 case 0xd7:temp=12;break; /12 case 0xbe:temp=13;break; /13 case 0xbd:temp=14;break; /14 case 0xbb:temp=15;break; /15 case 0xb7:temp=16;break; /16 case 0x7e:temp=17;break; /17 case 0x7d:temp=21;break; /21 case 0x7b:temp=22;break; /22 case 0x77:temp=23;break; /23display(); /顯示if(key_record=1&

8、&temp!=0)/錄音時,如果有按鍵按下且不是功能鍵recordj=8;/先把按鍵前的初始值記下recordj+1=temp;/再把此按鍵的值記下j=j+2;/下標值加2TH1=(65536-5000)/256;/裝初始值TL1=(65536-5000)%256;TR1=1;/啟動定時 if(temp!=0)/如果不是功能按鍵 則發(fā)出聲音TH0=tabletemp/256;TL0=tabletemp%256; TR0=1;while(h!=0xf0)/檢查按鍵是否彈起P3=0xf0; /列全置低電平,行全置高電平h=P3&0xf0;TR0=0;/彈起后關閉定時if(key_r

9、ecord=1&&temp!=0)/錄音時,如果有按鍵按下且不是功能鍵TR1=0;/關閉計時record_Lb=a;/把按鍵的時間記下a=0;/時間次數(shù)清零flag=0;b+;BUZZER=1;/把蜂鳴器關閉回放功能:就是把錄的音給回放出來源程序:void replay(uint *Song,uint *Song_L)/回放功能uint i;for(i=0;i<j;i+)temp=Songi; /把音譜頻率賦給nm=Song_Li;/把音長賦給mif(temp=8)/如果此時播放的是鍵與鍵之間的空隙時間TR0=0;/定時關閉即不發(fā)出聲音BUZZER=1;/關閉蜂鳴器tem

10、p=Songi-1;else/否則TH0=tabletemp/256; TL0=tabletemp%256;TR0=1;delay1(m/2);j=0;a=0;b=0;/把錄音清除TR0=0;/關閉定時BUZZER=1;/把蜂鳴器關閉實驗總結經過這次課程設計,我真正學會了如何使用單片機,懂得了仿真和用真實的單片機板子實現(xiàn)本功能的差別,仿真畢竟不是真實的現(xiàn)象,有時候仿真能實現(xiàn),但是把程序下載到板子上后現(xiàn)象可能不是你所想的那樣。做這個設計給我最大的感觸就是當一個模塊實現(xiàn)了,但是當把各個模塊結合到一塊后就會變得有點復雜。當然剛開始做這個程序時,要從實現(xiàn)簡單的功能入手,然后一點點把功能做大做強。在做這

11、個設計時我也遇到了很多問題:比如,做錄音、回放功能的時候,記錄鍵與鍵之間的時間的設置時,記錄的時間很短,原因就是當沒有鍵按下的時候,程序會一直進行鍵盤掃描,而且每次都會重新進行定時初始值設置,我們希望的現(xiàn)象是定時初始值設置一次就夠了,如果每次都重新設置定時器初始值,那么記錄的時間就會不準確。所以這時就要設置一個標志,開始時標志變量為0,如果是第一次設置,則設置完后就令這個標志變量置1,下次循環(huán)的時候,程序就不會進行重新設置定時初始值了。所以這個標志位再程序設計的時候顯得很重要。1和0是二進制數(shù),有時它不僅僅是一個數(shù)值,它也可以是代表一件事,1代表這件事做了,0則相反。標志變量就像是一個站崗放哨

12、的人,只有這個人同意了,你才能進入。所以當我做這個課程設計所遇到的問題以及我如何解決的過程,我感覺這個過程是如此的美妙,我絲毫感覺不到這是一件痛苦的事情,反而覺得這是一件讓人上癮的趣事。每當遇到的問題解決了,我都把他們當做是一筆財富。我覺得我們學習的不僅是單片機本門課的知識,而且是學習獲得知識的方法。授之魚不如授之漁,這句話也體現(xiàn)了方法的重要性。7、參考文獻1 張毅剛 彭喜來.單片機原理與應用設計.電子工業(yè)出版社,20112張毅剛MCS-51單片機應用設計(第二版)哈爾濱大學出版社,20028、附錄本課程設計的源程序:一個.c文件,兩個.h文件主程序源程序:#include<reg51.

13、h>#include<intrins.h>#include<keyscan.h>#include<play_music.h>#define uchar unsigned char #define uint unsigned int void init()/初始化程序TMOD=0X11;/定時器0、1都設為工作方式1EA=1;/總中斷打開ET0=1;/允許T0定時ET1=1;/允許T1定時void main()init();/初始化while(1)keyscan();/調用鍵盤掃描display();/顯示if(key_function=1)/如果選擇音

14、樂播放switch(count)case 1:play(music1,music1_L);break;case 2:play(music2,music2_L);break;case 3:play(music3,music3_L);break;else /否則選擇為電子琴if(key_record=2)/判斷是否回放replay(record,record_L); void T0_time() interrupt 1 /用于音樂播放器定時產生音調TH0=tabletemp/256;TL0=tabletemp%256;BUZZER=!BUZZER;void timer1 () interrupt

15、3/用于電子琴錄音計時 TH1=(65536-10000)/256;TL1=(65536-10000)%256;a+;keyscan.h鍵盤掃描源程序(錄音、顯示程序也在里面)#define uchar unsigned char #define uint unsigned int uint record_replay(); /錄音/回放void display();sbit BUZZER = P23;/sbit key3 = P24;sbit w1 = P20;sbit w2 = P21;sbit w3 = P22;sbit w5 = P24;sbit w6 = P25;sbit dula

16、= P26;sbit wela = P27;uchar j,a,b,flag,count=1;uchar key_function,key_record,next_flag;uint record20,record_L20;/存儲回放的音調uchar n,m,k,temp,pause;uchar code led=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/0-fuint code table=0,63628,63835,64021,64103,64260,64400,6452

17、4,0,0, 0,64580,64684,64777,64820,64898,64968,65030,0,0, 0,65058,65110,65157,65178,65217,65252,65283,0,0;/每個音符的簡譜碼(T值)void delay1(uint j) while(j-)uint x;for(x=125;x>0;x-);display(); void delay(uint a) / 1ms延時uint x;while(a-)for(x=0;x<125;x+);void display()dula=1;P0=ledkey_function;dula=0;wela=

18、1;P0=0xfe;/數(shù)碼管第一位亮wela=0;delay(2);dula=1;P0=ledcount;dula=0;wela=1;P0=0xfd; /數(shù)碼管第二位亮delay(2);dula=1;P0=ledkey_record;dula=0;wela=1;P0=0xfb; /數(shù)碼管第三位亮wela=0;delay(2);dula=1;P0=ledtemp/10;dula=0;wela=0;P0=0xef; /數(shù)碼管第四位亮wela=1;delay(2);dula=1;P0=ledtemp%10;dula=0;wela=0;P0=0xdf; /數(shù)碼管第五位亮wela=1;delay(2);

19、void keyscan() /鍵盤掃描:線反轉法uchar h,l; /h:行 l:列if(key_record=1&&flag=0)/記錄鍵與鍵之間的時間TH1=(65536-5000)/256;TL1=(65536-5000)%256;TR1=1;flag=1;P3=0xf0; /列全置低電平,行全置高電平h=P3&0xf0;while(h!=0xf0) /若有鍵按下則行會出現(xiàn)低電平delay(10); /按鍵去抖P3=0xf0; /列全置低電平,行全置高電平h=P3&0xf0;while(h!=0xf0) if(key_record=1)/如果有按鍵按下

20、,則把按鍵前的時間記錄下來 TR1=0;/關閉計時record_Lb=a;/把按鍵前的時間記錄下來a=0;/時間次數(shù)清零b+;/下標加一 h=P3&0xf0; /讀入行值 P3=0x0f; /電平反轉 l=P3&0x0f; /讀入列值 k=h+l;switch(k) case 0xee:temp=0;key_function+; if(key_function=2)key_function=0; break;/功能選擇按鈕 case 0xed:temp=0;count+;next_flag=1; if(count=4) count=1; break;/ 選曲按鈕 case 0x

21、eb:temp=0;key_record+; if(key_record=3)key_record=0; break;/錄音、回放、返回 case 0xe7:temp=0;pause+; if(pause=2)pause=0; break; / case 0xde:temp=6;break; /6 case 0xdd:temp=7;break; /7 case 0xdb:temp=11;break; /11 case 0xd7:temp=12;break; /12 case 0xbe:temp=13;break; /13 case 0xbd:temp=14;break; /14 case 0x

22、bb:temp=15;break; /15 case 0xb7:temp=16;break; /16 case 0x7e:temp=17;break; /17 case 0x7d:temp=21;break; /21 case 0x7b:temp=22;break; /22 case 0x77:temp=23;break; /23display(); /顯示if(key_record=1&&temp!=0)/錄音時,如果有按鍵按下且不是功能鍵recordj=8;/先把按鍵前的初始值記下recordj+1=temp;/再把此按鍵的值記下j=j+2;/下標值加2TH1=(65536

23、-5000)/256;/裝初始值TL1=(65536-5000)%256;TR1=1;/啟動定時 if(temp!=0)/如果不是功能按鍵 則發(fā)出聲音TH0=tabletemp/256;TL0=tabletemp%256; TR0=1;while(h!=0xf0)/檢查按鍵是否彈起P3=0xf0; /列全置低電平,行全置高電平h=P3&0xf0;TR0=0;/彈起后關閉定時if(key_record=1&&temp!=0)/錄音時,如果有按鍵按下且不是功能鍵TR1=0;/關閉計時record_Lb=a;/把按鍵的時間記下a=0;/時間次數(shù)清零flag=0;b+;BUZZ

24、ER=1;/把蜂鳴器關閉play_music.h音樂播放源程序(回放功能也在里面)#define uint unsigned int #define uchar unsigned char void play(uint *Sound,uint *Sound_L);/音樂播放 /第一首音樂:一分錢uint code music1=15,21,16,21,15,13,15,12,13,15,8,13,15,16,21,15,16,15,13,15,11,13,12,8,13,12,11,12,13,16,15,13,15,16,8,15,21,16,15,13,15,12,15,12,13,12,

25、11, 0x0;/音調uint code music1_L=4,4,2,2,4,2,2,2,2,4,4, 2,2,2,2,2,2,2,2,2,4,2,4,4, 2,2,2,2,4,4,2,2,2,2,4, 4,2,2,2,2,2,2,4,2,2,2,2,4,4, 4;/音長/第二首音樂:小兔子乖乖uint code music2=15,21,16,15,15,13,15,16,21,15,15,16,15,13,12,12,13,15,13,12,11,16,15,16,15,13,16,15,12,15,13,12,11,6,11,12,13,11,0x0;uint code music2_L=4,2,2,4,4,2,2,2,2,4,4,4,2,2,4,4,4,2,2,4,4, 2,2,2,2,2,2,4,2,2,2,2,4,4,2,2,2,2,4,4, 4;/第三首音樂:祝你生日快樂uint code music3=15,15,16,15,21,17, 15,15,16,15,22,21, 15,15,25,23,21,17,16, 24,24,23,21,22,21, 0x0; uint code music3_L=2,2,4,4,4,8, 2,2,4,4,4,8, 2,2,4,4,4,4,8, 2,2,4,4,4,4,2; void repla

溫馨提示

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

最新文檔

評論

0/150

提交評論