簡(jiǎn)易電子琴課程設(shè)計(jì) (2)_第1頁(yè)
已閱讀1頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p>  課程名稱:現(xiàn)代電子技術(shù)綜合實(shí)驗(yàn) </p><p>  實(shí)驗(yàn)名稱:簡(jiǎn)易電子琴 </p><p>  學(xué)生姓名: </p><p>  班級(jí): 08通信B班 </p><p>  學(xué)號(hào): &

2、lt;/p><p>  實(shí)驗(yàn)地點(diǎn): </p><p>  實(shí)驗(yàn)學(xué)時(shí): </p><p><b>  摘 要</b></p><p>  當(dāng)前市場(chǎng)上的玩具市場(chǎng)需求量大,其中電子琴就是一個(gè)很好的應(yīng)用,本設(shè)計(jì)的主要任務(wù)是要實(shí)現(xiàn)以單片機(jī)STC89C51RC為控制核

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

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

5、;<p>  3.3系統(tǒng)硬件總體設(shè)計(jì)9</p><p>  3.4 LED顯示模塊 10</p><p>  3.5揚(yáng)聲器模塊 10</p><p>  3.6按鍵模塊 10</p><p><b>  4 軟件設(shè)計(jì)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 設(shè)計(jì)總結(jié)15</b></p><p>  附錄1 實(shí)物圖16</p><p>  附錄2 C51源程序清單17</p>&l

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

24、輪回兩種方法。雙鍵鎖定,是當(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)鍵的鍵碼。</p><p> ?。?)被按鍵識(shí)別:如何識(shí)別被按鍵是接口解決的主要問(wèn)題,一般可通過(guò)軟硬結(jié)合的方法完成。常用的方法有行掃描法和線反轉(zhuǎn)法兩種。行掃描法的基本思想是,由程序?qū)︽I盤(pán)逐行掃描,通過(guò)檢測(cè)到的列輸出狀態(tài)來(lái)確定閉合鍵,為此,需要設(shè)

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

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

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

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

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

30、<p>  本系統(tǒng)按鍵顯示模塊軟件流程圖如圖4.1:</p><p><b>  4.2 按鍵模塊</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),因此,

31、我們只要把一首歌曲的音階對(duì)應(yīng)頻率關(guān)系正確即可。</p><p>  利用AT89C51的內(nèi)部定時(shí)器使其工作計(jì)數(shù)器模式(MODE1)下,改變計(jì)數(shù)值TH0及TL0以產(chǎn)生不同頻率的方法產(chǎn)生不同音階,例如,頻率為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ù)脈沖

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

33、i÷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-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ā)出對(duì)應(yīng)音符模塊軟件流程圖如圖4.2:</p><p><b>  5、

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

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

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

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

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

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>  //共陽(yáng)數(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>  //各音符應(yīng)對(duì)的延時(shí)</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; //按鍵序號(hào)</p><p>  uchar flag2=0;</p><p>  //--------------------------------------------------------------------------------</p><

82、;p><b>  //延時(shí)</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個(gè)為0,3個(gè)仍為1</p><p>  //下面的異或操作會(huì)把3個(gè)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;//無(wú)鍵按下</p><p><b>  }</b></p><p>  //低四位置0,放入四列</p><p&

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

90、;/p><p>  //對(duì)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>  //定時(shí)器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>  參考文獻(xiàn)</b></p><p>  [1]李鴻等.單片機(jī)原理及應(yīng)用[M].湖南大學(xué)出版社,2005.</p><p>  [2]何立民.單片機(jī)高級(jí)教程--應(yīng)用與設(shè)計(jì)[M].北京航空航天大學(xué)出版社,

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

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論