單片機(jī)課程設(shè)計(jì)報(bào)告--電子音樂(lè)盒的設(shè)計(jì)_第1頁(yè)
已閱讀1頁(yè),還剩27頁(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>  單片機(jī)技術(shù)課程設(shè)計(jì)報(bào)告</p><p>  課題名稱 電子音樂(lè)盒的設(shè)計(jì) </p><p>  專業(yè)班級(jí) xxxxxxxxxx </p><p>  學(xué) 號(hào) xxxxxxxxx </p><p>  學(xué)生姓名

2、 xxxx </p><p>  指導(dǎo)教師 xxxxxx </p><p>  評(píng) 分 </p><p>  20xx年x月xx日至x月xx日</p><p><b>  答辯記錄</b></p>

3、<p>  1、例舉設(shè)計(jì)過(guò)程中遇到的問(wèn)題及其解決方法(至少兩例)。</p><p>  答:(1)問(wèn)題說(shuō)明:</p><p><b>  解決方法:</b></p><p><b>  (2)問(wèn)題說(shuō)明:</b></p><p><b>  解決方法:</b><

4、;/p><p>  2、教師現(xiàn)場(chǎng)提的問(wèn)題記錄在此(不少于2個(gè)問(wèn)題)。</p><p><b>  答:</b></p><p><b>  摘 要</b></p><p>  本設(shè)計(jì)是基于單片機(jī)的數(shù)字音樂(lè)盒設(shè)計(jì),該音樂(lè)盒通過(guò)控制單片機(jī)內(nèi)部的定時(shí)器來(lái)產(chǎn)生不同頻率的方波,驅(qū)動(dòng)喇叭發(fā)出不同音調(diào)的音樂(lè),再

5、用Protel99來(lái)畫(huà)系統(tǒng)硬件圖,采用匯編語(yǔ)言進(jìn)行編程,編程后利用KEIL C51來(lái)進(jìn)行編譯,再生成的HEX文件裝入芯片中,采用proteus軟件來(lái)仿真,檢驗(yàn)功能得以正常實(shí)現(xiàn)從而設(shè)計(jì)出數(shù)字音樂(lè)盒。</p><p>  選用單片機(jī)AT89C51來(lái)設(shè)計(jì)制作是由于其功能的實(shí)現(xiàn)主要通過(guò)軟件編程來(lái)完成,降低了硬件電路的復(fù)雜性,而且其成本也有所降低。芯片AT89C51是低功耗、高性能的CMOS型8位單片機(jī)。片內(nèi)帶有4KB的F

6、lash存儲(chǔ)器,且允許在系統(tǒng)內(nèi)改寫或用編程器編程。另外, AT89C51的指令系統(tǒng)和引腳與8051完全兼容,片內(nèi)有128B 的RAM、32條I/O口線、2個(gè)16位定時(shí)計(jì)數(shù)器、5個(gè)中斷源、一個(gè)全雙工串行口等。</p><p>  該音樂(lè)盒的設(shè)計(jì)可以通過(guò)按鍵選擇不同的曲目播放,并通過(guò)LCD顯示歌曲號(hào)及播放時(shí)間。音樂(lè)盒主要由五大模塊構(gòu)成,包括AT89C51芯片、按鈕、蜂鳴器、晶振電路和液晶顯示器。有3個(gè)歌曲選擇鍵供用戶

7、按照自己的喜好選擇音樂(lè),該軟、硬件系統(tǒng)具有很好的通用性,很高的實(shí)際使用價(jià)值。</p><p>  關(guān)鍵詞:數(shù)字音樂(lè)盒; AT89C51; Proteus; KEIL; 匯編語(yǔ)言</p><p><b>  目 錄</b></p><p><b>  1 設(shè)計(jì)任務(wù)1</b></p><p><

8、;b>  2設(shè)計(jì)方案1</b></p><p><b>  2.1任務(wù)分析1</b></p><p><b>  2.2方案設(shè)計(jì)1</b></p><p>  3 系統(tǒng)硬件設(shè)計(jì)3</p><p>  3.1 AT89C51單片機(jī)簡(jiǎn)介3</p><p&g

9、t;  3.2 晶振電路4</p><p>  3.3 按鍵電路4</p><p>  3.4 LCD顯示電路4</p><p><b>  3.5 蜂鳴器5</b></p><p>  4 系統(tǒng)軟件設(shè)計(jì)5</p><p>  4.1外部中斷源系統(tǒng)設(shè)計(jì)5</p><

10、p>  4.2音頻發(fā)生原理6</p><p>  4.3顯示模塊設(shè)計(jì)7</p><p>  5仿真與性能分析8</p><p>  5.1 系統(tǒng)仿真過(guò)程 8</p><p>  5.2 仿真分析

11、 9 </p><p><b>  6設(shè)計(jì)小結(jié)10</b></p><p><b>  參考文獻(xiàn)11</b></p><p>  附錄1

12、 系統(tǒng)原理圖12</p><p>  附錄2 系統(tǒng)PCB圖13</p><p>  附錄3 程序清單14</p><p><b>  1 設(shè)計(jì)任務(wù)</b></p><p>  利用單片機(jī)設(shè)計(jì)一款簡(jiǎn)單實(shí)用的電子音樂(lè)盒。</p><p><b>  1. 基本要求</b>&

13、lt;/p><p> ?。?)查閱資料,了解單片機(jī)控制單音喇叭發(fā)聲原理; </p><p> ?。?)設(shè)計(jì)基于單片機(jī)的電子音樂(lè)盒; </p><p> ?。?)通過(guò)按鈕可選擇不同的音樂(lè);。</p><p><b>  2. 選做</b></p><p> ?。?)采用LCD顯示信息。</p>

14、;<p> ?。?)開(kāi)機(jī)時(shí)有英文歡迎提示字符,播放時(shí)顯示歌曲序號(hào)(或名稱)。</p><p> ?。?)可通過(guò)功能鍵選擇樂(lè)曲播放。</p><p><b>  2設(shè)計(jì)方案</b></p><p><b>  2.1任務(wù)分析</b></p><p>  本程序主要利用AT89C51芯片,

15、通過(guò)它來(lái)產(chǎn)生一定頻率的音頻脈沖信號(hào)來(lái)實(shí)現(xiàn)課程設(shè)計(jì)的基本要求和附加功能,并可以通過(guò)按鍵播放3首歌曲。</p><p><b>  2.2方案設(shè)計(jì)</b></p><p><b>  1.硬件方案</b></p><p><b>  圖1.硬件原理框圖</b></p><p>  

16、AT89C51是一種帶4K字節(jié)閃存可編程可擦除只讀存儲(chǔ)器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低電壓,高性能CMOS 8位微處理器,俗稱單片機(jī)。AT89C2051是一種帶2K字節(jié)閃存可編程可擦除只讀存儲(chǔ)器的單片機(jī)。單片機(jī)的可擦除只讀存儲(chǔ)器可以反復(fù)擦除100次。該器件采用ATMEL高密度非易失存儲(chǔ)器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集和輸出管腳相兼容。由

17、于將多功能8位CPU和閃爍存儲(chǔ)器組合在單個(gè)芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡(jiǎn)版本。AT89C51單片機(jī)為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價(jià)廉的方案。</p><p> ?。?)用P3.0--P3.2控制按鍵。</p><p>  (3)用P3.5,P3.6,P3.3作為L(zhǎng)CD的RS,R/W,E的控制信號(hào)。用P1.0--P1.7作為&

18、lt;/p><p>  LCD的D0--D7的控制信號(hào)。</p><p> ?。?)用P3.7口控制蜂鳴器。</p><p> ?。?)電路為12MHZ晶振頻率工作,起振電路中C1,C2均為22pf,接在XTAL1和</p><p><b>  XTAL2間。</b></p><p><b>

19、;  軟件方案</b></p><p><b>  N</b></p><p><b>  Y</b></p><p><b>  圖2.主程序流程圖</b></p><p><b>  3 系統(tǒng)硬件設(shè)計(jì)</b></p><

20、p>  3.1 AT89C51單片機(jī)簡(jiǎn)介</p><p><b>  引腳功能:</b></p><p>  P0.0-P0.7:為一個(gè)8位漏級(jí)開(kāi)路雙向I/O口;</p><p>  P1.0-P1.7:是一個(gè)內(nèi)部提供上拉電阻的8位雙向I/O口;</p><p>  P2.0-P2.7:為一個(gè)內(nèi)部上拉電阻的8位雙向

21、I/O口;</p><p>  P3.0-P3.7:管腳是8個(gè)帶內(nèi)部上拉電阻的雙向I/O口;</p><p>  P3.0:RXD(串行輸入口);</p><p>  P3.1:TXD(串行輸出口);</p><p>  P3.2:INT0(外部中斷0);</p><p>  P3.3:INT1(外部中斷1);<

22、/p><p>  P3.4:T0(記時(shí)器0外部輸入);</p><p>  P3.6:WR(外部數(shù)據(jù)存儲(chǔ)器寫選通);</p><p>  P3.7:RD(外部數(shù)據(jù)存儲(chǔ)器讀選通);</p><p>  EA:當(dāng)EA保持低電平時(shí),則在此期間外部程序存儲(chǔ)器(0000H-FFFFH),不管</p><p>  是否有內(nèi)部程序存儲(chǔ)器

23、。注意加密方式1時(shí),EA將內(nèi)部鎖定為RESET;當(dāng)</p><p>  EA端保持高電平時(shí),此間內(nèi)部程序存儲(chǔ)器;</p><p>  P3.5:T1(記時(shí)器1外部輸入);</p><p>  ALE:當(dāng)訪問(wèn)外部存儲(chǔ)器時(shí),地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié);</p><p>  PSEN:外部程序存儲(chǔ)器的選通信號(hào);</p>

24、<p><b>  RST:復(fù)位輸入;</b></p><p>  XTAL1:反向振蕩放大器的輸入及內(nèi)部時(shí)鐘工作電路的輸入;</p><p>  XTAL2:來(lái)自反向振蕩器的輸出。</p><p><b>  3.2 晶振電路</b></p><p>  晶振電路采用12MHZ的晶振

25、頻率工作,取起振電路中C1,C2均為22pf。它們分別接在晶振的兩個(gè)腳上和對(duì)地的電容,會(huì)影響到晶振的諧振頻率和輸出幅度。晶體旁邊的兩個(gè)電容接地, 實(shí)際上就是電容三點(diǎn)式電路的分壓電容, 接地點(diǎn)就是分壓點(diǎn). 以接地點(diǎn)即分壓點(diǎn)為參考點(diǎn), 振蕩引腳的輸入和輸出是反相的, 但從并聯(lián)諧振回路即石英晶體兩端來(lái)看, 形成一個(gè)正反饋以保證電路持續(xù)振蕩。</p><p><b>  C1</b></p&g

26、t;<p><b>  XTAL1</b></p><p><b>  C2</b></p><p><b>  XTAL2</b></p><p><b>  3.3 按鍵電路</b></p><p>  采用三個(gè)按鈕,分別用于選擇播放三首

27、歌。</p><p>  3.4 LCD顯示電路</p><p>  LCD顯示模塊采用14引腳的LM032L芯片,它有八個(gè)數(shù)據(jù)端口,三個(gè)控制口。當(dāng)控制口R/W為低電平時(shí),單片機(jī)向LCD寫入指令,當(dāng)其為高電平時(shí),單片機(jī)讀取LCD的信息。單片機(jī)的P3.5,P3.6,P3.3分別作為L(zhǎng)CD的RS,R/W,E的控制信號(hào)。用P1.0~P1.7作為L(zhǎng)CD的D0~D7的控制信號(hào)。用LCD來(lái)顯示開(kāi)機(jī)歡迎

28、字符及播放歌曲信息。 </p><p><b>  3.5 蜂鳴器</b></p><p>  蜂鳴器發(fā)聲原理是電流通過(guò)電磁線圈,</p><p>  使電磁線圈產(chǎn)生磁場(chǎng)來(lái)驅(qū)動(dòng)振動(dòng)膜發(fā)聲的。</p><p><b>  4 系統(tǒng)軟件設(shè)計(jì)</b></p><p>

29、  4.1 外部中斷源系統(tǒng)設(shè)計(jì)</p><p>  在本設(shè)計(jì)中中斷源是采用外部中斷0方式,其入口地址是0003H。其中斷響應(yīng)級(jí)別最高。</p><p>  (1)定時(shí)器/計(jì)數(shù)器</p><p>  工作方式寄存器TMOD用于選擇定時(shí)器/計(jì)數(shù)器的工作方式和工作模式。</p><p><b>  門控位—GATE</b>&l

30、t;/p><p>  工作方式選擇位—M1、M0</p><p>  —計(jì)數(shù)器模式和定時(shí)器模式選擇位</p><p>  =0,為定時(shí)器模式。</p><p><b>  =1,為計(jì)數(shù)模式。</b></p><p>  本設(shè)計(jì)中采用方式1的16位定時(shí)器/計(jì)數(shù)器。</p><p>

31、;  定時(shí)器/計(jì)數(shù)器控制寄存器TCON,其格式如下:</p><p>  TF1、TF0—計(jì)數(shù)溢出標(biāo)志位當(dāng)計(jì)數(shù)器溢出時(shí),該位置1。</p><p>  TR1、TR0—計(jì)數(shù)運(yùn)行控制位</p><p>  4.2 音頻發(fā)生原理</p><p>  要生產(chǎn)音頻脈沖,只要算出某一音頻的周期(1/頻率),然后將此周期除以2,</p>&

32、lt;p>  即為半周期的時(shí)間。利用定時(shí)器計(jì)時(shí)這個(gè)半周期時(shí)間,每當(dāng)計(jì)時(shí)到后就將輸 </p><p>  出脈沖的I/O反相,然后重復(fù)計(jì)時(shí)此半周期時(shí)間再對(duì)I/O反相,就可在I/O</p><p>  腳上得到此頻率的脈沖。</p><p>  利用8051的內(nèi)部定時(shí)器使用其工作在計(jì)數(shù)器模式MODE1下,改變計(jì)數(shù)值THO </p><p>

33、  及TLO以產(chǎn)生不同頻率的方法。</p><p>  例如頻率為523Hz,其周期T=1/523=1912us,因此只要令計(jì)數(shù)器計(jì)時(shí)</p><p>  956us/1us=956,在每次計(jì)數(shù)956次時(shí)將I/O反相,就可得到中音DO</p><p><b>  (523Hz). </b></p><p>  計(jì)數(shù)脈沖值

34、與頻率的關(guān)系公式如下:</p><p>  N=Fi÷2÷Fr </p><p><b>  N: 計(jì)算值;</b></p><p>  Fi: 內(nèi)部計(jì)時(shí)一次為1us, 故其頻率為1MHz;</p><p>  其計(jì)數(shù)值的求法如下:</p><p>  T=6553

35、6-N=65536-Fi÷2÷Fr</p><p>  例如: 設(shè)K=65536, F=1000000=Fi=1MHz, 求低音DO(261Hz).中音DO </p><p>  (523Hz)。高音的DO(1046Hz)的計(jì)算值.</p><p>  T=65536-N=65536-Fi÷2÷Fr=65536-1000000

36、÷2÷Fr</p><p>  =65536-500000/Fr</p><p>  低音DO的 T=65536-500000/262=63627</p><p>  中音DO的 T=65536-500000/523=64580</p><p>  高音DO的 T=65536-500000/1047=65059</p

37、><p>  C調(diào)各音符頻率與計(jì)數(shù)值T的對(duì)照表如表所示。</p><p>  4.3 顯示模塊設(shè)計(jì)</p><p>  本設(shè)計(jì)選用LM016L芯片顯示。LCD液晶投影機(jī)是液晶顯示技術(shù)和投影技術(shù)相結(jié)合的產(chǎn)物,它利用了液晶的電光效應(yīng),通過(guò)電路控制液晶單元的透射率及反射率,從而產(chǎn)生不同灰度層次及多達(dá)1670萬(wàn)種色彩的靚麗圖像。LCD投影機(jī)的主要成像器件是液晶板。LCD投影機(jī)的

38、體積取決于液晶板的大小,液晶板越小,投影機(jī)的體積也就越小。</p><p>  LM016L液晶模塊采用HD44780控制器。HD44780具有簡(jiǎn)單而功能較強(qiáng)的指令集,可以實(shí)現(xiàn)字符移動(dòng)、閃爍等功能。LM016L與單片機(jī)MCU(Microcontroller Unit)通訊可采用8位或者4位并行傳輸兩種方式。HD44780控制器由兩個(gè) 8位寄存器、指令寄存器( IR)和數(shù)據(jù)寄存器(DR)、忙標(biāo)志(BF)、顯示數(shù)據(jù)

39、RAM(DDRAM)、字符發(fā)生器ROM(CGROM)、字符發(fā)生器 RAM(CGRAM)、地址計(jì)數(shù)器( AC)。IR用于寄存指令碼,只能寫入不能讀出;DR用于寄存數(shù)據(jù),數(shù)據(jù)由內(nèi)部操作自動(dòng)寫入 DDRAM和CGRAM,或者暫存從DDRAM和CGRAM讀出的數(shù)據(jù)。BF為 1時(shí),液晶模塊處于內(nèi)部處理模式,不響應(yīng)外部操作指令和接受數(shù)據(jù)。DDRAM用來(lái)存儲(chǔ)顯示的字符,能存儲(chǔ) 80個(gè)字符碼。 </p><p><b>

40、;  5 仿真與性能分析</b></p><p>  5.1 系統(tǒng)仿真過(guò)程</p><p>  按照上面設(shè)計(jì)的電路在proteus軟件內(nèi)畫(huà)圖,選擇需要的芯片及參數(shù),按照原理圖畫(huà)出仿真圖,打開(kāi)單片機(jī)軟件開(kāi)發(fā)系統(tǒng)Keil,選擇89C51單片機(jī),在其中編寫程序(源程序見(jiàn)附錄),運(yùn)行生成一個(gè)后綴名為hex的文件,然后將該文件下載到proteus中的AT89C51單片機(jī)中進(jìn)行仿真,觀察實(shí)

41、驗(yàn)現(xiàn)象。仿真能實(shí)現(xiàn)播放音樂(lè),按鍵選擇曲目的功能。</p><p><b>  仿真原理圖:</b></p><p><b>  運(yùn)行界面:</b></p><p><b>  5.2 仿真分析</b></p><p>  現(xiàn)象結(jié)果:當(dāng)按下按鈕后LCD上會(huì)顯示歡迎字符且其所對(duì)應(yīng)的

42、歌曲能正常播放。</p><p>  程序調(diào)試中出現(xiàn)的問(wèn)題及解決的辦法:</p><p> ?。?)有時(shí)編寫的程序沒(méi)有錯(cuò)誤,卻在電腦輸入時(shí)沒(méi)有按照規(guī)范的格式,以致程序無(wú)法正常運(yùn)行,這浪費(fèi)了很多時(shí)間,所以還是得注重細(xì)節(jié);</p><p> ?。?)在檢查錯(cuò)誤時(shí),大篇的程序感覺(jué)無(wú)從下手,在平時(shí)編程的時(shí)候就得注意在關(guān)鍵的地方留下注釋,以便以后的檢驗(yàn)和修改;</p&g

43、t;<p> ?。?)流程圖對(duì)編程來(lái)說(shuō)很重要,能使思路清晰;</p><p> ?。?)設(shè)計(jì)原理圖時(shí)經(jīng)常會(huì)用到自己平時(shí)都沒(méi)接觸過(guò)的芯片,所以要上網(wǎng)查找資料,了解其原理才方便設(shè)計(jì)。</p><p> ?。?)在播放歌曲時(shí)LCD無(wú)法顯示歌曲信息和播放時(shí)間。這個(gè)問(wèn)題無(wú)論怎么修改編程依舊無(wú)法解決。</p><p><b>  設(shè)計(jì)小結(jié)</b&g

44、t;</p><p>  由于是上學(xué)期學(xué)的單片機(jī)知識(shí),而這學(xué)期來(lái)做課程設(shè)計(jì),中間相隔很長(zhǎng)一段時(shí)間,以至于剛拿到這個(gè)課題無(wú)所適從。于是又把課本和筆記拿出來(lái)溫習(xí)一遍,網(wǎng)上查找了些相關(guān)資料,才有了點(diǎn)設(shè)計(jì)的概念和頭緒。這次的課程設(shè)計(jì)為期一周,感覺(jué)時(shí)間有點(diǎn)緊迫,所以只是在完成基本要求的基礎(chǔ)上稍稍有點(diǎn)拓展。本次課程設(shè)計(jì)使我第一次真正意義上用自己的專業(yè)知識(shí)和技能來(lái)設(shè)計(jì)一個(gè)完整的作品,這使得我得到了很大的鍛煉和提高,雖說(shuō)這過(guò)程非

45、常的難熬,花費(fèi)了很多的時(shí)間,但看到自己的勞動(dòng)得到了成果就覺(jué)得值得了。</p><p>  在這次設(shè)計(jì)中,我完成了一個(gè)基于單片機(jī)的數(shù)字音樂(lè)盒設(shè)計(jì),盡管結(jié)果并算不上完美,但是我努力了,獲得了豐富的知識(shí),完善了大學(xué)三年中理論與實(shí)踐相結(jié)合的學(xué)習(xí)。我從資料的收集中,掌握了很多單片機(jī)的知識(shí),讓我對(duì)我所學(xué)過(guò)的知識(shí)有所鞏固和提高,在遇到困難時(shí)虛心請(qǐng)教同學(xué),和同學(xué)的討論也使我受益匪淺,拓寬了設(shè)計(jì)思路,可以說(shuō)音樂(lè)盒的完成少不了同學(xué)的

46、幫助和支持。在仿真過(guò)程中我大致學(xué)會(huì)了proteus和keil軟件的應(yīng)用,雖說(shuō)算不上精通,但也會(huì)基本的操作和運(yùn)行,這也為日后從事這方面的工作打下了一個(gè)良好的基礎(chǔ)。單片機(jī)是一個(gè)需要細(xì)心的學(xué)科,在本次課程設(shè)計(jì)中,很多次都是因?yàn)樽约旱牟患?xì)心才導(dǎo)致走了許多彎路,浪費(fèi)了很多時(shí)間,這是我明白什么才是細(xì)節(jié)決定成敗。</p><p>  雖說(shuō)設(shè)計(jì)的過(guò)程是很糾結(jié)很痛苦的,但我相信只要度過(guò)了這個(gè)過(guò)程,我的知識(shí)和經(jīng)驗(yàn)終將上升一個(gè)臺(tái)階,我

47、想這也就是我們以后邁入社會(huì)所擁有的最寶貴的東西了吧!</p><p><b>  參考文獻(xiàn)</b></p><p>  [1] 秦實(shí)宏,徐春輝.MCS-51單片機(jī)原理及應(yīng)用[M].武漢:華中科技大學(xué)出版社,2010.6</p><p>  [2] 杜樹(shù)春.基于Proteus和Keil C51的單片機(jī)設(shè)計(jì)與仿真.北京:電子工業(yè)出版社,2012&l

48、t;/p><p>  [3] 譚浩強(qiáng).C程序設(shè)計(jì).第三版,北京:清華大學(xué)出版社,2005:105</p><p>  [4] 張毅剛.單片機(jī)原理及應(yīng)用[M].北京:高等教育出版社,2008.</p><p>  [5] 周堅(jiān).單片機(jī)C語(yǔ)言輕松入門[M].北京:北京航空航天大學(xué)出版社,2006.</p><p><b>  附錄1 系統(tǒng)原

49、理圖</b></p><p>  附錄2 系統(tǒng)PCB圖</p><p><b>  附錄3 程序清單</b></p><p>  #include <REG52.H></p><p>  #include "Soundplay.h"//頭文件見(jiàn)后</p>&l

50、t;p>  int z,flag;</p><p>  unsigned char code word1[]={"Welcome to"};</p><p>  unsigned char code word2[]={"listen the music"};</p><p>  typedef unsigned cha

51、r uint8;</p><p>  sbit KeyIn1=P3^0;</p><p>  sbit KeyIn2=P3^1;</p><p>  sbit KeyIn3=P3^2;</p><p>  sbit RS = P3^5 ;</p><p>  sbit RW = P3^6 ;</p>&l

52、t;p>  sbit E = P3^3 ;</p><p>  sbit BUSY = P1^7;</p><p>  void delay(int z);</p><p>  void Key_check();</p><p>  void wait();</p><p>  void w_dat(int da

53、t);</p><p>  void w_cmd(uint8 cmd);</p><p>  void w_string(uint8 addr_start, uint8 *p);</p><p>  void Init_LCD1602(void);</p><p>  void display();</p><p> 

54、 void Delay1ms(unsigned int count)</p><p><b>  {</b></p><p>  unsigned int i,j;</p><p>  for(i=0;i<count;i++)</p><p>  for(j=0;j<120;j++);</p>

55、<p><b>  }</b></p><p>  //*****************************Music******************************************************</p><p><b>  //揮著翅膀的女孩</b></p><p>  un

56、signed char code Music_Girl[]={ </p><p>  0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x03,</p><p>  0x16,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x03, 0x18,0x03,</p><p>  0x19,0x02,

57、0x16,0x03, 0x17,0x03, 0x18,0x02, 0x18,0x03,</p><p>  0x17,0x03, 0x15,0x02, 0x18,0x03, 0x17,0x03, 0x18,0x02,</p><p>  0x10,0x03, 0x15,0x03, 0x16,0x02, 0x15,0x03, 0x16,0x03,</p><p>  

58、0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x1A,0x03,</p><p>  0x1B,0x03, 0x1F,0x03, 0x1F,0x03, 0x17,0x03, 0x18,0x03,</p><p>  0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03,</p>

59、<p>  0x18,0x03, 0x1F,0x03, 0x1F,0x02, 0x16,0x03, 0x17,0x03,</p><p>  0x18,0x03, 0x17,0x03, 0x18,0x03, 0x20,0x03, 0x20,0x02,</p><p>  0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,&

60、lt;/p><p>  0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03,</p><p>  0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,</p><p>  0x1A,0x03, 0x19,0x03, 0x15,0x03, 0x15,0x03,

61、0x17,0x03,</p><p>  0x16,0x66, 0x17,0x04, 0x18,0x04, 0x18,0x03, 0x19,0x03,</p><p>  0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,</p><p>  0x20,0x03, 0x1F,0x03, 0x1B,0x03,

62、0x1F,0x66, 0x1F,0x03,</p><p>  0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,</p><p>  0x1A,0x03, 0x19,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,</p><p>  0x1F,0x00, 0x1A,0x03,

63、0x1A,0x03, 0x1A,0x03, 0x1B,0x03,</p><p>  0x1B,0x03, 0x1A,0x03, 0x19,0x03, 0x19,0x02, 0x17,0x03,</p><p>  0x15,0x17, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x18,0x03,</p><p>  0x17,0x04,

64、0x18,0x0E, 0x18,0x03, 0x17,0x04, 0x18,0x0E,</p><p>  0x18,0x66, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03,</p><p>  0x20,0x03, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66,</p><p>  

65、0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03,</p><p>  0x1F,0x66, 0x1F,0x04, 0x1B,0x0E, 0x1B,0x03, 0x19,0x03,</p><p>  0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,</p>

66、<p>  0x15,0x03, 0x15,0x03, 0x17,0x03, 0x16,0x66, 0x17,0x04,</p><p>  0x18,0x04, 0x18,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,</p><p>  0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03,&

67、lt;/p><p>  0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03,</p><p>  0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,</p><p>  0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x00,

68、0x18,0x02,</p><p>  0x18,0x03, 0x1A,0x03, 0x19,0x0D, 0x15,0x03, 0x15,0x02,</p><p>  0x18,0x66, 0x16,0x02, 0x17,0x02, 0x15,0x00, 0x00,0x00};</p><p><b>  //葫蘆娃</b></p&g

69、t;<p>  unsigned char code Music_Small[]={ </p><p>  0x83,0x63,0x51,0x61,0x03,0x81,0x61,0x51,0x81,</p><p>  0x63,0x01,0x81,0x61,0x63,0x51,</p><p>  0x63,0x01,0x61,0x81,0x61,0

70、x51,0x81,0x63,0x03,</p><p>  0x12,0x12,0x35,0x11,0x12,0x31,0x02,</p><p>  0x62,0x62,0x61,0x51,0x62,0x51,0x12,0x31,0x02,</p><p>  0x81,0x61,0x61,0x51,0x65,0x51,0x12,0x21,0x02,</p&

71、gt;<p>  0x75,0x51,0x32,0x58,</p><p>  0x81,0x01,0x61,0x61,0x51,0x51,0x62,0x61,0x01,</p><p>  0x52,0x11,0x32,0x02,0x81,0x01,0x61,0x61,0x51,0x51,0x61,0x61,0x01,0x51,0x11,</p><p&

72、gt;  0x22,0x02,</p><p>  0x35,0x11,0x62,0x18,</p><p>  0x31,0x52,0x61,0x31,0x52,0x61,</p><p>  0x85,0x01,0x71,0x52,0x65,0x02,0xff</p><p><b>  };</b></p&g

73、t;<p>  //兩只蝴蝶 </p><p>  unsigned char code Music_Two[] ={ </p><p>  0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,

74、 </p><p>  0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, </p><p>  0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,

75、 </p><p>  0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03, </p><p>  0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01,

76、 </p><p>  0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, </p><p>  0x16,0x03, 0x15,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x01,

77、 </p><p>  0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03, </p><p>  0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,

78、 </p><p>  0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, </p><p>  0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x19,0x03,

79、</p><p>  0x19,0x01, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01, </p><p>  0x16,0x03, 0x16,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,

80、</p><p>  0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0D, 0x15,0x00, </p><p>  0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03,

81、</p><p>  0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, </p><p>  0x16,0x0D, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, &l

82、t;/p><p>  0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, </p><p>  0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, <

83、;/p><p>  0x19,0x02, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, </p><p>  0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, <

84、;/p><p>  0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, </p><p>  0x17,0x0D, 0x16,0x03, 0x17,0x03, 0x19,0x01, 0x19,0x03, &l

85、t;/p><p>  0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03, </p><p>  0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x03, &l

86、t;/p><p>  0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02, </p><p>  0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01, &l

87、t;/p><p>  0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03, </p><p>  0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, <

88、;/p><p>  0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, </p><p>  0x17,0x16, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, <

89、;/p><p>  0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x0F,0x02, </p><p>  0x10,0x03, 0x15,0x00, 0x00,0x00 };</p><p>  //******************************

90、*****************************************************</p><p><b>  /**</b></p><p><b>  * 等待繁忙標(biāo)志</b></p><p><b>  */</b></p><p>  void

91、wait(void)</p><p><b>  {</b></p><p>  P1 = 0xFF;</p><p><b>  do</b></p><p><b>  {</b></p><p>  RS = 0;</p>&

92、lt;p><b>  RW = 1;</b></p><p><b>  E = 0;</b></p><p><b>  E = 1;</b></p><p>  }while (BUSY == 1);</p><p><b>  E = 0;</b&g

93、t;</p><p><b>  }</b></p><p><b>  /**</b></p><p><b>  * 寫數(shù)據(jù)</b></p><p><b>  */</b></p><p>  void w_dat(int d

94、at)</p><p><b>  {</b></p><p><b>  wait();</b></p><p><b>  E = 0;</b></p><p><b>  P1 = dat;</b></p><p><b

95、>  RS = 1;</b></p><p><b>  RW = 0;</b></p><p><b>  E = 1;</b></p><p><b>  E = 0;</b></p><p><b>  }</b></p>

96、;<p><b>  /**</b></p><p><b>  * 寫命令</b></p><p><b>  */</b></p><p>  void w_cmd(uint8 cmd)</p><p><b>  {</b></p

97、><p><b>  wait();</b></p><p><b>  E = 0;</b></p><p><b>  P1 = cmd;</b></p><p><b>  RS = 0;</b></p><p><b>

98、;  RW = 0;</b></p><p><b>  E = 1;</b></p><p><b>  E = 0;</b></p><p><b>  }</b></p><p><b>  /**</b></p><

99、p>  * 發(fā)送字符串到LCD</p><p><b>  */</b></p><p>  void w_string(uint8 addr_start, uint8 *p)</p><p><b>  {</b></p><p>  w_cmd(addr_start);</p>

100、<p>  while (*p != '\0')</p><p><b>  {</b></p><p>  w_dat(*p++);</p><p><b>  }</b></p><p><b>  }</b></p><p

101、><b>  /**</b></p><p><b>  * 初始化1602</b></p><p><b>  */</b></p><p>  void Init_LCD1602(void)</p><p><b>  {</b></p&g

102、t;<p>  w_cmd(0x38); // 16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口</p><p>  w_cmd(0x0c); // 顯示器開(kāi)、光標(biāo)開(kāi)、光標(biāo)允許閃爍</p><p>  w_cmd(0x06); // 文字不動(dòng),光標(biāo)自動(dòng)右移</p><p>  w_cmd(0x01); // 清屏</p><p>

103、<b>  }</b></p><p><b>  main()</b></p><p><b>  {</b></p><p><b>  while(1)</b></p><p><b>  {</b></p>&l

104、t;p>  InitialSound();</p><p>  Key_check();//檢測(cè)按鍵</p><p>  if(flag==1)</p><p><b>  {</b></p><p>  Play(Music_Girl,0,3,360);</p><p>  delay(1

105、00);</p><p>  Key_check();</p><p><b>  }</b></p><p>  if(flag==2)</p><p><b>  {</b></p><p>  Play(Music_Small,0,3,360);</p>

106、<p>  delay(100);</p><p>  Key_check();</p><p><b>  }</b></p><p>  if(flag==3)</p><p><b>  {</b></p><p>  Play(Music_Two,0,3,3

107、60);</p><p>  //Delay1ms(500);</p><p>  delay(100);</p><p>  Key_check();</p><p><b>  }</b></p><p><b>  }</b></p><p>&

108、lt;b>  }</b></p><p>  void display()</p><p><b>  {</b></p><p><b>  RW=0;</b></p><p>  delay(500);</p><p>  Init_LCD1602();

109、</p><p>  w_string(0x80,word1);</p><p>  w_string(0xc0,word2);</p><p>  delay(1000);</p><p>  w_cmd(0x01);</p><p><b>  }</b></p><p&g

110、t;  void Key_check()//按鍵檢測(cè)子程序</p><p><b>  {</b></p><p>  if(!KeyIn1)//判斷是否有按鍵按下,按下后P3^3=0</p><p><b>  {</b></p><p>  delay(10);</p><p

111、>  if(!KeyIn1)//再判斷一次(按鍵去抖)</p><p><b>  {</b></p><p>  while(!KeyIn1);//等待松手,松開(kāi)后跳出程序</p><p>  flag=1;//標(biāo)志位</p><p><b>  }</b></p><p

112、><b>  }</b></p><p>  if(!KeyIn2)</p><p><b>  {</b></p><p>  delay(10);</p><p>  if(!KeyIn2)</p><p><b>  {</b></p&

113、gt;<p>  while(!KeyIn2);</p><p><b>  flag=2;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if(!KeyIn3)</p><p>

114、;<b>  {</b></p><p>  delay(10);</p><p>  if(!KeyIn3)</p><p><b>  {</b></p><p>  while(!KeyIn3);</p><p><b>  flag=3;</b>

115、</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void delay(int z) //延時(shí)子程序</p><p><b>  {</b>

116、;</p><p><b>  int x,y;</b></p><p>  for(x=z;x>0;x--)</p><p>  for(y=200;y>0;y--);</p><p><b>  }</b></p><p><b>  //頭文件:&

117、lt;/b></p><p>  #ifndef __SOUNDPLAY_H_REVISION_FIRST__</p><p>  #define __SOUNDPLAY_H_REVISION_FIRST__</p><p>  //****************************************************************

118、**********</p><p>  #define SYSTEM_OSC 12000000//定義晶振頻率12000000HZ</p><p>  #define SOUND_SPACE 4/5 //定義普通音符演奏的長(zhǎng)度分率,//每4分音符間隔</p><p>  sbit BeepIO = P3^7;//定義輸出管腳P3^

119、7</p><p>  unsigned 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在頻率表中的位置<

120、/p><p>  unsigned 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_Tem

121、p_TL1;//音長(zhǎng)定時(shí)器初值暫存</p><p>  //**************************************************************************</p><p>  void Key_check();</p><p>  void InitialSound(void)</p><p

122、><b>  {</b></p><p>  BeepIO = 0;</p><p>  Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256;// 計(jì)算TL1應(yīng)裝入的初值 </p><p>  Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256;

123、// 計(jì)算TH1應(yīng)裝入的初值 </p><p>  TH1 = Sound_Temp_TH1;</p><p>  TL1 = Sound_Temp_TL1;</p><p>  TMOD |= 0x11;</p><p>  ET0 = 1;</p><p>  ET1 = 0;</p>

124、<p>  TR0 = 0;</p><p>  TR1 = 0;</p><p>  EA = 1;</p><p><b>  }</b></p><p>  void BeepTimer0(void) interrupt 1</p><p><b>

125、;  {</b></p><p>  BeepIO = !BeepIO;</p><p>  TH0 = Sound_Temp_TH0;</p><p>  TL0 = Sound_Temp_TL0;</p><p><b>  }</b></p><p>  //****

126、**********************************************************************</p><p>  void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)</p><p><b>  {&

127、lt;/b></p><p>  unsigned int NewFreTab[12];//新的頻率表</p><p>  unsigned char i,j;</p><p>  unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;</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)論