基于51單片機的16鍵電子琴課程設計報告_第1頁
基于51單片機的16鍵電子琴課程設計報告_第2頁
基于51單片機的16鍵電子琴課程設計報告_第3頁
基于51單片機的16鍵電子琴課程設計報告_第4頁
基于51單片機的16鍵電子琴課程設計報告_第5頁
已閱讀5頁,還剩35頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

單片機原理及系統課程設計報告基于單片機的16鍵電子琴一、電子琴設計的目的、要求與設計方法1.1設計目的現代樂器中,電子琴是高新科技在音樂領域的一個代表,體現了人類電子技術和藝術的完美結合。電子琴自動伴奏的穩定性、準確性,以及鮮明的強弱規律、隨人設置的速度要求,都更便于人們由易到難、深入淺出的準確掌握歌曲節奏和樂曲風格,對其節奏的穩定性和準確性訓練能起到非常大的作用。1.2設計要求本設計主要是用AT89C52單片機為核心控制元件,設計一個微縮版的電子琴。單片機與按鍵構成主控制模塊,在主控制模塊上設置有9個按鍵,分別達成不同目標。本系統主要為了完成電子琴的三大功能:電子琴彈奏和音樂播放及錄音。1.3電子琴設計方法1.3.1設計工具表1軟件簡介軟件名稱設計作用KeiluVision4編寫程序與編譯PROTEUS繪制硬件電路圖、數字仿真MicrosoftVisio繪制程序流圖與框圖1.3.2設計思路(1)功能按鍵觸發外部中斷,以完成不同曲目的的切換。(2)設置定時器產生不同頻率的方波,I/O口輸出,經功放后揚聲器發聲。(3)采用4×4矩陣鍵盤彈奏16個音(低XI到高DO)。電子琴的設計方案及原理2.1設計總體方案本系統采用AT89C52為主控芯片。輸入電路有16個琴鍵按鍵,通過按鍵隨意按下所要表達的音符,作為電平送給主體電路,中央處理器通過識別,解碼輸出音符,在揚聲器中發出有效的聲音。1個音樂按鍵用于播放音樂和切換歌曲,通過按鍵觸發中斷,重置定時器初值,于另一個揚聲器中發出有效音響??傇O計框圖如下圖1所示。單單片機時鐘復位電路時鐘復位電路數碼管顯示電路數碼管顯示電路琴鍵控制電路琴鍵控制電路音頻播放電路音頻播放電路音樂切換電路音樂切換電路圖1基于單片機的電子琴電路原理框圖2.2發聲原理利用AT89C52的內部定時器使其工作計數器模式(MODE1)下,改變計數值TH0及TL0以產生不同頻率的方法產生不同音階,例如,頻率為523Hz,其周期T=1/523=1912μs,因此只要令計數器計時956μs/1μs=956,每計數956次時將I/O反相,就可得到中音DO(523Hz)。

計數脈沖值與頻率的關系式是:

N=fi÷2÷fr。式中,N是計數值;fi是機器頻率(晶體振蕩器為12MHz時,其頻率為1MHz);fr是想要產生的頻率。

電子琴的硬件設計基于單片機AT89C51的電子琴電路由琴鍵控制電路、數碼管顯示電路、音頻播放電路、時鐘-復位電路、音樂切換電路和電源電路六部分所構成。3.1琴鍵控制電路琴鍵控制電路作為人機聯系的輸入部分,也是間接控制數碼顯示和音頻功放的重要組成部分。鍵盤按照連接方式可以分為獨立式和矩陣式鍵盤兩類。3.1.1矩陣式鍵盤如圖2所示為4X4矩陣式鍵盤電路,由一個4X4的行、列結構可以構成一個16個按鍵鍵盤。

矩陣中無按鍵按下時,行線為高電平;當有按鍵按下時,行線電平狀態將由與此行線相連的列線的電平決定。列線的電平如果為低,則行線電平為低;列線的電平如果為高,則行線的電平也為高,這是識別按鍵是否按下的關鍵所在。圖2矩陣式鍵盤3.1.2獨立式鍵盤

獨立式鍵盤的特點是一鍵一線,各鍵相互獨立,每個鍵各接一條I/O口線,通過檢測I/O輸入線的電平狀態,可判斷出被按下的按鍵。

3.1.3

方案比較

表2鍵盤類型比較鍵盤類型優點缺點獨立式電路簡單,編程簡單占用I/O口線多矩陣式占用I/O口線較少編程比較復雜由于此次設計的琴鍵控制電路需要16個按鍵,故單純從I/O口線的占用的角度比較,獨立式需要占用16條I/O口線,而矩陣式卻只需8條。故選擇矩陣式鍵盤電路比較合理。3.2數碼管顯示電路LED(Light

Emitting

Diode)發光二極管縮寫。LED數碼管是由發光二極管構成的。常見的LED數碼管為“8”字型的,共計8段。一般來說分共陽極和共陰極兩種接法。3.2.1LED數碼管靜態顯示

靜態顯示方式即無論多少位LED數碼管,同時處于顯示狀態。如果送往各個LED數碼管所顯示字符的段碼一經確定,則相應I/O口鎖存器鎖存的段碼輸出將維持不變,直到送入另一個字符的段碼為止。3.2.2LED數碼管動態顯示

靜態顯示方式就是無論在任何時刻只有一個LED數碼管處于顯示狀態,即單片機采用“掃描”方式控制各個數碼管輪流顯示。

3.3.3方案比較

對于以上兩種數碼管驅動電路的的優缺點比較如表3所示。由于靜態驅動方式的顯示無閃爍,亮度較高,編程簡單,加上本次設計的數碼管顯示電路只需要2個數碼管,且分別接兩部分管腳,故選擇靜態驅動方式來顯示數碼管更為合理。如圖3所示為數碼管顯示電路,采用靜態驅動方式和共陽極接法。表3數碼管顯示方式比較驅動方式優點缺點靜態顯示顯示無閃爍,亮度較高,編程簡單數碼管越多,所需的電流越大,電源的要求越高動態顯示電路簡單,數碼管越多,優勢越明顯不如靜態顯示的亮度高,

可能出現閃爍現象圖3數碼管靜態顯示電路3.3音樂切換電路通過按鍵拉低電平,觸發中斷0。3.4音頻播放電路使用兩個揚聲器,一個作為琴鍵輸出,一個作為樂曲輸出。3.5時鐘復位電路3.5.1時鐘電路

時鐘頻率直接影響單片機的速度,時鐘電路的質量也直接影響單片機系統的穩定性。常用的時鐘電路有兩種方式,一種是內部時鐘方式,另一種是外部時鐘方式。

本設計采用內部時鐘方式做時鐘電路。3.5.2復位電路

在單片機的實用系統中,一般有兩種復位操作形式:上電復位和手動復位。

上電復位在單片機系統每次通電時執行。手動復位在系統出現操作錯誤或程序運行出錯時使用。

由于本設計的需要,同時采用這兩種復位方式。整體電路圖如下圖4所示。圖4整體硬件設計電子琴的軟件設計系統功能的實現一般包括硬件部分和軟件部分,一旦硬件確定下來,軟件要實現的功能也隨之確定。而為使編程思路清晰,應先繪制程序流程圖。

4.1

系統硬件接口定義

表4系統硬件接口定義引腳名接口說明備注P0.0~P0.7琴鍵數碼管與單片機通信數碼管顯示電路P2.0~P2.7曲目數碼管與單片機通信數碼管顯示電路P3.2(INT0)外部中斷源輸入端音樂切換電路P1.0~P1.7矩陣鍵盤接口琴鍵控制電路P3.0,P3.7控制揚聲器音頻播放電路4.2主函數

主函數流程圖如圖5所示。利用模塊化的思想,主函數只執行初始化函數、鍵盤掃碼函數、音頻處理函數和數碼管顯示函數。圖5主函數流程圖4.3初始化函數初始化的流程框圖如圖6所示。該函數對所需的I/O口、外部中斷0、定時器0、定時器T1以及數碼管進行初始化配置。TMOD=0x11;//T0方式1,T1方式1IP=0x01;//INT0中斷優先級最高 EA=1;ET0=1;ET1=1;EX0=1;//允許中斷TR0=0;//關定時器0P1=0xbf;//鍵盤初始化flag=0; //標志位置0圖6初始化流程圖4.4數碼管顯示及音頻處理函數根據鍵值掃描函數讀取的鍵碼,揚聲器發聲并結合數碼管顯示出來。圖7數碼管顯示流程圖4.5中斷函數中斷函數用到了外部中斷和定時器中斷。外部中斷的流程框圖如圖8所示,當按鍵按下時,外部信號觸發外部中斷,執行鍵值掃描函數,讀取對應的鍵值。定時中斷的流程框圖如圖9所示,定時器溢出中斷后,進行重裝載初值,同時執行相應的音頻控制操作。

4.6鍵值掃描函數將輸入端置為高電平,輸出端置為低電平。這樣,當按鍵沒有按下時,所有的輸入端無變化,代表無鍵按下。一旦有鍵按下,則輸入線就受輸出線的影響被拉低,這樣,通過讀入輸入線的狀態就可得知是否有鍵按下了。流程圖如圖10所示。圖8外部鍵盤中斷流程圖圖9定時器中斷流程圖圖10鍵值掃描流程圖電子琴的系統仿真5.1部分仿真結果表5仿真結果按鍵編號發聲音調數碼管顯示備注0低XI0,-1中DO1,-2中RI2,-無播放曲目及停止1,2,或-重復按切換音樂圖11音樂顯示為“-”或不顯示的時候,琴鍵按下DO有效圖12按音樂鍵,播放音樂1,琴鍵彈奏無效5.2調試中出現的問題及解決電子琴的設計并非一帆風順,在這期間遇到了很多問題,下面談幾個關鍵的問題。首先是數碼管顯示亂碼的問題,原本以為是數碼管字形碼表的代碼有錯,檢查幾遍發現代碼基沒錯,后來結合硬件圖一看,才知道硬件圖中數碼管是共陽極接法,軟件中的數碼管字形碼表是共陰極的。其二是按鍵引入中斷檢測時遇到的問題,按音樂鍵后琴鍵無法發聲和顯示,浪費了很多時間,最終發現是程序的判斷條件有問題。其三是揚聲器發出的音調不對,甚至沒有聲音,這個問題后來還是不能解決,最后放棄了LM386的功放電路,直接接揚聲器,但是導致了部分琴鍵發聲帶雜音??偨Y在本次設計八路多功能搶答器的課設過程中,我利用AT89C52單片機及外圍接口實現電子琴,利用單片機的定時器/計數器定時和計數的原理實現對彈奏和播放的功能,利用Proteus和Keil軟件設計出實驗電路,完成了課設的任務。在本次課設中,我意識到將理論知識與實踐相結合的重要性,對于單片機這樣的課程,僅僅通過了解課本上的知識是遠遠不夠的,我通過查資料和搜集有關文獻,培養了自學能力,通過利用軟件仿真和焊接電路,在很大程度上提高了我的動手能力。我們在課設的過程中,遇到了很多問題,比如我在仿真的過程中錯把共陰極數碼管字模當作共陽極使用,使得數碼管無法正常顯示,通過查資料我明白了共陰極數碼管是高電平驅動,公共端是負極,共陽極數碼管是低電平驅動,公共端是正極,類似的問題出現了很多,我們通過一一排查,終于完成了課設任務,結果表明,有付出必有收獲,把握重點、攻克難關,活學活用對于牢固的掌握知識,是非常有用的。在此次課設中,我學到了很多,也通過不斷糾正自己的錯誤,意識到自身的不足,我對知識的掌握還沒有實現深層次的理解記憶,我相信這些教訓都為我以后的學習奠定了良好的基礎,時刻牢記團隊合作、堅持與努力的重要性。參考文獻[1]王思明,張金敏,茍軍年.單片機原理及應用系統設計[M].北京:人民郵電出版社,2008.[2]馮育長,鄒小兵.單片機系統設計與實例指導[M].西安:西安電子科技大學出社,2004.[3]彭偉.單片機C語言程序設計實訓100例[M].北京:電子工業出版社,2009.[4]單丹,馬淑云.基于AT89C51單片機電子琴的設計[J].中國高新技術企業,2002.附錄#include<reg52.h>#defineucharunsignedchar#defineuintunsignedint//共陽極數碼管UcharcodeLED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};sbitbeep=P3^0;ucharkey;//鍵號sbitbuzzer=P3^7;uchardis_buf;ucharflag;//音符延時表uintcodeTone_Delay_Table[]={64524,64580,64684,64777,64820,64896,64966,65030,65058,65110,65157,65178,65217,65252,65283,65316};//音調與節拍ucharcodeSong1_Tone[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,0xff};ucharcodeTime1_Tone[]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xff};ucharcodeSong2_Tone[]={3,5,5,3,2,1,2,3,5,3,2,3,5,5,3,2,1,2,3,2,1,1,0xff};ucharcodeTime2_Tone[]={2,1,1,2,1,1,1,2,1,1,1,2,1,1,2,1,1,1,2,1,1,1,0xff};ucharcodeSong3_Tone[]={1,1,5,5,6,6,5,4,4,3,3,2,2,1,0xff};ucharcodeTime3_Tone[]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xff};//定義按鍵序號ucharkeyno;//音樂片段索引,音符索引ucharsong_index=0;uchartone_index=0;//音符指針,延時指針uchar*tone_pointer,*delay_pointer;//從當前數組中取出音符的位置uchari=0;//毫秒延時voiddelayms(uintms){ uchart; while(ms--)for(t=0;t<120;t++);}//按鍵產生外部中斷voidKey_Press()interrupt0{ TR0=0; //切換歌曲 song_index=(song_index+1)%3; switch(song_index) { case2:tone_pointer=Song1_Tone; delay_pointer=Time1_Tone; break; case1:tone_pointer=Song2_Tone; delay_pointer=Time2_Tone; break; case0:tone_pointer=0; delay_pointer=0; break; } //重新開始 i=0; TR0=1; flag=1;}//T0中斷播放voidplay_music()interrupt1{ if(song_index!=0){ TH0=Tone_Delay_Table[tone_index]/256; TL0=Tone_Delay_Table[tone_index]%256; buzzer=~buzzer;} else{buzzer=0;}}/*voidkey_scan(){ uchartemp,k; //高四位置0,放入四行 P1=0x0f; delayms(2); //按鍵后00001111變成0000xxxx,x中1個為0,3個仍為1 //以下亦或操作把3個1變成0,唯一0變成1 temp=P1^0x0f; //判斷按鍵發生于0-3列的哪一列 switch(temp) { case1:k=0;break; case2:k=1;break; case4:k=2;break; case8:k=3;break; default:return; } //底四位置0,放入四列 P1=0xf0; delayms(2); //按鍵后11110000變成xxxx0000,x為1個0,三個仍為1 //高四位移動至底四位,唯一0變1,其余為0 temp=(P1>>4)^0x0f; //對0~3行分別賦起始值0,4,8,12 switch(temp) { case1:k+=0;break; case2:k+=4;break; case4:k+=8;break; case8:k+=12;break; default:return; } keyno=k;}*///矩陣鍵盤掃描子程序voidkey_scan(void){ uchartemp;P1=0x0F;//低四位輸入delayms(2);//稍稍延時temp=P1;//讀P1口temp=temp&0x0F;//取低四位temp=~(temp|0xF0);if(temp==1)//檢測按下的鍵所在的列號,在第一列key=0;elseif(temp==2)//在第二列key=1;elseif(temp==4)//在第三列key=2;elseif(temp==8)//在第四列key=3;elsekey=16;//否則顯示-P1=0xF0;//高四位輸入delayms(2);temp=P1;//讀P1口temp=temp&0xF0;temp=~((temp>>4)|0xF0);if(temp==1)//檢測按下的鍵所在的行號,在第一行key=key+0;elseif(temp==2)//在第二行key=key+4;elseif(temp==4)//在第三行key=key+8;elseif(temp==8)//在第四行key=key+12;elsekey=16;//否則顯示-/*根據行號和列號得到按下的鍵號*/dis_buf=LED[key

溫馨提示

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

評論

0/150

提交評論