版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 本科畢業(yè)設(shè)計(jì)(論文)</p><p><b> ?。ǘ?屆)</b></p><p> 基于MCU及RTX51的樂曲編輯和發(fā)生器設(shè)計(jì)</p><p> 所在學(xué)院 </p><p> 專業(yè)班級 電子信息工程
2、 </p><p> 學(xué)生姓名 學(xué)號 </p><p> 指導(dǎo)教師 職稱 </p><p> 完成日期 年 月 </p><p><b> 摘 要</b></p><
3、;p> 在科技高度發(fā)達(dá)的今天,單片機(jī)已經(jīng)廣泛的應(yīng)用到了人們生活的各個(gè)領(lǐng)域,單片機(jī)為人們帶來了很多的方便也提高了人們生活學(xué)習(xí)和工作的效率。當(dāng)然單片機(jī)的廣泛應(yīng)用也可以為環(huán)保和節(jié)約資源做出貢獻(xiàn),比如應(yīng)用單片機(jī)設(shè)計(jì)電子書,讓人們閱讀電子書以代替紙張書籍就可以減少人們對紙張的需求和使用量。應(yīng)用單片機(jī)制作音樂編輯器也是同一個(gè)道理,他相對于傳統(tǒng)上的用筆將樂譜記錄在紙張上有4個(gè)有點(diǎn),即節(jié)省了紙張資源、保存方便、易于修改最后一點(diǎn)便是可以快速知道樂
4、曲設(shè)計(jì)的效果如何。基于MCU及RTX51的樂曲編輯和發(fā)生器可以通過4*4矩陣鍵盤進(jìn)行樂曲輸入和播放控制,通過LCD1602液晶屏形成人機(jī)交流界面,由揚(yáng)聲器播放樂曲的設(shè)計(jì)。</p><p> 關(guān)鍵詞:rtx51 、 mcu、 lcd 樂曲編輯發(fā)聲器</p><p> MCU-based Temperature Control System </p><p>&
5、lt;b> Abstract</b></p><p> In today's highly developed technology, SCM has been widely applied to all areas of people's lives, bring a lot of SCM also increased the convenience of the peop
6、le live and study and work efficiency. Of course, the extensive application of SCM can also contribute to environmental protection and conservation of resources, such as the application of single chip design e-books
7、, let people read books instead of paper books, people can reduce the demand for paper and use. Application of SCM make musi</p><p><b> 目錄</b></p><p><b> 目錄III</b>
8、;</p><p><b> 1 引言1</b></p><p><b> 選題背景、意義1</b></p><p><b> 1.2 目的1</b></p><p> 2 硬件電路設(shè)計(jì)3</p><p> 2.1 系統(tǒng)總體方案設(shè)計(jì)3
9、</p><p> 2.2模塊及芯片器件的介紹3</p><p> 2.2.1 單片機(jī)AT89S52簡介3</p><p> 2.2.2按鍵輸入模塊9</p><p> 2.2.3顯示模塊11</p><p> 2.2.4存儲模塊14</p><p> 2.2.5發(fā)聲模塊
10、15</p><p> 2.3 TRX51 Tiny操作系統(tǒng)的介紹16</p><p><b> 3 軟件設(shè)計(jì)18</b></p><p> 3.1程序設(shè)計(jì)的原理………………………………………………………………………………… 18</p><p> 3.1.1單片機(jī)設(shè)計(jì)音樂程序的整體原理:18</p&
11、gt;<p> 3.1.2應(yīng)用單片機(jī)產(chǎn)生不同頻率方波脈沖信號的方法:19</p><p> 3.1.3單片機(jī)定時(shí)器/計(jì)數(shù)器的原理:19</p><p> 3.1.4軟件的音調(diào)頻率設(shè)置: 20</p><p> 3.2 系統(tǒng)程序…………………………………………………………………………………….22</p><p>
12、 參 考 文 獻(xiàn)37 </p><p> 致謝…………………………………………………………………………………………………………38</p><p><b> 附錄39</b></p><p><b> 1 引言</b></p><p><b> 選題背景、意義</b>
13、;</p><p> 隨著單片機(jī)的不斷發(fā)展,單片機(jī)已經(jīng)廣泛應(yīng)用到了人們生活的各個(gè)領(lǐng)域。使用單片機(jī)設(shè)計(jì)樂曲編輯和發(fā)生器,是單片機(jī)所衍生出的眾多功能之一。以前在人們創(chuàng)作或記錄樂譜時(shí),一般搜是用筆將樂譜記錄在紙上來保存樂譜.這種方式普遍存在著紙張資源浪費(fèi)、保存不便、不易于修改等缺點(diǎn)。 本課題基于MCU及RTX51的樂曲編輯和發(fā)生器設(shè)計(jì),是對單片機(jī)mcu和多任務(wù)實(shí)時(shí)操作系統(tǒng)的一項(xiàng)實(shí)際應(yīng)用。隨著科技的發(fā)展音樂也從業(yè)在不
14、斷的發(fā)展,電子音樂是從具體的音樂發(fā)展到合成器音樂,再發(fā)展到現(xiàn)如今的計(jì)算機(jī)音樂。樂曲編輯和發(fā)生器可以記錄樂譜并制作簡單的電子音樂將其樂譜進(jìn)行演奏。</p><p> RTX51是一個(gè)用于8051系列處理器多任務(wù)實(shí)時(shí)操作系統(tǒng)。Rtx51是德國Keil公司開發(fā)的一種應(yīng)用于MCS51系列單片機(jī)功能強(qiáng)大的、可用于目前世界上所有由Intel 8051標(biāo)準(zhǔn)內(nèi)核派生出的350多種增強(qiáng)微控制器的實(shí)時(shí)操作系統(tǒng)。RTX51有兩個(gè)版本
15、:RTX51 Full和RTX51 Tiny。傳統(tǒng)的單片機(jī)應(yīng)用系統(tǒng)程序一般單任務(wù)機(jī)制的,而rtx51的單片機(jī)應(yīng)用系統(tǒng)程序是多任務(wù)機(jī)制。在多任務(wù)機(jī)制下,CPU的運(yùn)行時(shí)間被劃分成許多小的時(shí)間片,由某種調(diào)度算法按不同的優(yōu)先級別分配給不同的任務(wù)。RTX51 TINY執(zhí)行協(xié)作式任務(wù)切換(每個(gè)任務(wù)用一個(gè)操作系統(tǒng)例程)和時(shí)間片輪轉(zhuǎn)任務(wù)切換(每個(gè)任務(wù)在操作系統(tǒng)切換到下一個(gè)任務(wù)前運(yùn)行一個(gè)固定的時(shí)間段),不支持強(qiáng)先式任務(wù)切換以及任務(wù)優(yōu)先級。[4]Rtx51
16、的優(yōu)點(diǎn)在于提供實(shí)時(shí)操作系統(tǒng),允許多任務(wù)同時(shí)執(zhí)行,可以用c函數(shù)編寫程序并用c51編譯,還可以用標(biāo)準(zhǔn)的才變量來定義任務(wù)號和優(yōu)先權(quán)。</p><p><b> 1.2目的</b></p><p> 通過設(shè)計(jì)完成一個(gè)可以用4*4矩陣來輸入編輯樂曲的樂曲編輯器和通過放大器、揚(yáng)聲器播放音樂的音樂發(fā)聲器。其中編輯過程和音樂播放過程都要求可以用LCD液晶屏顯示其中的信息。<
17、/p><p><b> 2 硬件電路設(shè)計(jì)</b></p><p> 2.1 系統(tǒng)總體方案設(shè)計(jì)</p><p> 樂曲編輯和發(fā)生器系統(tǒng)基本按以下框圖實(shí)施:</p><p> 該系統(tǒng)包括了AT89S52芯片,晶振和復(fù)位電路,LCD1602顯示器,存儲模塊AT24C02芯片,和以達(dá)林頓晶體管ULN2803作為放大器的聲音
18、輸出系統(tǒng)。</p><p> 電路原理圖參見附錄。</p><p> 2.2模塊及芯片器件的介紹</p><p> 2.2.1 單片機(jī)AT89S52簡介</p><p> AT89S52是一種低功耗、高性能CM0S8位微控制器,具有8k在系統(tǒng)可編程Flah存儲器。使用Atmel公司高密度非易失性存儲器技術(shù)制造,與工業(yè)80c51產(chǎn)品指令
19、和引腳完全兼容。片上Flash允許持續(xù)存儲器在系統(tǒng)可編程,適于常規(guī)編程器。AT89S52具有以下標(biāo)準(zhǔn)功能;8k字節(jié)Flash,256字節(jié)RAM,32位I/O口線,看門狗定時(shí)器,2個(gè)數(shù)據(jù)指針,3個(gè)16位定時(shí)器/計(jì)數(shù)器,1個(gè)6 向量2級中斷結(jié)構(gòu),全雙工串行口,片內(nèi)晶振及時(shí)鐘電路。另外,AT89S52 可降至0Hz 靜態(tài)邏 輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU 停止工作,允許RAM、定時(shí)器/計(jì)數(shù)器、串口、中斷繼續(xù)工 作。掉電
20、保護(hù)方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié), 單片機(jī)一切工作停止,直到下一個(gè)中斷或硬件復(fù)位為止。[16]</p><p> AT89S52各引腳功能</p><p> [16][功能說明大多出自AT89S52的數(shù)據(jù)手冊]</p><p><b> [16]</b></p><p> AT89SC52Y 引腳圖D
21、IP 封裝</p><p><b> [16]</b></p><p> AT89SC52Y 引腳圖 FLCC 封裝</p><p> 中斷寄存器:各中斷允許位在IE寄存器中,六個(gè)中斷源的兩個(gè)優(yōu)先級也可在IE中設(shè)置。</p><p> T2CON 地址為0C8H 復(fù)位值:0000 0000B位可尋址</
22、p><p> MCS-51器件有單獨(dú)的程序存儲器和數(shù)據(jù)存儲器。外部程序存儲器和數(shù)據(jù)存儲器都可以64K尋址。</p><p> 程序存儲器:如果EA引腳接地,程序讀取只從外部存儲器開始。</p><p> 對于 89S52,如果EA 接VCC,程序讀寫先從內(nèi)部存儲器(地址為0000H~1FFFH)開始,接著從外部尋址,尋址地址為:2000H~FFFFH。</p
23、><p> 數(shù)據(jù)存儲器:AT89S52 有256 字節(jié)片內(nèi)數(shù)據(jù)存儲器。高128 字節(jié)與特殊功能寄存器重疊。也就是說高128字節(jié)與特殊功能寄存器有相同的地址,而物理上是分開的。</p><p> 當(dāng)一條指令訪問高于7FH 的地址時(shí),尋址方式?jīng)Q定CPU 訪問高128 字節(jié)RAM 還是特殊功能寄存器空間。直接尋址方式訪問特殊功能寄存器(SFR)。</p><p> 2.
24、2.2按鍵輸入模塊</p><p> 如圖,按鍵輸入模塊使用的是矩形鍵盤。將16個(gè)按鍵排成4行4列,第一行將每個(gè)按鍵的一端連接在一起構(gòu)成行線,第一列將每個(gè)按鍵的另一端連接在一起構(gòu)成列線,如此就會有4行4列的8根線,將這8根線接到I/o口上,通過程序掃描鍵盤就可以檢測出16個(gè)鍵。</p><p> 矩陣鍵盤的掃描檢測的依據(jù)和獨(dú)立鍵盤是一樣的,即檢測與鍵盤對應(yīng)的I/o口是否為低電平。因?yàn)榫?/p>
25、陣鍵盤的兩端都是和單片機(jī)的I/o相連的,所以檢測的時(shí)候需要人為的添加低電平。檢測時(shí)先發(fā)送給I/o口一列位低電平其他列為高電平,這個(gè)時(shí)候檢測各行是否有低電平,如果檢測到某一行位低電平,我們就可以先確定當(dāng)前被按下按鍵的行是哪一行哪一列,然后可以用相同的方法輪流操作其他列輪流檢測其他行,檢測出所有的按鍵。這樣就可以檢測出是否有按鍵按下和如果有按鍵按下是哪個(gè)按鍵按下。</p><p> 按鍵檢測的流程圖如下:</
26、p><p><b> 2.2.3顯示模塊</b></p><p> 顯示輸出模塊如圖,我們使用的是通用型LCD1602液晶顯示器。液晶顯示器是以電流控制液晶分子產(chǎn)生點(diǎn)、線、面的圖形。1602每行可以顯示16個(gè)字符,一共有2行。</p><p><b> [17]</b></p><p> 160
27、2有16條引腳先,功能說明如下:</p><p><b> 基本操作時(shí)序:</b></p><p> 讀狀態(tài) 輸入:RS=L,R/W=H,E=H 輸出:D0~D7= 狀態(tài)字</p><p> 讀數(shù)據(jù) 輸入:RS=H,R/W=H,E=H 輸出:無</p><p> 寫指令 輸入:RS=L,R/W=L,DO~D7
28、=指令碼,E=高脈沖 輸出:D0~D7=數(shù)據(jù)</p><p> 寫數(shù)據(jù) 輸入:RS=H,R/W=L,D0~D7=數(shù)據(jù),E=高脈沖 輸出:無</p><p> LCD1602一般用于寫,所以R/W可接地</p><p> RS 高寫數(shù)據(jù),RS低寫狀態(tài)</p><p><b> 2.2.4存儲模塊</b><
29、/p><p> 該存儲模塊使用的是AT24C02,他是串行E2PROM基于I2C-BUS 的存儲器件。</p><p> 24c02有256個(gè)字節(jié)的存儲空間。他的優(yōu)點(diǎn)是接口簡單方便,數(shù)據(jù)掉電后不丟失,而且不易受干擾。E0-E2(A0-A2)是地址線,wp是保護(hù)引腳,SCL.SDA是串行接口。當(dāng) wp與cpu斷開后保持高電平時(shí),cpu不能對芯片中的數(shù)據(jù)進(jìn)行修改,wp通過這種起到保護(hù)作用。&l
30、t;/p><p><b> 2.2.5發(fā)聲模塊</b></p><p><b> [19]</b></p><p> 2.3 TRX51 Tiny操作系統(tǒng)的介紹</p><p> RTX51是一個(gè)用于8051系列處理器多任務(wù)實(shí)時(shí)操作系統(tǒng)</p><p> RTX51可以
31、簡化那些復(fù)雜而且時(shí)間要求嚴(yán)格的工程的軟件設(shè)計(jì)工作</p><p> 有二個(gè)不同的RTX51版本可以利用:</p><p> RTX51 Full使用四個(gè)任務(wù)優(yōu)先權(quán)完成同時(shí)存在時(shí)間片輪轉(zhuǎn)調(diào)度和搶先的任務(wù)切換 RTX51工作在。[13]</p><p> 與中斷功能相似的狀態(tài)下 信號和信息可以通過郵箱系統(tǒng)在任務(wù)之間互相傳遞 你可以從一存</p>&l
32、t;p> 儲池中分配和釋放內(nèi)存 你可以強(qiáng)迫一個(gè)任務(wù)等待中斷 超時(shí)或者是從另一個(gè)任務(wù)或中斷發(fā)出的</p><p><b> 信號或信息</b></p><p> RTX51 Tiny是一個(gè) RTX51的子集 它可以很容易地在沒有任何外部存儲器的單片8051系統(tǒng)上運(yùn)</p><p> 轉(zhuǎn) 除了下列例外 RTX51 Tiny支持許多在
33、RTX51中的特征</p><p> RTX51 Tiny僅支持時(shí)間片輪轉(zhuǎn)任務(wù)切換和使用信號進(jìn)行任務(wù)切換,不支持搶先式的任務(wù)切換。</p><p> 我們用到的是RTX51 TINY,所以主要的是對RTX51 TINY進(jìn)行說明。</p><p> RTX51 TINY 規(guī)格說明</p><p><b> 1、中斷</b
34、></p><p> RTX51 Tiny與中斷函數(shù)并行運(yùn)作,中斷服務(wù)程序可以通過發(fā)送信號(用isr_send_signal函數(shù))或設(shè)置任務(wù)的就序標(biāo)志(用isr_set_redy函數(shù))與RTX51 Tiny的任務(wù)進(jìn)行通信。</p><p> 如同在一個(gè)標(biāo)準(zhǔn)的,沒有RTX51 Tiny的應(yīng)用中一樣,中斷例程必須在RTX51Tiny應(yīng)用中實(shí)現(xiàn)并允許,RTX51 Tinyim 沒有中斷
35、服務(wù)程序的管理。</p><p><b> 2、再入函數(shù)</b></p><p> C51編譯器提供對再入函數(shù)的支持,再入函數(shù)在再入堆棧中存儲參數(shù)和局部變量,從而保護(hù)遞歸調(diào)用或并行調(diào)用。RTX51 Tiny不支持對C51再入棧的任何管理。因此,如果在程序中使用再入函數(shù),必須確保這此函數(shù)不調(diào)用任何RTX51 Tiny系統(tǒng)函數(shù),且不被循環(huán)任務(wù)切掉所打斷。</p&
36、gt;<p><b> 3、C庫例程</b></p><p> 可再入C51庫函數(shù)可在任何任務(wù)中無限制的使用。對于非再入的C51庫函數(shù),同樣有非可再入C函數(shù)的限制。</p><p><b> 4、多數(shù)據(jù)指針</b></p><p> Keil C51編譯器允許使用多數(shù)據(jù)指針(存在于許多8051的派生芯
37、片中), RTX51 Tiny不提供對它們的支持.因此,在RTX51 Tiny的應(yīng)用程序中應(yīng)小心使用多數(shù)據(jù)指針。</p><p> 從本質(zhì)上說,必須確保循環(huán)任務(wù)切換不會在執(zhí)行改變數(shù)據(jù)指針選擇器的代碼時(shí)發(fā)生。</p><p><b> 5、寄存器組</b></p><p> RTX51 Tiny分配所有的任務(wù)到寄存器0,因此,所有的函數(shù)必須
38、用C51的默認(rèn)設(shè)置進(jìn)行編譯,REGISTERBANK(0)。</p><p> 中斷函數(shù)可以使用剩余的寄存器組。然而,RTX51 Tiny需要寄存器組區(qū)域中的6個(gè)永久性的字節(jié),用于這些字節(jié)的寄存器組在配置文件中指定 。 [摘自rtx51 tiny2.02中文手冊]</p><p><b> 3 軟件設(shè)計(jì)</b></p><p> 3.1程
39、序設(shè)計(jì)的原理</p><p> 3.1.1單片機(jī)設(shè)計(jì)音樂程序的整體原理:</p><p> 聲音便是在傳播中的不同頻率的聲波,由于頻率的不同,使人感覺音質(zhì)不同。樂曲中的不同音符便是不同頻率的聲波。在設(shè)計(jì)中可以使用單片機(jī)產(chǎn)生不同頻率的方波脈沖信號經(jīng)過放大電路,再由揚(yáng)聲器進(jìn)行播放,形成不同頻率的聲音。音樂的節(jié)拍就是該頻率的聲音所持續(xù)的時(shí)間。單片機(jī)可以控制不同頻率的方波脈沖信號在不同時(shí)間的持
40、續(xù)時(shí)間,也就是控制了節(jié)拍。兩者結(jié)合便可以形成音樂。</p><p> 3.1.2應(yīng)用單片機(jī)產(chǎn)生不同頻率方波脈沖信號的方法:</p><p> 需要的信號是不同頻率的方波脈沖信號,可以使用單片機(jī)中的中斷技術(shù)。使用定時(shí)器/計(jì)數(shù)器來控制高電平或低電平所持續(xù)的時(shí)間,即使用定時(shí)器/計(jì)數(shù)器來控制方波的半周期。計(jì)時(shí)到的時(shí)候就讓脈沖I/O反相。然后應(yīng)用循環(huán)計(jì)時(shí)所指定的半周期時(shí)間,讓脈沖I/O反相。此時(shí)
41、I/O腳上便可輸出穩(wěn)定頻率的方波脈沖。</p><p> 3.1.3單片機(jī)定時(shí)器/計(jì)數(shù)器的原理:</p><p> 定時(shí)器是單片機(jī)內(nèi)部的獨(dú)立硬件,定時(shí)器與晶振相互連接并相互作用。定時(shí)器/計(jì)數(shù)器本質(zhì)的16位的加1計(jì)數(shù)器,當(dāng)開啟定時(shí)器/計(jì)數(shù)器后,定時(shí)器/計(jì)數(shù)器便會在晶振的作用下指定的開始加1計(jì)數(shù)。計(jì)數(shù)滿后產(chǎn)生中斷。</p><p> 晶振頻率便是時(shí)鐘頻率,12個(gè)時(shí)
42、鐘周期便是一個(gè)機(jī)器周期T0 .。定時(shí)器/計(jì)數(shù)器所要計(jì)數(shù)的次數(shù)N,音樂脈沖的半周期為T,則N=T/T0 。</p><p> 計(jì)數(shù)器滿值為65536。</p><p> 需要計(jì)數(shù)的次數(shù)為N。</p><p> 則定時(shí)器/計(jì)數(shù)器的初值為N0 =65536-N 。</p><p> 計(jì)數(shù)的初值N0存入計(jì)數(shù)器:</p><
43、;p> 高8位 TH0= N0/256</p><p> 低8位 TL0= N0%56</p><p> 3.1.4軟件的音調(diào)頻率設(shè)置:</p><p><b> 樂曲音調(diào)的設(shè)置</b></p><p> 使用單片機(jī)播放音樂,就是讓單片機(jī)識別樂譜并輸出相應(yīng)頻率的脈沖信號 。要識別樂譜可以先對所要識別的
44、音調(diào)和節(jié)拍進(jìn)行設(shè)置。對音調(diào)的設(shè)置如下: </p><p><b> 系統(tǒng)軟件流程圖</b></p><p><b> 3.2系統(tǒng)程序</b></p><p> #include <REG52.H></p><p> #include "SoundPlay.h"
45、</p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> /***********管腳定義***************************/</p><p> sbit rs=P2^4;</p><p&g
46、t; sbit rw=P2^5;</p><p> sbit e=P2^6;</p><p> /***********變量和向量定義***************************/</p><p> uchar code tab[]={0x18,0x1b,5,4,4,5,3,0,//8行,低5位。</p><p>
47、0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,//年//1602可以自建64個(gè)字,但是需要看好說明書上的地址</p><p> 0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00,//月</p><p> 0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00};//日 </p>&
48、lt;p> uchar code zijian[]={0x00,0x01,0x02,0x03};//自定義字庫在內(nèi)存中的地址。調(diào)用字庫的時(shí)候需要用到</p><p> uchar code girl[4]={'g','i','r','l'};//因?yàn)閍iisic碼的值,和地址吻合,其實(shí)這個(gè)向量也是地址</p><p&g
49、t; uchar code next[4]={'n','e','x','t'};</p><p> uchar code fly[9]={'b','u','t','t','e','r','f','l','y
50、9;};</p><p> uchar code same[4]={'s','a','m','e'};</p><p> /***********延時(shí)***************************/</p><p> delay1ms1(uchar time)//延時(shí)1ms</p
51、><p><b> {</b></p><p> uchar i,j;</p><p> for(i=0;i<time;i++)</p><p><b> {</b></p><p> for(j=0;j<250;j++);</p><p
52、><b> }</b></p><p><b> }</b></p><p> /***********驅(qū)動部分***************************/</p><p> enable()//LCD驅(qū)動部分</p><p><b> {</b&
53、gt;</p><p><b> rs=0;</b></p><p><b> rw=0;</b></p><p><b> e=0;</b></p><p> delay1ms1(3);</p><p><b> e=1;</
54、b></p><p><b> }</b></p><p> write2(uchar i)</p><p><b> {</b></p><p><b> P0=i;</b></p><p><b> rs=1;</b&
55、gt;</p><p><b> rw=0;</b></p><p><b> e=0;</b></p><p> delay1ms1(2);</p><p><b> e=1;</b></p><p><b> }</b>
56、;</p><p> lcdshow(uchar date[],uchar weizhi,uchar num) //要寫的向量名稱,lcd顯示的位置,向量里面位的個(gè)數(shù)</p><p><b> {</b></p><p> uchar i,j,*pdate;//定義指針</p><p> pdate=date
57、;//取向量的地址</p><p><b> P0=0xc;</b></p><p><b> enable();</b></p><p> P0=weizhi;</p><p><b> enable();</b></p><p> f
58、or(i=0;i<num;i++,pdate++)</p><p><b> {</b></p><p> j=*pdate;//取值</p><p> write2(j);</p><p><b> }</b></p><p><b> }&
59、lt;/b></p><p> /***********自建字庫的寫入***************************/</p><p> zijianzi(uchar length,uchar table[],uchar address)</p><p><b> {</b></p><p> u
60、char i,j,*p;</p><p><b> p=table;</b></p><p> P0=address;</p><p><b> enable();</b></p><p> for(i=0;i<length;i++,p++)//一共4個(gè)?</p>&
61、lt;p><b> {</b></p><p><b> j=*p;</b></p><p> write2(j);</p><p> delay1ms1(2);</p><p><b> }</b></p><p><b>
62、 }</b></p><p> /***********clean_the_lcdshow*******/</p><p><b> clean()</b></p><p><b> {</b></p><p><b> rw=0;</b></p&g
63、t;<p><b> P0=1;</b></p><p><b> enable();</b></p><p><b> }</b></p><p> /***********lcd初始化程序***************************/</p><
64、p><b> initlcd()</b></p><p><b> {</b></p><p><b> rw=0;</b></p><p> P0=1;//清屏并光標(biāo)復(fù)位</p><p><b> enable();</b><
65、;/p><p> P0=0X38;//設(shè)置顯示模式:8位2行5x8點(diǎn)陣</p><p><b> enable();</b></p><p> P0=6;//文字不動,光標(biāo)自動右移</p><p><b> enable();</b></p><p> z
66、ijianzi(31,tab,0x40);//自建字</p><p><b> }</b></p><p> ////////////////////////////////////////////////////////</p><p> void Delay1ms(unsigned int count)</p>&
67、lt;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><p><b> }</b></p><
68、p> //*****************************Music******************************************************</p><p><b> //揮著翅膀的女孩</b></p><p> unsigned char code Music_Girl[]={ 0x17,0x02, 0x17
69、,0x03, 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
70、,0x03, 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><
71、p> 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,</
72、p><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
73、,0x03,</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
74、,0x03, 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
75、,0x03, 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
76、,0x03, 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
77、,0x66, 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><
78、p> 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,</
79、p><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
80、,0x03,</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
81、,0x03, 0x15,0x02,</p><p> 0x18,0x66, 0x16,0x02, 0x17,0x02, 0x15,0x00, 0x00,0x00};</p><p><b> //同一首歌</b></p><p> unsigned char code Music_Same[]={ 0x0F,0x01, 0x15,0x02
82、, 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,0x02,</p><p> 0x17,0x03
83、, 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,0x70, 0x1A,0x03,</p><p>
84、 0x1A,0x01, 0x19,0x02, 0x19,0x03, 0x1A,0x03, 0x1B,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>
85、<p> 0x16,0x01, 0x11,0x02, 0x11,0x03, 0x10,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
86、,</p><p> 0x1B,0x0C, 0x1A,0x0D, 0x19,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
87、, 0x17,0x03,</p><p> 0x16,0x00, 0x0F,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
88、, 0x15,0x03, 0x10,0x02,</p><p> 0x10,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
89、, 0x17,0x03, 0x16,0x03, 0x19,0x00,</p><p> 0x00,0x00 };</p><p> //兩只蝴蝶 </p><p> unsigned char code Music_Two[] ={ 0x17,0x03, 0x16,0x03, 0x17,0x01
90、, 0x16,0x03, 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
91、, 0x0F,0x01, 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
92、, 0x15,0x03, 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>
93、 0x16,0x0D, 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>
94、<p> 0x16,0x03, 0x16,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,</p><p> 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0D, 0x15,0x00,</p><p> 0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03
95、,</p><p> 0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03,</p><p> 0x16,0x0D, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03,</p><p> 0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D
96、, 0x16,0x03,</p><p> 0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03,</p><p> 0x19,0x02, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E,</p><p> 0x1B,0x04, 0x17,0x02, 0x1A,0x03
97、, 0x1A,0x03, 0x1A,0x0E,</p><p> 0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03,</p><p> 0x17,0x0D, 0x16,0x03, 0x17,0x03, 0x19,0x01, 0x19,0x03,</p><p> 0x19,0x03, 0x1A,0x03
98、, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03,</p><p> 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x03,</p><p> 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02,</p><p> 0x1A,0x02
99、, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01,</p><p> 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03,</p><p> 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,</p><p>
100、 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,</p><p> 0x17,0x16, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,</p><p> 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x0F,0x02,</p>
101、<p> 0x10,0x03, 0x15,0x00, 0x00,0x00 };</p><p> //***********************************************************************************</p><p><b> main()</b></p><p
102、><b> {</b></p><p> InitialSound();</p><p> initlcd();</p><p><b> clean();</b></p><p><b> while(1)</b></p><p>&l
103、t;b> {</b></p><p><b> clean();</b></p><p> lcdshow(girl,0x80,4);</p><p> lcdshow(next,0xc0,4);</p><p> lcdshow(same,0xc8,4);</p><p
104、> Play(Music_Girl,0,3,360);</p><p><b> clean();</b></p><p> lcdshow(same,0x80,4);</p><p> lcdshow(next,0xc0,4);</p><p> lcdshow(fly,0xc8,9);</p&g
105、t;<p> Delay1ms(500);</p><p> Play(Music_Same,0,3,360);</p><p><b> clean();</b></p><p> lcdshow(fly,0x80,9);</p><p> lcdshow(next,0xc0,4);</p
106、><p> lcdshow(girl,0xc8,4);</p><p> Delay1ms(500);</p><p> Play(Music_Two,0,3,360);</p><p> Delay1ms(500);</p><p><b> }</b></p><p&
107、gt;<b> }</b></p><p> /**************************************************************************</p><p> SOUND PLAY FOR 51MCU</p><p> COPYRIGHT (c) 2005 BY JJJ.<
108、;/p><p> -- ALL RIGHTS RESERVED --</p><p> File Name: SoundPlay.h</p><p> Author: Jiang Jian Jun</p><p> Created: 2005/5/16</p><p&g
109、t; Modified:NO</p><p> Revision: 1.0</p><p> *******************************************************************************/</p><p> #ifndef __SOUNDPLAY_H_REVISION_FIRST__&
110、lt;/p><p> #define __SOUNDPLAY_H_REVISION_FIRST__</p><p> //**************************************************************************</p><p> #define SYSTEM_OSC 12000000//定義晶振頻率
111、12000000HZ</p><p> #define SOUND_SPACE 4/5 //定義普通音符演奏的長度分率,//每4分音符間隔</p><p> sbit BeepIO = P1^2;//定義輸出管腳</p><p> unsigned int code FreTab[12] = { 262,277,294,311,
112、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 char code LengthTab[7]= { 1,2,4,8,16,32,64 };
113、</p><p> unsigned char Sound_Temp_TH0,Sound_Temp_TL0;//音符定時(shí)器初值暫存 </p><p> unsigned char Sound_Temp_TH1,Sound_Temp_TL1;//音長定時(shí)器初值暫存</p><p> //********************************
114、******************************************</p><p> void InitialSound(void)</p><p><b> {</b></p><p> BeepIO = 0;</p><p> Sound_Temp_TH1 = (65535-(1/1200)
115、*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_Temp_TH1;</p><p> TL1 = Sound_Temp_TL1;
116、</p><p> TMOD |= 0x11;</p><p> ET0 = 1;</p><p> ET1 = 0;</p><p> TR0 = 0;</p><p> TR1 = 0;</p><p> EA = 1;</p>&
117、lt;p><b> }</b></p><p> void BeepTimer0(void) interrupt 1//音符發(fā)生中斷</p><p><b> {</b></p><p> BeepIO = !BeepIO;</p><p> TH0 = Sound_Temp
118、_TH0;</p><p> TL0 = Sound_Temp_TL0;</p><p><b> }</b></p><p> //**************************************************************************</p><p> voi
119、d Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)</p><p><b> {</b></p><p> unsigned int NewFreTab[12];//新的頻率表</p><p> unsig
120、ned 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,FD;</p><p> for(i=0;i<1
121、2;i++) // 根據(jù)調(diào)號及升降八度來生成新的頻率表 </p><p><b> {</b></p><p> j = i + Signature;</p><p> if(j > 11)</p><p><b> {</b></p><p><
122、b> j = j-12;</b></p><p> NewFreTab[i] = FreTab[j]*2;</p><p><b> }</b></p><p><b> else</b></p><p> NewFreTab[i] = FreTab[j];</p&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于mcu及rtx51的樂曲編輯和發(fā)生器設(shè)計(jì)【文獻(xiàn)綜述】
- 基于mcu及rtx51的樂曲編輯和發(fā)生器設(shè)計(jì)【開題報(bào)告】
- 基于mcu及rtx51的樂曲編輯和發(fā)生器設(shè)計(jì)【畢業(yè)設(shè)計(jì)+開題報(bào)告+文獻(xiàn)綜述】
- 基于at89s52的樂曲編輯發(fā)生器設(shè)計(jì)畢業(yè)論文
- 畢業(yè)設(shè)計(jì)---基于51單片機(jī)的音樂發(fā)生器設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)----基于51單片機(jī)的函數(shù)發(fā)生器的設(shè)計(jì)
- 基于51單片機(jī)的波形發(fā)生器設(shè)計(jì)-畢業(yè)設(shè)計(jì)論文
- 基于fpga的函數(shù)發(fā)生器設(shè)計(jì)畢業(yè)設(shè)計(jì)
- 函數(shù)發(fā)生器的設(shè)計(jì)畢業(yè)設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)---信號發(fā)生器的設(shè)計(jì)
- 信號發(fā)生器畢業(yè)設(shè)計(jì)
- 基于fpga信號發(fā)生器畢業(yè)設(shè)計(jì)
- 函數(shù)發(fā)生器的設(shè)計(jì)畢業(yè)設(shè)計(jì)
- 波形發(fā)生器畢業(yè)設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)---信號發(fā)生器設(shè)計(jì)
- 基于labview的信號發(fā)生器的設(shè)計(jì)【畢業(yè)設(shè)計(jì)】
- 畢業(yè)設(shè)計(jì)(論文)基于dds的信號發(fā)生器設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)(論文)-基于fpga的信號發(fā)生器的設(shè)計(jì)和實(shí)現(xiàn)
- eda課程設(shè)計(jì)報(bào)告--樂曲發(fā)生器
- 基于51單片機(jī)的函數(shù)發(fā)生器的畢業(yè)設(shè)計(jì)(含外文翻譯)
評論
0/150
提交評論