2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩19頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論