版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 題目:音樂演奏器設(shè)計(jì)</p><p><b> 目錄</b></p><p><b> 一、 引言3</b></p><p> 二、方案比較以及選擇4</p><p> 2.1 控制模塊選擇方案4</p><p> 2.2 按鍵選擇方案
2、4</p><p> 三、硬件設(shè)計(jì)及說明4</p><p> 3.1系統(tǒng)組成及總體框圖4</p><p><b> 3.2元件簡(jiǎn)介5</b></p><p> 3.3 各功能模塊原理圖8</p><p><b> 四、軟件設(shè)計(jì)12</b></p>
3、;<p> 4.1 音樂相關(guān)知識(shí)12</p><p> 4.2用單片機(jī)實(shí)現(xiàn)音樂的節(jié)拍12</p><p> 4.3用單片機(jī)產(chǎn)生音頻脈沖12</p><p><b> 五、系統(tǒng)調(diào)試13</b></p><p> 5.1硬件調(diào)試13</p><p> 5.2 軟件調(diào)
4、試13</p><p><b> 六、總結(jié)14</b></p><p><b> 七、參考文獻(xiàn)14</b></p><p> 附錄1:元器件清單15</p><p> 附錄2:電路原理圖15</p><p><b> 音樂演奏器設(shè)計(jì)</b&
5、gt;</p><p> 摘要:微型電子琴的設(shè)計(jì)以STC89C52單片機(jī)作為系統(tǒng)的核心控制部分,通過制作硬件電路和軟件的設(shè)計(jì)編寫,然后進(jìn)行軟硬件的調(diào)試運(yùn)行,最終達(dá)到設(shè)計(jì)電路的樂器演奏、點(diǎn)歌及顯示等功能。設(shè)計(jì)中應(yīng)用中斷系統(tǒng)和定時(shí)/計(jì)數(shù)原理控制演奏器發(fā)聲,對(duì)音樂發(fā)生所必須確定的音符和節(jié)拍分別用程序語(yǔ)言實(shí)現(xiàn)??梢杂盟鼇?lái)彈奏和播放樂曲。特點(diǎn)是設(shè)計(jì)思路簡(jiǎn)單、清晰,成本低。</p><p> 關(guān)鍵
6、字:電子琴 單片機(jī) STC89C52</p><p><b> 引言</b></p><p><b> 1.1背景</b></p><p> 隨著電子科技的飛速發(fā)展,電子技術(shù)正在逐漸改善著人們的學(xué)習(xí)、生活、工作,因此開發(fā)本系統(tǒng)希望能夠給人們多帶來(lái)一點(diǎn)生活上的樂趣。</p><p> 基于
7、當(dāng)前市場(chǎng)上的玩具市場(chǎng)需求量大,其中電子琴就是一個(gè)很好的應(yīng)用方面。單片機(jī)技術(shù)使我們可以利用軟硬件實(shí)現(xiàn)電子琴的功能,從而實(shí)現(xiàn)電子琴的微型化,可以用作玩具琴、音樂轉(zhuǎn)盤以及音樂童車等等。并且可以進(jìn)行一定的功能擴(kuò)展。</p><p><b> 1.2設(shè)計(jì)的意義</b></p><p> 該設(shè)計(jì)具有以下優(yōu)點(diǎn):</p><p> (1)可以隨意彈奏想要
8、表達(dá)的音樂;</p><p> (2)制作簡(jiǎn)單,成本低。</p><p> (3)傳統(tǒng)電子琴功能更完善。</p><p><b> 1.3設(shè)計(jì)目標(biāo)</b></p><p> ?。?)用12 個(gè)鍵盤演奏音樂(建議演奏小星星)。</p><p> ?。?)樂曲的音階限于12 個(gè)音階內(nèi),C 調(diào),節(jié)
9、拍頻率1 Hz,C調(diào)音階頻率表見附表1;</p><p> ?。?)一次演奏后應(yīng)可以存儲(chǔ)并重放(不少于20 個(gè)音符); </p><p> ?。?)音階準(zhǔn)確,隨機(jī)抽測(cè)一點(diǎn)頻率,頻率誤差±0.1%; </p><p> ?。?)功率放大器滿足以下要求: </p><p> ①額定功率大于2W(負(fù)載電阻8Ω的條件下); </p&
10、gt;<p> ?、谠陬~定功率及帶寬范圍內(nèi)用示波器觀察無(wú)明顯失真。</p><p> ?。?)實(shí)現(xiàn)無(wú)線鍵盤控制功能,距離>5m ; </p><p> (2)功率放大器帶寬大于50 Hz~5000 Hz(負(fù)載電阻8Ω的條件下); </p><p> ?。?)功率放大器失真度<5%(1000Hz 時(shí),滿功率輸出); </p><p&
11、gt;<b> 方案比較以及選擇</b></p><p> 2.1 控制模塊選擇方案</p><p> 方案一: 采用AT89C51單片機(jī)進(jìn)行控制,由于AT89C51不具備ISP功能,</p><p> 因此Atmel公司已經(jīng)停產(chǎn)在市面上已經(jīng)不常見,況且其ROM只有4K在系統(tǒng)將來(lái)升級(jí)方面沒有潛力。</p&g
12、t;<p> 方案二:采用STC89C52單片機(jī)進(jìn)行控制,由于其性價(jià)比高,完全滿足了本作品智能化的要求,它的內(nèi)部程序存儲(chǔ)空間達(dá)到8K,使軟件設(shè)計(jì)有足夠的內(nèi)部使用空間并且方便日后系統(tǒng)升級(jí),使用方便,抗干擾性能提高。</p><p> 選擇方案:鑒于上述對(duì)比與分析,本設(shè)計(jì)采用方案二 </p><p> 2.2 按鍵選擇方案</p><p> 按鍵采
13、用市面上普通的輕觸按鍵,該按鍵的特點(diǎn)是價(jià)格便宜,實(shí)用性強(qiáng),按鍵手感和回彈速度都不錯(cuò)。</p><p><b> 硬件設(shè)計(jì)及說明</b></p><p> 3.1系統(tǒng)組成及總體框圖</p><p> 硬件設(shè)計(jì)的任務(wù)是根據(jù)總體設(shè)計(jì)要求,在選擇的機(jī)型的基礎(chǔ)上,具體確定系統(tǒng)中所要使用的元器件,設(shè)計(jì)出系統(tǒng)的原理框圖、電路原理圖。</p>
14、<p> 該設(shè)計(jì)要實(shí)現(xiàn)一種由單片機(jī)控制的電子琴,單片機(jī)工作于12MHZ時(shí)鐘頻率,使用其定時(shí)/計(jì)數(shù)器T0,工作模式為1,改變計(jì)數(shù)值TH0和TL0可以產(chǎn)生不同頻率的脈沖信號(hào)。用戶可以根據(jù)樂譜在鍵盤上進(jìn)行演奏,音樂發(fā)生器會(huì)根據(jù)用戶的彈奏,通過揚(yáng)聲器將音樂播放出來(lái)。由于本例實(shí)現(xiàn)的音樂發(fā)生器是由用戶通過鍵盤輸入彈奏樂曲的,所以節(jié)拍由用戶掌握,不由程序控制。</p><p> 用單片機(jī)產(chǎn)生的音頻脈沖直接驅(qū)動(dòng)
15、揚(yáng)聲器并不能產(chǎn)生所要實(shí)現(xiàn)的音樂,因?yàn)樗鼪]有足夠的驅(qū)動(dòng)能力,這就需要音頻功率放大電路。本電子琴使用國(guó)家半導(dǎo)體公司的低壓音頻功率放大器LM386來(lái)實(shí)現(xiàn)音頻功放電路。</p><p> 利用E2PROM的斷電保存數(shù)據(jù)的特性,來(lái)對(duì)鍵盤彈奏過程進(jìn)行錄制。選用ATMLU728這款芯片,通過IIC總線和單片機(jī)進(jìn)行連接,實(shí)線了電子琴歌曲的彈奏錄制和回放功能。</p><p> 圖3-1 系統(tǒng)結(jié)構(gòu)圖
16、</p><p><b> 3.2元件簡(jiǎn)介</b></p><p> 3.2.1 STC89C52</p><p> STC89C52是STC公司生產(chǎn)的一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統(tǒng)可編程Flash存儲(chǔ)器。STC89C52使用經(jīng)典的MCS-51內(nèi)核,但做了很多的改進(jìn)使得芯片具有傳統(tǒng)51單片機(jī)不具備的功能。在單芯
17、片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得STC89C52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。 具有以下標(biāo)準(zhǔn)功能: 8k字節(jié)Flash,512字節(jié)RAM, 32 位I/O 口線,看門狗定時(shí)器,內(nèi)置4KB EEPROM,MAX810復(fù)位電路,3個(gè)16 位定時(shí)器/計(jì)數(shù)器,4個(gè)外部中斷,一個(gè)7向量4級(jí)中斷結(jié)構(gòu)(兼容傳統(tǒng)51的5向量2級(jí)中斷結(jié)構(gòu)),全雙工串行口。另外 STC89C52 可降至0Hz 靜態(tài)邏輯操
18、作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU 停止工作,允許RAM、定時(shí)器/計(jì)數(shù)器、串口、中斷繼續(xù)工作。掉電保護(hù)方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機(jī)一切工作停止,直到下一個(gè)中斷或硬件復(fù)位為止。最高運(yùn)作頻率35MHz,6T/12T可選。</p><p> 3.2.2 LM386</p><p> LM386是美國(guó)國(guó)家半導(dǎo)體公司生產(chǎn)的音頻功率放大 器,主要應(yīng)用于低電壓消費(fèi)類
19、產(chǎn)品。為使外圍元件最少,電壓增益內(nèi)置為20。但在1腳和8腳之間增加一只外接電阻和電容,便可將電壓增益調(diào)為任意值,直至 200。輸入端以地位參考,同時(shí)輸出端被自動(dòng)偏置到電源電壓的一半,在6V電源電壓下,它的靜態(tài)功耗僅為24mW,使得LM386特別適用于電池供電的場(chǎng)合。LM386是一種音頻集成功放,具有自身功耗低、電壓增益可調(diào)整、電源電壓范圍大、外接元件少和總諧波失真小等優(yōu)點(diǎn),廣泛應(yīng)用于錄音機(jī)和收音機(jī)之中。</p><p
20、> LM386的封裝形式有塑封8引線雙列直插式和貼片式。</p><p> 圖3-2 LM386的封裝形式</p><p> 3.2.3 AT24C02</p><p> AT24C02是一個(gè)2K位串行CMOS E2PROM, 內(nèi)部含有256個(gè)8位字節(jié),CATALYST公司的先進(jìn)CMOS技術(shù)實(shí)質(zhì)上減少了器件的功耗。AT24C02有一個(gè)8字節(jié)頁(yè)寫緩沖器
21、。該器件通過IIC總線接口進(jìn)行操作,有一個(gè)專門的寫保護(hù)功能。</p><p> 3.2.4 LED數(shù)碼管</p><p> 本次課程設(shè)計(jì)的顯示電路采用LED數(shù)碼管顯示,LED(Light-Emitting Diode)是一種外加電壓從而流過電流并發(fā)出可見光的器件。LED是屬于電流控制器件,使用時(shí)必須加限流電阻。LED有單個(gè)LED和八段LED之分,也有共陰和共陽(yáng)兩種。</p>
22、<p> 常用的七段顯示器的結(jié)構(gòu)如圖下圖所示。發(fā)光二極管的陽(yáng)極連在一起的稱為共陽(yáng)極顯示器(如圖b所示),陰極連在一起的稱為共陰極顯示器(如圖c所示)。1位顯示器由八個(gè)發(fā)光二極管組成,其中七個(gè)發(fā)光二極管a~g控制七個(gè)筆畫(段)的亮或暗,另一個(gè)控制一個(gè)小數(shù)點(diǎn)的亮和滅,這種筆畫式的七段顯示器能顯示的字符較少,但控制簡(jiǎn)單,使用方便。</p><p> 此外,要畫出電路圖,首先還要搞清楚他的引腳圖的分布,
23、在了解了正確的引腳圖后才能進(jìn)行正確的字型段碼編碼。才能顯示出正確的數(shù)字來(lái)。</p><p> ?。╝)外形 (b)共陽(yáng)極 (C)共陰極</p><p> 圖3-6 數(shù)碼管引腳</p><p> 3.3 各功能模塊原理圖</p><p> 3.3.1 STC89C52最小系統(tǒng)模塊原理圖</p
24、><p> 單片機(jī)最小系統(tǒng)有12M晶振電路,復(fù)位電路,P0口上拉電路等基本電路組成,并帶有4個(gè)排針接到了單片機(jī)的VCC、GND、P3^0、P3^1這個(gè)四個(gè)腳上,方便了程序的下載和調(diào)試。</p><p> 圖3-7 STC89C52模塊電路原理圖</p><p> 3.3.2鍵盤掃描模塊電路原理圖</p><p> 對(duì)鍵盤掃描電路的掃描方式
25、有行掃描法和線反轉(zhuǎn)法,在此次程序編寫中,采用線反轉(zhuǎn)法,將列線作為輸出線,行線作為輸入線。置輸出線全部為0,此時(shí)行線中呈低電平0的為按鍵所在行,如果全部都不是0,則沒有按鍵按下。將前面的行列狀態(tài)反過來(lái),即將行線作為輸出線,列線作為輸入線。置輸出線全部為0,此時(shí)列線呈低電平的為按鍵所在的列。這樣,經(jīng)處理程序,就可以確定了按鍵的位置(X,Y),并送主程序以實(shí)現(xiàn)不同功能。</p><p> 圖3-8 鍵盤掃描模塊電路原
26、理圖</p><p> 3.3.3數(shù)碼管顯示模塊電路原理圖</p><p> 數(shù)碼管顯示模塊核心是共陽(yáng)級(jí)數(shù)碼管,通過來(lái)自單片機(jī)I/O口的電平高低來(lái)點(diǎn)亮和熄滅數(shù)碼管上的發(fā)光二極管,通過單片機(jī)送來(lái)的數(shù)碼管顯示編碼可以在數(shù)碼管上顯示數(shù)字和字符,使應(yīng)用人員可以很容易的理解按鍵按下所對(duì)應(yīng)的音符。圖3-9 數(shù)碼管顯示模塊電路原理圖</p><p> 3.3.4音頻處理模塊
27、電路原理圖</p><p> 由于單片機(jī)驅(qū)動(dòng)能力不夠,在處理音符信號(hào)時(shí),需加功率放大裝置,因LM386芯片具有低功耗、高增益的特點(diǎn),這合適單片機(jī)低功耗輸出,所以加裝LM386音頻信號(hào)放大器對(duì)信號(hào)進(jìn)行放大。</p><p> 圖3-10 音頻處理模塊電路原理圖</p><p> 3.3.5 EEPROM存儲(chǔ)模塊電路原理圖</p><p>
28、 本電子琴加入了EEPROM用來(lái)存儲(chǔ)錄制的歌曲,這里使用的芯片的CATALYST公司的AT24C02,該芯片有2K存儲(chǔ)空間,通過IIC總線和單片機(jī)進(jìn)行連接。</p><p><b> 四、軟件設(shè)計(jì)</b></p><p> 本軟件設(shè)計(jì)關(guān)鍵是要實(shí)現(xiàn)一種由單片機(jī)控制的簡(jiǎn)單音樂發(fā)生器,它由16個(gè)音調(diào)組成的的鍵盤,用戶可以根據(jù)樂譜在鍵盤上進(jìn)行演奏,音樂發(fā)生器會(huì)根據(jù)用戶的
29、彈奏,通過揚(yáng)聲器將音樂播放出來(lái)。</p><p> 4.1 音樂相關(guān)知識(shí)</p><p> 樂音聽起來(lái)有的高,有的低,這就叫音高,音高是由發(fā)音物體振動(dòng)頻率的高低決定的,頻率高聲音就高,頻率低聲音就低,不同音商的樂音是用C、D、E、F、G、A、B表示的,這7個(gè)字母就是樂音的音名,它們一般依次唱成DO、RE、MI、FA、SO、LA、SI,這是唱曲時(shí)樂音的發(fā)音,所以叫唱名。</p>
30、;<p> 音持續(xù)時(shí)間的長(zhǎng)短即時(shí)值,一般用拍數(shù)表示,休止符表示暫停發(fā)音。</p><p> 一首音樂是由許多不同的音符組成的,而每個(gè)音符對(duì)應(yīng)著不同的頻率,這樣就可以利用不同頻率的組合,加以與拍數(shù)對(duì)應(yīng)的延時(shí),構(gòu)成音樂。</p><p> 4.2用單片機(jī)實(shí)現(xiàn)音樂的節(jié)拍</p><p> 除了音符以外,節(jié)拍也是音樂的關(guān)鍵組成部分。</p>
31、<p> 節(jié)拍實(shí)際上就是音持續(xù)時(shí)間的長(zhǎng)短,在單片機(jī)系統(tǒng)中可以用延時(shí)來(lái)實(shí)現(xiàn),如果1/4拍的延時(shí)是0.4秒,則1拍的延時(shí)是1.6秒,只要知道1/4拍的延時(shí)時(shí)間,其余的節(jié)拍延時(shí)時(shí)間就是它的倍數(shù)。如果單片機(jī)要自己播放音樂,那么必須在程序設(shè)計(jì)中考慮到節(jié)拍的設(shè)置,由于本例實(shí)現(xiàn)的音樂發(fā)生器是由用戶通過鍵盤輸入彈奏樂曲的,所以節(jié)拍由用戶掌握,不由程序控制。對(duì)于不同的曲調(diào)我們也可以用單片機(jī)的另外一個(gè)定時(shí)/計(jì)數(shù)器來(lái)完成。</p>
32、<p> 4.3用單片機(jī)產(chǎn)生音頻脈沖</p><p> 了解音樂的一些基本知識(shí)后可知,產(chǎn)生不同頻率的音頻脈沖即能產(chǎn)生音樂,對(duì)于單片機(jī)而言,產(chǎn)生不同頻率有脈沖非常方便,可以利用它的定時(shí)/計(jì)數(shù)器來(lái)產(chǎn)生這樣的方波頻率信號(hào),因此,需要弄清楚音樂中的音符和對(duì)應(yīng)的頻率,以及單片機(jī)定時(shí)計(jì)數(shù)的關(guān)系。</p><p> 在本實(shí)驗(yàn)中,單片機(jī)工作于12MHZ時(shí)鐘頻率,使用其定時(shí)/計(jì)數(shù)器T0,
33、工作模式為1,改變計(jì)數(shù)值TH0和TL0可以產(chǎn)生不同頻率的脈沖信號(hào)。T的值決定了TH0和TL0的值,其關(guān)系為:TH0=T/256,TL0=T%256</p><p> 附表1 C調(diào)音階頻率表</p><p><b> 五、系統(tǒng)調(diào)試</b></p><p> 電路調(diào)試是整個(gè)系統(tǒng)功能否實(shí)現(xiàn)的關(guān)鍵步驟,我們將整個(gè)調(diào)試過程分為三大部分:硬件調(diào)試、軟
34、件調(diào)試和綜合調(diào)試。</p><p><b> 5.1硬件調(diào)試</b></p><p> 硬件調(diào)試主要是針對(duì)單片機(jī)部分進(jìn)行調(diào)試。</p><p> 在上電前,先確保電路中不在斷路或短路情況,這一工作是整個(gè)調(diào)試工作的第一步,也是非常重要的一個(gè)步驟。在這部分調(diào)試中主要使用的工具是萬(wàn)用表,用來(lái)完成檢測(cè)電路中是否存在斷路或者短路情況等。注意焊點(diǎn)之間
35、,確保焊點(diǎn)沒有短接在一起,同時(shí)注意焊點(diǎn)的美觀,確保沒有開路以及短路的現(xiàn)象出現(xiàn)。</p><p> 在確保硬件電路正常,無(wú)異常情況(斷路或短路)方可上電調(diào)試,上電調(diào)試的目的是檢驗(yàn)電路是否接錯(cuò),同時(shí)還要檢驗(yàn)原理是否正確,在本次設(shè)計(jì)中,上電調(diào)試主要鍵盤單片機(jī)控制部分、數(shù)碼管點(diǎn)亮部分、和音頻轉(zhuǎn)換電路硬件調(diào)試。</p><p> 1、數(shù)碼管LED電路調(diào)試:接通電源,隨機(jī)按下按鈕可以看到數(shù)碼管顯示
36、數(shù)字。</p><p> 2、鍵盤單片機(jī)控制部分調(diào)試:上電后,隨機(jī)按動(dòng)鍵盤可以發(fā)現(xiàn)各個(gè)按鍵對(duì)應(yīng)的音正確。</p><p><b> 5.2 軟件調(diào)試</b></p><p> 調(diào)試主要方法和技巧:</p><p> 通常一個(gè)調(diào)試程序應(yīng)該具備至少四種性能:跟蹤、斷點(diǎn)、查看變量、更改數(shù)值。整個(gè)程序是一個(gè)主程序調(diào)用各個(gè)
37、子程序?qū)崿F(xiàn)功能的過程,要使主程序和整個(gè)程序都能平穩(wěn)運(yùn)行,各個(gè)模塊的子程序的正確與平穩(wěn)運(yùn)行必不可少,所以在軟件調(diào)試的最初階段就是把各個(gè)子程序模塊進(jìn)行分別調(diào)試。</p><p><b> 總結(jié)</b></p><p> 通過這次的電子設(shè)計(jì)大賽,我們學(xué)到了不少課本上沒有的知識(shí),也鍛煉了自己的動(dòng)手能力,將以前學(xué)過的零散的知識(shí)串到一起,懂得了如何加強(qiáng)了團(tuán)隊(duì)合作能力和查詢資料
38、的能力。</p><p> 首先在知道比賽題目后的調(diào)研階段,我們學(xué)會(huì)了怎么通過各種方式查詢相關(guān)的資料。通過對(duì)這些資料的學(xué)習(xí),大致了解了單片機(jī)的發(fā)展現(xiàn)狀以及未來(lái)的發(fā)展趨勢(shì),認(rèn)識(shí)到目前單片機(jī)方面的各種各樣的發(fā)展,和它們之間的競(jìng)爭(zhēng)。了解了單片機(jī)方面的先進(jìn)技術(shù),這些都為我的未來(lái)的學(xué)習(xí)指明了方向。</p><p> 這次比賽主要涉及硬件和軟件兩方面的內(nèi)容,通過這些我們團(tuán)隊(duì)的硬件和軟件開發(fā)能力都獲
39、得了提高。首先硬件方面,基本了解了電子產(chǎn)品的開發(fā)流程和所要做的工作。并設(shè)計(jì)了一個(gè)單片機(jī)最小系統(tǒng)。通過開發(fā)板的設(shè)計(jì)和硬件搭建的過程,使我們對(duì)51系單片機(jī)的接口有了更深層次的理解,熟悉了一些單片機(jī)常用的外圍電路引腳和連接方法,如LED數(shù)碼管,矩陣鍵盤等,但是比賽的發(fā)揮功能無(wú)線鍵盤我們沒有實(shí)現(xiàn)這個(gè)功能,不過我相信以后有機(jī)會(huì)的話一定會(huì)實(shí)現(xiàn)的。</p><p> 在軟件方面,通過串行口調(diào)試工具的開發(fā),使我們加深了對(duì)原件封
40、裝的理解,熟悉了51系列單片機(jī)內(nèi)部的寄存器和編程規(guī)則,以及如何控制外圍電路,加強(qiáng)了C語(yǔ)言的編程能力,真正的做到了學(xué)以致用,更好的理解了以前所學(xué)到的知識(shí),我相信這次比賽會(huì)對(duì)我們的每個(gè)人的未來(lái)都產(chǎn)生積極的影響。</p><p><b> 七、參考文獻(xiàn)</b></p><p> 【1】郭天祥.新概念 51 單片機(jī) C 語(yǔ)言教程.入門、提高、開發(fā)[M].北京:電子工業(yè)出版
41、社,2009.</p><p> 【2】蘇家健、曹柏榮、汪志鋒.單片機(jī)原理及應(yīng)用技術(shù)[M].高等教育出版社</p><p> 【3】高吉祥,唐朝京.全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽培訓(xùn)系列教程(電子儀器儀表設(shè)計(jì))[M].北京:電子工業(yè)出版社,2007.</p><p> 【4】 李朝青. 單片機(jī)原理及接口技術(shù)[M]. 北京:北京航天航空大學(xué)出版色,2001. </
42、p><p><b> 附錄1:電路原理圖</b></p><p><b> 電路原理圖</b></p><p> Proteus仿真圖</p><p><b> 附錄3:程序清單</b></p><p> #include <reg52.h&
43、gt;</p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> #define ulong unsigned long</p><p> #define dim(x) (sizeof(x)/sizeof(x[0]))&
44、lt;/p><p> sbit beep = P3^7;// 定義蜂鳴器的輸出引腳</p><p> sbit led1 = P2^0;// 定義錄音指示燈的輸出引腳</p><p> sbit led2 = P2^1;// 定義播歌指示燈的輸出引腳</p><p> sbit led3 = P2^2;// 定義彈奏指示燈
45、的輸出引腳</p><p> sbit sda = P2^6;// 定義了AT24C02的sda腳</p><p> sbit scl = P2^7;// 定義了AT24C02的scl腳</p><p> sbit key1 = P3^4;// 定義了播放錄制的音樂的按鍵管腳</p><p> sbit key2 =
46、P3^3;// 定義了錄制/停止的按鍵管腳</p><p> sbit key3 = P3^2;// 定義了播放內(nèi)置歌曲的按鍵管腳</p><p> void ChooseMusic();</p><p> uchar song=0; // song代表當(dāng)前播放到第幾首歌,取值為1,2,3</p><p> uc
47、har g_tone;// g_tone代表當(dāng)前要播放的音調(diào)</p><p> /* 定時(shí)器的初值,TH_0代表TH0的值,TL_0代表TL0的初值,其含義如下所示 */</p><p> /* 低6 低7 中1 中2 中3 中4 中5 中6 中7 高1 高
48、2 高3 高4 高5 高6 高7 */</p><p> uchar code TH_0[]={ 0xFB,0xFC,0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF };</p><p> uchar code TL_0[]={ 0x90,0x0C,0x43,0xAC,0x09,0
49、x34,0x82,0xC8,0x06,0x22,0x56,0x85,0x9A,0xC1,0xE4,0x03 };</p><p> /* 數(shù)碼管的顯示值:6. 7. 1 2 3 4 5 6 7 1. 2. 3. 4. 5. 6. 7. */</p><p> uchar code dig[]={ 0x0
50、2,0x78,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x79,0x24,0x30,0x19,0x12,0x02,0x78};</p><p> /* 《世上只有媽媽好》的樂譜*/ </p><p> uchar code music1[]={ 14,3, 13,1, 11,2, 13,2, 15,2, 14,1, 13,1, 14,4,
51、 11,2, 13,1, 14,1, 13,2, 11,2, 9,1, 7,1, 13,1, </p><p> 11,1, 10,4, 10,3, 11,1, 13,2, 13,1, 14,1, 11,2, 10,2, 9,4, 13,3, 11,1, 10,1, 9,1, 7,1, 9,1, 6,4 };</p><p> /* 《生日快樂》的樂譜 */</p
52、><p> uchar code music2[]={ 6,1, 6,1, 7,2, 6,2, 9,2, 8,4, 6,1, 6,1, 7,2, 6,2, 10,2, 9,4, 6,1,</p><p> 6,1, 13,2, 11,2, 9,2, 8,2, 7,3, 12,1, 12,1, 11,2, 9,2, 10,2, 9,4 };</p><p&
53、gt; /* 《茉莉花》的樂譜*/ </p><p> uchar code music3[]={ 5,2, 5,1, 7,1, 8,1, 10,1, 10,1, 8,1, 7,2, 7,1, 8,1, 7,4, 5,2, 5,1, 7,1, 8,1, 10,1, 10,1, 8,1,</p><p> 7,2, 7,1, 8,1, 7,4, 7,2, 7,2,
54、 7,2, 5,1, 7,1, 8,2, 8,2, 7,4, 5,2, 4,1, 5,1, 7,2, 5,1, 4,1,</p><p> 3,2, 3,1, 4,1, 3,4, 5,1, 4,1, 3,1, 5,1, 4,3, 5,1, 7,2, 8,1, 10,1, 7,4, 4,2, 5,1, 7,1, 3,1,</p><p> 4,1, 3,1, 2,1, 1
55、,4, 1,2, 3,2, 4,3, 5,1, 3,1, 4,1, 3,1, 1,1, 7,4 };</p><p> /*******************************************</p><p><b> 延時(shí)函數(shù).</b></p><p> ---------------</p>
56、<p> t代表毫秒*******************************************/</p><p> void DelayMs(uint t)</p><p><b> {</b></p><p><b> uint x,y;</b></p><p>
57、for(x=t;x>0;x--)</p><p> for(y=110;y>0;y--);</p><p><b> }</b></p><p> /***********************************************</p><p><b> 用于簡(jiǎn)短的延時(shí)<
58、;/b></p><p> ***********************************************/</p><p> void flash()</p><p><b> { ; ; }</b></p><p> /******************************&l
59、t;/p><p> AT24C02的IIC總線初始化.</p><p> ******************************/</p><p> void AT24C02_Init()</p><p><b> {</b></p><p><b> scl=1; <
60、/b></p><p><b> flash(); </b></p><p><b> sda=1; </b></p><p><b> flash();</b></p><p><b> }</b></p><p>
61、 /**********************************************</p><p> AT24C02起始函數(shù).</p><p> ----------------</p><p> **********************************************/</p><p> void
62、 start()</p><p><b> {</b></p><p><b> sda=1; </b></p><p><b> flash(); </b></p><p><b> scl=1; </b></p><p>
63、;<b> flash(); </b></p><p><b> sda=0; </b></p><p><b> flash(); </b></p><p><b> scl=0; </b></p><p><b> flash();
64、</b></p><p><b> }</b></p><p> /***********************************************</p><p> AT24C02終止函數(shù).</p><p> **************************************
65、*********/</p><p> void stop()</p><p><b> {</b></p><p><b> sda=0; </b></p><p><b> flash(); </b></p><p><b> s
66、cl=1; </b></p><p><b> flash(); </b></p><p><b> sda=1; </b></p><p><b> flash();</b></p><p><b> }</b></p>
67、<p> /***************************************************</p><p> AT24C02寫一個(gè)字節(jié).</p><p> ***************************************************/</p><p> void write_byte(uchar
68、dat)</p><p><b> { </b></p><p> uchar i,temp;</p><p><b> temp=dat;</b></p><p> for(i=0;i<8;i++)</p><p><b> {</b>
69、;</p><p> temp=temp<<1; </p><p><b> scl=0; </b></p><p><b> flash(); </b></p><p><b> sda=CY; </b></p><p><b
70、> flash(); </b></p><p><b> scl=1; </b></p><p><b> flash();</b></p><p><b> }</b></p><p><b> scl=0; </b><
71、/p><p><b> flash(); </b></p><p><b> sda=1; </b></p><p><b> flash();</b></p><p><b> }</b></p><p> /*******
72、********************************************</p><p> AT24C02讀一個(gè)字節(jié).</p><p> ***************************************************/</p><p> unsigned char read_byte()</p><p
73、><b> {</b></p><p> uchar i,temp,dat=0;</p><p><b> scl=0; </b></p><p><b> flash(); </b></p><p><b> sda=1;</b><
74、/p><p><b> flash();</b></p><p> for (i=0;i<8;i++)</p><p><b> { </b></p><p><b> scl=1; </b></p><p><b> flash
75、();</b></p><p><b> temp=sda;</b></p><p> dat=(dat<<1)|temp;</p><p><b> scl=0;</b></p><p><b> flash();</b></p>
76、<p><b> } </b></p><p> return(dat);</p><p><b> }</b></p><p> /******************************</p><p> AT24C02總線響應(yīng).</p><p>
77、; ******************************/</p><p> void respons()</p><p><b> {</b></p><p> uchar i=0;</p><p><b> scl=1;</b></p><p><
78、b> flash();</b></p><p> while((sda==1)&&(i<255)) // 如果sda收到低電平,或者i自加255個(gè)數(shù)后還沒收到低電平,都認(rèn)為收到了</p><p><b> {</b></p><p><b> i++;</b></p
79、><p><b> }</b></p><p><b> scl=0; </b></p><p><b> flash();</b></p><p><b> }</b></p><p> /*****************
80、**************************************************************</p><p> AT24C02讀出數(shù)據(jù).</p><p> *******************************************************************************/</p><p>
81、; uchar AT24C02_Read(uchar addr)</p><p><b> {</b></p><p> uchar dat;</p><p><b> EA=0;</b></p><p><b> start(); </b></p>&
82、lt;p> write_byte(0xa0);</p><p> respons(); </p><p> write_byte(addr);</p><p> respons(); </p><p><b> start();</b></p><p> write_byte(0
83、xa1); </p><p> respons();</p><p> dat=read_byte(); </p><p><b> stop();</b></p><p> DelayMs(5);</p><p><b> EA=1;</b></p>
84、<p> return dat;</p><p><b> }</b></p><p> /**********************************************************</p><p> AT24C02寫入數(shù)據(jù).</p><p> **************
85、********************************************/</p><p> void AT24C02_Write(uchar addr,uchar dat)</p><p><b> {</b></p><p><b> EA=0;</b></p><p>&
86、lt;b> start(); </b></p><p> write_byte(0xa0);</p><p> respons(); </p><p> write_byte(addr);</p><p> respons(); </p><p> write_byte(dat);<
87、/p><p> respons(); </p><p><b> stop();</b></p><p><b> EA=1;</b></p><p> DelayMs(10);</p><p><b> }</b></p><
88、p> /************************************************</p><p> 發(fā)出指定音調(diào)及其節(jié)拍的聲音</p><p> --------------------------------</p><p><b> tone代表音調(diào)</b></p><p>&l
89、t;b> beat代表節(jié)拍</b></p><p> ************************************************/ </p><p> void Play(uchar tone,uchar beat)</p><p><b> {</b></p><p&
90、gt;<b> uchar t1;</b></p><p><b> ulong t2;</b></p><p> P0=dig[tone];// 數(shù)碼管顯示相應(yīng)的音調(diào),帶“.”表示高音音調(diào)</p><p> TH0=TH_0[tone];// 裝入定時(shí)器TH0的初值</p>&l
91、t;p> TL0=TL_0[tone];// 裝入定時(shí)器TL0的初值</p><p> TR0=1;// 啟動(dòng)定時(shí)器</p><p> for(t1=0;t1<beat;t1++)// 利用2個(gè)for循環(huán)進(jìn)行播放延時(shí)功能</p><p> for(t2=0;t2<7200;t2++);</p>
92、<p> TR0=0;// 停止定時(shí)器 </p><p> P0=0xff;// 關(guān)閉數(shù)碼管</p><p><b> }</b></p><p> /*******************************************************</
93、p><p><b> 矩陣鍵盤掃描程序.</b></p><p> *******************************************************/</p><p> char KeyScanf() //鍵盤掃描</p><p><b> {</b&g
94、t;</p><p> uchar hang=0,lie=0,temp1,temp2;// hang代表行,lie代表列</p><p> P1=0x0f;// 讓P1口的高4位為0</p><p> temp1=P1;// temp1采集P1口的數(shù)據(jù)</p><p> switch(temp1)
95、// 判斷是否某一行有被按下,有的話,給hang變量賦值</p><p><b> {</b></p><p> case 0x0e: hang=1; break;// 如果P1口的值,即temp1的值為0x0e,則代表第1行有某一個(gè)按鍵被按下了</p><p> case 0x0d: hang=2; break;// 如果
96、P1口的值,即temp1的值為0x0d,則代表第2行有某一個(gè)按鍵被按下了</p><p> case 0x0b: hang=3; break;// 如果P1口的值,即temp1的值為0x0b,則代表第3行有某一個(gè)按鍵被按下了</p><p><b> }</b></p><p> P1=0xf0;// 讓P1口的低4位為0
97、</p><p> temp2=P1;// temp2采集P1口的數(shù)據(jù)</p><p> switch(temp2)// 判斷是否某一列有被按下,有的話,給lie變量賦值</p><p><b> {</b></p><p> case 0x70: lie=1; break;// 如果P1
98、口的值,即temp2的值為0x70,則代表第1列有某一個(gè)按鍵被按下了</p><p> case 0xb0: lie=2; break;// 如果P1口的值,即temp2的值為0xb0,則代表第2列有某一個(gè)按鍵被按下了</p><p> case 0xd0: lie=3; break;// 如果P1口的值,即temp2的值為0xd0,則代表第3列有某一個(gè)按鍵被按下了</p&g
99、t;<p> case 0xe0: lie=4; break;// 如果P1口的值,即temp2的值為0xe0,則代表第4列有某一個(gè)按鍵被按下了</p><p><b> }</b></p><p> if((lie!=0)&(hang!=0))// 當(dāng)hang變量和lie變量都不為0時(shí),說明有按鍵被按下了</p>
100、<p> return ((hang-1)*4+lie);// 計(jì)算是哪個(gè)按鍵別按下,如第3行第4個(gè),那么((3-1)×4+4)=12</p><p><b> else</b></p><p> return 0; // 如果沒有按鍵被按下,則返回0</p><p><b> }<
101、;/b></p><p> /***********************</p><p> 功能:定時(shí)器初始化函數(shù)</p><p> ***********************/</p><p> void Timer0_Init()</p><p><b> {</b>&
102、lt;/p><p> TMOD=1;// 定時(shí)器0,工作方式1</p><p> ET0=1;// 開啟定時(shí)器0中斷</p><p> EA=1;// 開啟總中斷</p><p><b> }</b></p><p> /*****************************
103、*************</p><p> 功能:播放內(nèi)置的音樂</p><p> ******************************************/</p><p> void PlayMusic(uchar arr[],uchar num)</p><p><b> {</b></
104、p><p> uchar i=0;</p><p> led3 = 1;// 彈奏指示燈滅</p><p> led2 = 0; // 播放指示燈亮</p><p> while(i<num)</p><p><b> { </b>
105、;</p><p> g_tone=arr[i];// 給全局變量g_tone賦值Play(arr[i],arr[i+1]); // 開始演奏,每調(diào)用一次,演奏一個(gè)節(jié)拍</p><p> i+=2;// 進(jìn)入下一個(gè)節(jié)拍,因?yàn)闆]2個(gè)數(shù)為1組(第1個(gè)代表音調(diào),第2個(gè)代表節(jié)拍),所以每次要加2</p><p> if(key3=
106、=0)// 判斷播放過程,是否按下了下一曲按鍵,如果是,則切換到下一曲</p><p><b> {</b></p><p> DelayMs(100);</p><p> while(!key3);</p><p> DelayMs(100);</p><p><b&
107、gt; song++;</b></p><p> if(song==4)</p><p><b> song=1;</b></p><p> ChooseMusic();</p><p><b> }</b></p><p><b>
108、}</b></p><p> led3 = 0;// 彈奏指示燈亮</p><p> led2 = 1; // 播放指示燈滅</p><p><b> }</b></p><p> /***************************************
109、*********</p><p><b> 歌曲選擇</b></p><p> ************************************************/</p><p> void ChooseMusic()</p><p><b> {</b></p>
110、;<p> switch(song)</p><p><b> {</b></p><p> case 1 : DelayMs(300); PlayMusic(music1,dim(music1)); break;// dim(music1)求出樂譜music1中有幾個(gè)元素</p><p> case 2 : Dela
111、yMs(300); PlayMusic(music2,dim(music2)); break;</p><p> case 3 : DelayMs(300); PlayMusic(music3,dim(music3)); break;</p><p> default: break;</p><p>&
112、lt;b> }</b></p><p><b> }</b></p><p> /************************************************</p><p><b> 主函數(shù)</b></p><p> ****************
113、********************************/</p><p> void main()</p><p><b> {</b></p><p> uchar count=1;// count代表當(dāng)前的AT24C02已經(jīng)存了count個(gè)數(shù)據(jù)</p><p> char ret;
114、 // ret用來(lái)保存鍵盤掃描的返回值</p><p> uchar num,val,i;</p><p> Timer0_Init();// 初始化定時(shí)器</p><p> AT24C02_Init();// 初始化AT24C02的IIC總線</p><p> led3 = 0;// 彈奏指示燈亮
115、</p><p><b> while(1)</b></p><p><b> {</b></p><p> ret=KeyScanf();// 開始掃描矩陣鍵盤</p><p> if(ret!=0) // ret不等于0,說明音調(diào)鍵盤有某一個(gè)被按下了</p
116、><p><b> {</b></p><p> g_tone = ret-1;// 給全局變量g_tone賦值Play(ret-1,1);// 開始播放該按鍵對(duì)應(yīng)的音調(diào)</p><p> if(led1==0){</p><p> AT24C02_Write(count,re
117、t-1);</p><p> count++;</p><p><b> }</b></p><p><b> }</b></p><p> if(key1==0) // 播放錄制的音樂</p><p><b> {<
118、/b></p><p> DelayMs(700);</p><p> led3 = 1;// 彈奏指示燈滅</p><p> led2 = 0; // 播放指示燈亮</p><p> num=AT24C02_Read(0); // AT24C02的第0個(gè)字節(jié)存儲(chǔ)的是錄制歌曲的長(zhǎng)度<
119、;/p><p> for(i=0;i<num;i++)</p><p><b> {</b></p><p> val=AT24C02_Read(i+1);// 讀出AT24C02中存儲(chǔ)的值</p><p> g_tone=val;</p><p> Play(val,1);
120、// 開始播放該按鍵對(duì)應(yīng)的音調(diào)</p><p><b> }</b></p><p> led3 = 0;// 彈奏指示燈亮</p><p> led2 = 1; // 播放指示燈滅</p><p><b> }</b></p><
121、p> if(key2==0) // 開始/停止 錄制按鍵</p><p><b> {</b></p><p> DelayMs(700);// 延時(shí)去抖</p><p> led3 = 1;// 彈奏指示燈滅</p><p> led1 =~ led1;</
122、p><p> if(led1==1){</p><p> led3 = 0;// 彈奏指示燈亮</p><p> AT24C02_Write(0,count-1);</p><p><b> count=1;</b></p><p><b> }<
123、;/b></p><p> }</p><p> if(key3==0)// 播放內(nèi)置的音樂</p><p><b> {</b></p><p> DelayMs(100);</p><p> while(!key3);// 去除按鍵抖動(dòng)
124、</p><p> DelayMs(100);</p><p><b> song++;</b></p><p> if(song==4)</p><p><b> song=1;</b></p><p> ChooseMusic();// 選擇要播放哪一
125、首內(nèi)置音樂</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> /************************************************</p>
126、;<p> 定時(shí)器0中斷處理函數(shù)</p><p> ************************************************/ </p><p> void time0() interrupt 1</p><p><b> {</b></p><p> beep=!
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 微機(jī)原理課程設(shè)計(jì)--音樂演奏
- 微機(jī)原理課程設(shè)計(jì)--音樂演奏
- 匯編課程設(shè)計(jì)--音樂演奏程序設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)--音樂演奏器設(shè)計(jì)
- 智能音樂演奏器
- 單片機(jī)電子琴課程設(shè)計(jì)-- 基于單片機(jī)的音樂演奏器設(shè)計(jì)
- 電子音樂演奏器設(shè)計(jì)【文獻(xiàn)綜述】
- 電子音樂演奏器設(shè)計(jì)【開題報(bào)告】
- 畢業(yè)論文-智能音樂演奏器設(shè)計(jì)【精校排版】
- 電子線路課程設(shè)計(jì)-可編程音樂演奏電路硬件電路說明
- 陳尚杰---音樂演奏器設(shè)計(jì)(一稿).doc
- 基于單片機(jī)音樂演奏系統(tǒng)設(shè)計(jì)畢業(yè)設(shè)計(jì)
- 任務(wù)書-基于dsp的音樂演奏系統(tǒng)設(shè)計(jì)
- 陳尚杰-智能音樂演奏器(定稿).doc
- 音樂樂曲演奏程序課程設(shè)計(jì)報(bào)告
- 基于vhdl的音樂演奏電路設(shè)計(jì)開發(fā)【畢業(yè)設(shè)計(jì)】
- 陳尚杰-智能音樂演奏器(二稿).doc
- 基于vhdl的音樂演奏電路設(shè)計(jì)開發(fā)【文獻(xiàn)綜述】
- 基于vhdl的音樂演奏電路設(shè)計(jì)開發(fā)【開題報(bào)告】
- 音樂播放器課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論