版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 本科畢業(yè)設(shè)計(jì)(論文)</p><p><b> ?。ǘ?屆)</b></p><p> 基于MCU及RTX51的樂(lè)曲編輯和發(fā)生器設(shè)計(jì)</p><p> 所在學(xué)院 </p><p> 專業(yè)班級(jí) 電子信息工程
2、 </p><p> 學(xué)生姓名 學(xué)號(hào) </p><p> 指導(dǎo)教師 職稱 </p><p> 完成日期 年 月 </p><p><b> 摘 要</b></p><
3、;p> 在科技高度發(fā)達(dá)的今天,單片機(jī)已經(jīng)廣泛的應(yīng)用到了人們生活的各個(gè)領(lǐng)域,單片機(jī)為人們帶來(lái)了很多的方便也提高了人們生活學(xué)習(xí)和工作的效率。當(dāng)然單片機(jī)的廣泛應(yīng)用也可以為環(huán)保和節(jié)約資源做出貢獻(xiàn),比如應(yīng)用單片機(jī)設(shè)計(jì)電子書(shū),讓人們閱讀電子書(shū)以代替紙張書(shū)籍就可以減少人們對(duì)紙張的需求和使用量。應(yīng)用單片機(jī)制作音樂(lè)編輯器也是同一個(gè)道理,他相對(duì)于傳統(tǒng)上的用筆將樂(lè)譜記錄在紙張上有4個(gè)有點(diǎn),即節(jié)省了紙張資源、保存方便、易于修改最后一點(diǎn)便是可以快速知道樂(lè)
4、曲設(shè)計(jì)的效果如何?;贛CU及RTX51的樂(lè)曲編輯和發(fā)生器可以通過(guò)4*4矩陣鍵盤(pán)進(jìn)行樂(lè)曲輸入和播放控制,通過(guò)LCD1602液晶屏形成人機(jī)交流界面,由揚(yáng)聲器播放樂(lè)曲的設(shè)計(jì)。</p><p> 關(guān)鍵詞:rtx51 、 mcu、 lcd 樂(lè)曲編輯發(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簡(jiǎn)介3</p><p> 2.2.2按鍵輸入模塊9</p><p> 2.2.3顯示模塊11</p><p> 2.2.4存儲(chǔ)模塊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ì)音樂(lè)程序的整體原理:18</p&
11、gt;<p> 3.1.2應(yīng)用單片機(jī)產(chǎn)生不同頻率方波脈沖信號(hào)的方法: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ì)樂(lè)曲編輯和發(fā)生器,是單片機(jī)所衍生出的眾多功能之一。以前在人們創(chuàng)作或記錄樂(lè)譜時(shí),一般搜是用筆將樂(lè)譜記錄在紙上來(lái)保存樂(lè)譜.這種方式普遍存在著紙張資源浪費(fèi)、保存不便、不易于修改等缺點(diǎn)。 本課題基于MCU及RTX51的樂(lè)曲編輯和發(fā)生器設(shè)計(jì),是對(duì)單片機(jī)mcu和多任務(wù)實(shí)時(shí)操作系統(tǒng)的一項(xiàng)實(shí)際應(yīng)用。隨著科技的發(fā)展音樂(lè)也從業(yè)在不
14、斷的發(fā)展,電子音樂(lè)是從具體的音樂(lè)發(fā)展到合成器音樂(lè),再發(fā)展到現(xiàn)如今的計(jì)算機(jī)音樂(lè)。樂(lè)曲編輯和發(fā)生器可以記錄樂(lè)譜并制作簡(jiǎn)單的電子音樂(lè)將其樂(lè)譜進(jìn)行演奏。</p><p> RTX51是一個(gè)用于8051系列處理器多任務(wù)實(shí)時(shí)操作系統(tǒng)。Rtx51是德國(guó)Keil公司開(kāi)發(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)先級(jí)別分配給不同的任務(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)先級(jí)。[4]Rtx51
16、的優(yōu)點(diǎn)在于提供實(shí)時(shí)操作系統(tǒng),允許多任務(wù)同時(shí)執(zhí)行,可以用c函數(shù)編寫(xiě)程序并用c51編譯,還可以用標(biāo)準(zhǔn)的才變量來(lái)定義任務(wù)號(hào)和優(yōu)先權(quán)。</p><p><b> 1.2目的</b></p><p> 通過(guò)設(shè)計(jì)完成一個(gè)可以用4*4矩陣來(lái)輸入編輯樂(lè)曲的樂(lè)曲編輯器和通過(guò)放大器、揚(yáng)聲器播放音樂(lè)的音樂(lè)發(fā)聲器。其中編輯過(guò)程和音樂(lè)播放過(guò)程都要求可以用LCD液晶屏顯示其中的信息。<
17、/p><p><b> 2 硬件電路設(shè)計(jì)</b></p><p> 2.1 系統(tǒng)總體方案設(shè)計(jì)</p><p> 樂(lè)曲編輯和發(fā)生器系統(tǒng)基本按以下框圖實(shí)施:</p><p> 該系統(tǒng)包括了AT89S52芯片,晶振和復(fù)位電路,LCD1602顯示器,存儲(chǔ)模塊AT24C02芯片,和以達(dá)林頓晶體管ULN2803作為放大器的聲音
18、輸出系統(tǒng)。</p><p> 電路原理圖參見(jiàn)附錄。</p><p> 2.2模塊及芯片器件的介紹</p><p> 2.2.1 單片機(jī)AT89S52簡(jiǎn)介</p><p> AT89S52是一種低功耗、高性能CM0S8位微控制器,具有8k在系統(tǒng)可編程Flah存儲(chǔ)器。使用Atmel公司高密度非易失性存儲(chǔ)器技術(shù)制造,與工業(yè)80c51產(chǎn)品指令
19、和引腳完全兼容。片上Flash允許持續(xù)存儲(chǔ)器在系統(tǒng)可編程,適于常規(guī)編程器。AT89S52具有以下標(biāo)準(zhǔn)功能;8k字節(jié)Flash,256字節(jié)RAM,32位I/O口線,看門(mén)狗定時(shí)器,2個(gè)數(shù)據(jù)指針,3個(gè)16位定時(shí)器/計(jì)數(shù)器,1個(gè)6 向量2級(jí)中斷結(jié)構(gòu),全雙工串行口,片內(nèi)晶振及時(shí)鐘電路。另外,AT89S52 可降至0Hz 靜態(tài)邏 輯操作,支持2種軟件可選擇節(jié)電模式。空閑模式下,CPU 停止工作,允許RAM、定時(shí)器/計(jì)數(shù)器、串口、中斷繼續(xù)工 作。掉電
20、保護(hù)方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié), 單片機(jī)一切工作停止,直到下一個(gè)中斷或硬件復(fù)位為止。[16]</p><p> AT89S52各引腳功能</p><p> [16][功能說(shuō)明大多出自AT89S52的數(shù)據(jù)手冊(cè)]</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)先級(jí)也可在IE中設(shè)置。</p><p> T2CON 地址為0C8H 復(fù)位值:0000 0000B位可尋址</
22、p><p> MCS-51器件有單獨(dú)的程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器。外部程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器都可以64K尋址。</p><p> 程序存儲(chǔ)器:如果EA引腳接地,程序讀取只從外部存儲(chǔ)器開(kāi)始。</p><p> 對(duì)于 89S52,如果EA 接VCC,程序讀寫(xiě)先從內(nèi)部存儲(chǔ)器(地址為0000H~1FFFH)開(kāi)始,接著從外部尋址,尋址地址為:2000H~FFFFH。</p
23、><p> 數(shù)據(jù)存儲(chǔ)器:AT89S52 有256 字節(jié)片內(nèi)數(shù)據(jù)存儲(chǔ)器。高128 字節(jié)與特殊功能寄存器重疊。也就是說(shuō)高128字節(jié)與特殊功能寄存器有相同的地址,而物理上是分開(kāi)的。</p><p> 當(dāng)一條指令訪問(wèn)高于7FH 的地址時(shí),尋址方式?jīng)Q定CPU 訪問(wèn)高128 字節(jié)RAM 還是特殊功能寄存器空間。直接尋址方式訪問(wèn)特殊功能寄存器(SFR)。</p><p> 2.
24、2.2按鍵輸入模塊</p><p> 如圖,按鍵輸入模塊使用的是矩形鍵盤(pán)。將16個(gè)按鍵排成4行4列,第一行將每個(gè)按鍵的一端連接在一起構(gòu)成行線,第一列將每個(gè)按鍵的另一端連接在一起構(gòu)成列線,如此就會(huì)有4行4列的8根線,將這8根線接到I/o口上,通過(guò)程序掃描鍵盤(pán)就可以檢測(cè)出16個(gè)鍵。</p><p> 矩陣鍵盤(pán)的掃描檢測(cè)的依據(jù)和獨(dú)立鍵盤(pán)是一樣的,即檢測(cè)與鍵盤(pán)對(duì)應(yīng)的I/o口是否為低電平。因?yàn)榫?/p>
25、陣鍵盤(pán)的兩端都是和單片機(jī)的I/o相連的,所以檢測(cè)的時(shí)候需要人為的添加低電平。檢測(cè)時(shí)先發(fā)送給I/o口一列位低電平其他列為高電平,這個(gè)時(shí)候檢測(cè)各行是否有低電平,如果檢測(cè)到某一行位低電平,我們就可以先確定當(dāng)前被按下按鍵的行是哪一行哪一列,然后可以用相同的方法輪流操作其他列輪流檢測(cè)其他行,檢測(cè)出所有的按鍵。這樣就可以檢測(cè)出是否有按鍵按下和如果有按鍵按下是哪個(gè)按鍵按下。</p><p> 按鍵檢測(cè)的流程圖如下:</
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條引腳先,功能說(shuō)明如下:</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 輸出:無(wú)</p><p> 寫(xiě)指令 輸入:RS=L,R/W=L,DO~D7
28、=指令碼,E=高脈沖 輸出:D0~D7=數(shù)據(jù)</p><p> 寫(xiě)數(shù)據(jù) 輸入:RS=H,R/W=L,D0~D7=數(shù)據(jù),E=高脈沖 輸出:無(wú)</p><p> LCD1602一般用于寫(xiě),所以R/W可接地</p><p> RS 高寫(xiě)數(shù)據(jù),RS低寫(xiě)狀態(tài)</p><p><b> 2.2.4存儲(chǔ)模塊</b><
29、/p><p> 該存儲(chǔ)模塊使用的是AT24C02,他是串行E2PROM基于I2C-BUS 的存儲(chǔ)器件。</p><p> 24c02有256個(gè)字節(jié)的存儲(chǔ)空間。他的優(yōu)點(diǎn)是接口簡(jiǎn)單方便,數(shù)據(jù)掉電后不丟失,而且不易受干擾。E0-E2(A0-A2)是地址線,wp是保護(hù)引腳,SCL.SDA是串行接口。當(dāng) wp與cpu斷開(kāi)后保持高電平時(shí),cpu不能對(duì)芯片中的數(shù)據(jù)進(jìn)行修改,wp通過(guò)這種起到保護(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、簡(jiǎn)化那些復(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)下 信號(hào)和信息可以通過(guò)郵箱系統(tǒng)在任務(wù)之間互相傳遞 你可以從一存</p>&l
32、t;p> 儲(chǔ)池中分配和釋放內(nèi)存 你可以強(qiáng)迫一個(gè)任務(wù)等待中斷 超時(shí)或者是從另一個(gè)任務(wù)或中斷發(fā)出的</p><p><b> 信號(hào)或信息</b></p><p> RTX51 Tiny是一個(gè) RTX51的子集 它可以很容易地在沒(méi)有任何外部存儲(chǔ)器的單片8051系統(tǒng)上運(yùn)</p><p> 轉(zhuǎn) 除了下列例外 RTX51 Tiny支持許多在
33、RTX51中的特征</p><p> RTX51 Tiny僅支持時(shí)間片輪轉(zhuǎn)任務(wù)切換和使用信號(hào)進(jìn)行任務(wù)切換,不支持搶先式的任務(wù)切換。</p><p> 我們用到的是RTX51 TINY,所以主要的是對(duì)RTX51 TINY進(jìn)行說(shuō)明。</p><p> RTX51 TINY 規(guī)格說(shuō)明</p><p><b> 1、中斷</b
34、></p><p> RTX51 Tiny與中斷函數(shù)并行運(yùn)作,中斷服務(wù)程序可以通過(guò)發(fā)送信號(hào)(用isr_send_signal函數(shù))或設(shè)置任務(wù)的就序標(biāo)志(用isr_set_redy函數(shù))與RTX51 Tiny的任務(wù)進(jìn)行通信。</p><p> 如同在一個(gè)標(biāo)準(zhǔn)的,沒(méi)有RTX51 Tiny的應(yīng)用中一樣,中斷例程必須在RTX51Tiny應(yīng)用中實(shí)現(xiàn)并允許,RTX51 Tinyim 沒(méi)有中斷
35、服務(wù)程序的管理。</p><p><b> 2、再入函數(shù)</b></p><p> C51編譯器提供對(duì)再入函數(shù)的支持,再入函數(shù)在再入堆棧中存儲(chǔ)參數(shù)和局部變量,從而保護(hù)遞歸調(diào)用或并行調(diào)用。RTX51 Tiny不支持對(duì)C51再入棧的任何管理。因此,如果在程序中使用再入函數(shù),必須確保這此函數(shù)不調(diào)用任何RTX51 Tiny系統(tǒng)函數(shù),且不被循環(huán)任務(wù)切掉所打斷。</p&
36、gt;<p><b> 3、C庫(kù)例程</b></p><p> 可再入C51庫(kù)函數(shù)可在任何任務(wù)中無(wú)限制的使用。對(duì)于非再入的C51庫(kù)函數(shù),同樣有非可再入C函數(shù)的限制。</p><p><b> 4、多數(shù)據(jù)指針</b></p><p> Keil C51編譯器允許使用多數(shù)據(jù)指針(存在于許多8051的派生芯
37、片中), RTX51 Tiny不提供對(duì)它們的支持.因此,在RTX51 Tiny的應(yīng)用程序中應(yīng)小心使用多數(shù)據(jù)指針。</p><p> 從本質(zhì)上說(shuō),必須確保循環(huán)任務(wù)切換不會(huì)在執(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中文手冊(cè)]</p><p><b> 3 軟件設(shè)計(jì)</b></p><p> 3.1程
39、序設(shè)計(jì)的原理</p><p> 3.1.1單片機(jī)設(shè)計(jì)音樂(lè)程序的整體原理:</p><p> 聲音便是在傳播中的不同頻率的聲波,由于頻率的不同,使人感覺(jué)音質(zhì)不同。樂(lè)曲中的不同音符便是不同頻率的聲波。在設(shè)計(jì)中可以使用單片機(jī)產(chǎn)生不同頻率的方波脈沖信號(hào)經(jīng)過(guò)放大電路,再由揚(yáng)聲器進(jìn)行播放,形成不同頻率的聲音。音樂(lè)的節(jié)拍就是該頻率的聲音所持續(xù)的時(shí)間。單片機(jī)可以控制不同頻率的方波脈沖信號(hào)在不同時(shí)間的持
40、續(xù)時(shí)間,也就是控制了節(jié)拍。兩者結(jié)合便可以形成音樂(lè)。</p><p> 3.1.2應(yīng)用單片機(jī)產(chǎn)生不同頻率方波脈沖信號(hào)的方法:</p><p> 需要的信號(hào)是不同頻率的方波脈沖信號(hào),可以使用單片機(jī)中的中斷技術(shù)。使用定時(shí)器/計(jì)數(shù)器來(lái)控制高電平或低電平所持續(xù)的時(shí)間,即使用定時(shí)器/計(jì)數(shù)器來(lái)控制方波的半周期。計(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)開(kāi)啟定時(shí)器/計(jì)數(shù)器后,定時(shí)器/計(jì)數(shù)器便會(huì)在晶振的作用下指定的開(kāi)始加1計(jì)數(shù)。計(jì)數(shù)滿后產(chǎn)生中斷。</p><p> 晶振頻率便是時(shí)鐘頻率,12個(gè)時(shí)
42、鐘周期便是一個(gè)機(jī)器周期T0 .。定時(shí)器/計(jì)數(shù)器所要計(jì)數(shù)的次數(shù)N,音樂(lè)脈沖的半周期為T(mén),則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> 樂(lè)曲音調(diào)的設(shè)置</b></p><p> 使用單片機(jī)播放音樂(lè),就是讓單片機(jī)識(shí)別樂(lè)譜并輸出相應(yīng)頻率的脈沖信號(hào) 。要識(shí)別樂(lè)譜可以先對(duì)所要識(shí)別的
44、音調(diào)和節(jié)拍進(jìn)行設(shè)置。對(duì)音調(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è)字,但是需要看好說(shuō)明書(shū)上的地址</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};//自定義字庫(kù)在內(nèi)存中的地址。調(diào)用字庫(kù)的時(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ū)動(dòng)部分***************************/</p><p> enable()//LCD驅(qū)動(dòng)部分</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) //要寫(xiě)的向量名稱,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> /***********自建字庫(kù)的寫(xiě)入***************************/</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;//文字不動(dòng),光標(biāo)自動(dòng)右移</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 //定義普通音符演奏的長(zhǎng)度分率,//每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;//音長(zhǎng)定時(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)號(hào)及升降八度來(lái)生成新的頻率表 </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. 本站所有資源如無(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于mcu及rtx51的樂(lè)曲編輯和發(fā)生器設(shè)計(jì)【文獻(xiàn)綜述】
- 基于mcu及rtx51的樂(lè)曲編輯和發(fā)生器設(shè)計(jì)【開(kāi)題報(bào)告】
- 基于mcu及rtx51的樂(lè)曲編輯和發(fā)生器設(shè)計(jì)【畢業(yè)設(shè)計(jì)+開(kāi)題報(bào)告+文獻(xiàn)綜述】
- 基于at89s52的樂(lè)曲編輯發(fā)生器設(shè)計(jì)畢業(yè)論文
- 畢業(yè)設(shè)計(jì)---基于51單片機(jī)的音樂(lè)發(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ì)---信號(hào)發(fā)生器的設(shè)計(jì)
- 信號(hào)發(fā)生器畢業(yè)設(shè)計(jì)
- 基于fpga信號(hào)發(fā)生器畢業(yè)設(shè)計(jì)
- 函數(shù)發(fā)生器的設(shè)計(jì)畢業(yè)設(shè)計(jì)
- 波形發(fā)生器畢業(yè)設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)---信號(hào)發(fā)生器設(shè)計(jì)
- 基于labview的信號(hào)發(fā)生器的設(shè)計(jì)【畢業(yè)設(shè)計(jì)】
- 畢業(yè)設(shè)計(jì)(論文)基于dds的信號(hào)發(fā)生器設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)(論文)-基于fpga的信號(hào)發(fā)生器的設(shè)計(jì)和實(shí)現(xiàn)
- eda課程設(shè)計(jì)報(bào)告--樂(lè)曲發(fā)生器
- 基于51單片機(jī)的函數(shù)發(fā)生器的畢業(yè)設(shè)計(jì)(含外文翻譯)
評(píng)論
0/150
提交評(píng)論