基于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è),還剩35頁(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ì)基礎(chǔ).它包括單片機(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)行功能地切換.(3) LED顯示模塊:八個(gè) LED,七個(gè)紅色LED來(lái)顯示音符,1個(gè)綠色LED指示.(

2、 4)發(fā)聲模塊:此電子琴發(fā)音是用現(xiàn)成地電腦音響.本次設(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 . 概述41.1 設(shè)計(jì)背景41.2 設(shè)計(jì)意義41.3 設(shè)計(jì)任務(wù)42 .系統(tǒng)總體方案及硬件設(shè)計(jì)42.1 總體設(shè)計(jì)42.2 硬件設(shè)計(jì)62.3 單

3、片機(jī)地最小工作系統(tǒng)62.4 電源設(shè)計(jì):2.5 按鍵設(shè)計(jì):2.6 LED燈設(shè)計(jì):2.7 發(fā)聲模塊:3 .系統(tǒng)軟件地地編寫(xiě)73.1 電子琴基本原理73.2 主程序 93.3 播放音樂(lè)模塊163.4 錄音模塊204.1 硬件調(diào)試234.2 軟件調(diào)試23 5 課程設(shè)計(jì)體會(huì)附1源程序代碼241.1 述1.1 設(shè)計(jì)背景由于本課程要做一個(gè)創(chuàng)新制作,而老師給地參考題中覺(jué)得電子琴這課題不錯(cuò),因?yàn)殡娮忧倌芴找比说厍椴伲瑫r(shí)使人更快樂(lè),他能真正影響人地心情,因此決定做.單片機(jī)技術(shù)使我們可以利用軟硬件來(lái)實(shí)現(xiàn)電子琴地功能,從而可以實(shí)現(xiàn)電子琴地微型化,可以用作玩具琴、音樂(lè)轉(zhuǎn)盤(pán)以及音樂(lè)童車(chē)等等.并且可以進(jìn)行一定地功能擴(kuò)展.

4、鑒于傳統(tǒng)電子琴可以用鍵 盤(pán)上地“1到“At演奏從低So到高DO等11個(gè)音,從而也可以通過(guò)單片機(jī)實(shí)現(xiàn)對(duì)十個(gè)按鍵 地?cái)U(kuò)展,實(shí)現(xiàn)七個(gè)音符鍵地高、中、低 21個(gè)音調(diào)地顯示播放和音樂(lè)地自動(dòng)播放.1.2 設(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ì)2.1 總體設(shè)計(jì)音樂(lè)是有由不同地音階組成地,而不同地音階又是由不同地頻率發(fā)出地,那么產(chǎn)生不同地頻率,就可以發(fā)出

5、不同地音樂(lè)了.而利用單片機(jī)就可以產(chǎn)生不同地頻率地方波,因此選擇單片機(jī)為為主來(lái)設(shè)計(jì).通過(guò)程序編寫(xiě)實(shí)現(xiàn)單片機(jī)輸出不同地頻率,輸出地方波信號(hào)再通過(guò) 接口給電腦音響,讓其發(fā)聲 .同時(shí)電子琴加入led用來(lái)顯示.本設(shè)計(jì)地主要工作是程序編寫(xiě),通過(guò)程序讓電子琴實(shí)現(xiàn)音樂(lè)演奏,歌曲播放以及記錄已按下地音符,并播放,最后實(shí)現(xiàn)led顯示.而硬件主要有單片機(jī)最小系統(tǒng),鍵盤(pán)模塊,發(fā)聲模塊,還有一個(gè)電源模塊直流電源電腦音響總體框圖22.2硬件設(shè)計(jì)0 4:電路圖1注:本系統(tǒng)有主控單片機(jī)、鍵盤(pán)、led顯示模塊、發(fā)聲模塊以及電源組成2.2.2單片機(jī)地最小工作系統(tǒng)這里用地單片機(jī)地型號(hào)是STC90C516RD+配以12M地晶振,以及

6、復(fù)位電路供電電路構(gòu)成最小系統(tǒng).2.2.3 電源設(shè)計(jì):這里電源直接用直流5v 電源;2.2.4 按鍵設(shè)計(jì):按鍵采用4*6掃描;4根行線接P10-P13,六根列線接 P14-P17以及P20, P21 口共24個(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è)綠色

7、地指示燈會(huì)亮.而進(jìn)入錄音后,再按一次23 鍵,指示燈滅,退出錄音狀態(tài),返回主程序.2.2.5 LED燈設(shè)計(jì):七個(gè)紅色地LED代表按鍵地音符 DO, RE, MI分別接到P0 口地各個(gè)I端口音符 DO 時(shí),一個(gè)LED 亮,音符MI 時(shí), 2 個(gè) LED 亮 .同時(shí)為了區(qū)分高中低音,三個(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亮,否則,滅;2.2.6 發(fā)聲模塊:這里沒(méi)有自己做功放,而是使用電腦地音響.

8、3 系統(tǒng)軟件地地編寫(xiě)3.1 電子琴基本原理首先地弄清楚電子琴地基本原理:聲音地頻譜范圍約在幾十到幾千赫茲,若能利用程序來(lái)控制單片機(jī)地某個(gè)口線不斷輸出“高 ”“ 低 ”電平,則在該口線上就能產(chǎn)生一定頻率地方波,講該方波接上喇叭就能發(fā)出一定頻率地聲音,若再利用程序控制“高 ”“ 低 ”電平地持續(xù)時(shí)間,就能改變輸出波形地頻率從而改變音調(diào).樂(lè)曲中,每個(gè)音符對(duì)應(yīng)著確定地頻率,下表給出各音符頻率.如果單片機(jī)某個(gè)口線輸出高“低”電平地頻率和某個(gè)音符地頻率一樣,那么將此口線接上喇叭就可以發(fā)出此音符地聲音.根據(jù)這個(gè)原理就能設(shè)計(jì)出,對(duì)于單片機(jī)來(lái)說(shuō)要產(chǎn)生一定頻率地方波大致是先將某口線輸出高電平然后延遲一段時(shí)間再輸出

9、低電平,如此循環(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í)鐘計(jì)數(shù)時(shí),每個(gè)機(jī)器周期定時(shí)計(jì)數(shù)器地計(jì)數(shù)值就加,當(dāng)計(jì)數(shù)值達(dá)到計(jì)數(shù)最大值時(shí)計(jì)數(shù)完畢并通知單片機(jī).音樂(lè)中各個(gè)音符地頻率表如下:音符頻率(HZ)簡(jiǎn)譜碼(T值)音符頻率(11?)簡(jiǎn)譜碼IT值)低1 DO26263628S 4 FA474064860#1 DOS27763731中5 so784648

10、98低2 RE29463835# 5 SO#83164934也RE#31163928中6 LAS8064968低3 M33064021S 693264期4低4 FA34964103中7 519股65030力 4 FA#37064185高1 DO104665058低5 SO39264260# 1 DO#110965085# 5 SO#41564331高2 RE1 175651 10低6 LA14064400S 2 RE#124565134自646664463高3 M131865157低1 ST49464524高4 FA139765178中 1 1)()5236伽0# 4 FA#148065198

11、# 1 DO#55464633高5 so156865217中2 RE58764684if 5 SO#166165235# 2 RE#62264732高6 LA176066252中3 M65964777# 6186565268中4 FA69864820高7 51196765283音符頻率表3弄懂后開(kāi)始程序地實(shí)現(xiàn)3.2主程序模塊開(kāi)始初始化定時(shí)器T0, T1、led檢測(cè)有無(wú)按鍵按下KeyNo=21進(jìn)入函數(shù)播放曲目Y根據(jù)KeyNo,LED顯示N按鍵掃描KeyNo<21進(jìn)入錄音模式按鍵是否松開(kāi)關(guān)閉定時(shí) 器,LED燈 熄滅根據(jù)KeyNo,喇叭友嚴(yán)KeyNo=23開(kāi)啟定時(shí)器, 開(kāi)中斷關(guān)閉定時(shí)器主程序框

12、圖參數(shù)計(jì)算發(fā)音原理若要產(chǎn)生音頻脈沖,只要算出某一音頻地周期(1/頻率),再將此周期除以 2,即為半周期地時(shí)間.利用定時(shí)器計(jì)時(shí)半周期時(shí)間,每當(dāng)計(jì)時(shí)終止后就將 P1.0反相,然后重復(fù)計(jì)時(shí) 再反相.就可在P1.0引腳上得到此頻率地脈沖.利用AT89C51地內(nèi)部定時(shí)器使其工作計(jì)數(shù)器 模式(MODE1)下,改變計(jì)數(shù)值 TH0及TL0以產(chǎn)生不同頻率地方法產(chǎn)生不同音階 .計(jì)算舉例例如,頻率為523Hz,其周期T= 1/523= 1912Q,因此只要令方t數(shù)器計(jì)時(shí)956ds/1 g956,每計(jì)數(shù)956次時(shí)將I/O反相,就可得到中音 DO (523Hz).計(jì)數(shù)脈沖值與頻率地關(guān)系 式是:N=fi +2+偵中,N是

13、計(jì)數(shù)值;fi是機(jī)器頻率(晶體振蕩器為12MHz時(shí),其頻率為1MHz) ; fr是想要產(chǎn)生地頻率.其計(jì)數(shù)初值 T地求法如下:T= 65536- N= 65536-fi +2+fr例如:設(shè) K= 65536, fi = 1MHz,求中音 DO (261Hz) .T= 65536- N= 65536-fi +2 + fr = 65536 1000000+ 2+ 舟 65536500000/fr ,中音 DO地 T= 65536- 500000/523 = 64580.3.2.3計(jì)算結(jié)果(1)單片機(jī)12MHz晶振,中音符與計(jì)數(shù) T0相關(guān)地計(jì)數(shù)值如表所示:音符頻率(HZ)計(jì)數(shù)值(T 值)音符頻率(HZ)

14、計(jì)數(shù)值(T 值)低1DO26263628#4FA#74064860#1DO#27763737中5SO78464898低2RE29463835#5SO#83194934#2RE#31163928中6LA88064968低3MI33064021#6LA#93264994低4FA34964103中7SI96865030#4FA#37064185低1DO104665058低SO39264260#1DO#110965085#5SO#41564331高2RE117565110低6LA44064400#2RE#124565134#6LA#46664463高3MI131865157低7SI49464524Wj

15、 4FA139765178中1DO52364580#4FA#149065198#1DO#55464633高5SO156865217中2RE58764633#5SO#166165235#2RE#62264884高6LA176065252中3MI65964732#6LA#186565268中4FA69864820高7SI196765283采用查表程序進(jìn)行查表時(shí),可以為這個(gè)音符建立一個(gè)表格,有助于單片機(jī)通過(guò)查表地方式來(lái)獲得相應(yīng)地?cái)?shù)據(jù):低音 019之間,中音在20 39之間,高音在40 59之間.用單片機(jī)播放音樂(lè),或者彈奏電子琴,實(shí)際上是按照特定地頻率,輸出一連串地方波.為了輸出合適地方波,首先應(yīng)該知

16、道音符與頻率地關(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)3494ms調(diào)2/4250ms調(diào)2/4125ms上表中地頻率數(shù)值,有些過(guò)多,去掉不常用地黑鍵頻率,只是把白鍵對(duì)應(yīng)地?cái)?shù)據(jù)存放在單片機(jī)中,即可滿足絕大部分地應(yīng)用需求.定義音調(diào)數(shù)據(jù)表地程序如下:DW 63628,63835,64021,64103,64260,64400,64524。64580,低音區(qū):1 2 3 4 5 6 7DW 64580,64671,64777,64820,64898,64968,6503065058 中音區(qū):1 2 3 4 5 6 7DW 65058,6

17、5110,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)到上表中頻率地聲音.3.2 主程序中涉及地函數(shù)講解:void YinFu_DiZhongGao_Flag(uchar keyval)if(keyval<7)flag_yinfu_dizhonggao=1 。 /低音else if(keyval<14)flag_yinfu_dizhonggao=2。 / 中音else if(keyv

18、al<21)/高音flag_yinfu_dizhonggao=3 。此函數(shù)是根據(jù)按下鍵值來(lái)確定音符是高音、中音還是低音flag_yinfu_dizhonggao=1 代表低音; lag_yinfu_dizhonggao=2 。 代表中音.flag_yinfu_dizhonggao=3 。代表高音.而LED顯示函數(shù)(定時(shí)器 1中斷服務(wù)函數(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)

19、啟總中斷和定時(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 快速閃爍,占空比為1/2;當(dāng)是低音時(shí),LED相對(duì)較慢地閃爍,占空比為 1/4。以下是中斷服務(wù)程序:void play_Tone() interrupt 1 using 0/ 定時(shí)器 T0 溢出中斷,產(chǎn)生不同頻率地矩形波TH0=th0。TL0=tl0。Beep=Beep。using 2void play_LED() i

20、nterrupt 3if(Recordonoff)/ 開(kāi)啟錄音后計(jì)時(shí)按鍵按下地時(shí)間TH1=0xB1。TL1=0xE0。Record_Timer+。if(flag_yinfu_dizhonggao=1|flag_yinfu_dizhonggao=3)/ 低音或高音if(cont=3&&flag_yinfu_dizhonggao=1)|flag_yinfu_dizhonggao=3)/ 低音占空比為1/4、高音占空比為1led=LED_Disyuzhi。else led=0x00。if(flag_yinfu_dizhonggao=2)if(cont1) /控制占空比為1/2 con

21、t1=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.當(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,6

22、4968,65030,65058,65110,65157,65178,65217,65252,65283 void main() uchar Keystate=0。Timer_Init() 。led=0x00 。/ 初始化 ledled_zhishi=0。指示LED滅(進(jìn)入演奏狀態(tài),若進(jìn)入錄音狀態(tài)則亮)while(1)Keystate=KeyState()。 /如果有按鍵按下,返回1if(Keystate)key_scan()。if(KeyNo<21)/KeyNo 存儲(chǔ)按下鍵地鍵值yuzhi=(KeyNo+3)%7。/判斷 DO RE MI FA.th0=Tone_Delay_Table

23、KeyNo/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()。 Delayms(2000)。 else if(KeyNo=23)/進(jìn)入錄音狀態(tài) Recordonoff=Recordonoff 。Record_yinfu() 。 elseTR0=0。/關(guān)閉定時(shí)器TR1=0。led=0x00。cont=0??刂普伎毡茸兞?,讓 LE

24、D以不同頻率閃爍Delayms(2)。3.3 播放歌曲模塊KeyNo=22 KeyNo=23播放歌曲指針指向 存放下一首個(gè)地 數(shù)組,從而播放下 一首關(guān)閉定時(shí)器,關(guān)中 斷退出播放播放歌曲函數(shù)程序圖 4總共有三首歌可供播放,三首歌循環(huán)播放,當(dāng)按下退出鍵23,返回主程序,進(jìn)入演奏狀態(tài) .函數(shù)實(shí)現(xiàn)如下:/音樂(lè)地頻率所對(duì)應(yīng)地 T值/包含了低音 SO,LA,SI中音 DO,RE,MI, FA,SO,RE,S,音 DO,LA,MIucharcodeMusicYinFu=0XFc,0X44,0XFc,0Xac,0XFd,0X09,0XFd,0X34,0XFD,0X82,0XFD,0Xc8,0XFD,0X06,

25、0XFb,0X04, 0Xfb,0X90,0Xfc,0X0c,0Xfe,0X22,0Xf9,0X5b,0Xfa,0x15卜/月亮代表我地心這里地?cái)?shù)據(jù)地高4位代表音符對(duì)應(yīng)地序列號(hào),低4位代表節(jié)拍數(shù)例如0x82,表示第八個(gè)音符,延時(shí)兩個(gè)節(jié)拍codeucharMusic_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,0

26、x52 ,0x36,0x22,0x14,0x54,0xAC,0x92,0xA2,0x96,0xA2,0x96,0x82,0x3C,0x54,0x36,0x22,0x14,0x54,0xA C,0x92,0xA2,0x16,0x12,0x14,0x22,0x32,0x2C,0x02,0x82,0x16,0x32,0x56,0x12,0xA6,0x32,0x56,0x 52,0x66,0x72,0xB6,0x62,0x1C, 0xff。void PlayMusic(void)uchar yinfu,jiepai,yinfu_led 。uchar i,j。 / 循環(huán)變量uchar *p1=Music

27、_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, 音符代表MusicYinFu8jiepai=(*(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=0

28、x02, 這里地音符為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。 else if(KeyNo=22)/ 下一曲if(p1=Music_One) 若正在播放第一首,那么下一曲就是第二首ET0=0。 p1=Music_Two。 else if(p1=Music_Two)/ 若是第二首,下一首是第三首 ET0=0。 p1=Music_Three。 elseET0=0。 p1=Mus

29、ic_One。 / 同理i=0。KeyNo=26。一定要改變 KeyNo地值,否則只播放一個(gè)音符 Delayms(1000)。 /歌曲切換,停頓一下 break。 /跳出之前播放地歌曲,以使播放下一曲if(*(p1+i+1)=0XFF)/判斷歌曲是否播放完畢ET0=0。Beep=0。 / 暫停一下 if(p1=Music_One) / 如果剛剛結(jié)束第一首歌,播放第二首歌i=0。p1=Music_Two。Delayms(2000)。else if(p1=Music_Two) / 如果剛剛結(jié)束第二首歌,播放第三首歌i=0。p1=Music_Three 。Delayms(2000)。else /如果

30、剛剛結(jié)束第三首歌,播放第一首歌i=0。p1=Music_One。Delayms(3000)。TR0=0。ET0=0。if(KeyNo=23)ET0=1。break。ET0=1。3.4錄音函數(shù)實(shí)現(xiàn)主程序存儲(chǔ)按下鍵地 鍵值,以及按 下鍵地時(shí)間1定時(shí)器開(kāi)啟,播放按鍵 所對(duì)應(yīng)地音符,同時(shí) LED燈顯示那個(gè)音符按 下LED指示燈亮檢測(cè)是否有關(guān)定時(shí)器關(guān)按鍵按下zNYJ按鍵掃描KeyNo<21 KeyNo<21KeyNo=23keystate=KeyState()。按鍵狀態(tài)檢測(cè)if(keystate)key_scan()。if(KeyNo=23)Recordonoff=Recordonoff 。

31、 / 退出錄音else if(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

32、*2+1=Record_Timer 。 / 存儲(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)

33、%7 。/ 判斷 DO RE MI FA.YinFu_DiZhongGao_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。

34、TR0=0。 / 回放完了就關(guān)掉定時(shí)器TR1=0。for(i=0。 i<100。 i+)/清除錄音數(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).在確

35、保硬件電路正常且無(wú)異常情況(斷路或短路)地情況下方可上電調(diào)試,上電調(diào)試地目地是檢驗(yàn)電路是否接錯(cuò),同時(shí)還要檢驗(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ù)期地功能

36、全部實(shí)現(xiàn),瞬間感覺(jué)很有成就感.5. 課程設(shè)計(jì)體會(huì)總體來(lái)說(shuō),此次單片機(jī)課程設(shè)計(jì)使我們收獲良多,雖然課程設(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ò)這次

37、課程設(shè)計(jì),自己地能力得到進(jìn)一步地提升.附 1 源程序代碼#include<reg51.h>#define uchar unsigned char#define uint unsigned int#define led P0sbit led_zhishi = P3A1。sbit Beep=P3A0。/ 波形輸出 口/按鍵按下鍵值、定時(shí)器初值、音符低中高標(biāo)志位、音符DO、 RE.uchar KeyNo, th0,tl0,flag_yinfu_dizhonggao,yuzhi 。/ 控制占空比變量、錄音開(kāi)啟標(biāo)志、錄音音符延時(shí)uchar cont=0,cont1=0xff,Recordon

38、off=0,Record_Timer=0 。void PlayMusic(void) 。/函數(shù)聲明void Delayms(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, FA,SO,RE,S高音 DO,LA,MIucharcodeMusicYinFu=0XFc,0X44,0XFc,0Xac,0XF

39、d,0X09,0XFd,0X34,0XFD,0X82,0XFD,0Xc8,0XFD,0X06,0XFb,0X04,0Xfb,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,0x2

40、2,0x14, 0x54,0xAC,0x92,0xA2,0x96,0xA2,0x96,0x82,0x3C,0x54,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é)拍ucharcodeMusic_Two=0X88,0X14,0X24,0X36,0X42,0X34,0X14,0X28,0X14,0X94,0X1d,0X88

41、,0X14,0X24,0X 34,0X32,0X42,0X54,0X14,0X46,0X32,0X54,0X22,0X32,0X32,0X22,0X2C,0X38,0X54,0X74,0X76,0X6 2,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,0X b8,0X68,0X46,0X52,0X68,

42、0X64,0X62,0X62,0X64,0X42,0X32,0X2e,0X58,0X14,0X24,0X36,0X42,0X3 4,X12,0X12,0X26,0X22,0X24,0X22,0X12,0X94,0X9c,0Xa8,0Xa6,0X92,0X84,0X64,0X54,0X22,0X22,0 X46,0X42,0X44,0X32,0X22,0X5f, 0XFF。 / 千年之戀u(mài)charcodeMusic_Three= 0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,0x32,0x31,0x21,0x32,0x8 2,0x71,0x8

43、1,0x71,0x51,0x32,0x22,0x32,0x31,0x21, 0x32,0x52,0x32,0x31,0x21,0x32,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,0x6

44、1,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53, 0x42,0x63,0x83,0x83,0x91,0x91,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=0x1

45、f,0x3f,0x7f,0x01,0x03,0x07,0x0f。/21個(gè)音符地頻率對(duì)應(yīng)地 T值uintcodeTone_Delay_Table=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,0xf

46、e,0xfd 。 / 送 P2 值uchar code IO_Input =0x0e,0x0d,0x0b,0x07。/ 判斷輸入IO 口地值void main()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%

47、256。YinFu_DiZhongGao_Flag(KeyNo。)TR0=1。 /Turn on timerTR1=1。else if(KeyNo=21)/PlayMusic()。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=

48、th0。TL0=tl0。IE=0x82。開(kāi)啟總中斷和定時(shí)器 T0,T1溢出中斷ET1=1。IP=0x02。/T0 優(yōu)先于 T1void Delayms(uint x) / 一毫秒延時(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 KeySta

49、te(void) / 判斷有無(wú)按鍵按下uchar temp 。/P1=0x0f。P2&=0xfc。temp=P1&0x0f 。if(temp!=0x0f)Delayms(6)。if(temp!=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_dizho

50、nggao=3 。/高音void play_Tone() interrupt 1 using 0/ 定時(shí)器 T0 溢出中斷,產(chǎn)生不同頻率地矩形波TH0=th0。 TL0=tl0。 Beep=Beep。void play_LED() interrupt 3using 2if(Recordonoff)TH1=0xB1。TL1=0xE0。Record_Timer+。if(flag_yinfu_dizhonggao=1|flag_yinfu_dizhonggao=3)/ 低音或高音/ 低音占空比為1/4、高音占空比為if(cont=3&&flag_yinfu_dizhonggao=1)|flag_yinfu_dizhonggao=3) led=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

溫馨提示

  • 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)論