版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 《單片機原理與應(yīng)用》課程設(shè)計報告</p><p> 基于AT89C51的LCD音樂盒</p><p><b> 目 錄</b></p><p><b> 1 設(shè)計任務(wù)1</b></p><p> 2 系統(tǒng)設(shè)計方案2</p><p>
2、 2.1 設(shè)計目的2</p><p> 2.2 設(shè)計要求2</p><p> 2.3 系統(tǒng)組成框圖2</p><p> 2.4 主要設(shè)計軟件介紹3</p><p> 2.4.1 PROTEUS軟件簡介3</p><p> 2.4.2 KEIL簡介3</p><p> 3
3、 系統(tǒng)硬件設(shè)計5</p><p> 3.1 系統(tǒng)構(gòu)成5</p><p> 3.1.1 AT89C51單片機簡介5</p><p> 3.1.2 LCD 顯示器6</p><p> 3.1.3 鍵盤7</p><p> 3.1.4 跑馬燈電路8</p><p> 3.1.
4、5 播放電路的設(shè)計8</p><p> 3.1.6 系統(tǒng)復(fù)位電路的設(shè)計8</p><p> 3.1.7 時鐘電路模塊9</p><p> 3.2硬件電路端口分配9</p><p> 4 系統(tǒng)軟件設(shè)計10</p><p> 4.1 主模塊的設(shè)計10</p><p> 4.
5、2 外部中斷源系統(tǒng)設(shè)計11</p><p> 4.3 基本顯示模塊設(shè)計12</p><p> 4.4 系統(tǒng)初始化程序12</p><p> 5 系統(tǒng)的硬件調(diào)試及軟件調(diào)試14</p><p> 6 設(shè)計心得體會15</p><p><b> 參考文獻16</b></p
6、><p><b> 附A:圖18</b></p><p><b> 附B:源程序21</b></p><p> 基于AT89C51的LCD音樂盒</p><p><b> 1 設(shè)計任務(wù)</b></p><p> 21世紀(jì),電子技術(shù)獲得了飛速的
7、發(fā)展,在其推動下,現(xiàn)代電子產(chǎn)品幾乎滲透了社會的各個領(lǐng)域,有力地推動了社會生產(chǎn)力的發(fā)展和社會信息化程度的提高,同時也使現(xiàn)代電子產(chǎn)品性能進一步提高,產(chǎn)品更新?lián)Q代的節(jié)奏也越來越快。</p><p> 目前,單片機正朝著高性能和多品種方向發(fā)展趨勢將是進一步向著CMOS化、低功耗、小體積、大容量、高性能、低價格和外圍電路內(nèi)裝化等幾個方面發(fā)展。單片機應(yīng)用的重要意義還在于它從根本上改變了傳統(tǒng)的控制系統(tǒng)設(shè)計思想和設(shè)計方法。從前
8、必須由模擬電路或數(shù)字電路實現(xiàn)的大部分功能,現(xiàn)在已能用單片機通過軟件方法來實現(xiàn)了。這種軟件代替硬件的控制技術(shù)也稱為微控制技術(shù),是傳統(tǒng)控制技術(shù)的一次革命。單片機滲透到我們生活的各個領(lǐng)域,幾乎很難找到哪個領(lǐng)域沒有單片機的蹤跡。導(dǎo)彈的導(dǎo)航裝置,飛機上各種儀表的控制,計算機的網(wǎng)絡(luò)通訊與數(shù)據(jù)傳輸,工業(yè)自動化過程的實時控制和數(shù)據(jù)處理,廣泛使用的各種智能IC卡,民用豪華轎車的安全保障系統(tǒng),錄像機、攝像機、全自動洗衣機的控制,以及程控玩具、電子寵物等等,
9、這些都離不開單片機。</p><p> 隨著科學(xué)技術(shù)的進步和社會的發(fā)展,人類所接觸的信息也在不斷增加并且日益復(fù)雜。面對浩如煙海的信息,人們已經(jīng)能夠利用計算機等工具高效準(zhǔn)確地對之進行處理,但要想將處理完的信息及時,清晰地傳遞給別人,還必須通過尋求更加卓越的顯示技術(shù)來實現(xiàn)。單片機技術(shù)與液晶顯示技術(shù)的結(jié)合,使信息傳輸交流向著智能可視化方向迅速發(fā)展。</p><p> 隨著人類社會的發(fā)展,人們
10、對視覺、聽覺方面的享受提出了越來越高的要求。小小的音樂盒可以給人們帶來美好的回憶,提高人們的精神文化享受。傳統(tǒng)音樂盒多是機械型的,體積笨重,發(fā)音單調(diào),不能實現(xiàn)批量生產(chǎn)。本文設(shè)計的音樂盒是以單片機為核心元件的電子式音樂盒,體積小,重量輕,能演奏和旋音樂,功能多,外觀效果多彩,使用方便,并具有一定的商業(yè)價值。</p><p><b> 2 系統(tǒng)設(shè)計方案</b></p><
11、p><b> 2.1 設(shè)計目的</b></p><p> 本設(shè)計是基于單片機的數(shù)字音樂盒設(shè)計,由單片機AT89C51芯片和LED數(shù)碼管為核心,輔以必要的電路,構(gòu)成的一個單片機電子數(shù)字音樂盒。要求利用I/O口產(chǎn)生一定頻率的方波,驅(qū)動蜂鳴器,發(fā)出不同的音調(diào)并采用LCD顯示信息,從而演奏樂曲(最少三首樂曲,每首不少于30秒),開機時有英文歡迎提示字符,播放時顯示歌曲序號(或名稱),可通過
12、功能鍵選擇樂曲,暫停,播放。本設(shè)計采用4個按鍵,1602 LCD,跑馬燈結(jié)合了視覺聽覺雙重效果。</p><p><b> 2.2 設(shè)計要求</b></p><p> 若該設(shè)計使用數(shù)字電路完成,所設(shè)計的電路相當(dāng)復(fù)雜,大概需要十幾片數(shù)字集成塊,其功能也主要依賴于數(shù)字電路的各功能模塊的組合來實現(xiàn),焊接的過程比較復(fù)雜,成本也非常高。若用單片機來設(shè)計制作完成,由于其功能的
13、實現(xiàn)主要通過軟件編程來完成,那么就降低了硬件電路的復(fù)雜性,而且其成本也有所降低,所以在該設(shè)計中采用單片機利用AT89C51,它是低功耗、高性能的CMOS型8位單片機。片內(nèi)帶有4KB的Flash存儲器,且允許在系統(tǒng)內(nèi)改寫或用編程器編程。另外, AT89C51的指令系統(tǒng)和引腳與8051完全兼容,片內(nèi)有128B 的RAM、32條I/O口線、2個16位定時計數(shù)器、5個中斷源、一個全雙工串行口等。</p><p> 在開
14、機按鈕按下時有英文歡迎提示字符,播放時顯示歌曲序號(或名稱)。在演奏過程中可通過功能鍵選擇樂曲,暫停,播放。</p><p> 課設(shè)準(zhǔn)備中根據(jù)具體的要求,查找資料,然后按要求根據(jù)已學(xué)過的時鐘程序編寫定時鬧鐘的程序,依據(jù)程序利用proteus軟件進行了仿真試驗,對出現(xiàn)的問題進行分析和反復(fù)修改源程序,最終得到正確并符合要求的結(jié)果。</p><p> 2.3 系統(tǒng)組成框圖</p>
15、<p> 音樂盒的系統(tǒng)結(jié)構(gòu)以AT89C51單片機位控制核心,加上2個按鍵、時鐘復(fù)位電路、蜂鳴器、LED模塊組成。單片機負責(zé)接收按鍵的輸入,根據(jù)輸入控制音樂播放曲目和音樂花樣燈的顯示樣式以及蜂鳴器發(fā)音。系統(tǒng)組成框圖如圖2-1所示。</p><p> 圖2-1 系統(tǒng)組成框圖</p><p> 2.4 主要設(shè)計軟件介紹</p><p> 本設(shè)計利用K
16、EIL編程軟件對音樂盒源程序進行編程并調(diào)試,配合PROTEUS仿真軟件對硬件進行仿真調(diào)試,兩種軟件的簡介如下:</p><p> 2.4.1 PROTEUS軟件簡介</p><p> Proteus軟件是英國Labcenter electronics公司出版的EDA工具軟件(該軟件中國總代理為廣州風(fēng)標(biāo)電子技術(shù)有限公司)。它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機及外圍器件。
17、它是目前最好的仿真單片機及外圍器件的工具。雖然目前國內(nèi)推廣剛起步,但已受到單片機愛好者、從事單片機教學(xué)的教師、致力于單片機開發(fā)應(yīng)用的科技工作者的青睞。Proteus是世界上著名的EDA工具(仿真軟件),從原理圖布圖、代碼調(diào)試到單片機與外圍電路協(xié)同仿真,一鍵切換到PCB設(shè)計,真正實現(xiàn)了從概念到產(chǎn)品的完整設(shè)計。是目前世界上唯一將電路仿真軟件、PCB設(shè)計軟件和虛擬模型仿真軟件三合一的設(shè)計平臺,其處理器模型支持8051、HC11、PIC10/1
18、2/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即將增加Cortex和DSP系列處理器,并持續(xù)增加其他系列處理器模型。在編譯方面,它也支持IAR、Keil和MPLAB等多種編譯器。 </p><p> 2.4.2 KEIL簡介</p><p> 單片機開發(fā)中除必要的硬件外,同樣離不開軟件,我們寫的匯編語言源程序要變?yōu)镃PU可以執(zhí)行的機器碼
19、有兩種方法,一種是手工匯編,另一種是機器匯編,目前已極少使用手工匯編的方法了。機器匯編是通過匯編軟件將源程序變?yōu)闄C器碼,用于MCS-51單片機的匯編軟件有早期的A51,隨著單片機開發(fā)技術(shù)的不斷發(fā)展,從普遍使用匯編語言到逐漸使用高級語言開發(fā),單片機的開發(fā)軟件也在不斷發(fā)展,Keil軟件是目前最流行開發(fā)MCS-51系列單片機的軟件,這從近年來各仿真機廠商紛紛宣布全面支持Keil即可看出。Keil提供了包括C編譯器、宏匯編、連接器、庫管理和一個
20、功能強大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個集成開發(fā)環(huán)境(uVision)將這些部份組合在一起。運行Keil軟件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空閑的硬盤空間、WIN98、NT、WIN2000、WINXP等操作系統(tǒng)。掌握這一軟件的使用對于使用51系列單片機的愛好者來說是十分必要的,如果你使用C語言編程,那么Keil幾乎就是你的不二之選(目前在國內(nèi)你只能買到該軟件、而你買的仿真機也很可能只支持該軟件
21、),即使不使用C語言而僅用</p><p><b> 3 系統(tǒng)硬件設(shè)計</b></p><p><b> 3.1 系統(tǒng)構(gòu)成</b></p><p> 3.1.1 AT89C51單片機簡介</p><p> AT89C51是一種帶4K字節(jié)閃爍可編程可擦除只讀存儲器的低電壓,高性能CMOS8位
22、微處理器,俗稱單片機。該器件采用ATMEL高密度非易失存儲器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價廉的方案。</p><p> (1)主要特性:·與MCS-51 兼容 ·4K字節(jié)可編程閃爍存儲器·壽命:1000寫/
23、擦循環(huán)·數(shù)據(jù)保留時間:10年·全靜態(tài)工作:0Hz-24Hz·三級程序存儲器鎖定·128*8位內(nèi)部RAM·32可編程I/O線·兩個16位定時器/計數(shù)器·5個中斷源 ·可編程串行通道 ·低功耗的閑置和掉電模式·片內(nèi)振蕩器和時鐘
24、電路 </p><p> (2)管腳說明(如圖3-1): VCC:供電電壓。 GND:接地。</p><p> 圖3-1 P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當(dāng)P1口的管腳第一次寫
25、1時,被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時,P0 口作為原碼輸入口,當(dāng)FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。 P1口:P1口是一個內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內(nèi)部上拉的緣
26、故。在FLASH編程和校驗時,P1口作為第八位地址接收。 P2口:P2口為一個內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當(dāng)P2口被寫“1”時,其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。P2口當(dāng)用于外部程序存儲器或16位地址外部數(shù)據(jù)存儲器進行存取時,P2口輸出地址的高八位。在給出地址“1”時
27、,它利用內(nèi)部上拉優(yōu)勢,當(dāng)對外部八位地址數(shù)據(jù)存儲器進行讀寫時,P2口輸</p><p> RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時,要保持RST腳兩個機器周期的高電平時間。 ALE/PROG:當(dāng)訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用
28、于定時目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時, ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。</p><p> /PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時,這兩次有效
29、的/PSEN信號將不出現(xiàn)。 /EA/VPP:/EA保持低電平時,在此期間外部程序存儲器(0000H-FFFFH),不管是否有內(nèi)部程序存儲器。注意加密方式1時,/EA將內(nèi)部鎖定為RESET;當(dāng)/EA端保持高電平時,此間內(nèi)部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。 XTAL1:反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入。&
30、#160; XTAL2:來自反向振蕩器的輸出。 </p><p><b> (3)振蕩器特性:</b></p><p> XTAL1和XTAL2分別為反向放大器的輸入和輸出。該反向放大器可以配置為</p><p> 片內(nèi)振蕩器。石晶振蕩和陶瓷振蕩均可采用。如采用外部時鐘源驅(qū)動器件,XTAL2
31、應(yīng)不接。有余輸入至內(nèi)部時鐘信號要通過一個二分頻觸發(fā)器,因此對外部時鐘信號的脈寬無任何要求,但必須保證脈沖的高低電平要求的寬度。</p><p><b> ?。?)芯片擦除:</b></p><p> 整個PEROM陣列和三個鎖定位的電擦除可通過正確的控制信號組合,并保持ALE</p><p> 管腳處于低電平10ms 來完成。在芯片擦操作中
32、,代碼陣列全被寫“1”且在任何非空存儲字節(jié)被重復(fù)編程以前,該操作必須被執(zhí)行。此外,AT89C51設(shè)有穩(wěn)態(tài)邏輯,可以在低到零頻率的條件下靜態(tài)邏輯,支持兩種軟件可選的掉電模式。在閑置模式下,CPU停止工作。但RAM,定時器,計數(shù)器,串口和中斷系統(tǒng)仍在工作。在掉電模式下,保存RAM的內(nèi)容并且凍結(jié)振蕩器,禁止所用其他芯片功能,直到下一個硬件復(fù)位為止。</p><p> 3.1.2 LCD 顯示器</p>
33、<p> 1602液晶也叫1602字符型液晶,它是一種專門用來顯示字母、數(shù)字、符號的點陣型液晶模塊。它是由若干個5x7或者5x11的點陣字符位組成,每個點陣字符位都可以用顯示一個字符,每位之間有一個點距的間隔,每行之間也有間隔,起到了字符間距和行間距的作用,正因為如此,所以它不能很好的顯示圖片。實物圖如圖3-2,引腳圖如圖3-3。 </p><p><b> 圖3-2</b>&
34、lt;/p><p> 圖3-3 1602的引腳圖</p><p><b> 3.1.3 鍵盤</b></p><p> 鍵盤采用四個輕觸按鍵,一端接地一端直接連I/O口,當(dāng)按下某個按鍵時,即向相應(yīng)的I/O口輸入一個低電平,I/O口再對應(yīng)觸發(fā)音樂和的按鍵功能,上一首、下一首或停止、播放。接線圖如圖3-4。 </p><p&
35、gt;<b> 圖 3-4</b></p><p> 3.1.4 跑馬燈電路</p><p> 該跑馬燈可以根據(jù)音樂節(jié)奏閃動LED,再實物圖里可以將LED擺成心形實物圖見附錄3。采用八個LED,一端接1K排阻一端接P3口,由于I/O口驅(qū)動負載能力有限,所以采用灌電流輸入驅(qū)動LED。原理圖如圖3-5。</p><p><b>
36、 圖3-5</b></p><p> 3.1.5 播放電路的設(shè)計</p><p> 播放電路用一個PNP三極管進行信號放大,基極接一個200歐電阻限流,采用8歐0.5W大口徑喇叭,一端接地一端接一個電位器阻值在0-200歐內(nèi)可調(diào),用以控制播放音量。具體鏈接電路圖如圖3-6。</p><p><b> 圖3-6</b></
37、p><p> 3.1.6 系統(tǒng)復(fù)位電路的設(shè)計</p><p> 智能系統(tǒng)一般應(yīng)有手動或上電復(fù)位電路。復(fù)位電路的實現(xiàn)通常有兩種方式:RC復(fù)位電路和專用µP監(jiān)控電路。前者實現(xiàn)簡單,成本低,但復(fù)位可靠性相對較低;后者成本較高,但復(fù)位可靠性高,尤其是高可靠重復(fù)復(fù)位。對于復(fù)位要求高、并對電源電壓進行監(jiān)視的場合,大多采用這種方式。</p><p> 本次課程設(shè)計采用
38、了上電按鈕電平復(fù)位電路,如圖3-7。</p><p><b> 圖3-7</b></p><p> 3.1.7 時鐘電路模塊</p><p> 時鐘電路在單片機系統(tǒng)中起著非常重要的作用,是保證系統(tǒng)正常工作的基礎(chǔ)。在一個單片機應(yīng)用系統(tǒng)中,時鐘是保障系統(tǒng)正常工作的基準(zhǔn)振蕩定時信號,主要由晶振和外圍電路組成,晶振頻率的大小決定了單片機系統(tǒng)工作的
39、快慢。為達到振蕩周期是12MHZ的要求,這里要采用12MHZ的晶振,另外有兩個30PF的瓷片電容,兩晶振引腳分別連到XTAL1和XTAL2振蕩脈沖輸入引腳。具體連接圖如圖3-8所示:</p><p><b> 圖3-8</b></p><p> 3.2硬件電路端口分配 </p><p> (1)硬件電路中用P1.0-P1.3控制按鍵。&l
40、t;/p><p> (2)用P0.0-P0.7,P2.5-P2.7控制LCD,其中P0.0-P0.7做LCD的8個并行數(shù)據(jù)輸入端,P2.5-P2.7分別作為LCD的RW、RS、E的控制信號。 (4)用P2.0口控制喇叭。</p><p> (5)用P3.0-P3.7做跑馬燈輸出口。 (6)電路為12MHZ晶振頻率工作,起振電路中C1,C2均為30pf。</p>
41、<p><b> 4 系統(tǒng)軟件設(shè)計</b></p><p> 4.1 主模塊的設(shè)計</p><p> 主模塊是系統(tǒng)軟件的主框架。結(jié)構(gòu)化程序設(shè)計一般有“自上而下”和“自下而上”兩種方式,“自上而下”法的核心就是主框架的構(gòu)建。它的合理與否關(guān)系到程序最終的功能的多少和性能的好壞。本系統(tǒng)的主模塊的程序框圖如下圖4-1所示:</p><p
42、><b> 圖4-1</b></p><p> 4.2 外部中斷源系統(tǒng)設(shè)計</p><p> 在本設(shè)計中中斷源是采用外部中斷0方式,其入口地址是0003H。其中斷響應(yīng)級別最高。</p><p> ?。?)定時器/計數(shù)器</p><p> 工作方式寄存器TMOD用于選擇定時器/計數(shù)器的工作方式和工作模式。其格
43、式如下表:</p><p><b> 表4-1</b></p><p> 下面對TMOD各位進行說明:</p><p><b> 門控位—GATE</b></p><p> 工作方式選擇位—M1、M0</p><p><b> 表4-2</b>
44、</p><p> 其中,在本設(shè)計中采用方式1的16位定時器/計數(shù)器。</p><p> —計數(shù)器模式和定時器模式選擇位</p><p> =0,為定時器模式。</p><p><b> =1,為計數(shù)模式。</b></p><p> 定時器/計數(shù)器控制寄存器TCON,其格式如下:<
45、/p><p><b> 表4-3</b></p><p><b> 其各位的功能如下:</b></p><p> TF1、TF0—計數(shù)溢出標(biāo)志位當(dāng)計數(shù)器溢出時,該位置1。</p><p> TR1、TR0—計數(shù)運行控制位</p><p> 4.3 基本顯示模塊設(shè)計<
46、;/p><p> 基本顯示模塊設(shè)計的重點是由單片機定時計數(shù)器進行播放計時,通過LCD顯示器顯示歌曲名及播放時間,達到精確計時且直觀,同時可以從播放時間是否在跳動判斷歌曲是否在播放。 </p><p> 4.4 系統(tǒng)初始化程序</p><p> /*********************************************************
47、** </p><p> ******************1602初始化******************</p><p> ************************************************************/</p><p> void LCD1602_init()</p>
48、<p><b> {</b></p><p> LCD1602_write_cmd(0x38); //8位數(shù)據(jù),雙列顯示,5*7字形</p><p> LCD1602_write_cmd(0x0c); //開顯示,關(guān)光標(biāo),光標(biāo)不閃爍</p><p> LCD1602_write_cmd(0x01); //清屏<
49、/p><p><b> }</b></p><p> /***********************************************************</p><p> ******************定時器2初始化函數(shù)******************</p><p> *******
50、*****************************************************/</p><p> void init_timer2()</p><p><b> {</b></p><p><b> T2CON=0; </b></p><p><b>
51、 T2MOD=0; </b></p><p> RCAP2H=(65536-50000)/256; //定時初值50ms</p><p> RCAP2L=(65536-50000)%256;</p><p> TH2=(65536-50000)/256; </p><p> TL2=(65536-50000
52、)%256; </p><p><b> EA = 1;</b></p><p><b> ET2 = 1; </b></p><p><b> TR2 = 1;</b></p><p><b> }</b></p><p
53、> 5 系統(tǒng)的硬件調(diào)試及軟件調(diào)試</p><p> 本次課程設(shè)計所采用的程序調(diào)試軟件為wave6000集成調(diào)試軟件,所采用的仿真軟件為protus 6 professional軟件。</p><p> 本次試驗的效果圖如下所示:</p><p><b> 圖5-1</b></p><p> 按鍵功能說明:
54、 A:上一首歌曲 B:下一首歌曲 C:停止歌曲 D:播放歌曲</p><p> 開機時有英文歡迎提示字符,播放時顯示歌曲序號(或名稱)可通過功能鍵選擇樂曲,停止,播放。選作內(nèi)容:顯示樂曲播放時間或剩余時間.結(jié)構(gòu)化軟件程序的調(diào)試一般可以將重點放在分模塊調(diào)試上,統(tǒng)調(diào)是最后一環(huán)。軟件調(diào)試可以采取離線調(diào)試和在線調(diào)試兩種方式。前者不需要硬件仿真器,可借助于軟件仿真器即可;后者一般需要仿真系統(tǒng)的支持。本次
55、課設(shè),采用Keil uVision 4軟件來調(diào)試程序,通過各個模塊程序的單步或跟蹤調(diào)試,使程序逐漸趨于正確,最后統(tǒng)調(diào)程序。</p><p> 仿真部分采用protus 7.5 professional軟件,此軟件功能強大且操作較為簡單,可以很容易的實現(xiàn)各種系統(tǒng)的仿真。</p><p> 首先打開protus 7.5 professional軟件,在元件庫中找到要選用的所有元件,然后進行
56、原理圖的繪制;繪制好后再載入Keil uVision 4已經(jīng)編譯好生成的*.hex文件,選擇運行,觀察顯示結(jié)果,根據(jù)顯示的結(jié)果和課設(shè)的要求再修改程序,再運行查,直到滿足要求。</p><p><b> 6 設(shè)計心得體會</b></p><p> 單片機是一門應(yīng)用性很強的學(xué)科,課程設(shè)計是培養(yǎng)我們綜合運用所學(xué)知識,發(fā)現(xiàn)、提出、分析和解決實際問題,鍛煉實踐能力的重要環(huán)節(jié)
57、,是對我們實際工作能力的具體訓(xùn)練和考察過程。雖然在做課程設(shè)計以前已經(jīng)系統(tǒng)的把單片機課本認真的學(xué)習(xí)了一下,但是在剛拿到設(shè)計任務(wù)書時還是有點一頭霧水,不知道該從哪里下手。令人欣慰的是經(jīng)過一周的學(xué)習(xí),雖然過程很艱辛,但是總算實現(xiàn)了定時鬧鐘的功能,所有的努力都很值得。這一周的大部分時間都在研究程序怎么處理,在這個過程中加深了我對匯編語言命令的應(yīng)用,而且也更加了解到軟硬件配套的重要性。</p><p> 在設(shè)計的過程中不
58、僅鞏固了以前所學(xué)過的知識,加深了我對所學(xué)知識的理解,而且學(xué)到了很多在書本上所沒有的知識。通過這次課程設(shè)計使我懂得了理論與實際相結(jié)合的重要性,只有理論知識是遠遠不夠的,只有把所學(xué)的理論知識與實踐相結(jié)合起來,才能提高自己的實際動手能力和獨立思考的能力。</p><p> 總之,通過這次課程設(shè)計不僅使我鞏固了本課程所學(xué)的基本知識,還使我具有了撰寫科研報告的初步訓(xùn)練能力,我相信這些能力在我以后的工作或者是再學(xué)習(xí)中一定會
59、起到不小的作用,一切的辛苦和艱難都是值得的。</p><p><b> 參 考 文 獻</b></p><p> [1] 楊剛,周群.電子系統(tǒng)設(shè)計與實踐.電子工業(yè)出版社,2004:18-23 341-347 118-122</p><p> [2] 何立民.單片機高級教程(應(yīng)用與設(shè)計).北京航空航天大學(xué)出版社,2000:53-98<
60、/p><p> [3] 涂時亮,張友德.單片微機控制技術(shù).清華大學(xué)出版社,1994:86-87 146-147</p><p> [4] 《融會貫通 Protel99電路設(shè)計》 弘道工作室 北京 人民交通出版社,2000.</p><p> [5] 《單片機原理及接口技術(shù)實驗》 朱定華 北京 北方交通大學(xué)出版社,2002.11.</p><p&
61、gt;<b> 附A:圖</b></p><p><b> 附A-a系統(tǒng)原理圖</b></p><p> 附A-b 播放效果圖</p><p><b> 附A-c 總視圖</b></p><p><b> 附A-d最小系統(tǒng)</b></p&g
62、t;<p><b> 附B:源程序</b></p><p> #include<at89x52.h></p><p> #include<intrins.h></p><p> #define uint unsigned int</p><p> #define uchar
63、 unsigned char</p><p> #define LCD1602_DATA P0 //1602液晶數(shù)據(jù)口</p><p> #define lamp_data P3 //跑馬燈數(shù)據(jù)口</p><p> sbit LCD1602_RS=P2^7; //1602液晶寫命令/數(shù)據(jù)</p><p> sbit L
64、CD1602_RW=P2^6; //1602液晶讀/寫控制 </p><p> sbit LCD1602_EN=P2^5; //1602液晶使能控制</p><p> sbit BeepIO = P2^0 ; //蜂鳴器</p><p> sbit esc=P1^2; //取消播放音樂</p><p> sbit u
65、p=P1^0;</p><p> sbit down=P1^3;</p><p> sbit play=P1^1;</p><p> char number; //歌曲編號</p><p> bit flag; //播放標(biāo)志</p><p><b> char t;</b&g
66、t;</p><p> uchar ms50; //跑馬燈用</p><p> char count,sec,min; //歌曲時間顯示</p><p> char code song[][17]={ "1.Fairy Tale ","2.Love Transfer ","3.Girl With Wi
67、ng",</p><p> "4.The Same Song ","5.Two Butterfly ","6.Coral Sea "};</p><p> char code singer[][12]={ "Guang liang","Chen yixun ",&quo
68、t;Rong zuer ",</p><p> "Liu chang ","Pang long ","Zhou jielun"};</p><p> uchar code lamp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};</p><p>
69、 //以下為播放音樂的設(shè)置</p><p> #define SYSTEM_OSC 12000000</p><p> #define SOUND_SPACE 4/5</p><p> uint code FreTab[12] = { 262,277,294,311,330,349,369,392,415,440,466,494 }; //原始頻率
70、表</p><p> uchar code SignTab[7] = { 0,2,4,5,7,9,11 }; //1~7在頻率表中的位置</p><p> uchar code LengthTab[7]= { 1,2,4,8,16,32,64 }; </p><p> uchar Sound_Temp_TH0,Sound_Tem
71、p_TL0; //音符定時器初值暫存 </p><p> uchar Sound_Temp_TH1,Sound_Temp_TL1; //音長定時器初值暫存</p><p><b> bit stop;</b></p><p> /***********************延時函數(shù)(單位ms)**********************
72、****/ </p><p> void delay(uint z)</p><p><b> {</b></p><p><b> uint x;</b></p><p><b> uchar y;</b></p><p> f
73、or(x=z;x>0;x--)</p><p> for(y=112;y>0;y--);</p><p><b> }</b></p><p> /***********************************************************</p><p> ********
74、**********LCD1602驅(qū)動程序******************</p><p> ************************************************************/</p><p> /***********************************************************</p>&l
75、t;p><b> 忙檢測</b></p><p> ************************************************************/</p><p> void LCD1602_check_busy()</p><p><b> {</b></p>&l
76、t;p> LCD1602_DATA = 0xff;</p><p> LCD1602_RS = 0 ; </p><p> LCD1602_RW = 1 ; </p><p> LCD1602_EN = 1 ; </p><p> while(LCD1602_DATA & 0x80) ; </p><
77、;p> LCD1602_EN = 0 ; </p><p><b> }</b></p><p> /**********************************************************</p><p><b> 寫指令 </b></p><p>
78、; ************************************************************/</p><p> void LCD1602_write_cmd(uchar cmd)</p><p><b> {</b></p><p> LCD1602_check_busy(); </p>
79、<p> LCD1602_RS = 0 ; </p><p> LCD1602_RW = 0 ; </p><p> LCD1602_DATA = cmd ; </p><p> LCD1602_EN = 1 ;</p><p><b> _nop_(); </b></p><p&
80、gt; LCD1602_EN = 0 ;</p><p><b> }</b></p><p> /***********************************************************</p><p><b> 寫數(shù)據(jù)</b></p><p> *****
81、********************************************************/</p><p> void LCD1602_write_data(uchar dat)</p><p><b> {</b></p><p> LCD1602_check_busy(); </p><p&
82、gt; LCD1602_RS = 1 ; </p><p> LCD1602_RW = 0 ; </p><p> LCD1602_DATA = dat ; </p><p> LCD1602_EN = 1 ;</p><p><b> _nop_(); </b></p><p> L
83、CD1602_EN = 0 ;</p><p><b> }</b></p><p> /***********************************************************</p><p><b> 1602初始化</b></p><p> *******
84、*****************************************************/</p><p> void LCD1602_init()</p><p><b> {</b></p><p> LCD1602_write_cmd(0x38); //8位數(shù)據(jù),雙列顯示,5*7字形</p><
85、;p> LCD1602_write_cmd(0x0c); //開顯示,關(guān)光標(biāo),光標(biāo)不閃爍</p><p> LCD1602_write_cmd(0x01); //清屏</p><p><b> }</b></p><p> /***************************************************
86、*********</p><p><b> 設(shè)置顯示坐標(biāo)</b></p><p> ************************************************************/</p><p> void LCD1602_set_postion(uchar x , uchar y)</p>&
87、lt;p><b> {</b></p><p><b> if(!y)</b></p><p> LCD1602_write_cmd(0x80+x) ;</p><p> else if(y)</p><p> LCD1602_write_cmd(0xc0+x) ;</p>
88、;<p><b> }</b></p><p> /************************************************************</p><p><b> 指定位置寫字符</b></p><p> ******************************
89、*******************************/</p><p> void LCD1602_write_char(uchar x , uchar y , uchar chardata)</p><p><b> {</b></p><p> LCD1602_set_postion(x,y) ;</p>&l
90、t;p> LCD1602_write_data(chardata) ;</p><p><b> }</b></p><p> /************************************************************</p><p><b> 指定位置寫字符串</b><
91、/p><p> *************************************************************/</p><p> void LCD1602_write_string(uchar x , uchar y , uchar *string)</p><p><b> {</b></p>&
92、lt;p> LCD1602_set_postion(x,y) ;</p><p> while((*string) != '\0')</p><p><b> { </b></p><p> LCD1602_write_data(*string) ;</p><p> string++ ;
93、</p><p><b> }</b></p><p><b> }</b></p><p> /********************************************************************</p><p> ************播放音樂函數(shù)*
94、***********</p><p> ********************************************************************/</p><p> void InitialSound()</p><p><b> { </b></p><p> BeepIO
95、= 0; </p><p> Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256; // 計算TL1應(yīng)裝入的初值 (10ms的初裝值)</p><p> Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256; // 計算TH1應(yīng)裝入的初值 </p><p> T
96、H1 = Sound_Temp_TH1;</p><p> TL1 = Sound_Temp_TL1;</p><p> TMOD |= 0x11;</p><p> ET0 = 1;</p><p> ET1 = 0;</p><p> TR0 = 0;</p><p
97、> TR1 = 0;</p><p> EA = 1;</p><p><b> }</b></p><p> void BeepTimer0() interrupt 1 //音符發(fā)生中斷</p><p><b> { </b></p><p>
98、; if(esc==0) </p><p><b> {</b></p><p><b> delay(5);</b></p><p> if(esc==0)</p><p><b> stop=1;</b></p><p> while(
99、!esc);</p><p><b> }</b></p><p> ////////////////</p><p> BeepIO = !BeepIO;</p><p> TH0 = Sound_Temp_TH0;</p><p> TL0 = Sound_Temp_TL
100、0;</p><p><b> }</b></p><p> //**************************************************************************</p><p> void Play(unsigned char *Sound,unsigned char Signatur
101、e,unsigned Octachord,unsigned int Speed)</p><p><b> {</b></p><p> unsigned int NewFreTab[12]; //新的頻率表</p><p> unsigned char i,j;</p><p> unsigned int P
102、oint,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<12;i++) // 根據(jù)調(diào)號及升降八度來生成新的頻率表 </p><p&
103、gt;<b> {</b></p><p> j = i + Signature;</p><p> if(j > 11)</p><p><b> {</b></p><p><b> j = j-12;</b></p><p> N
104、ewFreTab[i] = FreTab[j]*2;</p><p><b> }</b></p><p><b> else</b></p><p> NewFreTab[i] = FreTab[j];</p><p> if(Octachord == 1)</p><
105、p> NewFreTab[i]>>=2;</p><p> else if(Octachord == 3)</p><p> NewFreTab[i]<<=2;</p><p> } </p><p> SoundLength = 0;</p><p> whi
106、le(Sound[SoundLength] != 0x00) //計算歌曲長度</p><p><b> {</b></p><p> SoundLength+=2;</p><p><b> }</b></p><p> Point = 0;</p><p> T
107、one = Sound[Point]; </p><p> Length = Sound[Point+1]; // 讀出第一個音符和它時時值</p><p> LDiv0 = 12000/Speed; // 算出1分音符的長度(幾個10ms) </p><p> LDiv4 = LDiv0/4; // 算出4分音符的長度 </
108、p><p> LDiv4 = LDiv4-LDiv4*SOUND_SPACE; // 普通音最長間隔標(biāo)準(zhǔn) </p><p> TR0 = 0;</p><p> TR1 = 1;</p><p> while(Point < SoundLength)</p><p><b> {<
109、/b></p><p> SL=Tone%10; //計算出音符 </p><p> SM=Tone/10%10; //計算出高低音 </p><p> SH=Tone/100; //計算出是否升半 </p><p> CurrentFre = NewFreTab[SignTab[
110、SL-1]+SH]; //查出對應(yīng)音符的頻率 </p><p><b> if(SL!=0)</b></p><p><b> {</b></p><p> if (SM==1) CurrentFre >>= 2; //低音 </p><p> if (SM==3) Cu
111、rrentFre <<= 2; //高音</p><p> Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//計算計數(shù)器初值</p><p> Sound_Temp_TH0 = Temp_T/256; </p><p> Sound_Temp_TL0 = Temp_T%25
112、6; </p><p> TH0 = Sound_Temp_TH0; </p><p> TL0 = Sound_Temp_TL0 + 12; //加12是對中斷延時的補償 </p><p><b> }</b></p><p> SLen=LengthTab[Length%10]; //算出是幾分音符<
113、;/p><p> XG=Length/10%10; //算出音符類型(0普通1連音2頓音) </p><p> FD=Length/100;</p><p> LDiv=LDiv0/SLen; //算出連音音符演奏的長度(多少個10ms)</p><p> if (FD==1) </p><p> L
114、Div=LDiv+LDiv/2;</p><p> if(XG!=1) </p><p> if(XG==0) //算出普通音符的演奏長度 </p><p> if (SLen<=4) </p><p> LDiv1=LDiv-LDiv4;</p><p><b> else</
115、b></p><p> LDiv1=LDiv*SOUND_SPACE;</p><p><b> else</b></p><p> LDiv1=LDiv/2; //算出頓音的演奏長度 </p><p><b> else</b></p><p> LDi
116、v1=LDiv;</p><p> if(SL==0) LDiv1=0;</p><p> LDiv2=LDiv-LDiv1; //算出不發(fā)音的長度 </p><p> if (SL!=0)</p><p><b> {</b></p><p><b> TR0=1;<
117、;/b></p><p> for(i=LDiv1;i>0;i--) //發(fā)規(guī)定長度的音 </p><p><b> {</b></p><p> while(TF1==0);</p><p> TH1 = Sound_Temp_TH1;</p><p> TL1 = So
118、und_Temp_TL1;</p><p><b> TF1=0;</b></p><p><b> } </b></p><p><b> }</b></p><p> if(LDiv2!=0)</p><p><b> {<
119、;/b></p><p> TR0=0;BeepIO=0; </p><p> for(i=LDiv2;i>0;i--) //音符間的間隔</p><p><b> {</b></p><p> while(TF1==0);</p><p> TH1 = Sound_Tem
120、p_TH1;</p><p> TL1 = Sound_Temp_TL1;</p><p><b> TF1=0;</b></p><p><b> } </b></p><p><b> }</b></p><p> ///////////
121、/////</p><p><b> if(stop)</b></p><p> Point=SoundLength;</p><p> ///////////////</p><p> Point+=2; </p><p> Tone=Sound[Point];</p>
122、<p> Length=Sound[Point+1];</p><p><b> }</b></p><p> ///////////////</p><p><b> stop=0;</b></p><p><b> BeepIO=1;</b></p
123、><p> ET0 = 0;</p><p> ET1 = 0;</p><p> TR0 = 0;</p><p> TR1 = 0;</p><p> EA = 0;</p><p> //////////////</p><p&g
124、t;<b> }</b></p><p><b> //歌曲《童話》</b></p><p> uchar code fairy_tale[]={ 0x0F,0x67, 0x19,0x03, 0x18,0x03, 0x17,0x02, 0x17,0x03, </p><p> 0x18,0x04, 0x17,0x
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于at89c51的lcd音樂盒課程設(shè)計論文【最新】
- 基于at89c51單片機音樂盒課程設(shè)計
- 1基于at89c51單片機的音樂盒的設(shè)計
- 畢業(yè)設(shè)計---基于at89c51單片機的音樂盒設(shè)計
- 基于at89c51單片機音樂盒設(shè)計含程序設(shè)計
- 基于at89c51帶有l(wèi)cd顯示的音樂倒數(shù)計數(shù)器課程設(shè)計
- 基于89c51的數(shù)字音樂盒設(shè)計
- 基于at89c51的多功能lcd時鐘設(shè)計
- 基于51單片機音樂盒課程設(shè)計
- 基于89c51的數(shù)字音樂盒設(shè)計說明書
- 音樂盒設(shè)計(單片機課程設(shè)計)---基于at89c51snd1c的mp3播放器
- 基于at89c51的時鐘設(shè)計
- at89c51雙機串口通信課程設(shè)計
- 基于at89c51的頻率設(shè)計
- 課程設(shè)計--基于at89c51單片機控制步進電機
- 基于at89c51單片機的電機控制綜合課程設(shè)計
- 課程設(shè)計--雙功能音樂盒
- 數(shù)字音樂盒的課程設(shè)計
- 基于at89c51的數(shù)控電源設(shè)計
- at89c51單片機課程設(shè)計-----搶答器
評論
0/150
提交評論