基于51單片機(jī)簡(jiǎn)易電子琴設(shè)計(jì)報(bào)告_第1頁(yè)
基于51單片機(jī)簡(jiǎn)易電子琴設(shè)計(jì)報(bào)告_第2頁(yè)
基于51單片機(jī)簡(jiǎn)易電子琴設(shè)計(jì)報(bào)告_第3頁(yè)
基于51單片機(jī)簡(jiǎn)易電子琴設(shè)計(jì)報(bào)告_第4頁(yè)
基于51單片機(jī)簡(jiǎn)易電子琴設(shè)計(jì)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、創(chuàng)新制作報(bào)告 簡(jiǎn)易電子琴設(shè)計(jì) 摘要本設(shè)計(jì)主要研究基于STC90C51單片機(jī)的簡(jiǎn)易電子琴設(shè)計(jì)。它是以單片機(jī)作為主控核心,鍵盤(pán)、電腦音響、led等外圍器件構(gòu)成;本設(shè)計(jì)硬件局部主要由最小系統(tǒng),按鍵系統(tǒng)模塊、led顯示模塊和發(fā)聲模塊組成。其軟件局部主要有主程序模塊、定時(shí)中斷程序、定時(shí)計(jì)數(shù)程序、顯示程序。1最小系統(tǒng):它是單片機(jī)應(yīng)用系統(tǒng)的設(shè)計(jì)根底。它包括單片機(jī)的選擇、時(shí)鐘系統(tǒng)設(shè)計(jì)、復(fù)位電路設(shè)計(jì)等。2按鍵系統(tǒng)模塊:本設(shè)計(jì)采用24個(gè)按鍵,其中21個(gè)按鍵用來(lái)顯示21個(gè)音調(diào),其它3個(gè)按鍵可以進(jìn)行功能的切換。3LED顯示模塊:八個(gè)LED,七個(gè)紅色LED來(lái)顯示音符,1個(gè)綠色LED指示。4發(fā)聲模塊:此電子琴發(fā)音是用現(xiàn)成

2、的電腦音響。本次設(shè)計(jì)首先對(duì)單片機(jī)設(shè)計(jì)簡(jiǎn)易電子琴仔細(xì)分析,接著制作硬件電路和編寫(xiě)軟件的程序,最后進(jìn)行軟硬件的調(diào)試運(yùn)行。并且從原理圖,主要芯片,各模塊的原理和各個(gè)模塊的程序調(diào)試來(lái)闡述。利用單片機(jī)產(chǎn)生不同頻率來(lái)獲得我們要求的音階,實(shí)現(xiàn)高、中、低共21個(gè)音符的發(fā)音和顯示和音樂(lè)播放時(shí)的控制顯示,并且能自動(dòng)播放程序中編排的音樂(lè),同時(shí)還有保存兵播放已按下的音符。系統(tǒng)運(yùn)行穩(wěn)定,其優(yōu)點(diǎn)是硬件電路簡(jiǎn)單,軟件功能完善,控制系統(tǒng)可靠. 目錄1.概述4設(shè)計(jì)背景4設(shè)計(jì)意義41.3 設(shè)計(jì)任務(wù)42.系統(tǒng)總體方案及硬件設(shè)計(jì)4總體設(shè)計(jì)4硬件設(shè)計(jì)6單片機(jī)的最小工作系統(tǒng)6電源設(shè)計(jì):按鍵設(shè)計(jì):燈設(shè)計(jì):發(fā)聲模塊: 3.系統(tǒng)軟件的的編寫(xiě)

3、7電子琴根本原理 7主程序 9播放音樂(lè)模塊 16錄音模塊 20硬件調(diào)試 23軟件調(diào)試 235課程設(shè)計(jì)體會(huì) 附1 源程序代碼241.概述設(shè)計(jì)背景由于本課程要做一個(gè)創(chuàng)新制作,而老師給的參考題中覺(jué)得電子琴這課題不錯(cuò),因?yàn)殡娮忧倌芴找比说那椴?,同時(shí)使人更快樂(lè),他能真正影響人的心情,因此決定做。單片機(jī)技術(shù)使我們可以利用軟硬件來(lái)實(shí)現(xiàn)電子琴的功能,從而可以實(shí)現(xiàn)電子琴的微型化,可以用作玩具琴、音樂(lè)轉(zhuǎn)盤(pán)以及音樂(lè)童車(chē)等等。并且可以進(jìn)行一定的功能擴(kuò)展。鑒于傳統(tǒng)電子琴可以用鍵盤(pán)上的“1到“A鍵演奏從低So到高DO等11個(gè)音,從而也可以通過(guò)單片機(jī)實(shí)現(xiàn)對(duì)十個(gè)按鍵的擴(kuò)展,實(shí)現(xiàn)七個(gè)音符鍵的高、中、低21個(gè)音調(diào)的顯示播放和音樂(lè)

4、的自動(dòng)播放。設(shè)計(jì)意義可以了解音樂(lè)的根本知識(shí);加深對(duì)單片機(jī)的使用;學(xué)會(huì)自己做工程;1.3 設(shè)計(jì)任務(wù) 實(shí)現(xiàn)電子琴發(fā)聲控制系統(tǒng);要求電路實(shí)現(xiàn)如下功能:利用現(xiàn)成電腦音響作為發(fā)聲部件,21個(gè)音符鍵,實(shí)現(xiàn)高音、中音、低音的1、2、3、4、5、6、7的發(fā)音。并在存儲(chǔ)幾首歌曲的內(nèi)容,可以實(shí)現(xiàn)自動(dòng)播放。 2.系統(tǒng)總體方案及硬件設(shè)計(jì)總體設(shè)計(jì)音樂(lè)是有由不同的音階組成的,而不同的音階又是由不同的頻率發(fā)出的,那么產(chǎn)生不同的頻率,就可以發(fā)出不同的音樂(lè)了。而利用單片機(jī)就可以產(chǎn)生不同的頻率的方波,因此選擇單片機(jī)為為主來(lái)設(shè)計(jì)。通過(guò)程序編寫(xiě)實(shí)現(xiàn)單片機(jī)輸出不同的頻率,輸出的方波信號(hào)再通過(guò)接口給電腦音響,讓其發(fā)聲。同時(shí)電子琴參加le

5、d用來(lái)顯示。本設(shè)計(jì)的主要工作是程序編寫(xiě),通過(guò)程序讓電子琴實(shí)現(xiàn)音樂(lè)演奏,歌曲播放以及記錄已按下的音符,并播放,最后實(shí)現(xiàn)led顯示。而硬件主要有單片機(jī)最小系統(tǒng),鍵盤(pán)模塊,發(fā)聲模塊,還有一個(gè)電源模塊。直流電源LED顯示 單片機(jī)按鍵輸入電腦音響 總體框圖2硬件設(shè)計(jì)電路圖1注:本系統(tǒng)有主控單片機(jī)、鍵盤(pán)、led顯示模塊、發(fā)聲模塊以及電源組成。單片機(jī)的最小工作系統(tǒng):這里用的單片機(jī)的型號(hào)是STC90C516RD+,配以12M的晶振,以及復(fù)位電路供電電路構(gòu)成最小系統(tǒng)。電源設(shè)計(jì):這里電源直接用直流5v電源;按鍵設(shè)計(jì): 按鍵采用4*6掃描;4根行線接P10-P13,六根列線接P14-P17以及P20,P21口共24

6、個(gè)按鍵,0-20代表音符鍵,0-6代表低音1,2,3,4,5,6,7;7-13代表中音1,2,3,4,5,6,7;14-20代表高音1,2,3,4,5,6,7;21號(hào)按鍵表示播放歌曲鍵,當(dāng)按下21號(hào)鍵,進(jìn)入播放歌曲函數(shù),當(dāng)按下22號(hào)鍵時(shí),播放下一首歌曲,當(dāng)按下23鍵時(shí),退出播放返回主程序。而在主程序中時(shí),代表演奏狀態(tài),當(dāng)按下23號(hào)鍵時(shí),進(jìn)入錄音狀態(tài),此時(shí)有個(gè)綠色的指示燈會(huì)亮。而進(jìn)入錄音后,再按一次23鍵,指示燈滅,退出錄音狀態(tài),返回主程序。LED燈設(shè)計(jì):七個(gè)紅色的LED代表按鍵的音符DO,RE,MI.分別接到P0口的各個(gè)I端口音符DO時(shí),一個(gè)LED亮,音符MI時(shí),2個(gè)LED亮。同時(shí)為了區(qū)分高中

7、低音,三個(gè)八度LED顯示不同,當(dāng)?shù)鸵粢舴シ艜r(shí),LED閃亮,當(dāng)是中音時(shí),LED也閃亮,但是閃亮的頻率更快,當(dāng)是高音時(shí),LED全亮,這是通過(guò)調(diào)節(jié)LED亮滅時(shí)間來(lái)實(shí)現(xiàn),也可以說(shuō)是PWM吧。還有一個(gè)綠色LED指示當(dāng)前狀態(tài),當(dāng)電子琴處于錄音時(shí),LED亮,否那么,滅;發(fā)聲模塊: 這里沒(méi)有自己做功放,而是使用電腦的音響。3系統(tǒng)軟件的的編寫(xiě)電子琴根本原理 首先的弄清楚電子琴的根本原理:聲音的頻譜范圍約在幾十到幾千赫茲,假設(shè)能利用程序來(lái)控制單片機(jī)的某個(gè)口線不斷輸出“高“低電平,那么在該口線上就能產(chǎn)生一定頻率的方波,講該方波接上喇叭就能發(fā)出一定頻率的聲音,假設(shè)再利用程序控制“高“低電平的持續(xù)時(shí)間,就能改變輸出波

8、形的頻率從而改變音調(diào)。樂(lè)曲中,每個(gè)音符對(duì)應(yīng)著確定的頻率,下表給出各音符頻率。如果單片機(jī)某個(gè)口線輸出“高“低電平的頻率和某個(gè)音符的頻率一樣,那么將此口線接上喇叭就可以發(fā)出此音符的聲音。根據(jù)這個(gè)原理就能設(shè)計(jì)出,對(duì)于單片機(jī)來(lái)說(shuō)要產(chǎn)生一定頻率的方波大致是先將某口線輸出高電平然后延遲一段時(shí)間再輸出低電平,如此循環(huán)的輸出就會(huì)產(chǎn)生一定頻率的方波,通過(guò)改變延遲的時(shí)間就可以改變輸出方波的頻率。單片機(jī)內(nèi)部有兩個(gè)定時(shí)計(jì)數(shù)器T1和T0,單片機(jī)的定時(shí)計(jì)數(shù)器實(shí)際上是個(gè)計(jì)數(shù)裝置,它既可以對(duì)單片機(jī)內(nèi)部晶振驅(qū)動(dòng)時(shí)鐘計(jì)數(shù),也可以對(duì)外部輸入的脈沖計(jì)數(shù),對(duì)內(nèi)部晶振計(jì)數(shù)時(shí)稱(chēng)為定時(shí)器,對(duì)外部時(shí)鐘計(jì)數(shù)時(shí)稱(chēng)為計(jì)數(shù)器。當(dāng)對(duì)單片機(jī)內(nèi)部晶振驅(qū)動(dòng)時(shí)

9、鐘計(jì)數(shù)時(shí),每個(gè)機(jī)器周期定時(shí)計(jì)數(shù)器的計(jì)數(shù)值就加,當(dāng)計(jì)數(shù)值到達(dá)計(jì)數(shù)最大值時(shí)計(jì)數(shù)完畢并通知單片機(jī)。音樂(lè)中各個(gè)音符的頻率表如下:音符頻率表3弄懂后開(kāi)始程序的實(shí)現(xiàn)主程序模塊 開(kāi)始初始化定時(shí)器T0,T1、led 關(guān)閉定時(shí)器,LED燈熄滅檢測(cè)有無(wú)按鍵按下 N Y 按鍵掃描 開(kāi)啟定時(shí)器,開(kāi)中斷KeyNo=21 KeyNo<21 KeyNo=23 進(jìn)入錄音模式 進(jìn)入函數(shù)播放曲目 Y 按鍵是否松開(kāi)根據(jù)KeyNo,喇叭發(fā)聲根據(jù)KeyNo,LED顯示 Y 關(guān)閉定時(shí)器 主程序框圖參數(shù)計(jì)算發(fā)音原理假設(shè)要產(chǎn)生音頻脈沖,只要算出某一音頻的周期1/頻率,再將此周期除以2,即為半周期的時(shí)間。利用定時(shí)器計(jì)時(shí)半周期時(shí)間,每當(dāng)計(jì)

10、時(shí)終止后就將反相,然后重復(fù)計(jì)時(shí)再反相。就可在引腳上得到此頻率的脈沖。利用AT89C51的內(nèi)部定時(shí)器使其工作計(jì)數(shù)器模式MODE1下,改變計(jì)數(shù)值TH0及TL0以產(chǎn)生不同頻率的方法產(chǎn)生不同音階。計(jì)算舉例例如,頻率為523Hz,其周期T1/5231912s,因此只要令計(jì)數(shù)器計(jì)時(shí)956s/1s956,每計(jì)數(shù)956次時(shí)將I/O反相,就可得到中音DO523Hz。計(jì)數(shù)脈沖值與頻率的關(guān)系式是:Nfi÷2÷fr,式中,N是計(jì)數(shù)值;fi是機(jī)器頻率晶體振蕩器為12MHz時(shí),其頻率為1MHz;fr是想要產(chǎn)生的頻率。其計(jì)數(shù)初值T的求法如下:T65536N65536fi÷2÷fr例如

11、:設(shè)K65536,fi1MHz,求中音DO261Hz。T65536N65536fi÷2÷fr655361000000÷2÷fr65536500000/fr,中音DO的T65536500000/52364580。 計(jì)算結(jié)果1單片機(jī)12MHZ晶振,中音符與計(jì)數(shù)T0相關(guān)的計(jì)數(shù)值如表所示:音符頻率HZ計(jì)數(shù)值T值音符頻率HZ計(jì)數(shù)值T值低1DO26263628#4FA#74064860#1DO#27763737中5SO78464898低2RE29463835#5SO#83194934#2RE#31163928中6LA88064968低3MI33064021#6LA#

12、93264994低4FA34964103中7SI96865030#4FA#37064185低1DO104665058低SO39264260#1DO#110965085#5SO#41564331高2RE117565110低6LA44064400#2RE#124565134#6LA#46664463高3MI131865157低7SI49464524高4FA139765178中1DO52364580#4FA#149065198#1DO#55464633高5SO156865217中2RE58764633#5SO#166165235#2RE#62264884高6LA176065252中3MI659647

13、32#6LA#186565268中4FA69864820高7SI196765283采用查表程序進(jìn)行查表時(shí),可以為這個(gè)音符建立一個(gè)表格,有助于單片機(jī)通過(guò)查表的方式來(lái)獲得相應(yīng)的數(shù)據(jù):低音019之間,中音在2039之間,高音在4059之間。用單片機(jī)播放音樂(lè),或者彈奏電子琴,實(shí)際上是按照特定的頻率,輸出一連串的方波。為了輸出適宜的方波,首先應(yīng)該知道音符與頻率的關(guān)系。2音調(diào)數(shù)據(jù)表曲調(diào)值DELAY曲調(diào)值DELAY調(diào)4/4125ms調(diào)4/462ms調(diào)3/4187ms調(diào)3/494ms調(diào)2/4250ms調(diào)2/4125ms上表中的頻率數(shù)值,有些過(guò)多,去掉不常用的黑鍵頻率,只是把白鍵對(duì)應(yīng)的數(shù)據(jù)存放在單片機(jī)中,即可滿

14、足絕大局部的應(yīng)用需求。定義音調(diào)數(shù)據(jù)表的程序如下:DW 63628,63835,64021,64103,64260,64400,64524 ;64580,低音區(qū):1 2 3 4 5 6 7 DW 64580,64671,64777,64820,64898,64968,65030 65058中音區(qū):1 2 3 4 5 6 7 DW 65058,65110,65157,65178,65217,65252,65283 65312高音區(qū):1 2 3 4 5 6 7把這個(gè)數(shù)據(jù)表,放在程序中,需要播音的時(shí)候,就從表中取出一個(gè)數(shù)據(jù)送到定時(shí)器,當(dāng)定時(shí)器溢出中斷的時(shí)候,再對(duì)輸出引腳取反,那么,在揚(yáng)聲器中,即可聽(tīng)到

15、上表中頻率的聲音。主程序中涉及的函數(shù)講解:void YinFu_DiZhongGao_Flag(uchar keyval)if(keyval<7)flag_yinfu_dizhonggao=1; / 低音else if(keyval<14)flag_yinfu_dizhonggao=2; /中音else if(keyval<21)flag_yinfu_dizhonggao=3; /高音此函數(shù)是根據(jù)按下鍵值來(lái)確定音符是高音、中音還是低音flag_yinfu_dizhonggao=1代表 低音;lag_yinfu_dizhonggao=2; 代表中音。flag_yinfu_diz

16、honggao=3;代表高音。而LED顯示函數(shù)定時(shí)器1中斷效勞函數(shù)會(huì)根據(jù)lag_yinfu_dizhonggao的值來(lái)顯示void Timer_Init()TMOD=0x11; /定時(shí)器T0,T1設(shè)置為方式1,TH1=0xD8; /10ms中斷一次TL1=0xF0;TH0=th0;TL0=tl0;IE=0x82;/開(kāi)啟總中斷和定時(shí)器T0,T1溢出中斷ET1=1;IP=0x02;/T0優(yōu)先于T1定時(shí)器0用來(lái)產(chǎn)生不同方波頻率,使音響發(fā)聲定時(shí)器1用來(lái)控制LED顯示,當(dāng)工作在演奏模式時(shí),按下音符鍵時(shí),判斷音符鍵是高音還是中音或者低音,當(dāng)是高音時(shí),LED全亮,占空比為1,當(dāng)是中音時(shí),LED快速閃爍,占空

17、比為1/2;當(dāng)是低音時(shí),LED相對(duì)較慢的閃爍,占空比為1/4;以下是中斷效勞程序:void play_Tone() interrupt 1 using 0/定時(shí)器T0溢出中斷,產(chǎn)生不同頻率的矩形波TH0=th0; TL0=tl0;Beep=Beep;void play_LED() interrupt 3 using 2if(Recordonoff)/開(kāi)啟錄音后計(jì)時(shí)按鍵按下的時(shí)間TH1=0xB1; TL1=0xE0;Record_Timer+;if(flag_yinfu_dizhonggao=1|flag_yinfu_dizhonggao=3)/低音或高音if(cont=3&&f

18、lag_yinfu_dizhonggao=1)|flag_yinfu_dizhonggao=3) /低音占空比為1/4、高音占空比為1led=LED_Disyuzhi;else led=0x00;if(flag_yinfu_dizhonggao=2) if(cont1)/控制占空比為1/2 cont1=cont1; led=LED_Disyuzhi; else led=0x00; cont1=cont1; cont+;if(cont>3) cont=0; 中斷函數(shù)中的余值在主程序中是這樣賦值的:yuzhi=(KeyNo+3)%7;/判斷DO RE MI FA.根據(jù)yuzhi判斷DO、RE

19、。當(dāng)時(shí)DO時(shí),亮一個(gè)LED燈,當(dāng)時(shí)RE時(shí),亮兩個(gè)LED./21個(gè)音符的頻率對(duì)應(yīng)的T值Uint codeTone_Delay_Table=63628,63835,64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,65217,65252,65283void main()uchar Keystate=0;Timer_Init();led=0x00; /初始化ledled_zhishi=0;指示LED滅進(jìn)入演奏狀態(tài),假設(shè)進(jìn)入錄音狀態(tài)那么亮while(1) Key

20、state=KeyState();/如果有按鍵按下,返回1if(Keystate)key_scan();if(KeyNo<21)/KeyNo存儲(chǔ)按下鍵的鍵值yuzhi=(KeyNo+3)%7;/判斷DO RE MI FA.th0=Tone_Delay_TableKeyNo/256;/賦初值,產(chǎn)生/按鍵所對(duì)應(yīng)的音符的頻率tl0=Tone_Delay_TableKeyNo%256; YinFu_DiZhongGao_Flag(KeyNo);/判斷是高中低音TR0=1; /Turn on timerTR1=1; else if(KeyNo=21) /進(jìn)入播放歌曲狀態(tài)PlayMusic(); D

21、elayms(2000); else if(KeyNo=23)/進(jìn)入錄音狀態(tài) Recordonoff=Recordonoff;Record_yinfu(); elseTR0=0; /關(guān)閉定時(shí)器TR1=0;led=0x00;cont=0;/控制占空比變量,讓LED以不同頻率閃爍Delayms(2);播放歌曲模塊主程序指針指向第一首歌存 放地址 翻開(kāi)定時(shí)器 按鍵掃描LED亮音響發(fā)聲 KeyNo=22 KeyNo=23關(guān)閉定時(shí)器,關(guān)中 斷退出播放播放歌曲指針指向存放下一首個(gè)的數(shù)組,從而播放下一首 播放歌曲函數(shù)程序圖4 總共有三首歌可供播放,三首歌循環(huán)播放,當(dāng)按下退出鍵23,返回主程序,進(jìn)入演奏狀態(tài)。

22、函數(shù)實(shí)現(xiàn)如下: /音樂(lè)的頻率所對(duì)應(yīng)的T值 /包含了低音SO,LA,SI,中音DO,RE,MI,F(xiàn)A,SO,RE,SI,高音DO,LA,MIuchar code MusicYinFu=0XFc,0X44,0XFc,0Xac,0XFd,0X09,0XFd,0X34, 0XFD,0X82,0XFD,0Xc8,0XFD,0X06,0XFb,0X04, 0Xfb,0X90,0Xfc,0X0c,0Xfe,0X22,0Xf9,0X5b,0Xfa,0x15; /月亮代表我的心/這里的數(shù)據(jù)的高4位代表音符對(duì)應(yīng)的序列號(hào),低4位代表節(jié)拍數(shù)/例如0x82,表示第八個(gè)音符,延時(shí)兩個(gè)節(jié)拍uchar code Music_

23、One= 0x02,0x82,0x16,0x32,0x54,0x02,0x52,0xA6,0x32,0x54,0x02,0x52,0x64,0x74,0xB6,0x64,0x52,0x5C,0x32,0x22,0x16,0x12,0x14,0x32,0x22,0x26,0x12,0x94,0x22,0x32,0x2C,0x32,0x52,0x36,0x22,0x14,0x54,0xAC,0x92,0xA2,0x96,0xA2,0x96,0x82,0x3C,0x54,0x36,0x22,0x14,0x54,0xAC,0x92,0xA2,0x16,0x12,0x14,0x22,0x32,0x2C,

24、0x02,0x82,0x16,0x32,0x56,0x12,0xA6,0x32,0x56,0x52,0x66,0x72,0xB6,0x62,0x1C, 0xff;void PlayMusic(void) uchar yinfu,jiepai,yinfu_led; uchar i,j; /循環(huán)變量uchar *p1=Music_One,*p2=MusicYinFu; /p1開(kāi)始指向第一首歌 /p2去歌曲的音符和節(jié)拍for(i=0;*(p1+i)!=0XFF;i+) yinfu=(*(p1+i)>>4); /取出音符對(duì)應(yīng)的序號(hào),如/Music_One2=0x82,音符代表MusicYi

25、nFu8jiepai=(*(p1+i)&0X0F);/取出節(jié)拍數(shù) yinfu_led=yinfu%7; /音符對(duì)應(yīng)LED顯示號(hào)if(yinfu!=0) th0=*(p2+(yinfu-1)*2); tl0=*(p2+(yinfu-1)*2+1); TR0=1;ET0=1; else /如Music_One1=0x02,這里的音符為0,表停頓TR0=0;Beep=1;for(j=jiepai;j>0;-j) led=LED_Disyinfu_led-1;Delayms(180);/一拍延時(shí)時(shí)間key_scan(); if(KeyNo=23) /退出播放ET0=1;break;els

26、e if(KeyNo=22)/下一曲if(p1=Music_One) 假設(shè)正在播放第一首,那么下一曲就是第二首ET0=0;p1=Music_Two;else if(p1=Music_Two)/假設(shè)是第二首,下一首是第三首ET0=0;p1=Music_Three;elseET0=0;p1=Music_One;/同理i=0;KeyNo=26; /一定要改變KeyNo的值,否那么只播放一個(gè)音符Delayms(1000);/歌曲切換,停頓一下break;/跳出之前播放的歌曲,以使播放下一曲 if(*(p1+i+1)=0XFF)/判斷歌曲是否播放完畢ET0=0;Beep=0;/暫停一下if(p1=Mus

27、ic_One) /如果剛剛結(jié)束第一首歌,播放第二首歌i=0;p1=Music_Two;Delayms(2000);else if(p1=Music_Two) /如果剛剛結(jié)束第二首歌,播放第三首歌i=0;p1=Music_Three;Delayms(2000);else /如果剛剛結(jié)束第三首歌,播放第一首歌i=0;p1=Music_One;Delayms(3000); TR0=0; ET0=0;if(KeyNo=23) ET0=1;break; ET0=1; 主程序錄音函數(shù)實(shí)現(xiàn):LED指示燈亮關(guān)定時(shí)器關(guān)檢測(cè)是否有按鍵按下NY 按鍵掃描KeyNo<21 KeyNo<21 KeyNo=2

28、3存儲(chǔ)按下鍵的鍵值,以及按下鍵的時(shí)間定時(shí)器開(kāi)啟,播放按鍵所對(duì)應(yīng)的音符,同時(shí)LED燈顯示那個(gè)音符按下播放已按下的鍵,播放完畢后,綠色LED指示燈滅 程序框圖:5程序?qū)崿F(xiàn):void Record_yinfu()uchar keystate,i=0;uchar history100=0;/記錄按下的鍵音,初始化led_zhishi=1;/開(kāi)燈while(KeyState();/等待按鍵釋放while(1)keystate=KeyState();/按鍵狀態(tài)檢測(cè)if(keystate)key_scan();if(KeyNo=23) Recordonoff=Recordonoff;/退出錄音else if

29、(KeyNo<21)/音符鍵do /這里用do while 循環(huán)能使音符播放隨按鍵松開(kāi)而停止,/同時(shí)計(jì)時(shí)也是隨按鍵松開(kāi)而停止計(jì)時(shí),這樣能比擬準(zhǔn)確計(jì)算按鍵按下的時(shí)間key_scan(); if(KeyNo<21) yuzhi=(KeyNo+3)%7;/判斷DO RE MI FA.YinFu_DiZhongGao_Flag(KeyNo);th0=Tone_Delay_TableKeyNo/256;tl0=Tone_Delay_TableKeyNo%256; TR0=1;TR1=1;historyi*2=KeyNo;/存儲(chǔ)按鍵的鍵的音符historyi*2+1=Record_Timer;

30、/存儲(chǔ)按鍵按下不松的時(shí)間 keystate=KeyState();while(keystate);/如果按鍵松開(kāi),表示按下的一個(gè)音符結(jié)束i+; /接下來(lái)按的鍵就是下一個(gè)音符else/表示沒(méi)鍵按下,那得關(guān)閉定時(shí)器,led滅led=0x00;Record_Timer=0;/按鍵按下定時(shí)數(shù)清零,下一個(gè)按鍵按下后從新計(jì)時(shí)TR0=0; TR1=0;if(!Recordonoff)/按下錄音播放鍵,回放按下的音符for(i=0;historyi*2+1!=0;i+)/historyi*2+1存的是按鍵對(duì)/應(yīng)的音符yuzhi=(historyi*2+3)%7;/判斷DO RE MI FA.YinFu_DiZ

31、hongGao_Flag(historyi*2);/判斷是中上下音th0=Tone_Delay_Tablehistoryi*2/256;tl0=Tone_Delay_Tablehistoryi*2%256;TR0=1;TR1=1;for(historyi*2+1;historyi*2+1>0;historyi*2+1-)Delayms(10);/historyi*2+1中存放的是按鍵按/下的時(shí)間次數(shù),一次表示一個(gè)10ms,因?yàn)橹袛鄷r(shí)間是10msDelayms(10);/音符之間延時(shí)一下led=0x00;TR0=0;/回放完了就關(guān)掉定時(shí)器TR1=0;for(i=0;i<100;i+)

32、/去除錄音數(shù)據(jù) historyi=0;led_zhishi=0;/關(guān)閉指示燈while(KeyState(); /等待按鍵釋放break;/跳出死循環(huán),回到主程序 4.硬件調(diào)試硬件調(diào)試主要是針對(duì)單片機(jī)局部進(jìn)行的調(diào)試。在上電之前,先確保電路中不存在斷路或短路情況,這一工作是整個(gè)調(diào)試工作的第一步,也是非常重要的一個(gè)步驟。在這局部調(diào)試中主要使用的工具是萬(wàn)用表,用來(lái)完成檢測(cè)電路中是否存在斷路或者短路情況的任務(wù)。注意焊點(diǎn)之間,確保焊點(diǎn)沒(méi)有短接在一起,同時(shí)注意焊點(diǎn)的美觀,確保沒(méi)有開(kāi)路以及短路的現(xiàn)象出現(xiàn)。在確保硬件電路正常且無(wú)異常情況(斷路或短路)的情況下方可上電調(diào)試,上電調(diào)試的目的是檢驗(yàn)電路是否接錯(cuò),同時(shí)

33、還要檢驗(yàn)原理是否正確。LED電路調(diào)試:接通電源,隨機(jī)按下按鈕可以看到LED亮。2、鍵盤(pán)單片機(jī)控制局部調(diào)試:上電后,隨機(jī)按動(dòng)鍵盤(pán)可以發(fā)現(xiàn)各個(gè)按鍵對(duì)應(yīng)的音正確。5 軟件調(diào)試軟件調(diào)試是一個(gè)重要的任務(wù),當(dāng)電子琴?zèng)]有出現(xiàn)預(yù)期的功能時(shí),通過(guò)反復(fù)研究程序的邏輯是否正確,哪些功能實(shí)現(xiàn),哪些功能沒(méi)實(shí)現(xiàn),是哪一個(gè)模塊出了問(wèn)題。實(shí)際中往往一個(gè)小小的變量沒(méi)賦予正確的值,其功能完全出不來(lái),當(dāng)中我花費(fèi)了大量的時(shí)間去調(diào)試代碼,而且是在PROTEUS上調(diào)試,這種仿真比擬靠譜,但與實(shí)際有小小的區(qū)別。最終通過(guò)巨大的努力,預(yù)期的功能全部實(shí)現(xiàn),瞬間感覺(jué)很有成就感。 5. 課程設(shè)計(jì)體會(huì)總體來(lái)說(shuō),此次單片機(jī)課程設(shè)計(jì)使我們收獲良多,雖然課

34、程設(shè)計(jì)的過(guò)程中遇到了很多困難與問(wèn)題,如起初對(duì)音樂(lè)的一點(diǎn)不懂開(kāi)始,到器件難找,到硬件焊好后在完善等等,但我們最終還是完成了設(shè)計(jì)的任務(wù)及要求。這次課程設(shè)計(jì)中,經(jīng)過(guò)我們的努力,在仿真軟件和實(shí)物上都實(shí)現(xiàn)了高、中、低21個(gè)音符的發(fā)聲和音樂(lè)的自動(dòng)播放,使我們有了一定的成就感,也使我們進(jìn)一步熟悉和掌握了單片機(jī)的內(nèi)部結(jié)構(gòu)和工作原理,了解了單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)的根本方法和步驟, 掌握了單片機(jī)仿真軟件Proteus的使用方法和鍵盤(pán)、顯示器在的單片機(jī)控制系統(tǒng)中的應(yīng)用,同時(shí)也掌握了撰寫(xiě)課程設(shè)計(jì)報(bào)告的方法??傊ㄟ^(guò)這次課程設(shè)計(jì),自己的能力得到進(jìn)一步的提升。 附1 源程序代碼#include<reg51.h>

35、#define uchar unsigned char#define uint unsigned int#define led P0sbit led_zhishi = P31;sbit Beep=P30;/波形輸出口 /按鍵按下鍵值、定時(shí)器初值 、 音符低中高標(biāo)志位、音符DO、RE.uchar KeyNo,th0,tl0,flag_yinfu_dizhonggao,yuzhi; /控制占空比變量、錄音開(kāi)啟標(biāo)志、錄音音符延時(shí) uchar cont=0,cont1=0xff,Recordonoff=0,Record_Timer=0;void PlayMusic(void); /函數(shù)聲明void D

36、elayms(uint x);void key_scan(void);void Timer_Init();void Record_yinfu();uchar KeyState(void);void YinFu_DiZhongGao_Flag(uchar keyval); /音樂(lè)的頻率所對(duì)應(yīng)的T值/包含了低音SO,LA,SI,中音DO,RE,MI,F(xiàn)A,SO,RE,SI,高音DO,LA,MIuchar code MusicYinFu=0XFc,0X44,0XFc,0Xac,0XFd,0X09,0XFd,0X34, 0XFD,0X82,0XFD,0Xc8,0XFD,0X06,0XFb,0X04,0

37、Xfb,0X90,0Xfc,0X0c,0Xfe,0X22,0Xf9,0X5b,0Xfa,0x15; /月亮代表我的心Music_One= 0x02,0x82,0x16,0x32,0x54,0x02,0x52,0xA6,0x32,0x54,0x02,0x52, 0x64,0x74,0xB6,0x64,0x52,0x5C,0x32,0x22,0x16,0x12,0x14,0x32,0x22,0x26,0x12,0x94,0x22,0x32,0x2C,0x32,0x52,0x36,0x22,0x14,0x54,0xAC,0x92,0xA2,0x96,0xA2,0x96,0x82,0x3C,0x54,

38、0x36,0x22,0x14,0x54,0xAC,0x92,0xA2,0x16,0x12,0x14,0x22,0x32,0x2C,0x02,0x82,0x16,0x32,0x56,0x12,0xA6,0x32,0x56,0x52,0x66,0x72,0xB6,0x62,0x1C, 0xff;/同一首歌的音符序列號(hào)和節(jié)拍uchar code Music_Two=0X88,0X14,0X24,0X36,0X42,0X34,0X14,0X28,0X14,0X94,0X1d,0X88,0X14,0X24,0X34,0X32,0X42,0X54,0X14,0X46,0X32,0X54,0X22,0X32

39、,0X32,0X22,0X2C,0X38,0X54,0X74,0X76,0X62,0X68,0X54,0X52,0X62,0X74,0X62,0X52,0X3f,0X46,0X42,0X54,0X64,0X54,0X42,0X32,0X28,0Xa4,0Xa2,0X92,0X84,0X94,0X1e,0Xb8,0X68,0X46,0X52,0X68,0X74,0X72,0X72,0X74,0X62,0X52,0X3f,0Xb8,0X68,0X46,0X52,0X68,0X64,0X62,0X62,0X64,0X42,0X32,0X2e,0X58,0X14,0X24,0X36,0X42,0X34

40、,X12,0X12,0X26,0X22,0X24,0X22,0X12,0X94,0X9c,0Xa8,0Xa6,0X92,0X84,0X64,0X54,0X22,0X22,0X46,0X42,0X44,0X32,0X22,0X5f, 0XFF; /千年之戀u(mài)char code Music_Three= 0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,0x32,0x31,0x21,0x32,0x82,0x71,0x81,0x71,0x51,0x32,0x22,0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32

41、,0x62,0x32,0x31,0x21,0x32,0x83,0x82,0x71,0x72,0x02,0x63,0xA1,0xA2,0x62,0x92,0x82,0x52,0x31, 0x51,0x63,0x51,0x63,0x51,0x63,0x51,0x62,0x82,0x7C,0x02,0x61, 0x71,0x82,0x71,0x62,0xA2,0x71,0x76,0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53, 0x42,0x63,0x83,0x83,0x91,0

42、x91,0x61,0x71,0x82,0x71,0x62,0xA2,0x71,0x76,0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53, 0x42,0x82,0x88,0x02,0x74,0x93,0x89, 0xff; /LED顯示音符 /DO, RE, MI, FA, SO, LA, SIuchar code LED_Dis=0x1f,0x3f,0x7f,0x01,0x03,0x07,0x0f;/21個(gè)音符的頻率對(duì)應(yīng)的T值uint code Tone_Delay_Tab

43、le=63628,63835,64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,65217,65252,65283;uchar code IO_P1 = 0xef,0xdf,0xbf,0x7f,0xff,0xff;/送P1值uchar code IO_P2 = 0xff,0xff,0xff,0xff,0xfe,0xfd; / 送P2值uchar code IO_Input = 0x0e,0x0d,0x0b,0x07;/判斷輸入IO口的值void main

44、()uchar Keystate=0;Timer_Init();led=0x00; /初始化ledled_zhishi=0;while(1) Keystate=KeyState();if(Keystate)key_scan();if(KeyNo<21)yuzhi=(KeyNo+3)%7;/判斷DO RE MI FA.th0=Tone_Delay_TableKeyNo/256;tl0=Tone_Delay_TableKeyNo%256; YinFu_DiZhongGao_Flag(KeyNo);TR0=1; /Turn on timerTR1=1;else if(KeyNo=21) /Pl

45、ayMusic(); Delayms(2000); else if(KeyNo=23)/Record Recordonoff=Recordonoff;Record_yinfu(); elseTR0=0; /關(guān)閉定時(shí)器TR1=0;led=0x00;cont=0;Delayms(2);void Timer_Init()TMOD=0x11; /定時(shí)器T0,T1設(shè)置為方式1,TH1=0xD8; /10ms中斷一次TL1=0xF0;TH0=th0;TL0=tl0;IE=0x82;/開(kāi)啟總中斷和定時(shí)器T0,T1溢出中斷ET1=1;IP=0x02;/T0優(yōu)先于T1void Delayms(uint x) /

46、一毫秒延時(shí)uchar i;while(x-) for(i=0;i<120;i+);void key_scan(void)/按鍵行列掃描uchar i,j,temp;for(i=0;i<6;i+)P1=IO_P1i;P2=IO_P2i;temp=P1&0x0f;for(j=0;j<4;j+)if(temp=IO_Inputj)KeyNo=i+j*6;uchar KeyState(void) /判斷有無(wú)按鍵按下uchar temp;/P1=0x0f;P2&=0xfc;temp=P1&0x0f;if(temp!=0x0f)Delayms(6);if(temp

47、!=0x0f)return 1;return 0;void YinFu_DiZhongGao_Flag(uchar keyval)if(keyval<7)flag_yinfu_dizhonggao=1; / 低音else if(keyval<14)flag_yinfu_dizhonggao=2; /中音else if(keyval<21)flag_yinfu_dizhonggao=3; /高音void play_Tone() interrupt 1 using 0/定時(shí)器T0溢出中斷,產(chǎn)生不同頻率的矩形波TH0=th0;TL0=tl0;Beep=Beep;void play_LED() interrupt 3 using 2if(Recordonoff)TH1=0xB1

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論