版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 畢業(yè)論文</b></p><p> 課題:基于單片機(jī)的電子琴電路設(shè)計(jì) </p><p> 專 業(yè) </p><p> 學(xué)生姓名 </p><p><b> 班 級(jí) </b></p><p> 學(xué) 號(hào)
2、 </p><p> 指導(dǎo)教師 </p><p><b> 完成日期 </b></p><p><b> 摘 要</b></p><p> 電子琴是現(xiàn)代電子科技與音樂結(jié)合的產(chǎn)物,是一種新型的鍵盤樂器。它在現(xiàn)代音樂扮演著重要的角色,單片機(jī)具有強(qiáng)大的控制功能和靈活的編程實(shí)現(xiàn)
3、特性,它已經(jīng)溶入現(xiàn)代人們的生活中,成為不可替代的一部分。本文的主要內(nèi)容是用AT89c51單片機(jī)為核心控制元件,設(shè)計(jì)一個(gè)電子琴。以單片機(jī)作為主控核心,與鍵盤、揚(yáng)聲器等模塊組成核心主控制模塊,在主控模塊上設(shè)有16個(gè)按鍵和揚(yáng)聲器。本系統(tǒng)運(yùn)行穩(wěn)定,其優(yōu)點(diǎn)是硬件電路簡單,軟件功能完善,控制系統(tǒng)可靠,性價(jià)比較高等,具有一定的實(shí)用和參考價(jià)值。</p><p><b> Abstract</b></
4、p><p> Electronic organ is a modern electronic music technology and the product is a new type of keyboard instruments. It played an important role in modern music. SCM has powerful control functions and flexib
5、le programming characteristics. It has converged with modern people's lives, become an irreplaceable part. The main content is AT89C51 control of the core components, design of a electronic organ. SCM as a host to th
6、e core, with the keyboard, speaker and other core modules. In the main control mod</p><p><b> 目 錄</b></p><p><b> 摘 要1</b></p><p> Abstract1</p>
7、<p><b> 目 錄2</b></p><p><b> 第一章 緒論3</b></p><p> 第二章 總體方案4</p><p> 2.1系統(tǒng)設(shè)計(jì)要求4</p><p> 2.2 電子琴系統(tǒng)的組成4</p><p> 2.4 系統(tǒng)框
8、圖4</p><p> 第三章 硬件簡介5</p><p> 3.1 AT89C516</p><p> 3.2 矩陣式鍵盤的識(shí)別和顯示8</p><p> 3.3 LED數(shù)碼管9</p><p> 3.4 硬件設(shè)計(jì)圖10</p><p> 第四章 軟件設(shè)計(jì)12<
9、/p><p> 4.1 整體程序處理流程圖12</p><p> 4.2 I/O并行口直接驅(qū)動(dòng)LED顯示12</p><p> 4.3 音樂播放設(shè)計(jì)13</p><p> 4.5 放歌子程序流程圖15</p><p><b> 第五章 調(diào)試17</b></p><
10、;p> 5.1 Proteus 簡介17</p><p> 5.2 keil 簡介17</p><p> 5.3利用keil與Proteus進(jìn)行的調(diào)試17</p><p><b> 第六章 結(jié)論20</b></p><p><b> 致 謝21</b></p>
11、<p><b> 參考資料22</b></p><p> 附錄 完整程序23</p><p><b> 第一章 緒論 </b></p><p> 隨著大規(guī)模集成電路的出現(xiàn)和發(fā)展,芯片生產(chǎn)廠家把中央處理器CPU,隨機(jī)存取內(nèi)存RAM,只讀存儲(chǔ)器ROM,定時(shí)器/計(jì)數(shù)器以及I/O接口電路等主要計(jì)算機(jī)部件,
12、集成在一塊集成電路芯片(硅片)上,形成芯片級(jí)計(jì)算機(jī),稱為單片微型計(jì)算機(jī),直譯為單片機(jī)。</p><p> 單片機(jī)雖只是一個(gè)芯片,但從組成和功能上看,它已具有了微機(jī)系統(tǒng)的含義,又稱微型處理部件MCU(Micro Controller Unit),單片機(jī)商品名稱為微控制器單元。</p><p> 雖然單片機(jī)出現(xiàn)的歷史并不長,但發(fā)展十分迅猛,在集成度、功能、速度、可靠性、應(yīng)用領(lǐng)域等全方位向更
13、高水平發(fā)展。目前單片機(jī)已用于工業(yè)控制、機(jī)電一體化設(shè)備、儀器儀表、信號(hào)處理、現(xiàn)代兵器、交通能源、商用設(shè)備、醫(yī)療設(shè)備及家用電器等各個(gè)領(lǐng)域,隨著單片機(jī)性能的不斷提高,它的應(yīng)用將會(huì)更加廣泛。單片機(jī)技術(shù)發(fā)展非???,所以目前的產(chǎn)品都致力于在功能全面、技術(shù)先進(jìn)、操作簡便、安全可靠、價(jià)格合理等方面進(jìn)行仔細(xì)研究,精心設(shè)計(jì);及時(shí)掌握最新的單片機(jī)技術(shù),在條件允許的情況下,盡可能地利用最新的單片機(jī)技術(shù)來研制其應(yīng)用系統(tǒng),再利用單片機(jī)體積小、價(jià)格低、功能強(qiáng)等特點(diǎn),
14、以保證所設(shè)計(jì)的產(chǎn)品在未來的一段時(shí)間內(nèi)仍具生命力。在生活和生產(chǎn)的各個(gè)領(lǐng)域中,凡是有自動(dòng)控制要求的地方都會(huì)有單片機(jī)的身影出現(xiàn);從簡單到復(fù)雜,從空中、地面到地下,凡是能想象到的地方幾乎都有使用單片機(jī)的需求?,F(xiàn)在,盡管單片機(jī)的應(yīng)用已經(jīng)很普遍了,但仍有許多可以用單片機(jī)控制而尚未實(shí)現(xiàn)的項(xiàng)目,因此,單片機(jī)的應(yīng)用大有可以想象和拓展的空間。</p><p> 單片機(jī)的應(yīng)用有利于產(chǎn)品的小型化、多功能化和智能化,有助于提高勞動(dòng)效率,
15、減輕勞動(dòng)強(qiáng)度,提高產(chǎn)品質(zhì)量,改善勞動(dòng)環(huán)境,減少能源和材料消耗,保證安全等。</p><p> 但是,單片機(jī)應(yīng)用的意義絕不僅限于它的廣闊范圍以及所帶來的經(jīng)濟(jì)效益上,更重要的意義還在于:單片機(jī)的應(yīng)用正從根本上改變著傳統(tǒng)的控制系統(tǒng)設(shè)計(jì)思想和設(shè)計(jì)方法。從前必須由模擬電路或數(shù)字電路實(shí)現(xiàn)的大部分控制功能,現(xiàn)在已能使用單片機(jī)通過軟件(編程序)方法實(shí)現(xiàn)了。這種以軟件取代硬件并能提高系統(tǒng)性能的控制系統(tǒng)“軟化”技術(shù),稱之為微控制技
16、術(shù)。微控制技術(shù)是一種全新的概念,是對傳統(tǒng)控制技術(shù)的一次革命。隨單片機(jī)應(yīng)用的推廣普及,微控制技術(shù)必將不斷發(fā)展、日益完善和更加充實(shí)。</p><p> 簡易電子琴系統(tǒng)就是以單片機(jī)為主要元器件設(shè)計(jì)的一個(gè)簡易電子琴,這只是單片機(jī)應(yīng)用的一個(gè)點(diǎn),由點(diǎn)及面,希望可以更好的了解和應(yīng)用單片機(jī)技術(shù)。 之所以以單片機(jī)電子琴為選題,目的在于從日常生活能接觸到的細(xì)微處著手,通過理論與實(shí)踐的結(jié)合,更明確自己的所學(xué)所用,也在實(shí)踐中發(fā)
17、現(xiàn)理論的不足,對目前日益廣泛應(yīng)用的單片機(jī)有了更加理性化和感性化的認(rèn)識(shí),使理論和實(shí)踐相得益彰。 通過單片機(jī)電子琴這個(gè)選題,更深層次的了解了單片機(jī)技術(shù),以前只是有理論,實(shí)踐的機(jī)會(huì)不是很多,在作單片機(jī)電子琴這個(gè)選題的過程中,更加熟練的掌握了一些單片機(jī)芯片的應(yīng)用,也解決了很多以前理論和實(shí)踐脫節(jié)的問題,可謂對單片機(jī)的認(rèn)識(shí)有了一個(gè)小的飛躍。</p><p><b> 第二章 總體方案</b>&
18、lt;/p><p><b> 2.1系統(tǒng)設(shè)計(jì)要求</b></p><p> 本系統(tǒng)分為兩個(gè)部分,一個(gè)是音樂播放,另一個(gè)就是電子琴彈奏。 關(guān)于聲音的處理,使用單片機(jī)C語言,利用定時(shí)器來控制頻率,而每個(gè)音符的符號(hào)只是存在我自己定義的表中。具體要求如下: 1.要求達(dá)到電子琴的基本功能,可以用彈奏出簡單的樂曲。 2.用鍵盤作出電子琴的按鍵,每鍵代表一個(gè)音符。
19、 3.各音符按一定的順序排列,必須符合電子琴的按鍵排列順序。 4.固定音樂播放有按鍵控制:“播放”、“彈奏/停止”。 5.彈奏電子琴時(shí)能播放出準(zhǔn)確的聲音,不彈奏時(shí)可以播放內(nèi)置音樂。</p><p> 2.2 電子琴系統(tǒng)的組成</p><p> 單片機(jī)因體積小、功能強(qiáng)、價(jià)格低廉而得到廣泛應(yīng)用。AT89C51單片機(jī)設(shè)計(jì)微型電子琴的方法,僅需AT89C51最小系統(tǒng),擴(kuò)展一組矩陣鍵
20、盤,再接一組發(fā)光二極管用來指示電子琴的工作狀態(tài)。</p><p> 本系統(tǒng)分為兩個(gè)部分,一個(gè)是音樂另一個(gè)就是電子琴。</p><p> 音樂播放部分:樂音實(shí)際上是有固定周期的信號(hào)。本文介紹用AT89C51的兩個(gè)定時(shí)器(如T0,T1)控制,在P3.7腳上輸出方波周期信號(hào),產(chǎn)生樂音,通過矩陣鍵盤按鍵產(chǎn)生不同的音符,由此操作人員可以隨心所欲的彈奏自己所喜愛的樂曲,當(dāng)不想彈奏時(shí)通過按放歌鍵可以
21、演奏事先存放在單片機(jī)中的幾首動(dòng)聽的曲子供消遣。當(dāng)歌曲演奏完時(shí),通過按復(fù)位鍵便可回到初始狀態(tài),這樣就做出了一臺(tái)微型電子琴。</p><p> 由于一首音樂是許多不同的音階組成的,而每個(gè)音階對應(yīng)著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構(gòu)成我們所想要的音樂了,當(dāng)然對于單片機(jī)來產(chǎn)生不同的頻率非常方便,我們可以利用單片機(jī)的定時(shí)/計(jì)數(shù)器T0來產(chǎn)生這樣方波頻率信號(hào),因此,我們只要把一首歌曲的音階對應(yīng)頻率關(guān)系弄正
22、確即可。樂曲中,每一音符對應(yīng)著確定的頻率,我們將每一音符的時(shí)間常數(shù)和其相應(yīng)的節(jié)拍常數(shù)作為一組,按順序?qū)非械乃谐?shù)排列成一個(gè)表,然后由查表程序依次取出,產(chǎn)生音符并控制節(jié)奏,就可以實(shí)現(xiàn)演奏效果。</p><p> 電子琴彈奏部分:實(shí)際上就是把每個(gè)按鍵所對應(yīng)的值經(jīng)過處理后發(fā)給單片機(jī),再在單片機(jī)內(nèi)把數(shù)字當(dāng)作指針指向所對應(yīng)的音符。</p><p><b> 2.4 系統(tǒng)框圖<
23、;/b></p><p> 該系統(tǒng)通過電子琴按鍵隨意鍵入所要表達(dá)的音符,作為電平送給主體電路,中央處理器通過識(shí)別,解碼輸出音符,在揚(yáng)聲器中發(fā)出有效的聲音。通過這樣可以不斷的彈奏音樂。嵌入式電路,按鍵電路,LED顯示電路和兩個(gè)功能鍵組成,通過功能鍵可以選擇播放音樂。其主要模塊由五個(gè)部分組成,具體關(guān)系如圖3-1所示:</p><p> 上圖即為此次設(shè)計(jì)中的電子琴的硬件結(jié)構(gòu)圖,我們運(yùn)用
24、單片機(jī)的最小系統(tǒng),用P0口的高四位和P0口的低四位作4X4矩陣式按鍵的接口,用P2口作數(shù)碼管的接口,用P3.7作信號(hào)輸出口。</p><p><b> 硬件簡介</b></p><p> 3.1 AT89C51</p><p> 3.1.1 AT89C51簡介</p><p> AT89C51是一種帶4K字節(jié)閃爍
25、可編程可擦除只讀存儲(chǔ)器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低電壓,高性能CMOS 8位微處理器,俗稱單片機(jī)。AT89C2051是一種帶2K字節(jié)閃爍可編程可擦除只讀存儲(chǔ)器的單片機(jī)。單片機(jī)的可擦除只讀存儲(chǔ)器可以反復(fù)擦除100次。該器件采用ATMEL高密度非易失存儲(chǔ)器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲(chǔ)器組
26、合在單個(gè)芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡版本。AT89C單片機(jī)為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價(jià)廉的方案。外形及引腳排列如圖3-2所示。</p><p> 3.1.2 主要的功能特性</p><p> ·與MCS-51 兼容 ·4K字節(jié)可編程閃爍存儲(chǔ)器 ·壽命:1000寫/擦循環(huán) &
27、#183;數(shù)據(jù)保留時(shí)間:10年 ·全靜態(tài)工作:0Hz-24MHz ·三級(jí)程序存儲(chǔ)器鎖定 ·128×8位內(nèi)部RAM ·32可編程I/O線 ·兩個(gè)16位定時(shí)器/計(jì)數(shù)器 ·5個(gè)中斷源 ·可編程串行通道 ·低功耗的閑置和掉電模式 ·片內(nèi)振蕩器和時(shí)鐘電路</p><p> 3.1.3 管
28、腳功能</p><p> VCC:供電電壓?! ND:接地?! 0口:P0口為一個(gè)8位漏級(jí)開路雙向I/O口,每腳可吸收8TTL門電流。當(dāng)P1口的管腳第一次寫1時(shí),被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲(chǔ)器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時(shí),P0 口作為原碼輸入口,當(dāng)FIASH進(jìn)行校驗(yàn)時(shí),P0輸出原碼,此時(shí)P0外部必須被拉高?! 1口:P1口是一個(gè)內(nèi)部提供上拉電阻的8位雙向I
29、/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時(shí),將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗(yàn)時(shí),P1口作為第八位地址接收。 P2口:P2口為一個(gè)內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個(gè)TTL門電流,當(dāng)P2口被寫“1”時(shí),其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時(shí),P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉
30、的緣故。P2口當(dāng)用于外部程序存儲(chǔ)器或16位地址外部數(shù)據(jù)存儲(chǔ)器進(jìn)行存取時(shí),P2口輸出地址的高八位。在給出地址“1”時(shí),它利用內(nèi)部上拉優(yōu)勢,當(dāng)對外部八位地址數(shù)據(jù)存儲(chǔ)器進(jìn)行讀寫時(shí)</p><p> 3.1.4 芯片擦除</p><p> 整個(gè)PEROM陣列和三個(gè)鎖定位的電擦除可通過正確的控制信號(hào)組合,并保持ALE管腳處于低電平10ms 來完成。在芯片擦操作中,代碼陣列全被寫“1”且在任何非空
31、存儲(chǔ)字節(jié)被重復(fù)編程以前,該操作必須被執(zhí)行?! 〈送?,AT89C51設(shè)有穩(wěn)態(tài)邏輯,可以在低到零頻率的條件下靜態(tài)邏輯,支持兩種軟件可選的掉電模式。在閑置模式下,CPU停止工作。但RAM,定時(shí)器,計(jì)數(shù)器,串口和中斷系統(tǒng)仍在工作。在掉電模式下,保存RAM的內(nèi)容并且凍結(jié)振蕩器,禁止所用其他芯片功能,直到下一個(gè)硬件復(fù)位為止?! ?lt;/p><p> 3.2 矩陣式鍵盤的識(shí)別和顯示</p><p>
32、 3.2.1.矩陣式鍵盤的結(jié)構(gòu)與工作原理</p><p> 在鍵盤中按鍵數(shù)量較多時(shí),為了減少I/O口的占用,通常將按鍵排列成矩陣形式。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個(gè)按鍵加以連接。這樣,一個(gè)端口(如P1口)就可以構(gòu)成4*4=16個(gè)按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數(shù)越多,區(qū)別越明顯,比如再多加一條線就可以構(gòu)成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由
33、此可見,在需要的鍵數(shù)比較多時(shí),采用矩陣法來做鍵盤是合理的。 矩陣式結(jié)構(gòu)的鍵盤顯然比直接法要復(fù)雜一些,識(shí)別也要復(fù)雜一些,上圖中,列線通過電阻接正電源,并將行線所接的單片機(jī)的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當(dāng)按鍵沒有按下時(shí),所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會(huì)被拉低,這樣,通過讀入輸入線的狀態(tài)就可得知是否有鍵按下了。具體的識(shí)別及編程方法如下所述。</p>
34、<p> 3.2.2.矩陣式鍵盤的按鍵識(shí)別方法</p><p> 確定矩陣式鍵盤上何鍵被按下介紹一種“行掃描法”?! ⌒袙呙璺?行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識(shí)別方法,如上圖所示鍵盤,介紹過程如下?! ?、判斷鍵盤中有無鍵按下 將全部行線Y0-Y3置低電平,然后檢測列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4
35、個(gè)按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下?! ?、判斷閉合鍵所在的位置 在確認(rèn)有鍵按下后,即可進(jìn)入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時(shí),其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。</p><p> 3.2.3. 鍵盤接口必須具有的4個(gè)基本功能。</p>
36、;<p> (1)去抖動(dòng):每個(gè)按鍵在按下或松開時(shí),都會(huì)產(chǎn)生短時(shí)間的抖動(dòng)。抖動(dòng)的持續(xù)時(shí)間與鍵的質(zhì)量相關(guān),一般為5—20mm。所謂抖動(dòng)是指在識(shí)別被按鍵是必須避開抖動(dòng)狀態(tài),只有處在穩(wěn)定接通或穩(wěn)定斷開狀態(tài)才能保證識(shí)別正確無誤。去抖問題可通過軟件延時(shí)或硬件電路解決。</p><p> ?。?)防串鍵:防串鍵是為了解決多個(gè)鍵同時(shí)按下或者前一按鍵沒有釋放又有新的按鍵按下時(shí)產(chǎn)生的問題。常用的方法有雙鍵鎖定和N鍵輪
37、回兩種方法。雙鍵鎖定,是當(dāng)有兩個(gè)或兩個(gè)以上的按鍵按下時(shí),只把最后釋放的鍵當(dāng)作有效鍵并產(chǎn)生相應(yīng)的鍵碼。N鍵輪回,是當(dāng)檢測到有多個(gè)鍵被按下時(shí),能根據(jù)發(fā)現(xiàn)它們的順序依次產(chǎn)生相應(yīng)鍵的鍵碼。</p><p> ?。?)被按鍵識(shí)別:如何識(shí)別被按鍵是接口解決的主要問題,一般可通過軟硬結(jié)合的方法完成。常用的方法有行掃描法和線反轉(zhuǎn)法兩種。行掃描法的基本思想是,由程序?qū)︽I盤逐行掃描,通過檢測到的列輸出狀態(tài)來確定閉合鍵,為此,需要設(shè)置
38、入口、輸出口一個(gè),該方法在微機(jī)系統(tǒng)中被廣泛使用。線反轉(zhuǎn)法的基本思想是通過行列顛倒兩次掃描來識(shí)別閉合鍵,為此需要提供兩個(gè)可編程的雙向輸入/輸出端口。</p><p> ?。?)鍵碼產(chǎn)生:為了從鍵的行列坐標(biāo)編碼得到反映鍵功能的鍵碼,一般在內(nèi)存區(qū)中建立一個(gè)鍵盤編碼表,通過查表獲得被按鍵的鍵碼。</p><p> 用AT89C51的并行口P0接4×4矩陣鍵盤,以P0.0-P0.3作輸入
39、線,以P0.4-P0.7作輸出線;在數(shù)碼管上顯示每個(gè)按鍵的“0-F”序號(hào)。</p><p> 3.3 LED數(shù)碼管</p><p><b> 【數(shù)碼管的分類】 </b></p><p> 數(shù)碼管按段數(shù)分為七段數(shù)碼管和八段數(shù)碼管,八段數(shù)碼管比七段數(shù)碼管多一個(gè)發(fā)光二極管單元(多一個(gè)小數(shù)點(diǎn)顯示);按能顯示多少個(gè)“8”可分為1位、2位、4位等等數(shù)
40、碼管;按發(fā)光二極管單元連接方式分為共陽極數(shù)碼管和共陰極數(shù)碼管。圖3-3為2位數(shù)碼管。共陽數(shù)碼管是指將所有發(fā)光二極管的陽極接到一起形成公共陽極(COM)的數(shù)碼管。共陽數(shù)碼管在應(yīng)用時(shí)應(yīng)將公共極COM接到+5V,當(dāng)某一字段發(fā)光二極管的陰極為低電平時(shí),相應(yīng)字段就點(diǎn)亮。當(dāng)某一字段的陰極為高電平時(shí),相應(yīng)字段就不亮。共陰數(shù)碼管是指將所有發(fā)光二極管的陰極接到一起形成公共陰極(COM)的數(shù)碼管。共陰數(shù)碼管在應(yīng)用時(shí)應(yīng)將公共極COM接到地線GND上,當(dāng)某一字
41、段發(fā)光二極管的陽極為高電平時(shí),相應(yīng)字段就點(diǎn)亮。當(dāng)某一字段的陽極為低電平時(shí),相應(yīng)字段就不亮。見圖3-4。</p><p> 【數(shù)碼管的驅(qū)動(dòng)方式】</p><p> 數(shù)碼管要正常顯示,就要用驅(qū)動(dòng)電路來驅(qū)動(dòng)數(shù)碼管的各個(gè)段碼,從而顯示出我們要的數(shù)字,因此根據(jù)數(shù)碼管的驅(qū)動(dòng)方式的不同,可以分為靜態(tài)式和動(dòng)態(tài)式兩類。 ① 靜態(tài)顯示驅(qū)動(dòng):靜態(tài)驅(qū)動(dòng)也稱直流驅(qū)動(dòng)。靜態(tài)驅(qū)動(dòng)是指每個(gè)數(shù)碼管的每一個(gè)段碼都
42、由一個(gè)單片機(jī)的I/O端口進(jìn)行驅(qū)動(dòng),或者使用如BCD碼二-十進(jìn)制譯碼器譯碼進(jìn)行驅(qū)動(dòng)。靜態(tài)驅(qū)動(dòng)的優(yōu)點(diǎn)是編程簡單,顯示亮度高,缺點(diǎn)是占用I/O端口多,如驅(qū)動(dòng)5個(gè)數(shù)碼管靜態(tài)顯示則需要5×8=40根I/O端口來驅(qū)動(dòng),要知道一個(gè)89S51單片機(jī)可用的I/O端口才32個(gè)呢:),實(shí)際應(yīng)用時(shí)必須增加譯碼驅(qū)動(dòng)器進(jìn)行驅(qū)動(dòng),增加了硬件電路的復(fù)雜性。 ② 動(dòng)態(tài)顯示驅(qū)動(dòng):數(shù)碼管動(dòng)態(tài)顯示接口是單片機(jī)中應(yīng)用最為廣泛的一種顯示方式之一,動(dòng)態(tài)驅(qū)動(dòng)是將所有
43、數(shù)碼管的8個(gè)顯示筆劃"a,b,c,d,e,f,g,dp"的同名端連在一起,另外為每個(gè)數(shù)碼管的公共極COM增加位選通控制電路,位選通由各自獨(dú)立的I/O線控制,當(dāng)單片機(jī)輸出字形碼時(shí),所有數(shù)碼管都接收到相同的字形碼,但究竟是那個(gè)數(shù)碼管會(huì)顯示出字形,取決于單片機(jī)對位選通COM端電路的控制,所以我們只要將需要顯示的數(shù)碼管的選通控制打開,該位就顯示出字形</p><p><b> 3.4 硬件
44、設(shè)計(jì)圖</b></p><p> 圖中的矩陣鍵盤,從上到下,從左到右,依次為鍵盤的0-15,在數(shù)碼管上顯示時(shí)順序?yàn)?-9和A-F,在按功能鍵時(shí),圖上的兩個(gè)指示燈會(huì)根據(jù)功能的不同實(shí)現(xiàn)亮/滅狀態(tài)的切換。在播放內(nèi)置音樂時(shí),指示燈在一定程度上能指示出曲目的音符。</p><p><b> 第四章 軟件設(shè)計(jì)</b></p><p> 4
45、.1 整體程序處理流程圖</p><p> 在電子琴開始工作時(shí),系統(tǒng)默認(rèn)電子琴處于彈奏狀態(tài),歌曲選擇功能鍵的目的是賦予矩陣鍵盤第二功能,即對系統(tǒng)內(nèi)置的歌曲進(jìn)行選擇,在放歌時(shí)能且只能通過彈奏/停止鍵來結(jié)束放歌,選歌時(shí)必須先按下歌曲選擇功能鍵,在通過矩陣鍵盤來選擇和切換曲目。</p><p> 4.2 I/O并行口直接驅(qū)動(dòng)LED顯示</p><p> 把“AT89
46、C51”區(qū)域中的P2.0/A8-P2.7/A15端口用8芯排線連接到一位數(shù)碼管的a-h(huán)端口上;要求:P2.0/A8與a相連,P2.1/A9與b相連,P2.2/A10與c相連,……,P2.7/A15與h相連。</p><p> 在本設(shè)計(jì)中,數(shù)碼管的顯示通過 </p><p> P2=DSY_CODE[k] </p><p> 這句語言來查表并輸出,實(shí)現(xiàn)音符的顯示
47、。</p><p> 4.3 音樂播放設(shè)計(jì)</p><p> 一首音樂是許多不同的音階組成的,而每個(gè)音階對應(yīng)著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構(gòu)成我們所想要的音樂了,當(dāng)然對于單片機(jī)來產(chǎn)生不同的頻率非常方便,我們可以利用單片機(jī)的定時(shí)/計(jì)數(shù)器T0來產(chǎn)生這樣方波頻率信號(hào),因此,我們只要把一首歌曲的音階對應(yīng)頻率關(guān)系弄正確即可。</p><p> 若
48、要產(chǎn)生音頻脈沖,只要算出某一音頻的周期(1/頻率),再將此周期除以2,即為半周期的時(shí)間。利用定時(shí)器計(jì)時(shí)半周期時(shí)間,每當(dāng)計(jì)時(shí)終止后就將P3.7反相,然后重復(fù)計(jì)時(shí)再反相。就可在P3.7引腳上得到此頻率的脈沖。</p><p> 利用AT89C51的內(nèi)部定時(shí)器使其工作計(jì)數(shù)器模式(MODE1)下,改變計(jì)數(shù)值TH0及TL0以產(chǎn)生不同頻率的方法產(chǎn)生不同音階,例如,頻率為523Hz,其周期T=1/523=1912μs,因此只
49、要令計(jì)數(shù)器計(jì)時(shí)956μs/1μs=956,每計(jì)數(shù)956次時(shí)將I/O反相,就可得到中音DO(523Hz)。</p><p> 計(jì)數(shù)脈沖值與頻率的關(guān)系式是:</p><p> N=fi÷2÷fr </p><p> 式中,N是計(jì)數(shù)值;fi是機(jī)器頻率(晶體振蕩器為12MHz時(shí),其頻率為1MHz);fr是想
50、要產(chǎn)生的頻率。</p><p> 其計(jì)數(shù)初值T的求法如下:</p><p> T=65536-N=65536-fi÷2÷fr</p><p> 例如:設(shè)K=65536,fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的計(jì)數(shù)值。</p><p> T=65536-N=6553
51、6-fi÷2÷fr=65536-1000000÷2÷fr</p><p> ?。?5536-500000/fr</p><p> 低音DO的T=65536-500000/262=63628</p><p> 中音DO的T=65536-500000/523=64580</p><p> 高音DO的T
52、=65536-500000/1046=65058</p><p> 單片機(jī)12MHZ晶振,高中低音符與計(jì)數(shù)T0相關(guān)的計(jì)數(shù)值如表4-1所示</p><p> 我們要為這個(gè)音符建立一個(gè)表格,單片機(jī)通過查表的方式來獲得相應(yīng)的數(shù)據(jù) uint code tab[]=</p><p><b> {</b></p><p>
53、 0,63628,63835,64021,64103,64260,64400,64524,</p><p> 64580,64684,64777,64820,64898,64968,65030,</p><p> 65058,65110,65157,65178,65217,65252,65283</p><p><b> ?。?lt;/b>&l
54、t;/p><p> 音樂的音拍,一個(gè)節(jié)拍為單位(C調(diào))(如表4-2所示)</p><p> 對于不同的曲調(diào)我們也可以用單片機(jī)的另外一個(gè)定時(shí)/計(jì)數(shù)器來完成。</p><p> 在這個(gè)程序中用到了兩個(gè)定時(shí)/計(jì)數(shù)器來完成的。其中T0用來產(chǎn)生音符頻率,T1用來產(chǎn)生音拍。</p><p> 4.5 放歌子程序流程圖</p><p
55、> 該程序?qū)崿F(xiàn)的是單首曲目循環(huán)播放,無法在程序內(nèi)部實(shí)現(xiàn)歌曲的切換。只能通過外部功能鍵來實(shí)現(xiàn)曲目及功能的切換,是該電子琴設(shè)計(jì)的一個(gè)缺憾。相信如果有更多的時(shí)間來進(jìn)行調(diào)試和設(shè)計(jì),這個(gè)設(shè)計(jì)會(huì)更加好。</p><p><b> 第五章 調(diào)試</b></p><p> 5.1 Proteus 簡介</p><p> Proteus(海神)的I
56、SIS是一款Labcenter出品的電路分析實(shí)物仿真系統(tǒng),可仿真各種電路和IC,并支持單片機(jī),元件庫齊全,使用方便,是不可多得的專業(yè)的單片機(jī)軟件仿真系統(tǒng)?! ≡撥浖奶攸c(diǎn): ① 全部滿足我們提出的單片機(jī)軟件仿真系統(tǒng)的標(biāo)準(zhǔn),并在同類產(chǎn)品中具有明顯的優(yōu)勢。 ?、诰哂心M電路仿真、數(shù)字電路仿真、單片機(jī)及其外圍電路組成的系統(tǒng)的仿真、RS-232動(dòng)態(tài)仿真、C調(diào)試器、SPI調(diào)試器、鍵盤和LCD系統(tǒng)仿真的功能;有各種虛擬儀器,如示波器、邏輯分
57、析儀、信號(hào)發(fā)生器等?! 、?目前支持的單片機(jī)類型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各種外圍芯片?! 、?支持大量的存儲(chǔ)器和外圍芯片。總之該軟件是一款集單片機(jī)和SPICE分析于一身的仿真軟件,功能極其強(qiáng)大 ,可仿真51、AVR、PIC。</p><p> 5.2 keil 簡介</p><p>
58、單片機(jī)開發(fā)中除必要的硬件外,同樣離不開軟件,我們寫的匯編語言源程序要變?yōu)镃PU可以執(zhí)行的機(jī)器碼有兩種方法,一種是手工匯編,另一種是機(jī)器匯編,目前已極少使用手工匯編的方法了。機(jī)器匯編是通過匯編軟件將源程序變?yōu)闄C(jī)器碼,用于MCS-51單片機(jī)的匯編軟件有早期的A51,隨著單片機(jī)開發(fā)技術(shù)的不斷發(fā)展,從普遍使用匯編語言到逐漸使用高級(jí)語言開發(fā),單片機(jī)的開發(fā)軟件也在不斷發(fā)展,Keil軟件是目前最流行開發(fā)MCS-51系列單片機(jī)的軟件,這從近年來各仿真機(jī)
59、廠商紛紛宣布全面支持Keil即可看出。Keil提供了包括C編譯器、宏匯編、連接器、庫管理和一個(gè)功能強(qiáng)大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個(gè)集成開發(fā)環(huán)境(uVision)將這些部份組合在一起。運(yùn)行Keil軟件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空閑的硬盤空間、WIN98、NT、WIN2000、WINXP等操作系統(tǒng)。掌握這一軟件的使用對于使用51系列單片機(jī)的愛好者來說是十分必要的,如果你使用C語言編程,那
60、么Keil幾乎就是你的不二之選(目前在國內(nèi)你只能買到該軟件、而你買的仿真機(jī)也很可能只支持該軟件),即使不使用C語言而僅用</p><p> 5.3利用keil與Proteus進(jìn)行的調(diào)試</p><p><b> 使用步驟:</b></p><p> 打開keil,建立工程,輸入程序</p><p> 編譯和生成h
61、ex文件,如圖5-1所示</p><p> 打開Proteus,設(shè)計(jì)硬件電路圖,見圖5-2</p><p> 4.導(dǎo)入hex文件,見圖5-3</p><p> 將鼠標(biāo)置于電路圖中AT89C51器件上,右擊后再左擊,彈出圖5-3中的對話框,在紅線框中導(dǎo)入dzq.hex文件。</p><p> 5.點(diǎn)擊面板左下角的,開始調(diào)試</p&
62、gt;<p><b> 第六章 結(jié)論</b></p><p> 將程序?qū)階T89C51芯片,調(diào)試成功后,可任意彈奏自己想要的旋律。本課題通過制作電子琴,將幾個(gè)模塊很好的融合起來,對使用單片機(jī)設(shè)計(jì)簡易電子琴進(jìn)行了分析,并介紹了基于單片機(jī)電子琴統(tǒng)硬件組成。利用單片機(jī)產(chǎn)生不同頻率來獲得我們要求的音階,最終可隨意彈奏想要表達(dá)的音樂。說明一首音樂是許多不同的音階組成的,而每個(gè)音階對
63、應(yīng)著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構(gòu)成我們所想要的音樂了,于是我們可以利用單片機(jī)的定時(shí)/計(jì)數(shù)器T0來產(chǎn)生這樣方波頻率信號(hào),因此,我們只要把一首歌曲的音階對應(yīng)頻率關(guān)系弄正確即可,然后我們利用功放電路來將音樂聲音放大,同時(shí)通過顯示模塊來確知自己所彈的音符。</p><p> 通過這次課程設(shè)計(jì),我感覺收獲了很多:</p><p> 首先,通過實(shí)踐,加深對單片機(jī)系列知識(shí)及
64、其系統(tǒng)的認(rèn)識(shí)。這個(gè)設(shè)計(jì)題目并不是新的,但從中能體現(xiàn)到一個(gè)系統(tǒng)開發(fā)設(shè)計(jì)的過程,足于讓我們受益。</p><p> 第二,通過設(shè)計(jì)學(xué)習(xí)到了很多軟件的使用。本次設(shè)計(jì),軟件部分用到了protues進(jìn)行硬件設(shè)計(jì),用keil進(jìn)行程系編譯,用protel進(jìn)行制板。</p><p> 第三,提高了自己的動(dòng)手能力。動(dòng)手在一定程度上反映了一個(gè)人的能力,作為當(dāng)代大學(xué)生,社會(huì)要求的我們不是只能說而不能做的人才
65、;作為海大的一員,三能人才標(biāo)準(zhǔn)更讓我們清醒地認(rèn)識(shí)到,實(shí)際動(dòng)手能力無比重要。從這次實(shí)物制作中,我的動(dòng)手能力提高了。感謝學(xué)院給了我們這次實(shí)踐動(dòng)手的機(jī)會(huì),更感謝我們的周老師教育了我們單片機(jī)相關(guān)知識(shí)。 </p><p> 本設(shè)計(jì)還可以擴(kuò)展其他功能,比如記憶功能,即可以存儲(chǔ)彈奏者所彈奏的音樂且保存,待彈奏完后播放給彈奏者聽。還可以做得更加娛樂一點(diǎn),增加一些彩燈使彩燈隨著音調(diào)變化而產(chǎn)生不同的樣式。 </p>
66、<p><b> 致 謝</b></p><p> 能夠得以順利完成,是所有曾經(jīng)指導(dǎo)過我的老師,幫助過我的同學(xué),一直支持著我的家人對我的教誨、幫助和鼓勵(lì)的結(jié)果。我要在這里對他們表示深深的謝意!</p><p> 首先,要特別感謝我的指導(dǎo)老師—— 老師。 老師在我畢業(yè)論文的撰寫過程中,給我提供了極大的幫助和指導(dǎo)。從開始選題到中期修正,再到最終定稿
67、, 老師給我提供了許多寶貴建議。老師淵博的專業(yè)知識(shí),嚴(yán)謹(jǐn)?shù)闹螌W(xué)態(tài)度,精益求精的工作作風(fēng),誨人不倦的高尚師德,樸實(shí)無華、平易近人的人格魅力對我影響深遠(yuǎn)。不僅使我樹立了遠(yuǎn)大的學(xué)術(shù)目標(biāo)、掌握了基本的研究方法,還使我明白了許多待人接物與為人處世的道理。</p><p> 其次,要感謝所有曾經(jīng)給我們 班任課的老師,老師們教會(huì)我的不僅僅是專業(yè)知識(shí),更多的是對待學(xué)習(xí)、對待生活的態(tài)度。</p><
68、;p> 第三,感謝我的父母親,你們是我力量的源泉,只要有你們,不管面對什么樣的困難,我都不會(huì)害怕,謝謝你們對我的支持與鼓勵(lì)!</p><p> 再次,感謝我的室友及其他好友,因?yàn)橛心銈兊膸椭?,我的論文得以順利完成。感謝你們,大學(xué)三年給我了那么多的幫助與鼓勵(lì),在我不開心的時(shí)候,總能讓我開心起來。不會(huì)忘記,大學(xué)三年里我們一起度過的歡樂時(shí)光,那些開心的日子,總是那么令人難以忘懷。</p><
69、;p> 最后對老師,同學(xué)和家人再次致以我最衷心的感謝!教導(dǎo)過我的老師,你們的人格魅力永記我心間。身邊的同學(xué)和朋友,有你們,我的大學(xué)才算完整。寢室的好友,你們的天賦猶如上天恩賜,有了你們我的生活更加精彩。感謝那些同做畢業(yè)設(shè)計(jì)的戰(zhàn)友,那段光輝歲月不管成敗,友情最可貴。</p><p><b> 參考資料</b></p><p> [1] 康年光.電子技術(shù)基礎(chǔ)(
70、數(shù)字部分).高等教育出版社.2005.07 </p><p> [2] 劉樂喜.微機(jī)計(jì)算機(jī)接口技術(shù)及應(yīng)用.華中科技大學(xué)出版社.2005.08</p><p> [3] 謝嘉奎.電子線路(線性部分).高等教育出版社.2004.04</p><p> [4] 潭浩強(qiáng).C語言程序設(shè)計(jì).清華大學(xué)出版社.2005.07</p><p> [5]
71、 李群芳,肖看.單片機(jī)原理、接口及應(yīng)用—嵌入式系統(tǒng)技術(shù)基礎(chǔ).清華大學(xué)出版社.2005.03</p><p> [6] 馮博琴.微型計(jì)算機(jī)原理與接口技術(shù).清華大學(xué)出版社.2004</p><p> [7] 長德,李華,李東.MCS51/98系列單片機(jī)原理與應(yīng)用.機(jī)械工業(yè)出版社.1997</p><p> [8] 李群芳,張士軍,黃建.單片微型計(jì)算機(jī)原理與接口技術(shù)
72、.電子工業(yè)出版社.2002</p><p> [9] 石東海等.單片機(jī)數(shù)據(jù)通信技術(shù)從入門到精通.西安電子科技大學(xué)出版社.2002</p><p> [10] 謝自美等.電子線路設(shè)計(jì)、實(shí)驗(yàn)、測試(第二版).華中科技大學(xué)出版社.2000</p><p> [11] R.L.Geiger,P.E.Allen,N.R.Strader.VLSI.DLSI Design
73、Techniques for Analog And Digital Ciruits.McGraw-Hill Inc.1990</p><p> [12]N.R.Mallik.Electronic Ciruits-Analysis Simulation and Design.Prentice Hall,1995.</p><p><b> 附錄 完整程序</b>&l
74、t;/p><p> #include <reg51.h></p><p> #include <absacc.h></p><p> #include <stdio.h></p><p> #include <math.h></p><p> #define uc
75、har unsigned char</p><p> #define uint unsigned int</p><p> uchar STH0; //定時(shí)器計(jì)數(shù)初值</p><p> uchar STL0; </p><p> bit FY=0; //放樂曲時(shí)FY=1, 電子琴彈奏時(shí)FY=0</p>
76、<p> uchar Song_Index=0,Tone_Index=0; //放音樂的參數(shù)</p><p> uchar k, key;</p><p> sbit SPK=P3^7;</p><p> sbit LED1=P1^0;</p><p> sbit LED2=P1^1;</p><p
77、> uchar code DSY_CODE[]= {0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,</p><p> 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71</p><p><b> };</b></p><p> uchar code Song[][5
78、0]= //任意選幾首音樂的旋律</p><p> { {1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,3,5,6,5,3,5,3,2,1,2,1,-1},</p><p> {3,3,3,4,5,5,5,5,6,5,3,5,3,2,1,5,6,5,3,3,2,1,1,-1},</p><p> {3,2,1,
79、3,2,1,1,2,3,2,1,2,3,1,3,4,5,3,4,5,5,6,5,3,5,3,2,1,3,2,1,1,-1},</p><p> {10,10,10,9,10,9,10,9,9,6,6,7,8,9,8,7,6,5,6,-1},</p><p> {10,10,10,9,10,13,12,13,12,12,9,9,10,11,12,11,10,9,8,10,10,-1},&
80、lt;/p><p> {13,14,13,12,12,10,12,10,12,9,13,12,10,9,10,10,-1},</p><p> {9,13,13,13,8,13,13,13,13,14,15,14,13,14,13,14,10,10,-1},</p><p> {13,14,13,12,12,10,12,10,12,13,14,13,14,13,1
81、4,10,-1},</p><p> {9,13,13,13,8,13,13,13,13,14,15,14,13,13,14,12,13,-1},</p><p> {5,5,10,9,8,5,5,5,5,10,9,8,6,6,6,11,10,9,6,-1},</p><p> {6,12,12,11,9,10,8,5,5,10,9,8,5,5,5,10,9,
82、8,6,-1},</p><p> {6,6,11,10,9,12,12,12,12,13,12,11,9,8,10,10,10,-1},</p><p> {10,10,10,10,12,8,9,10,11,1,11,11,11,10,10,10,10,10,9,9,8,9,12,12,12,11,9,8,-1},</p><p> {13,13,8,13,
83、13,13,13,14,15,14,13,14,13,14,10,10,13,14,13,12,12,10,12,10,12,13,14,13,14,13,14,10,9,13,13,13,8,13,13,13,13,14,15,14,13,13,14,12,13,-1},</p><p> {6,6,11,10,9,12,12,12,12,13,12,11,9,8,10,10,10,10,10,10,10,1
84、2,8,9,10,11,11,11,11,11,10,10,10,10,10,9,9,8,9,12,12,12,11,9,8,-1},</p><p> {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,-1}</p><p><b> };</b></p><p> uchar
85、 code Len[][50]= //上面幾首音樂的旋律每個(gè)音符對應(yīng)的節(jié)拍 </p><p> { {1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,2,2,-1},</p><p> {1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,2,-1},&
86、lt;/p><p> {1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,2,1,1,2,2,-1},</p><p> {1,1,1,1,2,1,1,1,1,0,1,1,0,1,1,0,1,1,2,-1},</p><p> {1,1,1,1,0,1,1,1,1,1,0,1,1,0,1,1,0,1,1,3
87、,1,-1},</p><p> {0,1,1,0,1,1,2,1,1,0,1,1,0,1,1,2,-1},</p><p> {0,1,1,2,0,1,1,0,1,1,0,1,1,0,1,1,2,1,-1},</p><p> {0,1,1,0,1,1,2,1,1,0,1,1,0,1,1,4,-1},</p><p> {0,1,1
88、,2,0,1,1,0,1,1,0,1,1,0,1,4,-1},</p><p> {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1},</p><p> {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1},</p><p> {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
89、,-1},</p><p> {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},</p><p> {1,1,2,0,1,1,0,1,1,0,1,1,0,1,1,2,1,0,1,1,0,1,1,2,1,1,0,1,1,0,1,1,4,0,1,1,2,0,1,1,0,1,1,0,1,1,0,1,4,-1},</
90、p><p> {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,1,1,1,1,1,1,1,1,1,1,1,1,1,-1}.</p><p> {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1}</p><p><b> };<
91、/b></p><p> /* 音符與計(jì)數(shù)值對應(yīng)表 */</p><p> uint code tab[]=</p><p> { 0,63628,63835,64021,64103,64260,64400,64524,</p><p> 64580,64684,64777,64820,64898,64968,65030,&l
92、t;/p><p> 65058,65110,65157,65178,65217,65252,65283</p><p><b> }; </b></p><p> void delay1(uint ms) //播放歌曲時(shí)實(shí)現(xiàn)節(jié)拍的延時(shí)函數(shù)</p><p><b> {</b>&l
93、t;/p><p><b> uchar t;</b></p><p> while(ms--) for (t=0;t<120;t++);</p><p><b> }</b></p><p> /* 鍵消抖延時(shí)函數(shù) */</p><p> void delay(v
94、oid)</p><p><b> {</b></p><p><b> uchar i;</b></p><p> for (i=300;i>0;i--);</p><p><b> }</b></p><p> /* 鍵掃描函數(shù) */
95、</p><p> uchar getkey(void)</p><p><b> {</b></p><p> uchar scancode,tmpcode;</p><p> if ((P0&0xf0)==0xf0)</p><p> return(0);</p&
96、gt;<p> scancode = 0xfe;</p><p> while((scancode&0x10)!=0)// 逐行掃描</p><p><b> {</b></p><p> P0 = scancode;// 輸出行掃描碼</p><p> if ((P0&
97、;0xf0)!=0xf0)// 本行有鍵按下</p><p><b> {</b></p><p> tmpcode = (P0&0xf0)|0x0f;</p><p> /* 返回特征字節(jié)碼,為1的位即對應(yīng)于行和列 */</p><p> return((~scancode)+(~tmpcode))
98、;</p><p><b> }</b></p><p> else scancode = (scancode<<1)|0x01;// 行掃描碼左移一位</p><p><b> }</b></p><p><b> }</b></p>&
99、lt;p> /* 外部中斷0 ,這里是彈唱按鍵*/</p><p> void EX0_INT() interrupt 0</p><p><b> {</b></p><p> FY=0; LED1=1; LED2=0; </p><p><b> }</b></p>
100、<p> /* 外部中斷1 ,這里是播放按鍵*/</p><p> void EX1_INT() interrupt 2</p><p><b> {</b></p><p> FY=1; LED1=0; LED2=1; </p><p><b> }</b></p&
101、gt;<p> /* 定時(shí)器0中斷服務(wù)子程序 */</p><p> void time0_int(void) interrupt 1 using 0</p><p><b> {</b></p><p> /* 設(shè)置計(jì)數(shù)初值 */</p><p> TH0 = STH0;</p>
102、<p> TL0 = STL0; </p><p> SPK=!SPK; // 反相,產(chǎn)生輸出脈沖</p><p> P2=DSY_CODE[k] ;</p><p><b> }</b></p><p> void main(void)</p><p><b>
103、 { LED1=1;</b></p><p><b> LED2=0;</b></p><p><b> P2=0x3f;</b></p><p><b> IE=0x87;</b></p><p> TMOD=0x01;</p><p&
104、gt;<b> IT0=1;</b></p><p><b> IT1=1;</b></p><p><b> while(1)</b></p><p><b> { </b></p><p> P0 = 0xf0; // 發(fā)全0
105、列掃描碼</p><p> if ((P0&0xf0)!=0xf0)// 若有鍵按下</p><p><b> {</b></p><p> delay();// 延時(shí)去抖動(dòng)</p><p> if ((P0&0xf0)!=0xf0)// 延時(shí)后再判斷一次,去除抖動(dòng)
106、影響</p><p><b> {</b></p><p> key = getkey();// 調(diào)用鍵盤掃描函數(shù)</p><p> switch(key) // 根據(jù)獲取的按鍵位置得到k值</p><p><b> {</b></p><
107、p> case 0x11:// 1行1列</p><p><b> k = 0;</b></p><p><b> break;</b></p><p> case 0x21:// 1行2列</p><p><b> k = 1;</b>
108、</p><p><b> break;</b></p><p> case 0x41:// 1行3列</p><p><b> k = 2;</b></p><p><b> break;</b></p><p> case
109、 0x81:// 1行4列</p><p><b> k = 3;</b></p><p><b> break;</b></p><p> case 0x12:// 2行1列</p><p><b> k = 4;</b></p>
110、<p><b> break;</b></p><p> case 0x22:// 2行2列</p><p><b> k = 5;</b></p><p><b> break;</b></p><p> case 0x42://
111、 2行3列</p><p><b> k = 6;</b></p><p><b> break;</b></p><p> case 0x82:// 2行4列</p><p><b> k = 7;</b></p><p><
112、b> break;</b></p><p> case 0x14:// 3行1列</p><p><b> k = 8;</b></p><p><b> break;</b></p><p> case 0x24:// 3行2列</p>
113、;<p><b> k = 9;</b></p><p><b> break;</b></p><p> case 0x44:// 3行3列</p><p><b> k = 10;</b></p><p><b> break;
114、</b></p><p> case 0x84:// 3行4列</p><p><b> k = 11;</b></p><p><b> break;</b></p><p> case 0x18:// 3行4列</p><p>
115、<b> k = 12;</b></p><p><b> break;</b></p><p> case 0x28:// 3行4列</p><p><b> k = 13;</b></p><p><b> break;</b>&
116、lt;/p><p> case 0x48:// 3行4列</p><p><b> k = 14;</b></p><p><b> break;</b></p><p> case 0x88:// 3行4列</p><p><b>
117、k = 15;</b></p><p><b> break;</b></p><p><b> default:</b></p><p><b> break;</b></p><p><b> } </b></p&g
118、t;<p><b> if(FY==0)</b></p><p><b> { </b></p><p> /* 根據(jù)所得的k值設(shè)定計(jì)數(shù)器1的計(jì)數(shù)初值 */</p><p> STH0 = tab[k]/256;</p><p> STL0 = tab[k]%256; &
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)畢業(yè)設(shè)計(jì)電子琴
- 畢業(yè)設(shè)計(jì)----基于單片機(jī)的電子琴設(shè)計(jì)
- 基于單片機(jī)的電子琴設(shè)計(jì)畢業(yè)設(shè)計(jì)
- 基于單片機(jī)的電子琴系統(tǒng)設(shè)計(jì)_畢業(yè)設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)---基于單片機(jī)的簡單電子琴設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)(論文)-基于單片機(jī)的電子琴設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)(論文)基于單片機(jī)的簡易電子琴
- 畢業(yè)設(shè)計(jì)(論文)-基于單片機(jī)的微型電子琴設(shè)計(jì)
- 電子琴課程設(shè)計(jì)--基于單片機(jī)的電子琴設(shè)計(jì)
- 基于單片機(jī)的電子琴設(shè)計(jì)
- 電子琴課程設(shè)計(jì)--基于單片機(jī)的電子琴設(shè)計(jì)
- 電子琴課程設(shè)計(jì)-- 基于單片機(jī)的電子琴設(shè)計(jì)
- 基于單片機(jī)原理的簡易電子琴系統(tǒng) 畢業(yè)設(shè)計(jì)
- 電子信息畢業(yè)設(shè)計(jì)論文 基于單片機(jī)的電子琴設(shè)計(jì)
- 基于單片機(jī)的電子琴設(shè)計(jì)畢業(yè)論文
- 基于單片機(jī)的簡單電子琴設(shè)計(jì)
- 基于51單片機(jī)的電子琴設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)—基于單片機(jī)的電子琴
- 單片機(jī)電子琴課程設(shè)計(jì)--基于單片機(jī)的可存儲(chǔ)式電子琴設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---基于單片機(jī)的電子琴設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論