版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 河南理工大學</b></p><p> 《單片機應用與仿真訓練》設(shè)計報告</p><p> 模擬電子琴發(fā)聲控制系統(tǒng)</p><p> 姓 名: </p><p> 學 號:
2、 </p><p> 專業(yè)班級: </p><p> 指導老師 : 王 莉 </p><p> 所在學院: 電氣工程與自動化學院 </p><p> 2012年10月 28 日</p><p><b> 摘要</b&g
3、t;</p><p> 本次課程設(shè)計的主要內(nèi)容是用AT89C51單片機為核心控制元件,設(shè)計一個簡單的電子琴并可實現(xiàn)音樂的連續(xù)播放。以單片機作為主控核心,與鍵盤、揚聲器等模塊組成核心主控制模塊,在主控模塊上設(shè)有12個按鍵和揚聲器。定時器按設(shè)置的定時參數(shù)產(chǎn)生中斷,由于定時參數(shù)不同,就會發(fā)出不同頻率的脈沖,不同頻率的脈沖經(jīng)喇叭驅(qū)動電路放大濾波后,就會發(fā)出不同音調(diào)。</p><p> 本簡易電
4、子琴的設(shè)計可實現(xiàn)的功能如下:程序中預存了4首音樂:《同一首歌》、《兩只蝴蝶》、《祝你快樂》、《Time to say goodbye》并通過一個獨立鍵盤可以實現(xiàn)對四首音樂的“下一曲”控制。3*4矩陣鍵盤中的7個按鍵分別對應著7個不同的音符,另外3個分為高、中、低音的控制,當按下某一按鍵,會發(fā)出相應的音調(diào)。按下按鍵時,揚聲器會發(fā)出聲音,松開按鍵后,揚聲器停止發(fā)聲,按鍵的時間越長,發(fā)聲時間越久。連續(xù)按下不同的按鍵,可以實現(xiàn)樂曲的演奏。此外還
5、有一“模式”按鍵,負責在電子琴和音樂播放器兩種不同模式下的切換。</p><p><b> 目錄</b></p><p><b> 1概述7</b></p><p> 1.1音樂產(chǎn)生原理7</p><p> 1.2結(jié)構(gòu)框圖7</p><p> 2系統(tǒng)總
6、體方案及硬件設(shè)計8</p><p> 2.1總體方案8</p><p> 2.2按鍵鍵盤8</p><p> 2.3蜂鳴器電路8</p><p> 2.4數(shù)碼管電路9</p><p> 2.5最小系統(tǒng)10</p><p> 2.6設(shè)計實現(xiàn)過程10</p
7、><p><b> 3軟件設(shè)計12</b></p><p> 3.1整體設(shè)計12</p><p> 3.2音樂設(shè)計13</p><p> 3.3按鍵設(shè)計14</p><p> 3.4顯示設(shè)計16</p><p> 4Proteus仿真17&l
8、t;/p><p> 5課程設(shè)計體會18</p><p><b> 參考文獻18</b></p><p> 附1:源程序代碼19</p><p> 附2:系統(tǒng)原理圖29</p><p><b> 概述</b></p><p><b&
9、gt; 音樂產(chǎn)生原理</b></p><p> 一首音樂是許多不同的音階組成的,而每個音階對應著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構(gòu)成我們所想要的音樂了,當然對于單片機來產(chǎn)生不同的頻率非常方便,我們可以利用單片機的定時/計數(shù)器T0來產(chǎn)生這</p><p> 樣方波頻率信號,因此,我們只要把一首歌曲的音階對應頻率關(guān)系正確即可。</p><
10、;p> 若要產(chǎn)生音頻脈沖,只要算出某一音頻的周期(1/頻率),再將此周期除以2,</p><p> 即為半周期的時間。利用定時器計時半周期時間,每當計時終止后就將P1.0反相,然后重復計時再反相。就可在P1.0引腳上得到此頻率的脈沖。</p><p> 利用STC89C52的內(nèi)部定時器使其工作計數(shù)器模式(MODE1)下,改變計數(shù)值TH0及TL0以產(chǎn)生不同頻率的方法產(chǎn)生不同音階,
11、例如,頻率為523Hz,其周期T=1/523=1912μs,單片機晶振頻率為12MHz,因此只要令計數(shù)器計時(956μs/1μs)=478,每計數(shù)478次時將I/O反相,就可得到中音DO(523Hz)。對于AT80C51而言要產(chǎn)生一定頻率的方波一般是先將某口線輸出高電平,延遲一段時間后再輸出低電平。通過改變延遲時間可以改變單片機的輸出頻率。單片機的延時主要有兩種方式,即軟件延時和使用定時/計數(shù)器延時。其中軟件延時不是很精確,而電子琴電路
12、由于每個音符的頻率值要求比較嚴格,因此我們選用定時/計數(shù)器延時。</p><p> 由于本課程設(shè)計是由用戶通過鍵盤輸入彈奏樂曲的,所以節(jié)拍由用戶掌握,不由程序控制。因此,我們只需弄清楚音樂中的音符和對應的頻率,利用單片機的定時/計數(shù)器來產(chǎn)生方波頻率信號即可。</p><p><b> 結(jié)構(gòu)框圖</b></p><p> 系統(tǒng)總體方案及硬件
13、設(shè)計</p><p><b> 總體方案</b></p><p> 本設(shè)計采用3*4鍵盤控制通過程序產(chǎn)生高、中、低七度音律,要考慮到軟件和硬件的匹配以及硬件電路焊接時的排版問題,否則建會帶來不必要的焊接麻煩,在編程序時要注意仿真與實際電路中可能的不符。在此基礎(chǔ)上,另外設(shè)計數(shù)碼管顯示電路,蜂鳴器驅(qū)動電路。</p><p><b>
14、 按鍵鍵盤</b></p><p> 設(shè)計中采用AT89S51的并行口P0接3×4矩陣鍵盤,以P0.0-P0.2作輸入線,以P0.4-P0.7作輸出線。每個按鍵有它的行值和列值,行值和列值的組合就是識別這個按鍵的編碼。矩陣的行線和列線分別通過兩并行接口和CPU通信。每個按鍵的狀態(tài)同樣需變成數(shù)字量“0”和“1”,開關(guān)的一端(列線)通過電阻接VCC,而接地是通過程序輸出數(shù)字“0”實現(xiàn)的。鍵盤處
15、理程序的任務是:確定有無鍵按下,判斷哪一個鍵按下,鍵的功能是什么;還要消除按鍵在閉合或斷開時的抖動。兩個并行口中,一個輸出掃描碼,使按鍵逐行動態(tài)接地,另一個并行口輸入按鍵狀態(tài),由行掃描值和回饋信號共同形成鍵編碼而識別按鍵,通過軟件查表,查出該鍵的功能,在本程序中,當程序檢測到有鍵按下時,將查表使按鍵值與預存數(shù)據(jù)表中數(shù)據(jù)對應,并調(diào)用發(fā)聲程序。另單獨焊接第三行第四列按鍵為獨立按鍵,用以控制歌曲的切換。</p><p>
16、;<b> 蜂鳴器電路</b></p><p> 蜂鳴器一陽極接三極管的集電極,另一端接地,三極管的集電極節(jié)電源VCC,基極接P3.6口。當P3.6口為低電平時三極管導通,蜂鳴器有電流流過,即發(fā)聲。本次設(shè)計采用的是9015(NPN型)三極管作為蜂鳴器的驅(qū)動電路。</p><p><b> 數(shù)碼管電路</b></p><p
17、> 本次單片機課程設(shè)計的顯示電路采用共陽極LED數(shù)碼管顯示,由于 LED是屬于電流控制器件,使用時必須加限流電阻。本次顯示使用的是數(shù)碼管的靜態(tài)顯示功能,主要用以顯示高、中、低音的狀態(tài)以及電子琴、播放器狀態(tài)的指示。</p><p><b> 最小系統(tǒng)</b></p><p> 本部分分為印刷電路板,主要包含復位電路、時鐘電路、P0-P3口插槽。</p&
18、gt;<p><b> 設(shè)計實現(xiàn)過程</b></p><p> 本次硬件設(shè)計的核心部分就是按鍵,組成鍵盤的按鍵有機械式、電容式、導電橡膠式、薄膜式多種,但不管什么形式,其作用都是一個使電路接通與斷開的開關(guān)。目前微機系統(tǒng)中使用的鍵盤按其功能不同,通??煞譃榫幋a鍵盤和非編碼鍵盤兩種基本類型。 編碼鍵盤:鍵盤本身帶有實現(xiàn)接口主要功能所需的硬件電路。不僅能自動檢測被按下的鍵
19、,并完成去抖動、防串鍵等功能,而且能提供與被按鍵功能對應的鍵碼(如ASCII碼)送往CPU。所以,編碼鍵盤接口簡單、使用方便。但由于硬件電路較復雜,因而價格較貴。 非編碼鍵盤:鍵盤只簡單地提供按鍵開關(guān)的行列矩陣。有關(guān)按鍵的識別、鍵碼的確定與輸入、去抖動等功能均由軟件完成。目前微機系統(tǒng)中,一般為了降低成本大多數(shù)采用非編碼鍵盤。 鍵盤接口必須具有去抖動、防串鍵、按鍵識別和鍵碼產(chǎn)生4個基本功能。 (1)去抖動:每個按鍵
20、在按下或松開時,都會產(chǎn)生短時間的抖動。抖動的持續(xù)時間與鍵的質(zhì)量相關(guān),一般為5—20mm。所謂抖動是指在識別被按鍵是必須避開抖動狀態(tài),只有處在穩(wěn)定接通或穩(wěn)定斷開狀態(tài)才能保證識別正確無誤。去抖問</p><p> 題可通過軟件延時或硬件電路解決。 (2)防串鍵:防串鍵是為了解決多個鍵同時按下或者前一按鍵沒有釋放又有新的按鍵按下時產(chǎn)生的問題。常用的方法有雙鍵鎖定和N鍵輪回兩種方法。雙鍵鎖定,是當有兩個或兩個以
21、上的按鍵按下時,只把最后釋放的鍵當作有效鍵并產(chǎn)生相應的鍵碼。N鍵輪回,是當檢測到有多個鍵被按下時,能根據(jù)發(fā)現(xiàn)它們的順序依次產(chǎn)生相應鍵的鍵碼。 (3)被按鍵識別:如何識別被按鍵是接口解決的主要問題,一般可通過軟硬結(jié)合的方法完成。常用的方法有行掃描法和線反轉(zhuǎn)法兩種。行掃描法的基本思想是,由程序?qū)︽I盤逐行掃描,通過檢測到的列輸出狀態(tài)來確定閉合鍵,為此,需要設(shè)置入口、輸出口一個,該方法在微機系統(tǒng)中被廣泛使用。線反轉(zhuǎn)法的基本思想是通過行列
22、顛倒兩次掃描來識別閉合鍵,為此需要提供兩個可編程的雙向輸入/輸出端口。 (4)鍵碼產(chǎn)生:為了從鍵的行列坐標編碼得到反映鍵功能的鍵碼,一般在內(nèi)存區(qū)中建立一個鍵盤編碼表,通過查表獲得被按鍵的鍵碼。</p><p> 用STC89C52的并行口P0接3×4矩陣鍵盤,以P0.0-P0.2作輸入線,以P0.4-P0.7作輸出線。</p><p> 除核心電路外,還包括輔助的發(fā)音
23、電路和顯示電路。發(fā)音電路主要部件是蜂鳴器,用三極管作為可控器件輔以驅(qū)動電路,以保證音量適中,音色較真。顯示電路由兩位共陽極數(shù)碼管作為顯示器件,同樣輔以三極管放大電路,并串接限流電阻,通過靜態(tài)顯示的方法作為高、中、低音狀態(tài)的顯示和電子琴模式與音樂播放器模式的狀態(tài)顯示。</p><p><b> 軟件設(shè)計</b></p><p><b> 整體設(shè)計</
24、b></p><p> 本設(shè)計使用Protues仿真軟件進行仿真,在程序設(shè)計部分,包括鍵盤掃描程序,音樂發(fā)聲程序(程序見附錄1)。3*4矩陣鍵盤是由單片機控制I/O口來實現(xiàn)掃描的。具體程序見附錄二主程序鍵盤掃描部分。程序首先給P0口賦值,然后讀取P0的狀態(tài),將讀取的狀態(tài)值同所賦值相比較,如果二者不相同,則說明有鍵按下,子程序?qū)存I值返回主程序;否則,說明沒有鍵按。程序繼續(xù)進行下一次掃描。 本系統(tǒng)的軟件主程
25、序流程圖如下:</p><p><b> 音樂設(shè)計</b></p><p> 對于不同的曲調(diào)我們也可以用單片機的另外一個定時/計數(shù)器來完成。琴鍵處理程序,根據(jù)檢測到得按鍵值,查詢音律表,給計時器賦值,發(fā)出相應頻率的聲音。對音調(diào)的控制:根據(jù)不同的按鍵,對定時器T1送入不同的初值,調(diào)節(jié)T1的溢出時間,這樣就可以輸出不同音調(diào)頻率的方波。不同音調(diào)下各個音階的定時器。在這個
26、程序中用到了兩個定時/計數(shù)器來完成的。其中T0用來產(chǎn)生音符頻率,T1用來產(chǎn)生音拍。</p><p> 要產(chǎn)生相應的音頻脈沖,只需要計算出某音頻的周期,再除以2。利用計數(shù)器計時半周期,計滿時使P2.0反向,然后重復計時再反向。本例中,單片機工作在12MHz時鐘,使用定時器/計數(shù)器T0,工作模式為1,改變計數(shù)初值TH0、TL0就可產(chǎn)生不同頻率的脈沖信號。</p><p> 例如低3MI音,
27、頻率為330Hz,其周期T=1/f=1/330=3030us,計數(shù)值N=3030/2=1515,所以每計數(shù)1515次P2.0反向。計數(shù)初值T=65536-N=64021。</p><p> 計數(shù)脈沖值與頻率的關(guān)系式是:</p><p><b> N=fi÷2÷fr</b></p><p> 式中,N是計數(shù)值;fi是機器
28、頻率(晶體振蕩器為12MHz時,其頻率為1MHz);fr是想要產(chǎn)生的頻率。</p><p> 其計數(shù)初值T的求法如下:</p><p> T=65536-N=65536-fi÷2÷fr</p><p> 例如:設(shè)K=65536,fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的計數(shù)值。</p&
29、gt;<p> T=65536-N=65536-fi÷2÷fr</p><p> ?。?5536-1000000÷2÷fr</p><p> =65536-500000/fr</p><p> 計算可得高中低音分別為:</p><p> 低音DO的T=65536-500000/26
30、2=63627</p><p> 中音DO的T=65536-500000/523=64580</p><p> 高音DO的T=65536-500000/1046=65059</p><p> 單片機12MHZ晶振,高中低音符與計數(shù)T0相關(guān)的計數(shù)值如表所示:</p><p><b> 音符頻率表</b></p
31、><p> 我們要為這個音符建立一個表格,單片機通過查表的方式來獲得相應的數(shù)據(jù),低音0-19之間,中音在20-39之間,高音在40-59之間 </p><p> TABLE1: DW 64021,64103,64260,64400</p><p> DW 64524,64580,64684,64777</p><p> DW 6
32、4820,64898,64968,65030</p><p> DW 65058,65110,65157,65178</p><p> 音樂的音拍,一個節(jié)拍為單位(C調(diào))如下表:</p><p><b> 曲調(diào)值表</b></p><p><b> 按鍵設(shè)計</b></p>&
33、lt;p> 對于不同的曲調(diào)我們也可以用單片機的另外一個定時/計數(shù)器來完成。琴鍵處理程序,根據(jù)檢測到得按鍵值,查詢音律表,給計時器賦值,發(fā)出相應頻率的聲音。對音調(diào)的控制:根據(jù)不同的按鍵,對定時器T1送入不同的初值,調(diào)節(jié)T1的溢出時間,這樣就可以輸出不同音調(diào)頻率的方波。不同音調(diào)下各個音階的定時器。</p><p><b> 顯示設(shè)計</b></p><p>
34、顯示部分使用共陽極數(shù)碼管,用NPN型三極管驅(qū)動電路進行靜態(tài)顯示,分別顯示高中低音狀態(tài)和音樂播放器及電子琴的模擬切換狀態(tài)。數(shù)碼管由P1.0-P1.7控制段顯示,P2.0和P2.1分別控制住位選,流程圖如下:</p><p><b> Proteus仿真</b></p><p> 軟件仿真調(diào)試主要是針對單片機部分進行調(diào)試。在軟件運行前,先確保電路中連線正確,這一工作是
35、整個調(diào)試工作的第一步,也是非常重要的一個步驟。在這部分調(diào)試中主要通過目測,用來完成檢測電路中是否存在斷路或者短路情況等。</p><p><b> 課程設(shè)計體會</b></p><p> 本次課程設(shè)計制作簡易電子琴,雖然花費了我們很多精力,但收獲頗豐,一方面,將自己的理論知識與實踐相結(jié)合起來,進一步鞏固了專業(yè)基礎(chǔ)知識和相關(guān)專業(yè)課程知識;另一方面,也培養(yǎng)了自己獨立自
36、主、綜合分析的思維與創(chuàng)新能力,更讓我知道了團隊的力量是巨大的。在實際制作時,我們將程序燒入芯片,調(diào)試成功后,可任意彈奏自己想要的旋律。本設(shè)計通過制作電子琴,將幾個模塊很好的融合,對使用單片機設(shè)計簡易電子琴進行了分析,并了解了基于單片機電子琴統(tǒng)硬件組成。利用單片機產(chǎn)生不同頻率來獲得我們要求的音階,最終可隨意彈奏想要表達的音樂。說明一首音樂是許多不同的音階組成的,而每個音階對應著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構(gòu)成我們所
37、想要的音樂了,于是我們可以利用單片機的定時/計數(shù)器T0來產(chǎn)生這樣方波頻率信號,因此,我們只要把一首歌曲的音階對應頻率關(guān)系弄正確即可,然后我們利用功放電路來將音樂聲音放大。</p><p> 設(shè)計的過程不是一帆風順,遇到過各種各樣的問題。特別是設(shè)計軟件時,一些很細小的問題都可能導致功能性的錯誤,修改了多次才通過仿真,例如:1、在剛剛焊接好后,程序燒入芯片后,發(fā)現(xiàn)并不發(fā)聲,經(jīng)檢查才發(fā)現(xiàn)是對鍵盤沒看清楚,將鍵盤接亂了
38、;2、在程序編寫時發(fā)現(xiàn)程序正確但電路并不工作,后來才發(fā)現(xiàn)是所用三極管為NPN型,而程序編寫時則按PNP型進行編寫,在修改程序后,程序運行正常實現(xiàn)了預想的功能;3、在硬件電路修改好后,發(fā)現(xiàn)每次按鍵時會引起蜂鳴器一直響,再按鍵時有可能會消失,經(jīng)檢查后知道是在每按鍵件程序后蜂鳴器對應參值沒有直接置1(置1關(guān)蜂鳴器,由電路連接方式?jīng)Q定)。 </p><p> 總之,這是一次動手能力的鍛煉,也是一次單片機知識的再回顧
39、,還是對自己細心以及耐心能力的考察。同時在具體的制作過程中我們發(fā)現(xiàn)一些書本上的知識與實際的應用存在著一定的差距,書本上的知識很多都是理想化后的結(jié)論,忽略了很多實際的因素,或者涉及的不全面,可在實際的應用時這些是不能被忽略的,我們不得不考慮這方面的問題,這也讓我更深刻地體會到在今后的學習工作中也要注重理論聯(lián)系實際。</p><p><b> 參考文獻</b></p><p
40、> [1]余發(fā)山.單片機原理及應用技術(shù)[M],中國礦業(yè)大學出版社,2003年12月版;</p><p> [2] 馬淑華、王鳳文.單片機原理與接口技術(shù)[M],北京郵電大學出版社,2005年10月版;</p><p> [3] 郭天祥.新概念51單片機C語言教程,電子工業(yè)出版社,2009年版</p><p><b> 附1:源程序代碼</
41、b></p><p> #include "MusInstru.h"</p><p> #include <reg52.h></p><p> #include <stdio.h></p><p> #include <math.h></p><p>
42、; #include <absacc.h></p><p> #include "SoundPlay.h"</p><p> unsigned k,h=1;</p><p> void Delay1ms(unsigned int count)</p><p><b> {<
43、/b></p><p> unsigned int i,j;</p><p> for(i=0;i<count;i++)</p><p> for(j=0;j<120;j++);</p><p><b> }</b></p><p> void music()</
44、p><p><b> {</b></p><p> InitialSound();</p><p><b> P2=0;</b></p><p><b> P1=0x00;</b></p><p><b> while(1)</b&
45、gt;</p><p><b> {</b></p><p> Play(Music_One,0,3,360);</p><p> Delay1ms(600);</p><p> Play(Music_Two,0,3,360);</p><p> Delay1ms(600);</p
46、><p> Play(Music_Three,0,3,360);</p><p> Delay1ms(600);</p><p> Play(Music_Four,0,3,360);</p><p> Delay1ms(600);</p><p> //Play(Music_Five,0,3,360);</
47、p><p> //Delay1ms(600);</p><p><b> }</b></p><p> } </p><p> /* 鍵掃描函數(shù) */</p><p> uchar getkey(voi
48、d) </p><p><b> {</b></p><p> uchar scancode,tmpcode;</p><p> if ((P0&0xf0)==0xf0)</p><p> return(0);</p><p&g
49、t; scancode = 0xfe;</p><p> while((scancode&0x10)!=0) // 逐行掃描</p><p><b> {</b></p><p> P0 = scancode; // 輸出行掃描碼</p><p>
50、if ((P0&0xf0)!=0xf0) // 本行有鍵按下</p><p><b> {</b></p><p> tmpcode = (P0&0xf0)|0x0f;</p><p> /* 返回特征字節(jié)碼,為1的位即對應于行和列 */</p><p> return(
51、(~scancode)+(~tmpcode));</p><p><b> }</b></p><p> else scancode = (scancode<<1)|0x01;// 行掃描碼左移一位</p><p><b> }</b></p><p> return(0);
52、</p><p><b> }</b></p><p> void display()</p><p><b> {</b></p><p> unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,</p><p> 0x9
53、9,0x92,0x82,0xf8,</p><p> 0x80,0x90,0x88,0x83,</p><p> 0xc6,0xa1,0x86,0x8e};</p><p> unsigned char code hl[]={0xf7,0xbf,0xfe};</p><p> unsigned int i,m=0;</p>
54、<p> for(i=0;i<9;i++)</p><p><b> {</b></p><p><b> m=m%2;</b></p><p><b> if(m==0)</b></p><p><b> {</b><
55、/p><p><b> P2=1;</b></p><p><b> P1=hl[h];</b></p><p> Delay1ms(5); </p><p><b> m+=1;</b></p><p><b> }</b&g
56、t;</p><p><b> else</b></p><p><b> {</b></p><p><b> P2=2;</b></p><p> P1=table[k+1];</p><p> Delay1ms(5); </p&
57、gt;<p><b> m+=1; </b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> /*MUSINSTRU頭文件*/</p>
58、<p> #ifndef_MUSINSTRU_H // 防止MusInstru.h被重復引用</p><p> #define_MUSINSTRU_H</p><p> #include <reg52.h></p><p> #include <absacc.h></p><p> #in
59、clude <stdio.h></p><p> #include <math.h></p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> /* 音符與計數(shù)值對應表 */</p><
60、p> uint code tab[3][7]={{0xf88b,0xf95b,0xfa14,0xfa03,0xfb8f,0xfbcf,0xfc0b},</p><p> {0xfc43,0xfcab,0xfd08,0xfd33,0xfd81,0xfdc7,0xfe05},</p><p> {0xfe21,0xfe55,0xfe84,0xfe99,0xfec0,0xfee3,0
61、xff02}}; </p><p> /*4首音樂代碼*/</p><p> unsigned char code Music_One[]={ 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x66, 0x18,0x03,</p><p> 0x17,0x02, 0x15,0x02, 0x16,0x01, 0x15,0x02, 0
62、x10,0x02, 0x15,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x02,</p><p> 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x02, 0x18,0x66,</p><p> 0x17,0x03, 0x19,0x02, 0
63、x16,0x03, 0x17,0x03, 0x16,0x00,</p><p> 0x17,0x01, 0x19,0x02, 0x1B,0x02, 0x1B,0x70, 0x1A,0x03,</p><p> 0x1A,0x01, 0x19,0x02, 0x19,0x03, 0x1A,0x03, 0x1B,0x02,</p><p> 0x1A,0x0D, 0
64、x19,0x03, 0x17,0x00, 0x18,0x66, 0x18,0x03,</p><p> 0x19,0x02, 0x1A,0x02, 0x19,0x0C, 0x18,0x0D, 0x17,0x03,</p><p> 0x16,0x01, 0x11,0x02, 0x11,0x03, 0x10,0x03, 0x0F,0x0C,</p><p> 0
65、x10,0x02, 0x15,0x00, 0x1F,0x01, 0x1A,0x01, 0x18,0x66,</p><p> 0x19,0x03, 0x1A,0x01, 0x1B,0x02, 0x1B,0x03, 0x1B,0x03,</p><p> 0x1B,0x0C, 0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x1F,0x01,</p>&
66、lt;p> 0x1A,0x01, 0x18,0x66, 0x19,0x03, 0x1A,0x01, 0x10,0x02,</p><p> 0x10,0x03, 0x10,0x03, 0x1A,0x0C, 0x18,0x0D, 0x17,0x03,</p><p> 0x16,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x70,&l
67、t;/p><p> 0x18,0x03, 0x17,0x02, 0x15,0x03, 0x15,0x03, 0x16,0x66,</p><p> 0x16,0x03, 0x16,0x02, 0x16,0x03, 0x15,0x03, 0x10,0x02,</p><p> 0x10,0x01, 0x11,0x01, 0x11,0x66, 0x10,0x03, 0
68、x0F,0x0C,</p><p> 0x1A,0x02, 0x19,0x02, 0x16,0x03, 0x16,0x03, 0x18,0x66,</p><p> 0x18,0x03, 0x18,0x02, 0x17,0x03, 0x16,0x03, 0x19,0x00,</p><p> 0x00,0x00 }; // 兩只蝴蝶
69、 </p><p> unsigned char code Music_Two[] ={ 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,</p><p> 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,</p><p> 0x16
70、,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,</p><p> 0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03,</p><p> 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01,</p><
71、p> 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,</p><p> 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x01,</p><p> 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,</
72、p><p> 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,</p><p> 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,</p><p> 0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x19
73、,0x03,</p><p> 0x19,0x01, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01,</p><p> 0x16,0x03, 0x16,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,</p><p> 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10
74、,0x0D, 0x15,0x00,</p><p> 0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03,</p><p> 0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03,</p><p> 0x16,0x0D, 0x17,0x01, 0x17
75、,0x03, 0x17,0x03, 0x19,0x03,</p><p> 0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03,</p><p> 0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03,</p><p> 0x19,0x02, 0x1F
76、,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E,</p><p> 0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E,</p><p> 0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03,</p><p> 0x17
77、,0x0D, 0x16,0x03, 0x17,0x03, 0x19,0x01, 0x19,0x03,</p><p> 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03,</p><p> 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x03,</p><
78、p> 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02,</p><p> 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01,</p><p> 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03,</
79、p><p> 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,</p><p> 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,</p><p> 0x17,0x16, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B
80、,0x04,</p><p> 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x0F,0x02,</p><p> 0x10,0x03, 0x15,0x00, 0x00,0x00 }; //同一首歌</p><p> unsigned char code Music_Three[]={ 0x17,0x02, 0
81、x10,0x03, 0x15,0x03, 0x19,0x03, 0x0D,0x02,</p><p> 0x19,0x03, 0x15,0x02, 0x16,0x03, 0x15,0x03, 0x10,0x01,</p><p> 0x1A,0x02, 0x1A,0x03, 0x19,0x03, 0x15,0x02, 0x16,0x02,</p><p> 0
82、x17,0x00, 0x17,0x03, 0x1A,0x03, 0x1A,0x03, 0x19,0x03,</p><p> 0x10,0x02, 0x17,0x03, 0x16,0x03, 0x17,0x03, 0x17,0x03,</p><p> 0x15,0x03, 0x16,0x01, 0x17,0x02, 0x17,0x03, 0x19,0x03,</p>&
83、lt;p> 0x16,0x03, 0x15,0x02, 0x0F,0x03, 0x10,0x00, 0x17,0x02,</p><p> 0x17,0x03, 0x19,0x03, 0x1B,0x03, 0x1A,0x03, 0x19,0x02,</p><p> 0x1A,0x00, 0x1F,0x02, 0x1F,0x03, 0x1B,0x02, 0x1A,0x02,&l
84、t;/p><p> 0x1F,0x00, 0x11,0x02, 0x17,0x03, 0x19,0x03, 0x1A,0x03,</p><p> 0x1B,0x03, 0x1A,0x03, 0x1A,0x00, 0x11,0x02, 0x1B,0x03,</p><p> 0x1A,0x02, 0x1B,0x02, 0x16,0x00, 0x16,0x03, 0
85、x16,0x03,</p><p> 0x16,0x03, 0x10,0x03, 0x15,0x02, 0x16,0x02, 0x17,0x00,</p><p> 0x19,0x03, 0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1B,0x02,</p><p> 0x1A,0x03, 0x19,0x03, 0x1A,0x00, 0
86、x00,0x00 };//祝你快樂</p><p> unsigned char code Music_Four[]={ 0x0F,0x03, 0x15,0x03, 0x15,0x01, 0x11,0x03, 0x16,0x03,</p><p> 0x15,0x01, 0x15,0x66, 0x16,0x03, 0x17,0x03, 0x17,0x66,</p><
87、;p> 0x17,0x02, 0x16,0x03, 0x18,0x03, 0x17,0x03, 0x15,0x66,</p><p> 0x1F,0x03, 0x1B,0x03, 0x19,0x03, 0x15,0x03, 0x1B,0x03,</p><p> 0x19,0x03, 0x17,0x03, 0x19,0x01, 0x16,0x03, 0x18,0x03,<
88、/p><p> 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x11,0x03, 0x0F,0x03,</p><p> 0x15,0x03, 0x15,0x01, 0x11,0x03, 0x16,0x03, 0x15,0x01,</p><p> 0x15,0x66, 0x16,0x03, 0x17,0x03, 0x17,0x03, 0x1
89、7,0x03,</p><p> 0x17,0x03, 0x17,0x17, 0x16,0x03, 0x18,0x03, 0x17,0x03,</p><p> 0x15,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03, 0x15,0x03,</p><p> 0x1B,0x03, 0x19,0x03, 0x17,0x03, 0x1
90、9,0x01, 0x16,0x03,</p><p> 0x18,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x11,0x03,</p><p> 0x11,0x01, 0x0E,0x04, 0x0F,0x04, 0x10,0x04, 0x0F,0x04,</p><p> 0x10,0x04, 0x11,0x04, 0x1
91、0,0x04, 0x11,0x04, 0x15,0x04,</p><p> 0x11,0x04, 0x15,0x04, 0x16,0x04, 0x15,0x04, 0x10,0x04,</p><p> 0x16,0x04, 0x17,0x04, 0x18,0x02, 0x17,0x02, 0x0E,0x04,</p><p> 0x0F,0x04, 0x1
92、0,0x04, 0x0F,0x04, 0x10,0x04, 0x11,0x04,</p><p> 0x10,0x04, 0x11,0x04, 0x16,0x67, 0x15,0x04, 0x17,0x02,</p><p> 0x0E,0x04, 0x0F,0x04, 0x10,0x04, 0x0F,0x04, 0x10,0x04,</p><p> 0x1
93、1,0x04, 0x10,0x04, 0x11,0x04, 0x15,0x16, 0x0E,0x04,</p><p> 0x0F,0x04, 0x10,0x04, 0x0F,0x04, 0x10,0x04, 0x11,0x04,</p><p> 0x10,0x04, 0x11,0x04, 0x16,0x67, 0x15,0x04, 0x16,0x67,</p><
94、;p> 0x15,0x04, 0x18,0x67, 0x17,0x04, 0x0F,0x15, 0x00,0x00 };</p><p> //time to say goodbye</p><p><b> #endif</b></p><p> /*SoundPlay頭文件*/</p><p> #i
95、fndef __SOUNDPLAY_H_REVISION_FIRST__</p><p> #define __SOUNDPLAY_H_REVISION_FIRST__</p><p> #define SYSTEM_OSC 11059200//定義晶振頻率12000000HZ</p><p> #define SOUND_SPACE 4/5 //
96、定義普通音符演奏的長度分率,//每4分音符間隔</p><p> sbit BeepIO = P3^6;//定義輸出管腳</p><p> uint Point,SoundLength;</p><p> uint code FreTab[12] = { 262,277,294,311,330,349,369,392,415,440,
97、466,494 }; //原始頻率表</p><p> uchar code SignTab[7] = { 0,2,4,5,7,9,11 }; //1~7在頻率表中的位置</p><p> uchar code LengthTab[7]= { 1,2,4,8,16,32,64 };</p><p> uchar Sound_Temp_TH
98、0,Sound_Temp_TL0;//音符定時器初值暫存 </p><p> uchar Sound_Temp_TH1,Sound_Temp_TL1;//音長定時器初值暫存</p><p> void InitialSound(void)</p><p><b> {</b></p><p> BeepIO
99、= 0;</p><p> Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256;// 計算TL1應裝入的初值 (10ms的初裝值)</p><p> Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256;// 計算TH1應裝入的初值 </p><p> TH1 =
100、Sound_Temp_TH1;</p><p> TL1 = Sound_Temp_TL1;</p><p> TMOD |= 0x11;</p><p> ET0 = 1;</p><p> ET1 = 0;</p><p> TR0 = 0;</p><p>
101、 TR1 = 0;</p><p> EA = 1;</p><p><b> }</b></p><p> void BeepTimer0(void) interrupt 1//音符發(fā)生中斷</p><p><b> {</b></p><p>
102、BeepIO = !BeepIO;</p><p> TH0 = Sound_Temp_TH0;</p><p> TL0 = Sound_Temp_TL0;</p><p><b> }</b></p><p> void int0(void) interrupt 0</p><
103、p><b> {</b></p><p> Point =SoundLength;</p><p><b> }</b></p><p> void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned i
104、nt Speed)</p><p><b> {</b></p><p> uint NewFreTab[12];//新的頻率表</p><p> uchar i,j;</p><p> uint LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T;</p>
105、;<p> uchar Tone,Length,SL,SH,SM,SLen,XG,FD;</p><p> for(i=0;i<12;i++) // 根據(jù)調(diào)號及升降八度來生成新的頻率表 </p><p><b> {</b></p><p><b> EX0=1;</b></p&g
106、t;<p> j = i + Signature;</p><p> if(j > 11)</p><p><b> {</b></p><p><b> j = j-12;</b></p><p> NewFreTab[i] = FreTab[j]*2;</p&
107、gt;<p><b> }</b></p><p><b> else</b></p><p> NewFreTab[i] = FreTab[j];</p><p> if(Octachord == 1)</p><p> NewFreTab[i]>>=2;<
108、;/p><p> else if(Octachord == 3)</p><p> NewFreTab[i]<<=2;</p><p> }</p><p> SoundLength = 0;</p><p> while(Sound[SoundLength] != 0x00)//
109、計算歌曲長度</p><p><b> {</b></p><p> SoundLength+=2;</p><p><b> }</b></p><p> Point = 0;</p><p> Tone = Sound[Point];</p>
110、<p> Length = Sound[Point+1]; // 讀出第一個音符和它時時值</p><p> LDiv0 = 12000/Speed;// 算出1分音符的長度(幾個10ms) </p><p> LDiv4 = LDiv0/4; // 算出4分音符的長度 </p><p> LDiv4 = LDiv4-L
111、Div4*SOUND_SPACE; // 普通音最長間隔標準 </p><p> TR0 = 0;</p><p> TR1 = 1;</p><p> while(Point < SoundLength)</p><p><b> {</b></p><p> SL=T
112、one%10; //計算出音符 </p><p> SM=Tone/10%10; //計算出高低音 </p><p> SH=Tone/100; //計算出是否升半 </p><p> CurrentFre = NewFreTab[SignTab[SL-1]+SH]; //查出對應音符的頻率 </p&g
113、t;<p><b> if(SL!=0)</b></p><p><b> {</b></p><p> if (SM==1) CurrentFre >>= 2; //低音 </p><p> if (SM==3) CurrentFre <<= 2; //高音</
114、p><p> Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);</p><p><b> //計算計數(shù)器初值</b></p><p> Sound_Temp_TH0 = Temp_T/256; </p><p> Sound_Temp_TL0 =
115、Temp_T%256; </p><p> TH0 = Sound_Temp_TH0; </p><p> TL0 = Sound_Temp_TL0 + 12; //加12是對中斷延時的補償 </p><p><b> }</b></p><p> SLen=LengthTab[Length%10]; //算
116、出是幾分音符</p><p> XG=Length/10%10; //算出音符類型(0普通1連音2頓音) </p><p> FD=Length/100;</p><p> LDiv=LDiv0/SLen; //算出連音音符演奏的長度(多少個10ms)</p><p> if (FD==1) </p><
117、;p> LDiv=LDiv+LDiv/2;</p><p> if(XG!=1)</p><p> if(XG==0) //算出普通音符的演奏長度 </p><p> if (SLen<=4)</p><p> LDiv1=LDiv-LDiv4;</p><p><b>
118、else</b></p><p> LDiv1=LDiv*SOUND_SPACE;</p><p><b> else</b></p><p> LDiv1=LDiv/2; //算出頓音的演奏長度 </p><p><b> else</b></p><p
119、> LDiv1=LDiv;</p><p> if(SL==0) LDiv1=0;</p><p> LDiv2=LDiv-LDiv1; //算出不發(fā)音的長度 </p><p> if (SL!=0)</p><p><b> {</b></p><p><b>
120、TR0=1;</b></p><p> for(i=LDiv1;i>0;i--) //發(fā)規(guī)定長度的音 </p><p><b> {</b></p><p> while(TF1==0);</p><p> TH1 = Sound_Temp_TH1;</p><p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子琴課程設(shè)計--模擬電子琴發(fā)聲控制系統(tǒng)
- 模擬電子琴發(fā)聲控制系統(tǒng)課程設(shè)計
- 電子琴課程設(shè)計---電子琴的設(shè)計與實現(xiàn)
- 電子琴單片機課程設(shè)計--電子琴模擬實驗
- 電子琴課程設(shè)計
- 電子琴課程設(shè)計
- 課程設(shè)計--電子琴
- 電子琴課程設(shè)計--基于單片機的電子琴設(shè)計
- 電子琴課程設(shè)計-- 基于單片機的電子琴設(shè)計
- 電子琴課程設(shè)計--基于單片機的電子琴設(shè)計
- 微機課程設(shè)計電子琴
- 接口課程設(shè)計電子琴
- 簡易電子琴課程設(shè)計
- 電子琴課程設(shè)計論文
- 簡易電子琴課程設(shè)計
- 簡易電子琴課程設(shè)計
- 電子琴課程設(shè)計報告
- 電子琴的課程設(shè)計
- 課程設(shè)計--按鍵控制電子琴
- 電子琴的設(shè)計 課程設(shè)計
評論
0/150
提交評論