2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩41頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論