簡易電子琴課程設計 (2)_第1頁
已閱讀1頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  課程名稱:現(xiàn)代電子技術綜合實驗 </p><p>  實驗名稱:簡易電子琴 </p><p>  學生姓名: </p><p>  班級: 08通信B班 </p><p>  學號: &

2、lt;/p><p>  實驗地點: </p><p>  實驗學時: </p><p><b>  摘 要</b></p><p>  當前市場上的玩具市場需求量大,其中電子琴就是一個很好的應用,本設計的主要任務是要實現(xiàn)以單片機STC89C51RC為控制核

3、心的簡單音樂發(fā)生器。本系統(tǒng)由51系列單片機STC89C51RC,矩陣鍵盤、LED數(shù)碼管、揚聲器組成,可通過按壓不同的按鍵控制不同音符的播放和顯示。</p><p>  關鍵詞:51單片機;電子琴;行列鍵盤;定時/計數(shù)器</p><p><b>  目錄</b></p><p>  1 項目的主要任務4</p><p>

4、  2 總體設計方案5\</p><p>  2.1 控制模塊選擇方案5</p><p>  3.1 按鍵選擇方案5</p><p><b>  3 硬件設計6</b></p><p>  3.1 SST89E58單片機簡介6</p><p>  3.2系統(tǒng)工作原理8</p>

5、;<p>  3.3系統(tǒng)硬件總體設計9</p><p>  3.4 LED顯示模塊 10</p><p>  3.5揚聲器模塊 10</p><p>  3.6按鍵模塊 10</p><p><b>  4 軟件設計12</b></p><p>  4.1 顯示模塊12&

6、lt;/p><p>  4.2 按鍵模塊12</p><p><b>  5 系統(tǒng)調(diào)試14</b></p><p><b>  6 設計總結15</b></p><p>  附錄1 實物圖16</p><p>  附錄2 C51源程序清單17</p>&l

7、t;p>  參考文獻錯誤!未定義書簽。</p><p><b>  1、項目主要任務</b></p><p>  1.1 課程設計的目的</p><p>  鞏固和運用所學課程,理論聯(lián)系實際,提高分析、解決計算機技術實際問題的獨立工作能力,通過對一個簡易的八音符電子琴的設計,進一步加深對計算機原理以及數(shù)字電路應用技術方面的了解與認識,進

8、一步熟悉數(shù)字電路系統(tǒng)設計、制作與調(diào)試的方法和步驟。鞏固所學課堂知識,理論聯(lián)系實際,提高分析、解決計算機技術實際問題的獨立工作能力。為了進一步了解計算機組成原理與系統(tǒng)結構,用C語言去控制將會使我們對本專業(yè)知識可以更好地掌握。</p><p>  1.2 課程設計的內(nèi)容</p><p> ?。?)設計一個簡易的八音符電子琴,它可通過按鍵輸入來控制音響。</p><p>

9、 ?。?)演奏時可以選擇是手動演奏(由鍵盤輸入)還是自動演奏已存入的樂曲。</p><p> ?。?)能夠自動演奏多首樂曲,且每首樂曲可重復演奏。</p><p><b>  2、總體設計方案</b></p><p>  2.1 控制模塊選擇方案</p><p>  由于STC89C51單片機性價比較高,并完全滿足本設計

10、作品智能化的要求,所以采用STC89C51單片機進行控制。</p><p>  2.2 按鍵選擇方案</p><p>  傳統(tǒng)電子琴可以用鍵盤上的“1”到“A”鍵演奏從低SO到高DO等11音。該設計有13個按鈕矩陣,設計成21個音,比傳統(tǒng)音階范圍大,彈奏效果好。</p><p>  該設計要實現(xiàn)一種由單片機控制的電子琴,具有4X4行列式鍵盤,并根據(jù)按鍵通過揚聲器將音

11、樂播放出來。所以本系統(tǒng)由以51單片機為主控核心,和矩陣鍵盤、揚聲器、LED顯示管模塊一起組合而成。具體如圖2.1。</p><p>  圖2.1 系統(tǒng)總體框圖流程圖</p><p><b>  3、硬件設計</b></p><p>  3.1 STC89C51RC單片機簡介</p><p>  STC89C51RC是

12、一種高性能低功耗的采用CMOS工藝制造的8位微控制器,它提供下列標準特征:4K字節(jié)的程序存儲器,128字節(jié)的RAM,32條I/O線,2個16位定時器/計數(shù)器, 一個5中斷源兩個優(yōu)先級的中斷結構,一個雙工的串行口, 片上震蕩器和時鐘電路。</p><p><b>  引腳說明:</b></p><p><b>  ·VCC:電源電壓</b&g

13、t;</p><p><b>  ·GND:地</b></p><p>  ·P0口:P0口是一組8位漏極開路型雙向I/O口,作為輸出口用時,每個引腳能驅(qū)動8個TTL邏輯門電路。當對0端口寫入1時,可以作為高阻抗輸入端使用。</p><p>  當P0口訪問外部程序存儲器或數(shù)據(jù)存儲器時,它還可設定成地址數(shù)據(jù)總線復用的形式。在

14、這種模式下,P0口具有內(nèi)部上拉電阻。</p><p>  在EPROM編程時,P0口接收指令字節(jié),同時輸出指令字節(jié)在程序校驗時。程序校驗時需要外接上拉電阻。</p><p>  ·P1口:P1口是一帶有內(nèi)部上拉電阻的8位雙向I/O口。P1口的輸出緩沖能接受或輸出4個TTL邏輯門電路。當對P1口寫1時,它們被內(nèi)部的上拉電阻拉升為高電平,此時可以作為輸入端使用。當作為輸入端使用時,P

15、1口因為內(nèi)部存在上拉電阻,所以當外部被拉低時會輸出一個低電流(IIL)。</p><p>  ·P2口:P2是一帶有內(nèi)部上拉電阻的8位雙向的I/O端口。P2口的輸出緩沖能驅(qū)動4個TTL邏輯門電路。當向P2口寫1時,通過內(nèi)部上拉電阻把端口拉到高電平,此時可以用作輸入口。作為輸入口,因為內(nèi)部存在上拉電阻,某個引腳被外部信號拉低時會輸出電流(IIL)。</p><p>  P2口在訪問

16、外部程序存儲器或16位地址的外部數(shù)據(jù)存儲器(例如MOVX @ DPTR)時,P2口送出高8位地址數(shù)據(jù)。在這種情況下,P2口使用強大的內(nèi)部上拉電阻功能當輸出1時。當利用8位地址線訪問外部數(shù)據(jù)存儲器時(例MOVX @R1),P2口輸出特殊功能寄存器的內(nèi)容。</p><p>  當EPROM編程或校驗時,P2口同時接收高8位地址和一些控制信號。</p><p>  ·P3口:P3是一帶

17、有內(nèi)部上拉電阻的8位雙向的I/O端口。P3口的輸出緩沖能驅(qū)動4個TTL邏輯門電路。當向P3口寫1時,通過內(nèi)部上拉電阻把端口拉到高電平,此時可以用作輸入口。作為輸入口,因為內(nèi)部存在上拉電阻,某個引腳被外部信號拉低時會輸出電流(IIL)。</p><p>  P3口同時具有STC89C51RC的多種特殊功能,具體如表1所示。</p><p>  表3-1 P3口的第二功能</p>

18、<p>  ·RST:復位輸入。當振蕩器工作時,RST引腳出現(xiàn)兩個機器周期的高電平將使單片機復位。</p><p>  ·ALE/:當訪問外部存儲器時,地址鎖存允許是一輸出脈沖,用以鎖存地址的低8位字節(jié)。當在Flash編程時還可以作為編程脈沖輸出()。</p><p>  一般情況下,ALE是以晶振頻率的1/6輸出,可以用作外部時鐘或定時目的。但也要注意,

19、每當訪問外部數(shù)據(jù)存儲器時將跳過一個ALE脈沖。</p><p>  ·:程序存儲允許時外部程序存儲器的讀選通信號。/VPP:外部訪問允許。為了使單片機能夠有效的傳送外部數(shù)據(jù)存儲器從0000H到FFFH單元的指令,必須同GND相連接。需要主要的是,如果加密位1被編程,復位時EA端會自動內(nèi)部鎖存。</p><p>  當執(zhí)行內(nèi)部編程指令時,應該接到VCC端。</p>&

20、lt;p>  ·XTAL1:振蕩器反相放大器以及內(nèi)部時鐘電路的輸入端。</p><p>  ·XTAL2:振蕩器反相放大器的輸出端。</p><p><b>  3.2系統(tǒng)工作原理</b></p><p>  本系統(tǒng)掃描鍵盤矩陣、顯示按鍵、揚聲器發(fā)出對應音符。</p><p>  4*4行列式鍵

21、盤識別及顯示原理如下:</p><p>  組成鍵盤的按鍵有機械式、電容式、導電橡膠式、薄膜式多種,但不管什么形式,其作用都是一個使電路接通與斷開的開關。目前微機系統(tǒng)中使用的鍵盤按其功能不同,通??煞譃榫幋a鍵盤和非編碼鍵盤兩種基本類型。</p><p>  編碼鍵盤:鍵盤本身帶有實現(xiàn)接口主要功能所需的硬件電路。不僅能自動檢測被按下的鍵,并完成去抖動、防串鍵等功能,而且能提供與被按鍵功能對應

22、的鍵碼(如ASCII碼)送往CPU。所以,編碼鍵盤接口簡單、使用方便。但由于硬件電路較復雜,因而價格較貴。</p><p>  非編碼鍵盤:鍵盤只簡單地提供按鍵開關的行列矩陣。有關按鍵的識別、鍵碼的確定與輸入、去抖動等功能均由軟件完成。目前微機系統(tǒng)中,一般為了降低成本大多數(shù)采用非編碼鍵盤。</p><p>  鍵盤接口必須具有去抖動、防串鍵、按鍵識別和鍵碼產(chǎn)生4個基本功能。</p&g

23、t;<p> ?。?)去抖動:每個按鍵在按下或松開時,都會產(chǎn)生短時間的抖動。抖動的持續(xù)時間與鍵的質(zhì)量相關,一般為5—20mm。所謂抖動是指在識別被按鍵是必須避開抖動狀態(tài),只有處在穩(wěn)定接通或穩(wěn)定斷開狀態(tài)才能保證識別正確無誤。去抖問題可通過軟件延時或硬件電路解決。</p><p> ?。?)防串鍵:防串鍵是為了解決多個鍵同時按下或者前一按鍵沒有釋放又有新的按鍵按下時產(chǎn)生的問題。常用的方法有雙鍵鎖定和N鍵

24、輪回兩種方法。雙鍵鎖定,是當有兩個或兩個以上的按鍵按下時,只把最后釋放的鍵當作有效鍵并產(chǎn)生相應的鍵碼。N鍵輪回,是當檢測到有多個鍵被按下時,能根據(jù)發(fā)現(xiàn)它們的順序依次產(chǎn)生相應鍵的鍵碼。</p><p>  (3)被按鍵識別:如何識別被按鍵是接口解決的主要問題,一般可通過軟硬結合的方法完成。常用的方法有行掃描法和線反轉(zhuǎn)法兩種。行掃描法的基本思想是,由程序?qū)︽I盤逐行掃描,通過檢測到的列輸出狀態(tài)來確定閉合鍵,為此,需要設

25、置入口、輸出口一個,該方法在微機系統(tǒng)中被廣泛使用。線反轉(zhuǎn)法的基本思想是通過行列顛倒兩次掃描來識別閉合鍵,為此需要提供兩個可編程的雙向輸</p><p><b>  入/輸出端口。</b></p><p> ?。?)鍵碼產(chǎn)生:為了從鍵的行列坐標編碼得到反映鍵功能的鍵碼,一般在內(nèi)存區(qū)中建立一個鍵盤編碼表,通過查表獲得被按鍵的鍵碼。</p><p>

26、  總體電路具體流程圖如圖:</p><p>  3.3系統(tǒng)硬件總體設計</p><p>  本系統(tǒng)由鍵盤矩陣、LED顯示管、揚聲器這幾個部分組成,LED顯示管顯示當前按鍵,揚聲器發(fā)出對應音符。硬件總體設計圖如下:</p><p>  圖3.3 系統(tǒng)硬件總體設計圖</p><p>  3.4 LED顯示模塊</p><p

27、>  LED顯示模塊的接口電路如圖3.4所示。圖中,數(shù)碼管采用共陽結構,為節(jié)省單片機口線,采用動態(tài)掃描顯示。PNP型三極管Q1~Q4實現(xiàn)數(shù)碼管驅(qū)動。</p><p>  圖3.4 LED顯示模塊接口電路</p><p><b>  3.5 揚聲器模塊</b></p><p>  矩陣掃描揚聲器發(fā)出對應音符模塊如下:</p>

28、<p>  圖3.5 揚聲器模塊</p><p><b>  3.6 按鍵模塊</b></p><p>  對鍵盤掃描電路的掃描方式有行掃描法和線反轉(zhuǎn)法,在此次程序編寫中,采用行掃描法,通過掃描口線電平信息給單片機,經(jīng)處理程序,判斷出是哪個按鍵按下,并送主程序調(diào)子程序以實現(xiàn)不同功能。</p><p><b>  4、軟件

29、設計</b></p><p><b>  4.1 顯示模塊</b></p><p>  七段LED顯示器內(nèi)部由七個條形發(fā)光二極管和一個小圓點發(fā)光二極管組成,根據(jù)各管的極管的接線形式,可分成共陰極型和共陽極型。LED數(shù)碼管的g-a七個發(fā)光二極管因加正電壓而發(fā)亮,因加零電壓而不以發(fā)亮,不同亮暗的組合就能形成不同的字形,這種組合稱之為字形碼。</p>

30、<p>  本系統(tǒng)按鍵顯示模塊軟件流程圖如圖4.1:</p><p><b>  4.2 按鍵模塊</b></p><p>  一首音樂是許多不同的音階組成的,而每個音階對應著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構成我們所想要的音樂了,當然對于單機來產(chǎn)生不同的頻率非常方便,我們可以利用單片機的定時/計數(shù)器T0來產(chǎn)生這樣方波頻率信號,因此,

31、我們只要把一首歌曲的音階對應頻率關系正確即可。</p><p>  利用AT89C51的內(nèi)部定時器使其工作計數(shù)器模式(MODE1)下,改變計數(shù)值TH0及TL0以產(chǎn)生不同頻率的方法產(chǎn)生不同音階,例如,頻率為523Hz,其周期T=1/523=1912μs,因此只要令計數(shù)器計時956μs/1μs=956,每計數(shù)956次時將I/O反相,就可得到中音DO(523Hz)。</p><p>  計數(shù)脈沖

32、值與頻率的關系式:</p><p><b>  N=fi÷2÷fr</b></p><p>  上式中,N是計數(shù)值;fi是機器頻率(晶體振蕩器為12MHz時,其頻率為1MHz);fr是想要產(chǎn)生的頻率。</p><p>  其計數(shù)初值T的求法如下:</p><p>  T=65536-N=65536-f

33、i÷2÷fr</p><p>  例如:設K=65536,fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的計數(shù)值。</p><p>  T=65536-N=65536-fi÷2÷fr=65536-1000000÷2÷fr=65536-500000/fr</p><p&

34、gt;  低音DO的T=65536-500000/262=63627</p><p>  中音DO的T=65536-500000/523=64580</p><p>  高音DO的T=65536-500000/1046=65059</p><p>  本系統(tǒng)按鍵發(fā)出對應音符模塊軟件流程圖如圖4.2:</p><p><b>  5、

35、系統(tǒng)調(diào)試</b></p><p>  調(diào)試是電路與系統(tǒng)設計中的重要環(huán)節(jié),通過調(diào)試,逐步排除電路連接、元件裝配、程序運行過程中可能存在的各種故障,使系統(tǒng)在滿足功能要求的前提下穩(wěn)定、可靠地工作。</p><p>  焊好電路板后先用萬用表檢測是否存在短路故障,有的話一定要找到短路點,否則,一旦通電,極有可能損壞電源或電路板。在沒有短路存在的情況下,初次上電也一定要細心,不要接反電源

36、極性,否則很容易燒壞芯片。</p><p>  電路板除短路或斷路外還可能存在其它故障,如元器件老化失效或管腳接錯等,為了驗證電路板硬件的正確性,可先編寫一些針對硬件各單元的基本測試程序,經(jīng)編譯、連接、轉(zhuǎn)換后下載到單片機運行,發(fā)現(xiàn)硬件故障要及時排除,直到各部分硬件都能獨立正常工作。</p><p><b>  6、設計總結</b></p><p&g

37、t;  單片機作為我們的主要專業(yè)課之一,雖然在開學初我對這門課并沒有太大興趣,覺得那些程序枯燥乏味,但在這次課程設計后我發(fā)現(xiàn)自己在一點一滴的努力中對單片機的興趣也在逐漸增加。在課堂上我們掌握的僅僅是理論上的知識,但此次的課程設計鍛煉了我們的實踐能力,讓我們學會如何把學到的專業(yè)理論知識運用到實踐中去。</p><p>  整個設計過程中,不僅鞏固了書本知識,更學到了許多平時不會去注意的知識,這是在設計過程中遇到問題

38、而查閱大量資料去解決才能獲得的。</p><p>  同時,課程設計還鍛煉了我們的思維能力。要做好一個設計,必須在設計之前先根據(jù)要設計的內(nèi)容選取合適的單片機和設計方案,對所用單片機的內(nèi)部結構有一個系統(tǒng)的了解;要有一個清晰的思路和一個完整的軟件流程圖;在設計程序時,一次就想設計好是不現(xiàn)實的,必須經(jīng)過反復的改進和完善,不僅能實現(xiàn)應有的功能,并能完整的展現(xiàn)出自己的思路;碰到問題時不要著急,這正是一個學習分析的好機會,解

39、決過后之后就不會困于相同的問題了。</p><p>  另外,同學間的交流也能讓我們吸收不同的思維,互幫互助。還要感謝指導老師在我們遇到困難時給予我們的建議與幫助。</p><p>  課程設計雖然結束了,但是從中學到的知識卻會讓我受益終生。發(fā)現(xiàn)、提出、分析、解決問題和實踐能力的提高都將益于今后的學習工作。</p><p><b>  附錄1實物圖<

40、/b></p><p>  附錄2 C51源程序清單</p><p>  #include<reg51.h></p><p>  #include<SoundPlay.h></p><p>  #include<intrins.h></p><p>  #define uch

41、ar unsigned char</p><p>  #define uint unsigned int</p><p><b>  //共陽數(shù)碼管編碼</b></p><p>  uchar code DSY_Table[] =</p><p>  { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x

42、82,0xf8,0x80, //0,1,2,3,4,5,6,7,8</p><p>  0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xBF}; //9,A,B,C,D,E,F,-</p><p>  //各音符應對的延時</p><p>  uint code Tone_Delay_Table[] =</p>&

43、lt;p>  {64580,64684,64777,64820, //中1DO,中2RE,中3ME,中4FA</p><p>  64898,64968,65030,63628, //中5SO,中6LA,中7SI,低1DO</p><p>  64021,64260,64524, //低3ME,低5SO,低7SI</p><p>  6

44、5058,65110,65157,65178, //高1DO,高2RE,高3ME,高4FA</p><p>  65217,65252,65283,63835, //高5SO,高6LA,高7SI,低2RE</p><p>  64103,64400,64524}; //低4FA,低6LA,低7SI0</p><p>  uchar code l

45、ed99[22][4] ={{0xf9,0xBF,0xBF,0xBF},</p><p>  {0xa4,0xBF,0xBF,0xBF},</p><p>  {0xb0,0xBF,0xBF,0xBF},</p><p>  {0x99,0xBF,0xBF,0xBF},</p><p>  {0x92,0xBF,0xBF,0xBF},<

46、;/p><p>  {0x82,0xBF,0xBF,0xBF},</p><p>  {0xf8,0xBF,0xBF,0xBF},</p><p>  {0xf9,0xF7,0xF7,0xF7},</p><p>  {0xb0,0xF7,0xF7,0xF7},</p><p>  {0x92,0xF7,0xF7,0xF7

47、},</p><p>  {0xf8,0xF7,0xF7,0xF7},</p><p>  {0xf9,0xFE,0xFE,0xFE},</p><p>  {0xa4,0xFE,0xFE,0xFE},</p><p>  {0xb0,0xFE,0xFE,0xFE},</p><p>  {0x99,0xFE,0xFE

48、,0xFE},</p><p>  {0x92,0xFE,0xFE,0xFE},</p><p>  {0x82,0xFE,0xFE,0xFE},</p><p>  {0xf8,0xFE,0xFE,0xFE},</p><p>  {0xa4,0xF7,0xF7,0xF7},</p><p>  {0x99,0xF7

49、,0xF7,0xF7},</p><p>  {0x82,0xF7,0xF7,0xF7},</p><p>  {0xf8,0xF7,0xF7,0xF7}</p><p><b>  };</b></p><p>  unsigned char code Music_Girl[]={ 0x17,0x02, 0x17,0x

50、03, 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,0x

51、03, 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&g

52、t;  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&g

53、t;<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,0x

54、03,</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,0x

55、03, 0x19,0x03,</p><p>  0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,</p><p>  0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03,</p><p>  0x1B,0x03, 0x19,0x03, 0x19,0x

56、03, 0x15,0x03, 0x1A,0x66,</p><p>  0x1A,0x03, 0x19,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,</p><p>  0x1F,0x00, 0x1A,0x03, 0x1A,0x03, 0x1A,0x03, 0x1B,0x03,</p><p>  0x1B,0x03, 0x1A,0x

57、03, 0x19,0x03, 0x19,0x02, 0x17,0x03,</p><p>  0x15,0x17, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x18,0x03,</p><p>  0x17,0x04, 0x18,0x0E, 0x18,0x03, 0x17,0x04, 0x18,0x0E,</p><p>  0x18,0x

58、66, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03,</p><p>  0x20,0x03, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66,</p><p>  0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03,</p><p&g

59、t;  0x1F,0x66, 0x1F,0x04, 0x1B,0x0E, 0x1B,0x03, 0x19,0x03,</p><p>  0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,</p><p>  0x15,0x03, 0x15,0x03, 0x17,0x03, 0x16,0x66, 0x17,0x04,</p&g

60、t;<p>  0x18,0x04, 0x18,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,</p><p>  0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03,</p><p>  0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x

61、03,</p><p>  0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,</p><p>  0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x00, 0x18,0x02,</p><p>  0x18,0x03, 0x1A,0x03, 0x19,0x0D, 0x15,0x

62、03, 0x15,0x02,</p><p>  0x18,0x66, 0x16,0x02, 0x17,0x02, 0x15,0x00, 0x00,0x00};</p><p>  unsigned char code Music_Same[]={ 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x66, 0x18,0x03,</p><p

63、>  0x17,0x02, 0x15,0x02, 0x16,0x01, 0x15,0x02, 0x10,0x02,</p><p>  0x15,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x02,</p><p>  0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x02, 0x18,0x66,</p

64、><p>  0x17,0x03, 0x19,0x02, 0x16,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,

65、0x02,</p><p>  0x1A,0x0D, 0x19,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,

66、0x03, 0x0F,0x0C,</p><p>  0x10,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,

67、0x03, 0x17,0x00, 0x1F,0x01,</p><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,

68、0x01, 0x15,0x02, 0x16,0x02, 0x17,0x70,</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,

69、0x01, 0x11,0x01, 0x11,0x66, 0x10,0x03, 0x0F,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

70、>  0x00,0x00 };</p><p>  unsigned char code Music_love[]={ 0x19,0x03, 0x19,0x03, 0x19,0x03, 0x19,0x04, 0x19,0x0E,</p><p>  0x19,0x04, 0x19,0x0E, 0x1A,0x03, 0x19,0x7A, 0x20,0x03,</p>&l

71、t;p>  0x20,0x04, 0x1B,0x0E, 0x1B,0x03, 0x19,0x03, 0x1F,0x0E,</p><p>  0x1F,0x7A, 0x15,0x04, 0x1F,0x03, 0x1F,0x04, 0x19,0x0E,</p><p>  0x19,0x0E, 0x17,0x03, 0x1A,0x0E, 0x1A,0x15, 0x19,0x03,<

72、;/p><p>  0x19,0x03, 0x19,0x03, 0x19,0x03, 0x19,0x03, 0x1A,0x04,</p><p>  0x19,0x0E, 0x1A,0x0E, 0x19,0x7B, 0x19,0x04, 0x20,0x03,</p><p>  0x20,0x04, 0x1B,0x0E, 0x1B,0x04, 0x19,0x03, 0x

73、1F,0x0E,</p><p>  0x1F,0x7A, 0x15,0x04, 0x1F,0x03, 0x1F,0x04, 0x19,0x0E,</p><p>  0x19,0x04, 0x17,0x03, 0x1A,0x0E, 0x1A,0x15, 0x1A,0x03,</p><p>  0x1A,0x04, 0x1A,0x0E, 0x1A,0x03, 0x

74、1A,0x04, 0x1B,0x0E,</p><p>  0x1B,0x04, 0x1F,0x03, 0x1F,0x0E, 0x1F,0x03, 0x1B,0x03,</p><p>  0x1A,0x04, 0x19,0x04, 0x1A,0x03, 0x1A,0x15, 0x1B,0x03,</p><p>  0x1B,0x04, 0x21,0x0E, 0x

75、21,0x67, 0x1B,0x04, 0x1A,0x67,</p><p>  0x19,0x04, 0x1A,0x04, 0x1B,0x7B, 0x1F,0x0E, 0x1B,0x15,</p><p>  0x1A,0x03, 0x1A,0x03, 0x1A,0x03, 0x1A,0x04, 0x1B,0x0E,</p><p>  0x1B,0x04, 0x

76、1F,0x03, 0x1F,0x0E, 0x1F,0x03, 0x1B,0x03,</p><p>  0x1A,0x04, 0x19,0x04, 0x1A,0x0D, 0x1A,0x15, 0x1B,0x03,</p><p>  0x1B,0x04, 0x21,0x0D, 0x21,0x67, 0x1B,0x04, 0x1A,0x0E,</p><p>  0x

77、1A,0x67, 0x19,0x04, 0x1A,0x04, 0x1F,0x7B, 0x1F,0x0E,</p><p>  0x21,0x0D, 0x20,0x01, 0x21,0x01, 0x23,0x01, 0x1F,0x00,</p><p>  0x21,0x03, 0x22,0x03, 0x23,0x03, 0x24,0x0D, 0x24,0x03,</p>&l

78、t;p>  0x23,0x03, 0x1F,0x0D, 0x1F,0x0D, 0x1F,0x17, 0x1A,0x03,</p><p>  0x1F,0x03, 0x24,0x03, 0x21,0x03, 0x21,0x16, 0x1A,0x0D,</p><p>  0x1F,0x0D, 0x1B,0x03, 0x1B,0x16, 0x21,0x01, 0x23,0x01,<

79、;/p><p>  0x1F,0x00, 0x21,0x03, 0x22,0x03, 0x23,0x03, 0x24,0x0D,</p><p>  0x24,0x04, 0x23,0x04, 0x1F,0x0D, 0x1F,0x0D, 0x21,0x0D,</p><p>  0x20,0x03, 0x1F,0x0D, 0x20,0x03, 0x1F,0x00, 0x

80、00,0x00 };</p><p>  sbit BEEP = P3^7; //蜂鳴器</p><p>  uchar keys=0x8;</p><p>  uint i,led;// 聲明按鈕及播放譜變量 </p><p>  uchar KeyNo; </p><p>  uchar fl

81、ag=0; </p><p>  uchar flag1=0; //按鍵序號</p><p>  uchar flag2=0;</p><p>  //--------------------------------------------------------------------------------</p><

82、;p><b>  //延時</b></p><p>  //--------------------------------------------------------------------------------</p><p>  void DelayMS(uchar x)</p><p><b>  {</b&

83、gt;</p><p><b>  uchar i;</b></p><p>  while( x--) for(i =0;i< 120;i++);</p><p><b>  }</b></p><p>  //----------------------------------------

84、----------------------------------------</p><p>  //按鍵矩陣掃描子程序</p><p>  //--------------------------------------------------------------------------------</p><p>  void Keys_Scan()&l

85、t;/p><p><b>  {</b></p><p>  uchar Tmp,k;</p><p>  //高四位置 0,放入四行</p><p>  P1 = 0x0F;</p><p>  if(P1!=0x0F)</p><p><b>  {</b&

86、gt;</p><p>  DelayMS(20);</p><p><b>  };</b></p><p>  //按鍵后00001111將變成0000XXXX,x中1個為0,3個仍為1</p><p>  //下面的異或操作會把3個1變成0,唯一的0變成1</p><p>  Tmp = P

87、1 ^ 0x0F;</p><p>  //判斷按鍵發(fā)生于0~3列中的哪一列</p><p>  switch (Tmp)</p><p><b>  {</b></p><p>  case 1 :k=3; break;</p><p>  case 2 :k=2; break;</p

88、><p>  case 4 :k=1; break;</p><p>  case 8 :k=0; break;</p><p>  default:return;//無鍵按下</p><p><b>  }</b></p><p>  //低四位置0,放入四列</p><p&

89、gt;  P1 = 0xF0;</p><p>  DelayMS(2);</p><p>  //按鍵后11110000將變成XXXX0000,x中1個為0,3個仍為1</p><p>  //下面的表達式會將高四位移至低四位,并將其中唯一的0變?yōu)?,其余為0</p><p>  Tmp = (P1>>4) ^ 0x0F;<

90、;/p><p>  //對0~3行分別附加起始值0,4,8,12</p><p>  switch (Tmp)</p><p><b>  {</b></p><p>  case 1 :k+=0; break;</p><p>  case 2 :k+=4; break;</p>

91、<p>  case 4 :k+=8; break;</p><p>  case 8 :k+=12; break;</p><p>  default:return;</p><p><b>  }</b></p><p><b>  KeyNo= k;</b></p&g

92、t;<p><b>  }</b></p><p>  //--------------------------------------------------------------------------------------</p><p>  //定時器0中斷程序,不同頻率的聲音由該中斷產(chǎn)生</p><p>  //--

93、------------------------------------------------------------------------------------</p><p>  void Play_Tone() interrupt 3</p><p><b>  {</b></p><p>  TH1 = Tone_Delay_Ta

94、ble[ KeyNo]/256;</p><p>  TL1 = Tone_Delay_Table[ KeyNo]%256;</p><p>  BEEP= ~BEEP;</p><p><b>  }</b></p><p>  //-------------------------------------------

95、----------------------------------------------------</p><p><b>  //主程序</b></p><p>  //-----------------------------------------------------------------------------------------------&

96、lt;/p><p>  void main()</p><p><b>  {</b></p><p>  TMOD=0x11;</p><p><b>  IE=0x8A;</b></p><p><b>  P2=0x77;</b></p>

97、<p><b>  while(1)</b></p><p><b>  {</b></p><p><b>  P1=0xF0;</b></p><p>  while(P1==0xF0)</p><p><b>  {</b></p&

98、gt;<p>  for(i=0;i<4;i++)</p><p><b>  {</b></p><p>  P2=_crol_(P2,1);</p><p>  P0=led99[led][i];</p><p>  DelayMS(1);</p><p>&l

99、t;b>  };</b></p><p><b>  }; </b></p><p>  Keys_Scan();</p><p>  ET1 = 1;</p><p>  if(KeyNo==11)</p><p><b>  { </b>&l

100、t;/p><p><b>  flag=1;</b></p><p><b>  };</b></p><p>  if(KeyNo==12)</p><p><b>  { </b></p><p><b>  flag1=1;</b&g

101、t;</p><p>  keys=_crol_(keys,1);</p><p><b>  };</b></p><p>  if(KeyNo==13)</p><p><b>  { </b></p><p><b>  flag2=1;</b>

102、</p><p><b>  P1=0xF0;</b></p><p>  while(P1!=0xF0);</p><p><b>  };</b></p><p>  if(flag2==1)</p><p><b>  {</b></p>

103、;<p>  keys=_crol_(keys,1);</p><p><b>  flag2=0;</b></p><p><b>  KeyNo=0;</b></p><p><b>  };</b></p><p>  if(flag==1) </p&

104、gt;<p><b>  {</b></p><p><b>  P1=0xBF;</b></p><p>  while(P1==0xBE);</p><p><b>  P1=0x8F;</b></p><p>  if(P1!=0x8F)</p>

105、<p><b>  { </b></p><p>  if(KeyNo!=12)</p><p><b>  {</b></p><p>  KeyNo=KeyNo+11;</p><p>  led=KeyNo;</p><p><b>  TR1

106、=1; </b></p><p>  DelayMS(255);</p><p>  DelayMS(50);</p><p><b>  TR1=0;</b></p><p>  KeyNo=KeyNo-11;</p><p><b>  flag=0;</b>

107、</p><p><b>  BEEP=1;</b></p><p><b>  }</b></p><p><b>  } </b></p><p><b>  }</b></p><p>  if((flag+flag1)==

108、0)</p><p><b>  { </b></p><p><b>  P1=0x8F;</b></p><p>  if(P1!=0x8F)</p><p><b>  { </b></p><p>  // Keys_Scan();<

109、/p><p>  //P0=DSY_Table[KeyNo];</p><p>  led=KeyNo;</p><p><b>  TR1=1; </b></p><p>  DelayMS(255);</p><p>  DelayMS(4);</p><p><b&

110、gt;  TR1=0;</b></p><p><b>  BEEP=1;</b></p><p><b>  P1=0xF0;</b></p><p>  while(P1!=0xF0); //wait key released</p><p><b>  } &

111、lt;/b></p><p><b>  }</b></p><p>  if(flag1==1)</p><p><b>  {</b></p><p>  switch (keys) // 判讀 </p><p>  {case 0x01: I

112、nitialSound();Play(Music_Canon,2,2,192); break;//按下S1,播放第一首歌 </p><p>  case 0x02: InitialSound();Play(Music_Same,4,2,260); break;//按下S2,播放第二首歌 </p><p>  case 0x04: InitialSound();Play(Music_Two

113、,4,2,260); break;//按下S3,播放第三首歌 </p><p>  case 0x08: InitialSound();Play(Music_love,4,2,260); break;//按下S4,播放第四首歌 </p><p><b>  } </b></p><p><b>  BEEP=1;</b&g

114、t;</p><p><b>  flag1=0;</b></p><p><b>  KeyNo=1;</b></p><p><b>  TR1=0;</b></p><p><b>  }</b></p><p><b&

115、gt;  }</b></p><p><b>  }</b></p><p><b>  參考文獻</b></p><p>  [1]李鴻等.單片機原理及應用[M].湖南大學出版社,2005.</p><p>  [2]何立民.單片機高級教程--應用與設計[M].北京航空航天大學出版社,

116、2000,8.</p><p>  [3]戴佳.51單片機C語言應用程序設計實例精講[M].北京:電子工業(yè)出版社,2006.</p><p>  [4]于京.51系列單片機C程序設計與應用案例[M].北京:中國電力出版社,2006.</p><p>  [5]孫育才.ATMEL新型AT89S52系列單片機及其應用[M].北京:清華大學出版社,2005.</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

提交評論