版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 《單片機應用與仿真訓練》設計報告</p><p> 題目:基于單片機的電子琴設計</p><p> 2012年6月27日</p><p><b> 摘 要</b></p><p> 本設計是一個基于單片機的簡易電子琴,它是以單片機作為主控核心,設置鍵盤、蜂鳴器等外圍器件;另外還用到一些簡單
2、器件如:兩位數(shù)碼管,和NPN型三極管及電阻等。利用按鍵實現(xiàn)音符和音調(diào)的輸入;兩位的數(shù)碼管進行被操作的按鍵顯示;用NPN型三極管8550實現(xiàn)低音頻功率放大;最后用蜂鳴器進行播放“結(jié)婚進行曲”。</p><p> 本設計硬件部分主要由最小系統(tǒng),按鍵系統(tǒng)模塊、數(shù)碼管顯示模塊和蜂鳴器模塊組成。其軟件部分主要有主程序模塊、定時中斷程序、定時計數(shù)程序、顯示程序。</p><p> ?。?)最小系統(tǒng):
3、它是單片機應用系統(tǒng)的設計基礎。它包括單片機的選擇、時鐘系統(tǒng)設計、復位電路設計、簡單的I/O口擴展、掉電保護等。</p><p> (2)按鍵系統(tǒng)模塊:本設計采用10個按鍵,其中7個按鍵用來顯示7個音調(diào),其它3個按鍵可以進行高低中音的切換,并自動播放已存歌曲。</p><p> ?。?)數(shù)碼管顯示模塊:SM420562段選端接在單片機的P0口,兩個位選端分別接在P2^0和P2^1。<
4、/p><p> ?。?)蜂鳴器模塊:此電子琴發(fā)音電路是通過三極管驅(qū)動蜂鳴器發(fā)音,經(jīng)過上拉電阻提高驅(qū)動能力。</p><p> 本次設計首先對單片機設計簡易電子琴仔細分析,接著制作硬件電路和編寫軟件的程序,最后進行軟硬件的調(diào)試運行。并且從原理圖,主要芯片,各模塊的原理和各個模塊的程序調(diào)試來闡述。利用單片機產(chǎn)生不同頻率來獲得我們要求的音階,實現(xiàn)高、中、低共21個音符的發(fā)音和顯示和音樂播放時的控制
5、顯示,并且能自動播放程序中編排的音樂。系統(tǒng)運行穩(wěn)定,其優(yōu)點是硬件電路簡單,軟件功能完善,控制系統(tǒng)可靠,性價比高等,具有一定的使用和參考價值。</p><p><b> 目 錄</b></p><p><b> 1.概述4</b></p><p><b> 1.1設計背景4</b><
6、/p><p><b> 1.2設計意義4</b></p><p> 1.3 設計任務4</p><p> 2.系統(tǒng)總體方案及硬件設計5</p><p><b> 2.1總體設計5</b></p><p> 2.2單片機選型5</p><p&
7、gt; 2.3 原理框圖6</p><p> 2.4顯示部分設計7</p><p> 2.5 按鍵部分設計8</p><p> 2.6發(fā)音部分設計9</p><p> 3.系統(tǒng)軟件設計11</p><p> 3.1系統(tǒng)分析11</p><p> 3.2 參數(shù)計算13&
8、lt;/p><p> 3.3程序設計15</p><p> 4. Proteus軟件仿真18</p><p> 4.1硬件調(diào)試18</p><p> 4.2 軟件調(diào)試18</p><p> 4.4 結(jié)果分析19</p><p> 5. 課程設計體會20</p>
9、<p><b> 參考文獻21</b></p><p> 附1 源程序代碼22</p><p> 附2 系統(tǒng)原理圖27</p><p><b> 1.概述</b></p><p><b> 1.1設計背景</b></p><p
10、> 隨著電子科學技術的飛速發(fā)展,電子技術正在逐漸改善著人們的學習、生活、工作,因此開發(fā)本系統(tǒng)希望能夠給人們帶來更多的生活樂趣。</p><p> 基于當前市場上的玩具需求量增大,其中電子琴就是一個很好的應用方面。單片機技術使我們可以利用軟硬件來實現(xiàn)電子琴的功能,從而可以實現(xiàn)電子琴的微型化,可以用作玩具琴、音樂轉(zhuǎn)盤以及音樂童車等等。并且可以進行一定的功能擴展。鑒于傳統(tǒng)電子琴可以用鍵盤上的“1”到“A”鍵演
11、奏從低So到高DO等11個音,從而也可以通過單片機實現(xiàn)對十個按鍵的擴展,實現(xiàn)七個音符鍵的高、中、低21個音調(diào)的顯示播放和任意音樂的自動播放。該設計將十個音鍵制作成獨立鍵盤,其中七個為音符鍵,三個為控制鍵,并用數(shù)碼管進行顯示,使電子琴的功能更加完美。不但可以實現(xiàn)對按鍵的顯示,而且可以實現(xiàn)對音樂的自動存儲和播放,使該設計功能更加完善。</p><p><b> 1.2設計意義</b></
12、p><p> 該設計具有以下優(yōu)點:</p><p> ?、倏梢苑奖愕弥シ诺囊舴鸵粽{(diào);</p><p> ?、诒葌鹘y(tǒng)電子琴功能更完善;</p><p> ?、壑谱骱唵危杀镜?;</p><p><b> 1.3 設計任務</b></p><p> 實現(xiàn)電子琴發(fā)聲控制系統(tǒng)
13、;要求電路實現(xiàn)如下功能:</p><p> 利用蜂鳴器作為發(fā)聲部件,兩個數(shù)碼管作為顯示部件,設置10個按鍵,實現(xiàn)高音、中音、低音的1、2、3、4、5、6、7的發(fā)音。并在存儲一首歌曲的內(nèi)容,可以實現(xiàn)自動播放。</p><p> 用PROTEUS實現(xiàn)的電子琴仿真設計</p><p> 說明:單片機的工作時鐘頻率為11.0592MHz。</p><
14、;p> 2.系統(tǒng)總體方案及硬件設計</p><p><b> 2.1總體設計</b></p><p> 采用AT89S52單片機作為主控芯片,設置鍵盤、蜂鳴器等外圍器件,另外還用到一些簡單器件如:兩位數(shù)碼管,和NPN型三極管及電阻等。利用按鍵實現(xiàn)音符和音調(diào)的輸入;兩位的數(shù)碼管進行被操作的按鍵顯示;用NPN型三極管8550實現(xiàn)低音頻功率放大;最后用蜂鳴器發(fā)音
15、。</p><p><b> 2.2單片機選型</b></p><p> 硬件電路要以單片機作為主控芯片,實現(xiàn)按鍵輸入音符和音調(diào),兩位數(shù)碼管的顯示以及低音頻功率放大和蜂鳴器發(fā)音。針對本設計的功能和用途,采用AT89S51單片機更好,實現(xiàn)功能完全,性價比較高,更適合本設計。</p><p><b> 時鐘電路 </b>
16、</p><p> 單片機內(nèi)部具有一個高增益反相放大器,用于構(gòu)成振蕩器。通常在引腳XTALl和XTAL2跨接石英晶體和兩個補償電容構(gòu)成自激振蕩器,結(jié)構(gòu)圖2 中X1、C1、C2。可以根據(jù)情況選擇6MHz、12MHz或24MHz等頻率的石英晶體,補償電容通常選擇30pF左右的瓷片電容。</p><p><b> 圖2-1、時鐘電路</b></p><
17、;p><b> 復位電路 </b></p><p> 單片機小系統(tǒng)常采用上電自動復位和手動按鍵復位兩種方式實現(xiàn)系統(tǒng)的復位操作。上電復位要求接通電源后,自動實現(xiàn)復位操作。手動復位要求在電源接通的條件下,在單片機運行期間,用按鈕開關操作使單片機復位。其結(jié)構(gòu)如下圖。上電自動復位通過電容C3充電來實現(xiàn)。手動按鍵復位是通過按鍵將電阻R1與VCC接通來實現(xiàn)。</p><p&
18、gt;<b> 圖2-2、復位電路</b></p><p><b> 2.3 原理框圖</b></p><p> 本系統(tǒng)有主控芯片89S52、發(fā)音單元、顯示模塊、按鍵模塊組成。</p><p><b> 圖2-3、原理框圖</b></p><p><b>
19、2.4顯示部分設計</b></p><p><b> 數(shù)碼顯示方式</b></p><p> 數(shù)碼顯示有靜態(tài)顯示方式與動態(tài)顯示方式兩種。工作在靜態(tài)顯示方式時,數(shù)碼管的位線與電源一直相連,數(shù)碼管中的二極管均處于通電狀態(tài),即在靜態(tài)工作方式下,顯示電路中數(shù)碼管的位選線是同時選通,而數(shù)碼管的段選線是獨立輸入。</p><p> 工作在
20、動態(tài)顯示方式時,數(shù)碼管的位線在掃描控制電路的控制下按設定順序?qū)?,即電路中的?shù)碼管是逐個接通電源,數(shù)碼管的段選線以并聯(lián)方式與譯碼電路聯(lián)接,即在動態(tài)工作方式下,數(shù)碼管不是同時導通顯示而是按照設定順序分時導通顯示。</p><p><b> 八位數(shù)碼管的結(jié)構(gòu)</b></p><p> 本次課程設計的顯示電路采用兩位數(shù)碼管進行顯示,由于此設計采用的是共陰極的,使用時不加
21、限流電阻。</p><p> 為了顯示字符,要為 LED 顯示器段碼,除了組成8字形的字符的 7段,另加上1個小數(shù)點位,共計8段, 因此提供給 LED 顯示器的顯示段碼為1個字節(jié)。</p><p> 圖2-4、數(shù)碼管電路</p><p> 2.5 按鍵部分設計</p><p><b> 鍵盤設計</b></
22、p><p> 鍵盤在單片機應用系統(tǒng)中是一個關鍵的部件,它能實現(xiàn)向計算機輸入數(shù)據(jù),傳送命令等功能,是人工干預計算機的主要手段。</p><p> 鍵盤可以分為2類:獨立連接式鍵盤和矩陣式鍵盤。</p><p><b> 獨立連接式鍵盤</b></p><p> 獨立式按鍵是直接用I/O口線構(gòu)成的單個按鍵電路,其特點是每
23、個按鍵單獨占用一根I/O口線,每個按鍵的工作不會影響其它I/O口線的狀態(tài)。獨立式按鍵電路配置靈活,軟件結(jié)構(gòu)簡單,但每個按鍵必須占用一根I/O口線,然而,在按鍵較多時,I/O口線浪費較大,不宜采用。</p><p> 獨立式按鍵軟件常采用查詢式結(jié)構(gòu)。先逐位查詢每根I/O口線的輸入狀態(tài),如某一根I/O口線輸入為低電平,則可確認該I/O口線所對應的按鍵已按下,然后,再轉(zhuǎn)向該鍵的功能處理程序。由于本程序較為簡單,為了使
24、用方便及節(jié)省資源,選擇獨立式鍵盤。下圖為獨立式鍵盤電路圖:</p><p> 圖2-5、獨立式鍵盤電路圖</p><p><b> 去抖</b></p><p> 鍵盤編程中主要考慮去抖動的問題。</p><p> 當測試表明有鍵被按下之后,緊接著就進行去抖動處理。因為鍵是機械開關結(jié)構(gòu),由于機械觸點的彈性及電壓突
25、跳等原因,在觸點閉合或斷開的瞬間會出現(xiàn)電壓抖動。為保證鍵識別的準確,在電壓信號抖動的情況下不能進行行狀態(tài)輸入。為此需進行去抖動處理。去抖動有硬件和軟件兩種方法。硬件方法就是加去抖動電路,從根本上避免抖動的產(chǎn)生。軟件消抖,在第一次檢測到有鍵按下時,執(zhí)行一段延時程序之后,再檢測此按鍵,如果第二次檢測結(jié)果仍為按下狀態(tài),CPU便確認此按鍵己按下,消除了抖動。</p><p><b> 2.6發(fā)音部分設計<
26、;/b></p><p> 如下圖所示,發(fā)音電路是由蜂鳴器、三極管、上拉電阻構(gòu)成。由三極管來驅(qū)動揚聲器發(fā)音的,同時加上拉電阻增強驅(qū)動電流,提高驅(qū)動能力。</p><p> 圖2-6、發(fā)音部分電路圖</p><p><b> 3.系統(tǒng)軟件設計</b></p><p><b> 3.1系統(tǒng)分析<
27、/b></p><p><b> 系統(tǒng)軟件的組成</b></p><p> ?。?)鍵盤掃描程序:檢測是否有按鍵按下,有按鍵按下則記錄按下鍵的鍵值,并跳轉(zhuǎn)至功能轉(zhuǎn)移程序;無按鍵按下,則返回鍵盤掃描程序繼續(xù)檢測。</p><p> ?。?)功能轉(zhuǎn)移程序:對檢測到的按鍵值進行判斷,是琴鍵則跳轉(zhuǎn)至琴鍵處理程序,是功能鍵則跳轉(zhuǎn)至相應的功能程序,
28、我們設計的功能程序有兩種,即音色調(diào)節(jié)功能和自動播放樂曲的功能。</p><p> (3)琴鍵處理程序:根據(jù)檢測到的按鍵值,查詢音調(diào)表,給計時器賦值,使發(fā)出相應頻率的聲音。</p><p> (4)自動播放歌曲程序:檢測到按鍵按下的是自動播放歌曲功能鍵后執(zhí)行該程序,電子琴會自動播放事先已經(jīng)存放的歌曲,歌曲播放完畢之后自動返回至鍵盤掃描程序,繼續(xù)等待是否有按鍵按下。</p>
29、<p><b> 系統(tǒng)總體功能流程圖</b></p><p> 圖3-1、系統(tǒng)總體功能流程圖</p><p><b> 3.2 參數(shù)計算</b></p><p><b> 發(fā)音原理</b></p><p> 若要產(chǎn)生音頻脈沖,只要算出某一音頻的周期(1/頻率
30、),再將此周期除以2,即為半周期的時間。利用定時器計時半周期時間,每當計時終止后就將P1.0反相,然后重復計時再反相。就可在P1.0引腳上得到此頻率的脈沖。利用AT89C51的內(nèi)部定時器使其工作計數(shù)器模式(MODE1)下,改變計數(shù)值TH0及TL0以產(chǎn)生不同頻率的方法產(chǎn)生不同音階。</p><p> 例如,頻率為523Hz,其周期T=1/523=1912μs,因此只要令計數(shù)器計時956μs/1μs=956,每計數(shù)
31、956次時將I/O反相,就可得到中音DO(523Hz)。計數(shù)脈沖值與頻率的關系式是:N=fi÷2÷fr,式中,N是計數(shù)值;fi是機器頻率(晶體振蕩器為12MHz時,其頻率為1MHz);fr是想要產(chǎn)生的頻率。其計數(shù)初值T的求法如下:T=65536-N=65536-fi÷2÷fr</p><p> 例如:設K=65536,fi=1MHz,求中音DO(261Hz)。T=6553
32、6-N=65536-fi÷2÷fr=65536-1000000÷2÷fr=65536-500000/fr,中音DO的T=65536-500000/523=64580。</p><p><b> 計算結(jié)果</b></p><p> ?。?)單片機12MHZ晶振,中音符與計數(shù)T0相關的計數(shù)值如表所示:</p><
33、;p> 采用查表程序進行查表時,可以為這個音符建立一個表格,有助于單片機通過查表的方式來獲得相應的數(shù)據(jù):低音0-19之間,中音在20-39之間,高音在40-59之間。用單片機播放音樂,或者彈奏電子琴,實際上是按照特定的頻率,輸出一連串的方波。為了輸出合適的方波,首先應該知道音符與頻率的關系。</p><p><b> ?。?)音調(diào)數(shù)據(jù)表</b></p><p&g
34、t; 上表中的頻率數(shù)值,有些過多,去掉不常用的黑鍵頻率,只是把白鍵對應的數(shù)據(jù)存放在單片機中,即可滿足絕大部分的應用需求。定義音調(diào)數(shù)據(jù)表的程序如下:</p><p> DW 63628,63835,64021,64103,64260,64400,64524 64580,低音區(qū):1 2 3 4 5 6 7 DW 64580,64671,64777,64820,64898,64968,65030 65058中音
35、區(qū):1 2 3 4 5 6 7 DW 65058,65110,65157,65178,65217,65252,65283 65312高音區(qū):1 2 3 4 5 6 7</p><p> 把這個數(shù)據(jù)表,放在程序中,需要播音的時候,就從表中取出一個數(shù)據(jù)送到定時器,當定時器溢出中斷的時候,再對輸出引腳取反,那么,在揚聲器中,即可聽到上表中頻率的聲音。</p><p><b> 3
36、.3程序設計</b></p><p> (1) 判斷音階(高中低音)子程序</p><p> 在軟件設計中采用yinjie代表音階,如下圖所示</p><p> 初始化狀態(tài)為中音(yinjie=1),電路中設計高、低兩個音階鍵。上電后,若無按鍵按下,則為中音模式。若音階鍵被按下,則如下流程圖所示,初始化后進行按鍵掃描,在高音鍵按下,若初始yinji
37、e不為2,則令yinjie=2,進入高音工作模式,若初始yinjie為2,則對yinjie進行初始化,即另yinjie=1,重新進入進入中音工作模式,這樣即實現(xiàn)了高音鍵切換高、中音方式的轉(zhuǎn)換。同理,用低音鍵實現(xiàn)中、低音的切換。</p><p> 圖3-2、判斷音階(高中低音)子程序</p><p> (2) 播放子程序(包括自動播放存儲音樂和按鍵發(fā)音)</p><p
38、> 本設計共兩種播放模式,包括自動播放存儲音樂和按鍵發(fā)音。上電后,首先開中斷并設定定時器0為工作方式1,當自動播放鍵按下時,進入中斷,根據(jù)樂譜在定義的音頻數(shù)組中查找相應音律,然后給定時器賦初值,即開始播放音樂。當DO、RE、MI、FA、SO、LA、SI七種音符鍵按下時,根據(jù)音階值(如3.3.1中高中低對應)和音符值在定義的音頻數(shù)組中查找相應音律,然后給定時器賦初值,即按鍵發(fā)音。</p><p> 圖3-
39、3、播放子程序</p><p> 4. Proteus軟件仿真</p><p><b> 4.1硬件調(diào)試</b></p><p> 硬件調(diào)試主要是針對單片機部分進行的調(diào)試。</p><p> 在上電之前,先確保電路中不存在斷路或短路情況,這一工作是整個調(diào)試工作的第一步,也是非常重要的一個步驟。在這部分調(diào)試中主要使
40、用的工具是萬用表,用來完成檢測電路中是否存在斷路或者短路情況的任務。注意焊點之間,確保焊點沒有短接在一起,同時注意焊點的美觀,確保沒有開路以及短路的現(xiàn)象出現(xiàn)。</p><p> 在確保硬件電路正常且無異常情況(斷路或短路)的情況下方可上電調(diào)試,上電調(diào)試的目的是檢驗電路是否接錯,同時還要檢驗原理是否正確,在本次設計中,上電調(diào)試主要是檢測單片機控制部分、數(shù)碼管點亮部分、和音頻轉(zhuǎn)換電路硬件調(diào)試。</p>
41、<p> 1、數(shù)碼管LED電路調(diào)試:接通電源,隨機按下按鈕可以看到數(shù)碼管顯示數(shù)字。</p><p> 2、鍵盤單片機控制部分調(diào)試:上電后,隨機按動鍵盤可以發(fā)現(xiàn)各個按鍵對應的音正確。</p><p><b> 4.2 軟件調(diào)試</b></p><p> 調(diào)試主要方法和技巧:通常一個調(diào)試程序應該具備至少四種性能:跟蹤、斷點、查看
42、變量、更改數(shù)值。整個程序是一個主程序調(diào)用各個子程序?qū)崿F(xiàn)功能的過程,要使主程序和整個程序都能平穩(wěn)運行,各個模塊的子程序的正確與平穩(wěn)運行必不可少,所以在軟件調(diào)試的最初階段就是把各個子程序模塊進行分別調(diào)試。</p><p> 4.3 仿真結(jié)果(任舉一例)</p><p> 圖4-1、低音音符RE仿真圖</p><p><b> 4.4 結(jié)果分析</b
43、></p><p> 根據(jù)仿真結(jié)果可知,本次課程設計能夠準確并徹底的完成設計要求。左側(cè)數(shù)碼管可以顯示a、b、c三種結(jié)果,分別代表低音、中音和高音。右側(cè)數(shù)碼管可以顯示1、2、3、4、5、6、7七個數(shù)字,分別代表DO、RE、MI、FA、SO、LA、SI七種音符。下面以4.3為例具體進行分析:當系統(tǒng)上電后,若按下低音鍵(如圖P3.6),,則選定工作方式為低音模式,圖中a即代表低音。P0口連接數(shù)碼管段選端,右側(cè)數(shù)
44、碼管顯示的1即代表DO。兩位數(shù)碼管即代表低音DO。</p><p><b> 5. 課程設計體會</b></p><p> 總體來說,此次單片機課程設計使我們收獲良多,雖然課程設計的過程中遇到了很多困難與問題,但我們最終還是完成了設計的任務及要求。具體來說可以分為以下幾點:第一,不夠細心,不夠嚴謹(如因為粗心大意而焊錯線);第二,因?qū)φn本理論的掌握度不夠?qū)е戮幊坛?/p>
45、現(xiàn)錯誤;第三,硬件方面,剛開始有的程序模塊不能實現(xiàn)預期的效果,對于有的硬件,在實物制作過程中焊了比較多的排線,同時對于整體各元器件的布局都有很高的要求。不過在向同學請教,各方面都有了不同程度的改善;第四,在做人方面,我認識到,無論做什么事情,只要你足夠堅強,有足夠的毅力和決心,有足夠的挑戰(zhàn)困難的勇氣,就沒有什么辦不到的。</p><p> 這次課程設計中,經(jīng)過我們的努力,在仿真軟件和實物上都實現(xiàn)了高、中、低21
46、個音符的發(fā)聲和音樂的自動播放,使我們有了一定的成就感,也使我們進一步熟悉和掌握了單片機的內(nèi)部結(jié)構(gòu)和工作原理,了解了單片機應用系統(tǒng)設計的基本方法和步驟, 掌握了單片機仿真軟件Proteus的使用方法和鍵盤、顯示器在的單片機控制系統(tǒng)中的應用,同時也掌握了撰寫課程設計報告的方法??傊?,通過這次課程設計,我們都清楚明白了自己的能力有多深,想提高還得歸于多鍛煉,多動手,多向別人學習。</p><p><b>
47、參考文獻</b></p><p> 【1】余發(fā)山、王福忠. 單片機原理及應用技術. 中國礦業(yè)大學出版社.2008年6月第1 版</p><p> 【2】楊凌霄. 微型計算機原理與應用,中國礦業(yè)大學出版社.2008年8月第一版</p><p> 【3】康華光. 電子技術基礎(數(shù)字部分),高等教育出版社.第五版</p><p>
48、 【4】徐志軍,伊廷輝等. EDA技術與PLD設計 人民郵電出版社, 2006年2月第1版</p><p> 【5】李朝青. 單片機原理及接口技術[M]. 北京:北京航天航空大學出版色,2001.</p><p> 【6】胡漢才. 單片機原理及其接口技術[M]. 北京:清華大學出版社,2004.</p><p> 【7】 彭偉.單片機C語言程序設計實訓1
49、00例.電子工業(yè)出版社.2009年</p><p> 【8】 李建忠.單片機原理及應用.西安:西安電子科技大學,2002年</p><p> 【9】 韓志軍等.單片機應用系統(tǒng)設計[M].機械工業(yè)出版社,2004</p><p> 【10】 馬忠梅等.單片機的C語言應用程序設計[M].北京航空航天大學出版社,2006</p><p>&l
50、t;b> 附1 源程序代碼</b></p><p> #include<reg52.h> </p><p> #define keyport P1</p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p
51、><p> uchar high,low; //定時器預裝值的高8位和低8位</p><p> sbit speak=P3^0;</p><p> sbit gao=P3^5;</p><p> sbit di=P3^6;</p><p> sbit zdbf=P3^7;</p><p&
52、gt; uchar yinjie=1;</p><p> uchar time;</p><p> uchar n=0;</p><p> uchar bo=0;</p><p> uchar code fre[][2]= { </p><p> 0x8c,0xf8,</p><p&
53、gt; 0x5b,0xf9,</p><p> 0x15,0xfa,</p><p> 0x67,0xfa,</p><p> 0x90,0xfb,</p><p> 0xae,0xfb,</p><p> 0x0c,0xfc, //低音</p><p> 0x44,
54、0xfc,</p><p> 0xac,0xfc,</p><p> 0x09,0xfd,</p><p> 0x34,0xfd,</p><p> 0x82,0xfd,</p><p> 0xc2,0xfd,</p><p> 0x06,0xfe, //中音<
55、/p><p> 0x22,0xfe,</p><p> 0x56,0xfe,</p><p> 0x85,0xfe,</p><p> 0x9a,0xfe,</p><p> 0xc1,0xfe,</p><p> 0xe4,0xfe,</p><p> 0x0
56、3,0xff, //高音</p><p><b> };</b></p><p> void delay(uint );</p><p> void ITimer0(void);//定時器初始化</p><p> void key(void);</p><p> void dtxs
57、(int,int);</p><p> void song()</p><p><b> {</b></p><p><b> TH0=high;</b></p><p><b> TL0=low;</b></p><p><b>
58、TR0=1;</b></p><p> delay(time*180); </p><p><b> }</b></p><p> void yinyue()</p><p><b> {</b></p><p>
59、; uchar code hls[]={ 1,2,4, 4,2,3, 4,2,1, 4,2,8, 1,2,4, 5,2,3, 3,2,1, 4,2,8, 1,2,4, 4,2,3, </p><p> 7,2,1, 7,2,4, 6,2,3, 5,2,1, 4,2,4, 3,2,3, 4,2,1, 5,2,8, 1,2,4, 4,2,3, 4,2,1, 4,2,8, 1,2,4, </p>
60、<p> 5,2,3, 3,2,1, 4,2,8, 1,2,4, 4,2,3, 6,2,1, 1,3,4, 6,2,3, 4,2,1, 4,2,8, 7,2,4, 6,2,3, 5,2,1, </p><p> 2,2,4, 2,2,4, 3,2,4, 4,2,3, 5,2,1, 5,2,8, 7,2,4, 6,2,3, 5,2,1, 2,2,4, 2,2,4, 3,2,4, 4,2,3, <
61、/p><p> 5,2,8, 1,2,4, 4,2,3, 4,2,1, 1,2,4, 5,2,3, 3,2,1, 4,2,8, 1,2,4, 4,2,3, 6,2,1, 1,3,4, 6,2,3, </p><p> 4,2,1, 2,2,4, 5,2,3, 6,2,1, 4,2,8, 2,2,4, 5,2,3, 6,2,1, 4,2,8, 4,2,8</p><p&g
62、t;<b> };</b></p><p><b> uchar m;</b></p><p><b> n=0;</b></p><p> while(n<216)</p><p><b> {</b></p><p&
63、gt; m=hls[n]+7*(hls[n+1]-1)-1;</p><p> high=fre[m][1];</p><p> low=fre[m][0];</p><p> time=hls[n+2];</p><p><b> n=n+3;</b></p><p><b>
64、; song();</b></p><p><b> }</b></p><p><b> }</b></p><p> void main (void)</p><p><b> {</b></p><p> uc
65、har num;</p><p> ITimer0();</p><p><b> speak=0;</b></p><p><b> while(1)</b></p><p><b> {</b></p><p><b> key(
66、);</b></p><p> switch(keyport)</p><p><b> {</b></p><p> case 0xfe:num=1;break;</p><p> case 0xfd:num=2;break;</p><p> case 0xfb:num=
67、 3;break;</p><p> case 0xf7:num= 4;break;</p><p> case 0xef:num= 5;break;</p><p> case 0xdf:num= 6;break;</p><p> case 0xbf:num= 7;break;</p><p> case
68、 0x7f:num= 8;break;</p><p> default:num= 0;break;</p><p><b> }</b></p><p> if(num==0)</p><p><b> {</b></p><p><b> TR0=0;
69、</b></p><p><b> speak=0;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> high=
70、fre[7*yinjie+num-1][1];</p><p> low=fre[7*yinjie+num-1][0];</p><p><b> TR0=1;</b></p><p><b> }</b></p><p> dtxs(yinjie,num);</p><
71、p><b> }</b></p><p><b> }</b></p><p> void ITimer0(void)</p><p><b> {</b></p><p> TMOD |= 0x01; //使用模式1,16位定時器,使用&qu
72、ot;|"符號可以在使用多個定時器時不受影響 </p><p> EA=1; //總中斷打開</p><p> ET0=1; //定時器中斷打開</p><p> TR0=1; //定時器開關打開</p><p><b&g
73、t; }</b></p><p> void Timer0_isr(void) interrupt 1</p><p><b> {</b></p><p><b> TH0=high;</b></p><p><b> TL0=low;</b></
74、p><p> speak=!speak;</p><p> if(zdbf==0)</p><p><b> {</b></p><p> delay(100);</p><p> if(zdbf==0)</p><p><b> {</b>&
75、lt;/p><p><b> bo++;</b></p><p> if(bo/2==1)</p><p> {delay(100);</p><p> if(n<216)n=500;//n賦值大于216,跳出while,停止音樂</p><p><b> else
76、n=0;</b></p><p> dtxs(3,0);</p><p><b> }</b></p><p> if(bo%2==0)</p><p> {delay(100);</p><p> n=500;//n賦值大于216,跳出while,停止音樂</
77、p><p><b> }</b></p><p><b> } </b></p><p><b> }/**/</b></p><p><b> }</b></p><p> void key()</p><
78、;p><b> {</b></p><p> if(zdbf==0)</p><p> {delay(100);</p><p> if(zdbf==0)</p><p><b> yinyue();</b></p><p><b> }<
79、/b></p><p> if(gao==0)</p><p><b> {</b></p><p> delay(100);</p><p> if(gao==0)</p><p><b> {</b></p><p> delay
80、(100);</p><p> if(yinjie==2)</p><p><b> yinjie=1;</b></p><p> else yinjie=2;</p><p><b> }</b></p><p><b> }</b><
81、/p><p><b> if(di==0)</b></p><p><b> {</b></p><p> delay(100);</p><p><b> if(di==0)</b></p><p><b> {</b>&l
82、t;/p><p> delay(100);</p><p> if(yinjie==0)</p><p><b> yinjie=1;</b></p><p> else yinjie=0;</p><p><b> }</b></p><p>
83、<b> }</b></p><p><b> }</b></p><p> void delay(unsigned int x)</p><p><b> { </b></p><p><b> int a,b;</b></p&
84、gt;<p> for(a=x;a>0;a--)</p><p> for(b=110;b>0;b--);</p><p><b> }</b></p><p> void dtxs(k,l)//k是工作方式,l是按鍵號</p><p><b> {</b><
85、;/p><p> char seg[12]={0x77,0x7c,0x39,0x3f,0x06,0x5b,0x4f,0x66,0x6d,</p><p> 0x7d,0x07,0xff};</p><p> P2=0x01;//選擇第一個數(shù)碼管</p><p> P0=seg[k];//顯示工作方式</p><p>
86、;<b> delay(4);</b></p><p> P2=0x02;//選擇第二個數(shù)碼管</p><p> P0=seg[l+3];//顯示按鍵號</p><p><b> delay(4);</b></p><p><b> }</b></p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子琴課程設計--基于單片機的電子琴設計
- 電子琴課程設計-- 基于單片機的電子琴設計
- 電子琴單片機課程設計--電子琴模擬實驗
- 單片機課程設計---電子琴
- 單片機課程設計(電子琴)
- 單片機課程設計-電子琴
- 單片機課程設計——電子琴
- 單片機電子琴課程設計--基于單片機的可存儲式電子琴設計
- 單片機課程設計---電子琴設計
- 單片機課程設計---電子琴設計
- 基于單片機的電子琴課程設計
- 基于單片機的電子琴課程設計
- 單片機課程設計簡易電子琴
- 基于單片機的電子琴設計課程設計
- 簡易電子琴單片機課程設計
- 簡易電子琴單片機課程設計
- 簡易電子琴單片機課程設計
- 單片機課程設計報告--電子琴
- 單片機課程設計簡易電子琴
- 單片機課程設計——簡易電子琴
評論
0/150
提交評論