版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 一實(shí)訓(xùn)目的</b></p><p> 通過(guò)本課程的實(shí)訓(xùn),旨在使學(xué)生在掌握先修課程的基礎(chǔ)上,一方面能綜合應(yīng)用這些課程的理論知識(shí),更重要的一方面,是讓學(xué)生親自動(dòng)手,參與到工程實(shí)踐訓(xùn)練中。使學(xué)生在之前掌握的電路.模電.數(shù)電等知識(shí),以及單片機(jī)知識(shí)的基礎(chǔ)上,進(jìn)一步掌握電子產(chǎn)品設(shè)計(jì)以及開發(fā)調(diào)試的全過(guò)程,尤其包括掌握PCB板的設(shè)計(jì).印刷,元器件的安裝.電路調(diào)試.程序調(diào)試.程
2、序下載等實(shí)踐實(shí)訓(xùn)部分,真正培養(yǎng)學(xué)生理論聯(lián)系實(shí)際.分析解決一般性技術(shù)問(wèn)題以及實(shí)際動(dòng)手的能力。</p><p><b> 二.設(shè)計(jì)原理</b></p><p> 電子琴由以下幾個(gè)部件組成:?jiǎn)纹瑱C(jī)89S51、電源、4*4的16個(gè)按鈕矩陣、音頻放大模塊、復(fù)位模塊,數(shù)碼管,LED顯示模塊、晶振模塊。</p><p> ?。?)AT89S51單片機(jī)及其
3、引腳說(shuō)明</p><p> AT89S51是一個(gè)低功耗,高性能CMOS 8位單片機(jī),片內(nèi)含4k Bytes ISP(In-system programmable)的可反復(fù)擦寫1000次的Flash只讀程序存儲(chǔ)器,器件采用ATMEL公司的高密度、非易失性存儲(chǔ)技術(shù)制造,兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng)及80C51引腳結(jié)構(gòu),芯片內(nèi)集成了通用8位中央處理器和ISP Flash存儲(chǔ)單元,功能強(qiáng)大的微型計(jì)算機(jī)的AT89S51&
4、lt;/p><p> 1.主要特性:· 8031 CPU與MCS-51 兼容· 4K字節(jié)可編程FLASH存儲(chǔ)器(壽命:1000寫/擦循環(huán))· 全靜態(tài)工作:0Hz-24KH· 三級(jí)程序存儲(chǔ)器保密鎖定· 128*8位內(nèi)部RAM· 32條可編程I/O線· 兩個(gè)16位定時(shí)器/計(jì)數(shù)器· 6個(gè)中斷源·
5、可編程串行通道· 低功耗的閑置和掉電模式· 片內(nèi)振蕩器和時(shí)鐘電路</p><p> (2)主要管腳說(shuō)明: P0口:P0口為一個(gè)8位漏級(jí)開路準(zhǔn)雙向I/O口,每腳可吸收8TTL門電流。P0能夠用于外部程序數(shù)據(jù)存儲(chǔ)器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時(shí),P0 口作為原碼輸入口,當(dāng)FIASH進(jìn)行校驗(yàn)時(shí),P0輸出原碼,此時(shí)P0外部必
6、須被拉高。 P1口:P1口是一個(gè)內(nèi)部提供上拉電阻的8位雙向I/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口緩沖器可接收,
7、輸出4個(gè)TTL門電流,當(dāng)P2口被寫“1”時(shí),其管腳被內(nèi)部上拉電阻拉高,且作為輸入。P2口當(dāng)用于外部程序存儲(chǔ)器或16位地址外部數(shù)據(jù)存儲(chǔ)器進(jìn)行存取時(shí),P2口輸出地址的高八位。 P3口:P3口管腳是8個(gè)帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個(gè)TTL門電流。當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)</p><p> P3口同時(shí)為閃爍編程
8、和編程校驗(yàn)接收一些控制信號(hào)。</p><p><b> 1.音樂(lè)產(chǎn)生的方法</b></p><p> 一首音樂(lè)是許多不同的音階組成的,而每個(gè)音階對(duì)應(yīng)著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構(gòu)成我們所想要的音樂(lè)了,當(dāng)然對(duì)于單片機(jī)來(lái)產(chǎn)生不同的頻率非常方便,我們可以利用單片機(jī)的定時(shí)/計(jì)數(shù)器T0來(lái)產(chǎn)生這樣方波頻率信號(hào),因此,我們只要把一首歌曲的音階對(duì)應(yīng)頻率關(guān)
9、系弄正確即可。</p><p> 若要產(chǎn)生音頻脈沖,只要算出某一音頻的周期(1/頻率),再將此周期除以2,即為半周期的時(shí)間。利用定時(shí)器計(jì)時(shí)半周期時(shí)間,每當(dāng)計(jì)時(shí)終止后就將P0.0反相,然后重復(fù)計(jì)時(shí)再反相。就可在P0.0引腳上得到此頻率的脈沖。</p><p> 利用AT89S51的內(nèi)部定時(shí)器使其工作計(jì)數(shù)器模式(MODE1)下,改變計(jì)數(shù)值TH0及TL0以產(chǎn)生不同頻率的方法產(chǎn)生不同音階,例如
10、,頻率為523Hz,其周期T=1/523=1912μs,因此只要令計(jì)數(shù)器計(jì)時(shí)956μs/1μs=956,每計(jì)數(shù)956次時(shí)將I/O反相,就可得到中音DO(523Hz)。</p><p> 計(jì)數(shù)脈沖值與頻率的關(guān)系式(如式2-1所示)是:</p><p> N=fi÷2÷fr &
11、#160; 2-1</p><p> 式中,N是計(jì)數(shù)值;fi是機(jī)器頻率(晶體振蕩器為12MHz時(shí),其頻率為1MHz);fr是想要產(chǎn)生的頻率。</p><p> 其計(jì)數(shù)初值T的求法如下:</p>
12、<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=65536-fi÷2÷fr=65536-1000000÷2÷fr=65536
13、-500000/fr</p><p> 低音DO的T=65536-500000/262=63627</p><p> 中音DO的T=65536-500000/523=64580</p><p> 高音DO的T=65536-500000/1046=65059</p><p> 單片機(jī)12MHZ晶振,高中低音符與計(jì)數(shù)T0相關(guān)的計(jì)數(shù)值如表2
14、-2所示</p><p> 表2-2 音符頻率表</p><p> 我們要為這個(gè)音符建立一個(gè)表格,單片機(jī)通過(guò)查表的方式來(lái)獲得相應(yīng)的數(shù)據(jù) 低音0-19之間,中音在20-39之間,高音在40-59之間 TABLE: DW 0, 63628, 63835, 64021, 64103, 64260, 64400, 64
15、524, 0, 0</p><p> DW 0, 63731, 63928, 0, 64185, 64331, 64463, 0, 0, 0</p><p> DW 0, 64580, 64684, 64777, 64820, 64898, 64968, 65030, 0, 0</p><p> DW 0, 64633, 64732, 0, 64860, 64
16、934, 64994, 0, 0, 0</p><p> DW 0, 65058, 65110,65157, 65178, 65217, 65252, 65283, 0, 0</p><p> DW 0, 65085, 65134, 0, 65198, 65235, 65268, 0, 0, 0</p><p><b> DW 0
17、0; </b></p><p> 音樂(lè)的音拍,一個(gè)節(jié)拍為單位(C調(diào))(如表2-3所示)</p><p><b> 表2-3 曲調(diào)值表</b></p><p> 對(duì)于不同的曲調(diào)我們也可以用單片機(jī)的另外一個(gè)定時(shí)/計(jì)數(shù)器來(lái)完成。</p><p> 琴鍵處理程序,根據(jù)檢測(cè)到得按鍵值,查詢
18、音律表,給計(jì)時(shí)器賦值,發(fā)出相應(yīng)頻率的聲音。對(duì)音調(diào)的控制:根據(jù)不同的按鍵,對(duì)定時(shí)器T1送入不同的初值,調(diào)節(jié)T1的溢出時(shí)間,這樣就可以輸出不同音調(diào)頻率的方波。不同音調(diào)下各個(gè)音階的定時(shí)器。在這個(gè)程序中用到了兩個(gè)定時(shí)/計(jì)數(shù)器來(lái)完成的。其中T0用來(lái)產(chǎn)生音符頻率,T1用來(lái)產(chǎn)生音拍。</p><p> 2.4X4行列式鍵盤識(shí)別及顯示</p><p> 組成鍵盤的按鍵有機(jī)械式、電容式、導(dǎo)電橡膠式、薄膜
19、式多種,但不管什么形式,其作用都是一個(gè)使電路接通與斷開的開關(guān)。目前微機(jī)系統(tǒng)中使用的鍵盤按其功能不同,通??煞譃榫幋a鍵盤和非編碼鍵盤兩種基本類型。 編碼鍵盤:鍵盤本身帶有實(shí)現(xiàn)接口主要功能所需的硬件電路。不僅能自動(dòng)檢測(cè)被按下的鍵,并完成去抖動(dòng)、防串鍵等功能,而且能提供與被按鍵功能對(duì)應(yīng)的鍵碼(如ASCII碼)送往CPU。所以,編碼鍵盤接口簡(jiǎn)單、使用方便。但由于硬件電路較復(fù)雜,因而價(jià)格較貴。 非編碼鍵盤:鍵盤只簡(jiǎn)單地提供按鍵開關(guān)
20、的行列矩陣。有關(guān)按鍵的識(shí)別、鍵碼的確定與輸入、去抖動(dòng)等功能均由軟件完成。目前微機(jī)系統(tǒng)中,一般為了降低成本大多數(shù)采用非編碼鍵盤。 鍵盤接口必須具有去抖動(dòng)、防串鍵、按鍵識(shí)別和鍵碼產(chǎn)生4個(gè)基本功能。 (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í)別正確無(wú)誤。去抖問(wèn)</p>
21、;<p> 題可通過(guò)軟件延時(shí)或硬件電路解決。 (2)防串鍵:防串鍵是為了解決多個(gè)鍵同時(shí)按下或者前一按鍵沒有釋放又有新的按鍵按下時(shí)產(chǎn)生的問(wèn)題。常用的方法有雙鍵鎖定和N鍵輪回兩種方法。雙鍵鎖定,是當(dāng)有兩個(gè)或兩個(gè)以上的按鍵按下時(shí),只把最后釋放的鍵當(dāng)作有效鍵并產(chǎn)生相應(yīng)的鍵碼。N鍵輪回,是當(dāng)檢測(cè)到有多個(gè)鍵被按下時(shí),能根據(jù)發(fā)現(xiàn)它們的順序依次產(chǎn)生相應(yīng)鍵的鍵碼。 (3)被按鍵識(shí)別:如何識(shí)別被按鍵是接口解決的主要問(wèn)題,一般
22、可通過(guò)軟硬結(jié)合的方法完成。常用的方法有行掃描法和線反轉(zhuǎn)法兩種。行掃描法的基本思想是,由程序?qū)︽I盤逐行掃描,通過(guò)檢測(cè)到的列輸出狀態(tài)來(lái)確定閉合鍵,為此,需要設(shè)置入口、輸出口一個(gè),該方法在微機(jī)系統(tǒng)中被廣泛使用。線反轉(zhuǎn)法的基本思想是通過(guò)行列顛倒兩次掃描來(lái)識(shí)別閉合鍵,為此需要提供兩個(gè)可編程的雙向輸入/輸出端口。 (4)鍵碼產(chǎn)生:為了從鍵的行列坐標(biāo)編碼得到反映鍵功能的鍵碼,一般在內(nèi)存區(qū)中建立一個(gè)鍵盤編碼表,通過(guò)查表獲得被按鍵的鍵碼。<
23、/p><p> 用AT89S51的并行口P0接4×4矩陣鍵盤,以P0.0-P0.3作輸入線,以P0.4-P0.7作輸出線;在數(shù)碼管上顯示每個(gè)按鍵的“0-F”序號(hào)。</p><p> 3.LED數(shù)碼顯示原理: (1)七段LED顯示器內(nèi)部由七個(gè)條形發(fā)光二極管和一個(gè)小圓點(diǎn)發(fā)光二極管組成,根據(jù)各管的極管的接線形式,可分成共陰極型和共陽(yáng)極型。 LED數(shù)
24、碼管的g~a七個(gè)發(fā)光二極管因加正電壓而發(fā)亮,因加零電壓而不以發(fā)亮,不同亮暗的組合就能形成不同的字形,這種組合稱之為字形碼,下面給出共陰極的字形碼表(如表2-1所示) </p><p> 表2-1 字形碼表</p><p> ?。?)由于顯示的數(shù)字0-9的字形碼沒有規(guī)律可循,只能采用查表的方式來(lái)完成我們所需的要求了。這樣我們按著數(shù)字0-9的順序,把每個(gè)數(shù)字的筆段代碼按順序排
25、好!建立的表格如下所示:TABLEDB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。</p><p> 4.電子琴實(shí)現(xiàn)原理1. 電源部分:是由220V的市電通過(guò)變壓、整流穩(wěn)壓利用7805來(lái)得到+5V電壓,維持系統(tǒng)的正常工作;把7805的3腳輸出接到89S51的40引腳上 </p><p> 2 .4*4的16個(gè)按鈕矩陣: 4*4行列式鍵盤識(shí)別;行
26、線接P0口的P0.0~P0.3,列線P0.4~P0.7,行值和列值的組合就是識(shí)別這個(gè)按鍵的編碼。每個(gè)按鍵的狀態(tài)同樣需變成數(shù)字量“0”和“1”,開關(guān)的一端(列線)通過(guò)電阻接VCC,而接地是通過(guò)程序輸出數(shù)字“0”實(shí)現(xiàn)的。</p><p> 3. 晶振模塊:用12MHZ的晶振,及兩個(gè)30pf的電容,接到單片機(jī)的18,19,20腳,電路如圖(a)所示</p><p> ?。╝)
27、 (b)</p><p> 4. 復(fù)位模塊:利用開關(guān)和一個(gè)10uf的極性電容并聯(lián)接單片機(jī)9腳“reset”腳,電路如圖(b)所示</p><p> 5. 音頻放大模塊:利用三極管將信號(hào)放大,由揚(yáng)聲器放出,信號(hào)由單片機(jī)的17腳“P3.7”口讀出,電路如圖(c)所示 </p><p> (c)
28、 (d)</p><p> 6. 數(shù)碼管:利用AT89S51單片機(jī)的P2端口的P2.0-P2.7連接到一個(gè)七段數(shù)碼管的a-h(huán)的筆段上,數(shù)碼管的公共端接地。在數(shù)碼管上循環(huán)顯示0-7數(shù)字,時(shí)間間隔0.2秒。</p><p><b> 三.硬件電路</b></p><p> 圖3.1 硬件電路原理圖Pr
29、otel</p><p> 圖3.2 硬件電路PCB</p><p> 四.系統(tǒng)程序設(shè)計(jì)流程圖</p><p> 五.Proteus仿真電路</p><p> 圖4.1 Proteus仿真電路圖</p><p><b> 六.源程序</b></p><p> ?。?/p>
30、1)Soundplay調(diào)用程序:</p><p> /*說(shuō)明**************************************************************************</p><p> 曲譜存貯格式 unsigned char code MusicName{音高,音長(zhǎng),音高,音長(zhǎng)...., 0,0};末尾:0,0 表示結(jié)束(Important
31、)</p><p> 音高由三位數(shù)字組成:</p><p> 個(gè)位是表示 1~7 這七個(gè)音符 </p><p> 十位是表示音符所在的音區(qū):1-低音,2-中音,3-高音;</p><p> 百位表示這個(gè)音符是否要升半音: 0-不升,1-升半音。</p><p> 音長(zhǎng)最多由三位數(shù)字組成: </p>
32、<p> 個(gè)位表示音符的時(shí)值,其對(duì)應(yīng)關(guān)系是: </p><p> |數(shù)值(n): |0 |1 |2 |3 | 4 | 5 | 6 </p><p> |幾分音符: |1 |2 |4 |8 |16 |32 |64 音符=2^n</p><p> 十位表示音符的演奏效果(0-2): 0-普通,1-連音,2-頓音</p><
33、;p> 百位是符點(diǎn)位: 0-無(wú)符點(diǎn),1-有符點(diǎn)</p><p> 調(diào)用演奏子程序的格式</p><p> Play(樂(lè)曲名,調(diào)號(hào),升降八度,演奏速度);</p><p> |樂(lè)曲名 : 要播放的樂(lè)曲指針,結(jié)尾以(0,0)結(jié)束;</p><p> |調(diào)號(hào)(0-11) :是指樂(lè)曲升多少個(gè)半音演奏;
34、</p><p> |升降八度(1-3) : 1:降八度, 2:不升不降, 3:升八度;</p><p> |演奏速度(1-12000):值越大速度越快;</p><p> ***************************************************************************/</p><
35、;p> #ifndef __SOUNDPLAY_H_REVISION_FIRST__</p><p> #define __SOUNDPLAY_H_REVISION_FIRST__</p><p> //**************************************************************************</p>&l
36、t;p> #define SYSTEM_OSC 12000000//定義晶振頻率12000000HZ</p><p> #define SOUND_SPACE 4/5 //定義普通音符演奏的長(zhǎng)度分率,//每4分音符間隔</p><p> sbit BeepIO = P3^7;//定義輸出管腳</p><p> unsi
37、gned int code FreTab[12] = { 262,277,294,311,330,349,369,392,415,440,466,494 }; //原始頻率表</p><p> unsigned char code SignTab[7] = { 0,2,4,5,7,9,11 }; //1~7在頻率表中的位置</p><p> unsigned
38、char code LengthTab[7]= { 1,2,4,8,16,32,64 };</p><p> unsigned char Sound_Temp_TH0,Sound_Temp_TL0;//音符定時(shí)器初值暫存 </p><p> unsigned char Sound_Temp_TH1,Sound_Temp_TL1;//音長(zhǎng)定時(shí)器初值暫存</p>
39、<p> //**************************************************************************</p><p> void InitialSound(void)</p><p><b> { </b></p><p> BeepIO = 1;&
40、lt;/p><p> Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256;// 計(jì)算TL1應(yīng)裝入的初值 (10ms的初裝值)</p><p> Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256;// 計(jì)算TH1應(yīng)裝入的初值 </p><p> TH1 = Sound
41、_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> TR1
42、= 0;</p><p> EA = 1;</p><p><b> }</b></p><p> void BeepTimer0(void) interrupt 1//音符發(fā)生中斷</p><p> { BeepIO = 0;</p><p> BeepIO = !
43、BeepIO;</p><p> TH0 = Sound_Temp_TH0;</p><p> TL0 = Sound_Temp_TL0;</p><p><b> }</b></p><p> //***************************************************
44、***********************</p><p> void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)</p><p> {BeepIO = 0;</p><p> unsigned int NewFreTab[
45、12];//新的頻率表</p><p> unsigned char i,j;</p><p> unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;</p><p> unsigned char Tone,Length,SL,SH,SM,SLen,XG
46、,FD;</p><p> for(i=0;i<12;i++) // 根據(jù)調(diào)號(hào)及升降八度來(lái)生成新的頻率表 </p><p><b> {</b></p><p> j = i + Signature;</p><p> if(j > 11)</p><p><b&
47、gt; {</b></p><p><b> j = j-12;</b></p><p> NewFreTab[i] = FreTab[j]*2;</p><p><b> }</b></p><p><b> else</b></p>&l
48、t;p> NewFreTab[i] = FreTab[j];</p><p> if(Octachord == 1)</p><p> NewFreTab[i]>>=2;</p><p> else if(Octachord == 3)</p><p> NewFreTab[i]<<=2;</p&
49、gt;<p> }</p><p> SoundLength = 0;</p><p> while(Sound[SoundLength] != 0x00)//計(jì)算歌曲長(zhǎng)度</p><p><b> {</b></p><p> SoundLength+=2;</p>
50、;<p><b> }</b></p><p> Point = 0;</p><p> Tone = Sound[Point];</p><p> Length = Sound[Point+1]; // 讀出第一個(gè)音符和它時(shí)時(shí)值</p><p> LDiv0 = 12000/Spee
51、d;// 算出1分音符的長(zhǎng)度(幾個(gè)10ms) </p><p> LDiv4 = LDiv0/4; // 算出4分音符的長(zhǎng)度 </p><p> LDiv4 = LDiv4-LDiv4*SOUND_SPACE; // 普通音最長(zhǎng)間隔標(biāo)準(zhǔn) </p><p> TR0 = 0;</p><p> TR1 =
52、1;</p><p> while(Point < SoundLength)</p><p><b> {</b></p><p> SL=Tone%10; //計(jì)算出音符 </p><p> SM=Tone/10%10; //計(jì)算出高低音 </p><p
53、> SH=Tone/100; //計(jì)算出是否升半 </p><p> CurrentFre = NewFreTab[SignTab[SL-1]+SH]; //查出對(duì)應(yīng)音符的頻率 </p><p><b> if(SL!=0)</b></p><p><b> {</b></p>
54、<p> if (SM==1) CurrentFre >>= 2; //低音 </p><p> if (SM==3) CurrentFre <<= 2; //高音</p><p> Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//計(jì)算計(jì)數(shù)器初值</p>
55、<p> Sound_Temp_TH0 = Temp_T/256; </p><p> Sound_Temp_TL0 = Temp_T%256; </p><p> TH0 = Sound_Temp_TH0; </p><p> TL0 = Sound_Temp_TL0 + 12; //加12是對(duì)中斷延時(shí)的補(bǔ)償 </p><
56、;p><b> }</b></p><p> SLen=LengthTab[Length%10]; //算出是幾分音符</p><p> XG=Length/10%10; //算出音符類型(0普通1連音2頓音) </p><p> FD=Length/100;</p><p> LDiv=LDiv
57、0/SLen; //算出連音音符演奏的長(zhǎng)度(多少個(gè)10ms)</p><p> if (FD==1) </p><p> LDiv=LDiv+LDiv/2;</p><p> if(XG!=1)</p><p> if(XG==0) //算出普通音符的演奏長(zhǎng)度 </p><p> if (SL
58、en<=4)</p><p> LDiv1=LDiv-LDiv4;</p><p><b> else</b></p><p> LDiv1=LDiv*SOUND_SPACE;</p><p><b> else</b></p><p> LDiv1=LDi
59、v/2; //算出頓音的演奏長(zhǎng)度 </p><p><b> else</b></p><p> LDiv1=LDiv;</p><p> if(SL==0) LDiv1=0;</p><p> LDiv2=LDiv-LDiv1; //算出不發(fā)音的長(zhǎng)度 </p><p> if
60、(SL!=0)</p><p><b> {</b></p><p><b> TR0=1;</b></p><p> for(i=LDiv1;i>0;i--) //發(fā)規(guī)定長(zhǎng)度的音 </p><p><b> {</b></p><p>
61、 while(TF1==0);</p><p> TH1 = Sound_Temp_TH1;</p><p> TL1 = Sound_Temp_TL1;</p><p><b> TF1=0;</b></p><p><b> }</b></p><p><
62、b> }</b></p><p> if(LDiv2!=0)</p><p><b> {</b></p><p> TR0=0; BeepIO=0;</p><p> for(i=LDiv2;i>0;i--) //音符間的間隔</p><p><b>
63、; {</b></p><p> while(TF1==0);</p><p> TH1 = Sound_Temp_TH1;</p><p> TL1 = Sound_Temp_TL1;</p><p><b> TF1=0;</b></p><p><b> }
64、</b></p><p><b> }</b></p><p> Point+=2; </p><p> Tone=Sound[Point];</p><p> Length=Sound[Point+1];</p><p><b> }</b></
65、p><p> BeepIO = 0;</p><p><b> }</b></p><p> //**************************************************************************</p><p><b> #endif</b>&
66、lt;/p><p><b> ?。?)主程序</b></p><p> #include <REG52.H></p><p> #include "SoundPlay.h"</p><p> #include<intrins.h></p><p>
67、#include<math.h></p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> int shang,key;</p><p> sbit w=P3^2;</p><p> sbit
68、 k = P3^0;//定義輸出管腳</p><p> void delay(unsigned int t)</p><p><b> {</b></p><p> unsigned int i, j;</p><p> for (i = 0;i < t;i++)</p>
69、<p> for (j = 0;j < 10;j++)</p><p><b> ;</b></p><p><b> }</b></p><p> unsigned char code table[]={0x3f,0x06,0x5b,0x4f, //0,1,2,3//</p>&l
70、t;p> 0x66,0x6d,0x7d,0x07, //4,5,6,7//</p><p> 0x7f,0x6f,0x77,0x7c, //8,9,a,b//</p><p> 0x39,0x5e,0x79,0x71 //c,d,e,f//</p><p><b> };</b></p><p>
71、 //*****************************Music******************************************************</p><p><b> //揮著翅膀的女孩</b></p><p> unsigned char code Music_Girl[]={ 0x17,0x02, 0x17,0x03
72、, 0x18,0x03, 0x19,0x02, 0x15,0x03,</p><p> 0x16,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x03, 0x18,0x03,</p><p> 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x02, 0x18,0x03,</p><p> 0x17,0x03
73、, 0x15,0x02, 0x18,0x03, 0x17,0x03, 0x18,0x02,</p><p> 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x15,0x03, 0x16,0x03,</p><p> 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x1A,0x03,</p><p>
74、 0x1B,0x03, 0x1F,0x03, 0x1F,0x03, 0x17,0x03, 0x18,0x03,</p><p> 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03,</p><p> 0x18,0x03, 0x1F,0x03, 0x1F,0x02, 0x16,0x03, 0x17,0x03,</p>
75、<p> 0x18,0x03, 0x17,0x03, 0x18,0x03, 0x20,0x03, 0x20,0x02,</p><p> 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,</p><p> 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03
76、,</p><p> 0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,</p><p> 0x1A,0x03, 0x19,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03,</p><p> 0x16,0x66, 0x17,0x04, 0x18,0x04, 0x18,0x03
77、, 0x19,0x03,</p><p> 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,</p><p> 0x00, 0x00,0x00};</p><p><b> //同一首歌</b></p><p> unsigned char code M
78、usic_Same[]={ 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x66, 0x18,0x03,</p><p> 0x17,0x02, 0x15,0x02, 0x16,0x01, 0x15,0x02, 0x10,0x02,</p><p> 0x15,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x0
79、2,</p><p> 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x02, 0x18,0x66,</p><p> 0x17,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x16,0x00,</p><p> 0x17,0x01, 0x19,0x02, 0x1B,0x02, 0x1B,0x7
80、0, 0x1A,0x03,</p><p> 0x19,0x00, 0x00,0x00 };</p><p> //兩只蝴蝶 </p><p> unsigned char code Music_Two[] ={ 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x0
81、3, 0x17,0x03,</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,0x0
82、1, 0x17,0x03, 0x16,0x03,</p><p> 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01,</p><p> 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,</p><p> 0x16,0x03, 0x15,0x0
83、3, 0x10,0x03, 0x15,0x03, 0x16,0x01,</p><p> 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,0x0
84、D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,</p><p> 0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x19,0x03,</p><p> 0x19,0x01, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01,</p><p>
85、; 0x10,0x03, 0x15,0x00, 0x00,0x00 };</p><p> //***********************************************************************************</p><p> unsigned char code Music_Gir2[]={ 0x25,0x02,0x00,0x0
86、0};</p><p> unsigned char code Music_Gir3[]={ 0x57,0x02,0x00,0x00};</p><p> unsigned char code Music_Gir4[]={ 0x84,0x02,0x00,0x00};</p><p> unsigned char code Music_Gir5[]={ 0x98
87、,0x02,0x00,0x00};</p><p> unsigned char code Music_Gir6[]={ 0xc0,0x02,0x00,0x00};</p><p> unsigned char code Music_Gir7[]={ 0x15,0x02,0x00,0x00};</p><p> unsigned char code Music
88、_Gir8[]={ 0x17,0x02,0x00,0x00};</p><p> unsigned char code Music_Gir9[]={ 0x16,0x02,0x00,0x00};</p><p> unsigned char code Music_Gir10[]={ 0x1A,0x02,0x00,0x00};</p><p> unsigned
89、char code Music_Gir11[]={ 0x1B,0x02,0x00,0x00};</p><p> unsigned char code Music_Gir12[]={ 0x0E,0x02,0x00,0x00};</p><p> unsigned char code Music_Gir13[]={ 0x19,0x02,0x00,0x00};</p><
90、;p> unsigned char code Music_Gir14[]={ 0x17,0x02,0x00,0x00};</p><p><b> //鍵盤按鍵程序 </b></p><p> void scan() // 鍵盤掃描程序</p><p><b> { </b></
91、p><p> uchar hao[4]={0x0e,0x0d,0x0b,0x07};</p><p> uchar key_[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; //決定了鍵盤按鍵布局 </p><p> uchar temp,h,j,i,high,low;</p><p> bit
92、find=0; //定義位find標(biāo)志 并賦值零</p><p><b> P0=0xf0; </b></p><p> temp=P0; //行低電平 列高電平</p><p> if(temp!=0xf0) //檢測(cè)是否有鍵按下</p><p><b>
93、; {</b></p><p> delay(20); //去抖</p><p> if(temp!=0xf0) //確定有鍵按下</p><p><b> { </b></p><p> find=1; //標(biāo)志有鍵按下</p><p> hi
94、gh=(temp>>4); //將列的狀態(tài)存入high</p><p> P0=0x0f; //翻轉(zhuǎn)行列電平</p><p> temp=P0; //再次讀取P0</p><p> low=(temp&0x0f); //將行的狀態(tài)存入low</p><p> for(i=0;i<4
95、;i++) //確定按鍵的坐標(biāo)</p><p><b> {</b></p><p> if(hao[i]==high){j=i;}</p><p> if(hao[i]==low){h=i;}</p><p><b> }</b></p><p><b>
96、 }</b></p><p><b> }</b></p><p> if(find==0){key=16;}</p><p> else key=4*h+j;</p><p> shang=key;</p><p> }
97、 </p><p> void keydown()//判斷按鍵是否按下</p><p><b> { </b></p><p><b> P0=0xF0 ;</b></p><p> if(P0!=0xF0)&l
98、t;/p><p><b> {</b></p><p><b> scan() ;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> main()</
99、b></p><p><b> {k=1;w=0;</b></p><p> InitialSound();</p><p><b> while(1)</b></p><p> {shang=20;</p><p> keydown();</p>
100、<p> if(shang==13) {P2=table[13]; k=0; delay(200);Play(Music_Girl,0,3,360);k=1;}</p><p> if(shang==14) {P2=table[14];k=0;delay(200);Play(Music_Same,0,3,360);k=1;}</p><p> if(shang==15)
101、 {P2=table[15];k=0;delay(200);Play(Music_Two,0,3,360);k=1;}</p><p> if(shang==0) {shang=20;Play(Music_Gir2,0,3,360);P2=table[0];k=0;delay(600);k=1;}</p><p> if(shang==1) {shang=20;Play(Music
102、_Gir3,0,3,360);P2=table[1];k=0;delay(600);k=1;}</p><p> if(shang==2) {shang=20;Play(Music_Gir4,0,3,360);P2=table[2];k=0;delay(600);k=1;}</p><p> if(shang==3) {shang=20;Play(Music_Gir5,0,3,36
103、0);P2=table[3];k=0;delay(600);k=1;}</p><p> if(shang==4) {shang=20;Play(Music_Gir6,0,3,360);P2=table[4];k=0;delay(600);k=1;}</p><p> if(shang==5) {shang=20;Play(Music_Gir7,0,3,360);P2=table[
104、5];k=0;delay(600);k=1;}</p><p> if(shang==6) {shang=20;Play(Music_Gir8,0,3,360);P2=table[6];k=0;delay(600);k=1;}</p><p> if(shang==7) {shang=20;Play(Music_Gir9,0,3,360);P2=table[7];k=0;delay
105、(600);k=1;}</p><p> if(shang==8) {shang=20;Play(Music_Gir10,0,3,360);P2=table[8];k=0;delay(600);k=1;}</p><p> if(shang==9) {shang=20;Play(Music_Gir11,0,3,360);P2=table[9];k=0;delay(600);k=1;
106、}</p><p> if(shang==10) {shang=20;Play(Music_Gir12,0,3,360);P2=table[10];k=0;delay(600);k=1;}</p><p> if(shang==11) {shang=20;Play(Music_Gir13,0,3,360);P2=table[11];k=0;delay(600);k=1;}</p&
107、gt;<p> if(shang==12) {shang=20;Play(Music_Gir14,0,3,360);P2=table[12];k=0;delay(600);k=1;}</p><p><b> }</b></p><p><b> }</b></p><p><b> 七.元
108、件清單</b></p><p> AT89S51芯片1個(gè)</p><p> 二極管IN40044個(gè)(電橋) </p><p> 極性電容220uf/50V2個(gè)</p><p> 10uf 1個(gè)</p><p> 4電容105
109、2個(gè)</p><p> 30pf 2個(gè)</p><p> 5電阻排1K1個(gè)</p><p> 6電阻5001個(gè)</p><p> 1K9個(gè)</p><p> 5.1K1個(gè)</p><p> 10K
110、1個(gè)</p><p> 7晶振 12MHZ1個(gè)</p><p> 8紅色發(fā)光LED 1個(gè)</p><p> 97段數(shù)碼管 共陰1個(gè)</p><p> 10開關(guān)17個(gè)</p><p> 11喇叭
111、1個(gè)</p><p> 12變壓器1個(gè)</p><p> 13下載線1根</p><p> 14LM78051個(gè)</p><p> 159015PNP1個(gè)</p><p> 169013NPN1個(gè)</p
112、><p><b> 八.設(shè)計(jì)心得與體會(huì)</b></p><p> 在為期一周的單片機(jī)課程設(shè)計(jì)中,我在增長(zhǎng)知識(shí)、提高能力的同時(shí),產(chǎn)生了很深的感觸。從初步定下方案到編出程序,從不斷的運(yùn)行排錯(cuò)到調(diào)試成功,在整個(gè)設(shè)計(jì)過(guò)程中,著實(shí)受益匪淺,不僅可以鞏固以前所學(xué)過(guò)的知識(shí),而且學(xué)到了很多在書本上所沒有學(xué)到過(guò)的東西。</p><p> 我懂得了理論與實(shí)際相結(jié)
113、合是很重要的,眼高手低的現(xiàn)象常常難以避免。只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來(lái),從理論中得出結(jié)論,才能提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。</p><p> 在設(shè)計(jì)的過(guò)程中難免會(huì)遇到各種各樣的問(wèn)題,但是在這重重困難之中我了解到自己的真實(shí)水平,并努力提高自己。同時(shí)我明白,對(duì)于想要成功的人來(lái)說(shuō)更重要的不是知識(shí)或技能,而是克服困難的信心。實(shí)踐證明看似“莫名其妙”的錯(cuò)誤只要堅(jiān)持嘗試必定有辦法解決,應(yīng)靈活地從各方面找
114、原因而不是一味歸咎于實(shí)驗(yàn)儀器或軟件平臺(tái)。</p><p> 同時(shí)我意識(shí)到合作的精神是非常重要的。有目的的分工可以提高課程設(shè)計(jì)的質(zhì)量和效率,互幫互助的學(xué)風(fēng)可以使每個(gè)成員走最少的彎路而增長(zhǎng)最多的知識(shí)。</p><p> 通過(guò)這次的課程設(shè)計(jì)作品的制作讓我對(duì)單片機(jī)的理論有了更加深入的了解,同時(shí)在具體的制作過(guò)程中我們發(fā)現(xiàn)現(xiàn)在書本上的知識(shí)與實(shí)際的應(yīng)用存在著不小的差距,書本上的知識(shí)很多都是理想化后的
115、結(jié)論,忽略了很多實(shí)際的因素,或者涉及的不全面,可在實(shí)際的應(yīng)用時(shí)這些是不能被忽略的,我們不得不考慮這方的問(wèn)題,這讓我們無(wú)法根據(jù)書上的理論就輕易得到預(yù)想中的結(jié)果,有時(shí)結(jié)果甚至很差別很大。通過(guò)這次實(shí)訓(xùn),基本掌握了Protel99SE原理圖的畫法,并畫出PCB圖,如何利用protues進(jìn)行仿真,利用keil生成hex文件。通過(guò)開發(fā)板的設(shè)計(jì)和硬件搭建的過(guò)程,使我對(duì)51系單片機(jī)的接口有了更深層次的理解,熟悉了一些單片機(jī)常用的外圍電路引腳和連接方法。
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ì)報(bào)告
- 單片機(jī)電子琴課程設(shè)計(jì)
- 單片機(jī)電子琴課程設(shè)計(jì)
- 單片機(jī)電子琴課程設(shè)計(jì) (2)
- 課程設(shè)計(jì)----簡(jiǎn)易單片機(jī)電子琴設(shè)計(jì)
- 單片機(jī)電子琴課程設(shè)計(jì)--基于單片機(jī)的可存儲(chǔ)式電子琴設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告--電子琴
- 單片機(jī)電子琴課程設(shè)計(jì)--帶存儲(chǔ)播放功能的簡(jiǎn)易電子琴設(shè)計(jì)
- 《單片機(jī)原理及應(yīng)用》課程設(shè)計(jì)—單片機(jī)電子琴設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---電子琴
- 單片機(jī)課程設(shè)計(jì)(電子琴)
- 電子琴課程設(shè)計(jì)--基于單片機(jī)的電子琴設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)-電子琴
- 單片機(jī)課程設(shè)計(jì)——電子琴
- 單片機(jī)原理課程設(shè)計(jì)報(bào)告--電子琴
- 電子琴課程設(shè)計(jì)--基于單片機(jī)的電子琴設(shè)計(jì)
- 電子琴課程設(shè)計(jì)-- 基于單片機(jī)的電子琴設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---電子琴設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告---簡(jiǎn)單電子琴設(shè)計(jì)
- 單片機(jī)電子系統(tǒng)課程設(shè)計(jì)—簡(jiǎn)易電子琴
評(píng)論
0/150
提交評(píng)論