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

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  畢業(yè)設(shè)計(jì)(論文)</b></p><p>  課 題 名 稱 基于單片機(jī)的推箱子游戲設(shè)計(jì) </p><p>  學(xué) 生 姓 名 </p><p>  學(xué) 號(hào)

2、 </p><p>  系、年級(jí)專業(yè) 信息工程系﹑05級(jí)電子信息工程專業(yè) </p><p>  指 導(dǎo) 教 師 </p><p>  職 稱 講 師

3、 </p><p>  2009年 5 月 24日</p><p><b>  摘 要</b></p><p>  本論文主要介紹了基于單片機(jī)的推箱子游戲的規(guī)則、硬件結(jié)構(gòu)、軟件代碼的編寫(xiě)及工作原理、基于T6963C內(nèi)核的液晶模塊PG160128A的詳細(xì)介紹以及指令集。模擬出Windows系統(tǒng)下的推箱子游戲,具有任意關(guān)數(shù)選擇、難度依次加大、游

4、戲步數(shù)記錄、游戲時(shí)間記錄、按鍵發(fā)聲、系統(tǒng)低功耗、可實(shí)現(xiàn)在線調(diào)試等特點(diǎn)。本系統(tǒng)是以單片機(jī)為其控制核心,以有源晶振構(gòu)成的電路作為時(shí)鐘信號(hào),通過(guò)方向鍵的選擇向單片機(jī)控制系統(tǒng)發(fā)出人物移動(dòng)控制命令,控制系統(tǒng)接收命令后做出一系列必要的判斷后,控制人物及箱子的移動(dòng)。本設(shè)計(jì)已通過(guò)了實(shí)驗(yàn)仿真,運(yùn)行穩(wěn)定,基本上沒(méi)有規(guī)則方面的錯(cuò)誤。</p><p>  論文主要分為兩大塊:一塊為游戲的硬件電路組成部分,一塊為軟件程序設(shè)計(jì)部分。在硬件電

5、路里主要包括有源晶振部分、方向控制部分及液晶顯示部分等與單片機(jī)的接線設(shè)計(jì);軟件編程方面主要是子程序和主程序的編寫(xiě),包括:初始化代碼、液晶驅(qū)動(dòng)代碼、方向按鍵代碼、過(guò)關(guān)判斷代碼、步數(shù)記錄代碼、時(shí)間記錄代碼、按鍵發(fā)聲代碼、關(guān)數(shù)選擇代碼及表格數(shù)據(jù)代碼等等。所有這些在文中都有詳細(xì)說(shuō)明。</p><p>  關(guān)鍵詞:?jiǎn)纹瑱C(jī);推箱子;PG160128A; T6963C內(nèi)核;指令集</p><p><

6、;b>  Abstract</b></p><p>  This paper introduces the single-chip based on the rules of the game Sokoban, the structure of hardware, software code writing and working principle, based on the core T69

7、63C LCD module PG160128A, as well as details of the instruction set. Simulate the system under Windows Sokoban game, an arbitrary number of related options, in turn increase the difficulty of the game a few step-by-step

8、record time of the game record, sound button, low-power system can achieve on-line debugging and so on. The s</p><p>  Key words:</p><p>  MCU; Sokoban; PG160128A; T6963C core; instruction set&l

9、t;/p><p><b>  目錄</b></p><p>  摘要.............................................................................................................</p><p>  Abstract.............

10、.....................................................................................</p><p>  1 前言.......................................................................................................</

11、p><p>  1.1 課題的來(lái)源.....................................................................................................</p><p>  1.2 課題研究的意義..........................................................

12、....................................</p><p>  1.3 課題國(guó)內(nèi)研究現(xiàn)狀.........................................................................................</p><p>  1.4 課題研究的目的和主要內(nèi)容.....................

13、......................................................</p><p>  2 推箱子游戲方案論證...........................................................................</p><p>  2.1 游戲能否在單片機(jī)上實(shí)現(xiàn)...................

14、......................................................</p><p>  2.2 單片機(jī)、液晶屏的選擇......................................................................................</p><p>  3 推箱子游戲的硬件部分設(shè)計(jì)......

15、............................................................</p><p>  3.1 PG160128A液晶屏介紹....................................................................................</p><p>  3.2 T6963C及其

16、指令集介紹...................................................................................</p><p>  3.3 晶振、復(fù)位電路.................................................................................................&

17、lt;/p><p>  3.4 液晶顯示屏與單片機(jī)接口電路.........................................................................</p><p>  3.5 控鍵、喇叭與單片機(jī)接口電路....................................................................

18、.......</p><p>  4 推箱子游戲的軟件部分設(shè)計(jì)...............................................................</p><p>  4.1 游戲流程圖.................................................................................

19、....................</p><p>  4.2 液晶屏驅(qū)動(dòng)代碼設(shè)計(jì)................................................................................</p><p>  4.3 初始化代碼設(shè)計(jì)..................................................

20、........................................</p><p>  4.4 游戲時(shí)間代碼設(shè)計(jì)..................................................................................</p><p>  4.5 游戲選關(guān)代碼設(shè)計(jì)............................

21、.......................................................</p><p>  4.6 步數(shù)、關(guān)數(shù)更新代碼設(shè)計(jì)..................................................................................</p><p>  4.7 游戲過(guò)關(guān)代碼設(shè)計(jì)..........

22、.........................................................................</p><p>  4.8 圖形顯示子程序.........................................................................................</p><p>  4

23、.9 中斷代碼設(shè)計(jì).................................................................................................</p><p>  4.10 方向控制代碼設(shè)計(jì)..............................................................................

24、.........</p><p>  5 推箱子游戲的系統(tǒng)仿真..................................................................</p><p>  5.1 Keil2編譯環(huán)境介紹........................................................................

25、...........</p><p>  5.2 Proteus在線仿真平臺(tái)介紹............................................................</p><p>  5.3 建立工程項(xiàng)目..........................................................................

26、.................</p><p>  5.4 Proteus中原理圖的繪制及文件的加載....................................................</p><p>  5.5 開(kāi)機(jī)及游戲界面顯示....................................................................

27、....................</p><p>  5.7 仿真結(jié)果分析及解決方法................................................................................</p><p>  6 總結(jié).......................................................

28、.......................................</p><p>  參考文獻(xiàn)............................................................................................</p><p>  致謝.....................................

29、...............................................................</p><p>  附件………………………………………………………………….</p><p><b>  1 前言</b></p><p><b>  1.1 課題的來(lái)源</b></p>

30、;<p>  如今,游戲機(jī)風(fēng)行的程度,是第一臺(tái)電子游戲機(jī)的研制者諾蘭?布什納爾先生始料不及的。在全世界最大的城市,直至最小的村莊,從紐約最輝煌的游樂(lè)場(chǎng),到高加索最小的鄉(xiāng)鎮(zhèn)兒童娛樂(lè)點(diǎn),在千家萬(wàn)戶,正在進(jìn)行著千千萬(wàn)萬(wàn)這樣的“戰(zhàn)斗”,伴隨著無(wú)數(shù)成功與失敗,興奮與懊喪。游戲機(jī)帶來(lái)了一個(gè)全球性的瘋狂癥,其他任何娛樂(lè)與之相比都望塵莫及。然而,究竟是什么原因使游戲機(jī)如此風(fēng)行呢? 在回顧了游戲機(jī)發(fā)展簡(jiǎn)史之后,我們不難悟出,技術(shù)進(jìn)步在游戲機(jī)

31、發(fā)展過(guò)程中起到了極大的促進(jìn)作用。</p><p>  但是,技術(shù)進(jìn)步絕不是游戲機(jī)風(fēng)行的唯一因素。隨著終端設(shè)備開(kāi)發(fā)能力的加強(qiáng),作為娛樂(lè)終端的游戲機(jī)也得到了很大程度的發(fā)展。這也加速了游戲機(jī)在全球風(fēng)行程度,所以對(duì)于游戲機(jī)的研究和設(shè)計(jì)具有很重要的意義,這也是本課題研究的來(lái)源。</p><p>  1.2 課題研究的意義</p><p>  用單片機(jī)來(lái)設(shè)計(jì)一個(gè)游戲,不同于現(xiàn)在

32、的大型網(wǎng)絡(luò)游戲和手機(jī)游戲,也不同于其他的小型的單片機(jī)控制程序,它對(duì)游戲編寫(xiě)者對(duì)單片機(jī)架構(gòu)、指令系統(tǒng)、工作模式、數(shù)據(jù)在內(nèi)存分配以及傳遞的把握都提出了更高的要求,特別是在游戲運(yùn)行當(dāng)中對(duì)外部按鍵的處理,各子程序的調(diào)用流程,先后順序等代碼的復(fù)雜程度也都是單片機(jī)的一般程序不能比的??梢赃@樣說(shuō),能完整的編出游戲,并可以穩(wěn)定運(yùn)行,會(huì)讓我們對(duì)游戲有一個(gè)更深刻的認(rèn)識(shí);對(duì)游戲編寫(xiě)的難度有一個(gè)更切身的理解;對(duì)自己的編程能力及邏輯思維能力有一個(gè)很大的提高;再一

33、次看到了C語(yǔ)言的適用性、易移植性、高效性,相信對(duì)C語(yǔ)言的學(xué)習(xí)也不無(wú)幫助。</p><p>  1.3 課題國(guó)內(nèi)研究現(xiàn)狀</p><p>  目前國(guó)內(nèi)游戲公司已達(dá)到了200多家,市場(chǎng)上運(yùn)營(yíng)的游戲亦達(dá)250多款,但與歐美、韓國(guó)等國(guó)家的游戲發(fā)展程度還有一定差距。我國(guó)有廣闊的游戲市場(chǎng),寬闊的發(fā)展空間,無(wú)限的繼續(xù)挑戰(zhàn)和劇增的玩家隊(duì)伍。隨著網(wǎng)絡(luò)的興起,巨大的市場(chǎng)需求量使中國(guó)在短短幾年,已經(jīng)從無(wú)到有,從

34、陌生到熟知,從掌握到運(yùn)用。游戲必將成為網(wǎng)絡(luò)競(jìng)爭(zhēng)中的主角,他的商業(yè)利益和商業(yè)價(jià)值無(wú)法估量。中國(guó),人口眾多的國(guó)家,隨著人們生活水平的提高,溫飽已經(jīng)不是最終目的,我們尋求的是更加多姿多彩的生活,那么我們?cè)趺茨苠e(cuò)過(guò)游戲這一最佳休閑娛樂(lè)項(xiàng)目呢?所以我國(guó)游戲發(fā)展前景一片大好,更應(yīng)加大游戲開(kāi)發(fā)力度!??!</p><p>  1.4 課題研究的目的和主要內(nèi)容</p><p>  本文針對(duì)推箱子游戲機(jī)的設(shè)計(jì)

35、,首先介紹了選題的要求,之后詳細(xì)敘述了軟件和硬件的設(shè)計(jì)過(guò)程。</p><p>  在時(shí)鐘脈沖的作用下,各個(gè)按鍵都能按照事先設(shè)定好的規(guī)則進(jìn)行游戲控制。確定鍵能使界面從初始化顯示切換到游戲界面顯示,上下左右鍵控制箱子的移動(dòng)方向,如果可以移動(dòng)則移動(dòng)方塊同時(shí)跟蹤人物的位置及刷新動(dòng)態(tài)數(shù)組的內(nèi)容。在游戲的同時(shí)程序會(huì)隨時(shí)記錄玩家所走的游戲步數(shù)、游戲時(shí)間,直至本關(guān)通過(guò),在進(jìn)入下一關(guān)的同時(shí)更新地圖并刷新游戲步數(shù)和時(shí)間。選關(guān)鍵用于選

36、擇游戲關(guān)數(shù),在游戲過(guò)程中這個(gè)鍵任何時(shí)候都有效,當(dāng)按下選關(guān)鍵后,游戲地圖返回第一關(guān),再次按下時(shí)游戲進(jìn)入二關(guān),這樣每按下一次鍵游戲關(guān)數(shù)加一,如果游戲到了第最后一關(guān)將自動(dòng)返回第一關(guān)。</p><p>  硬件部分是由中央處理器(AT89C51單片機(jī)),控制部分(獨(dú)立式按鍵系統(tǒng)),顯示部分(PG160128A液晶顯示模塊)組成的;軟件部分的主要內(nèi)容是通過(guò)對(duì)游戲程序進(jìn)行編寫(xiě)和調(diào)試以實(shí)現(xiàn)推箱子游戲的功能。通過(guò)硬件和軟件調(diào)試,

37、并針對(duì)問(wèn)題分析修改后,游戲機(jī)系統(tǒng)可以穩(wěn)定運(yùn)行。游戲機(jī)系統(tǒng)中各個(gè)部分之間通過(guò)數(shù)據(jù)的傳送最終完成了整個(gè)游戲運(yùn)行、顯示和進(jìn)行按鍵的功能。</p><p>  最后論文對(duì)設(shè)計(jì)進(jìn)行了總結(jié),對(duì)設(shè)計(jì)中可以進(jìn)一步改善的地方提出了建議。</p><p>  2 推箱子游戲方案論證</p><p>  現(xiàn)如今,游戲風(fēng)靡全球,各種游戲?qū)映霾桓F,大到網(wǎng)絡(luò)型的復(fù)雜游戲,小到手機(jī)游戲、單機(jī)游戲

38、、智力游戲等簡(jiǎn)單游戲。但是這種簡(jiǎn)單也是相對(duì)于網(wǎng)絡(luò)游戲等大型游戲而言的,小游戲本身的代碼還是相當(dāng)繁雜,它要執(zhí)行一系列指令才能正確的完成一個(gè)簡(jiǎn)單的操作,才能按照玩家的意志工作。所以我們現(xiàn)在見(jiàn)到的游戲多是在基于電腦這種高速執(zhí)行指令的平臺(tái)上運(yùn)行的,脫離了它就什么事都做不了了。那么推箱子這種小游戲能否在單片機(jī)上編出來(lái)呢?答案是肯定的,現(xiàn)從以下幾個(gè)方面加以論證。</p><p>  2.1 游戲能否在單片機(jī)上實(shí)現(xiàn)</p

39、><p>  首先,我們編寫(xiě)的這個(gè)游戲是一個(gè)小型游戲,實(shí)現(xiàn)的功能比較簡(jiǎn)單,不像大型游戲那樣功能復(fù)雜,它只要控制人物將所有箱子推到正確的位置即可,難度隨著箱子的增多而加大,對(duì)于實(shí)現(xiàn)這樣一個(gè)功能,程序不是太復(fù)雜,用一塊單片機(jī)足以達(dá)到目的。其次,它的控件也比較少只有4個(gè)方向鍵和2個(gè)輔助的功能鍵,這些控鍵在Proteus中用彈跳式按鍵代替即可。第三,游戲地圖相對(duì)比較小、畫(huà)面簡(jiǎn)單,只有箱子、人物和正確位置箱子等幾個(gè)圖形,這些在

40、一塊稍大的液晶屏上就足以顯示,用不著電腦顯示屏。第四,就編程語(yǔ)言方面來(lái)說(shuō),編寫(xiě)這樣一個(gè)簡(jiǎn)單的小游戲不需要什么高級(jí)的語(yǔ)言,C語(yǔ)言或匯編語(yǔ)言就足以完成,C語(yǔ)言是一種通用型的語(yǔ)言,編程靈活、可讀性強(qiáng)、移植性好;匯編語(yǔ)言是一種直接面向硬件的基礎(chǔ)語(yǔ)言,最接近機(jī)器語(yǔ)言,執(zhí)行速度快(本游戲采用C語(yǔ)言編寫(xiě))。由以上幾點(diǎn)可知:?jiǎn)纹瑱C(jī)上運(yùn)行推箱子游戲在硬件和軟件兩個(gè)方面都是可行的。</p><p>  2.2 單片機(jī)、液晶屏的選擇&

41、lt;/p><p>  2.1 單片機(jī)的選擇</p><p>  單片機(jī)的種類有很多:通用型單片機(jī)按位數(shù)分有4位機(jī),8位機(jī),16位機(jī)和32位機(jī)等等。按廠家分種類就更多,我國(guó)目前最常用的單片機(jī)有如下幾家:Intel 公司的(MCS51系列,MCS96系列);Atmel公司的(AT89系列,MCS51內(nèi)核);Microchip公司的(PIC系列);Motorola公司的(68HCXX系列);Zil

42、og公司的(Z86系列);Philips公司的(87,80系列,MCS51內(nèi)核);Siemens公司的(SAB80系列,MCS51內(nèi)核);NEC公司的(78系列),每種單片機(jī)的都有不同,包括:I/O口個(gè)數(shù)、定時(shí)/計(jì)數(shù)器個(gè)數(shù)、數(shù)據(jù)/程序存取區(qū)大小、中斷源個(gè)數(shù)、有無(wú)看門狗中斷、有無(wú)A/D轉(zhuǎn)化等等。</p><p>  基于本游戲只用到了不到20個(gè)I/O口;2個(gè)定時(shí)器斷。所以選擇了Atmel公司的AT89C51單片機(jī)。

43、其參數(shù)如下:</p><p>  1、基于8051的全靜態(tài)CMOS工藝控制器;</p><p>  2、3級(jí)流水線指令執(zhí)行架構(gòu);</p><p><b>  3、32個(gè)I/O口</b></p><p>  4、2個(gè)定時(shí)/計(jì)數(shù)器</p><p><b>  5、6個(gè)中斷源</b>

44、;</p><p>  6、4K的閃存程序存儲(chǔ)器</p><p>  7、128字節(jié)的片內(nèi)數(shù)據(jù)存取器</p><p>  由以上參數(shù)可知AT89C51單片機(jī)完全滿足游戲設(shè)計(jì)要求。</p><p>  2.2 液晶屏的選擇</p><p>  液晶屏的種類也有很多,我們經(jīng)常用到的液晶屏包括:AMPIRE128*64;LG

45、M12641BS1R;LM016L;LM020L;LM017L等等。</p><p>  前兩種為不帶字庫(kù)的漢字、圖形點(diǎn)陣液晶屏,共64行,128列,能顯示4行8列32個(gè)16*16點(diǎn)陣漢字或4行16列64個(gè)16*8點(diǎn)陣字符或者最大128*64點(diǎn)陣圖形。也有帶字庫(kù)的12864,功能一樣。</p><p>  后幾種則是帶字庫(kù)的字符點(diǎn)陣,不能顯示圖形。LM016L為能顯示2行16列32個(gè)字符的

46、液晶屏;LM020L為能顯示1行16列16個(gè)字符的液晶屏;LM017L為能顯示2行32列16個(gè)字符的液晶屏。</p><p>  由以上介紹可知:后3種液晶不能顯示圖形,所以最先排除,因?yàn)橛螒蛑械貓D都是以圖形的形式掃描進(jìn)去的;前2種液晶雖然可以顯示圖形,但屏幕較小顯示不完所有游戲界面的內(nèi)容,光就地圖顯示就需要128*144點(diǎn)陣的屏幕,而這兩種都是128*64的液晶屏,所以必須找一種更大的液晶顯示屏。</p&

47、gt;<p>  最后找到PG160128A液晶屏。很明顯,這塊液晶屏是160*128點(diǎn)陣的屏幕,除了滿足地圖顯示外還可以顯示其他記錄信息,如關(guān)數(shù)顯示、時(shí)間顯示、步數(shù)顯示等等,完全滿足設(shè)計(jì)要求。這塊液晶和以上的很不一樣,它基于T6963C內(nèi)核,引腳更多,功能更復(fù)雜,指令集也更多(這些相關(guān)內(nèi)容將在下一章具體介紹)。</p><p>  3 推箱子游戲的硬件部分設(shè)計(jì)</p><p&g

48、t;  本部分內(nèi)容包括介紹PG160128A及其引腳功能;介紹T6963C指令集;晶振電路、復(fù)位電路的硬件設(shè)計(jì);控件及按鍵發(fā)聲電路設(shè)計(jì),最后給出游戲仿真的整體硬件電路圖,接下來(lái)是具體的說(shuō)明。</p><p>  3.1 PG160128A液晶屏介紹</p><p>  PG160128A為一個(gè)128行160列的點(diǎn)陣液晶屏,他能顯示各種字符、圖形、漢字,基于T6963C內(nèi)核控制,自帶字符庫(kù),

49、同時(shí)用戶也可以自己建立漢字、圖形庫(kù),其在Proteus中的元器件圖形如下: </p><p>  圖1 PG160128 A</p><p>  各引腳的功能描敘如下表: </p><p>  表一 PG160128引腳功能表</p><p>  3.2 T6963C及其指令集介紹</p&

50、gt;<p>  3.2.1 T6963C</p><p>  T6963C是一個(gè)LCD控制器,可設(shè)計(jì)為用于液晶顯示器控制驅(qū)動(dòng)芯片和數(shù)據(jù)顯示的存取器。該控制器有一個(gè)8位并行數(shù)據(jù)總線,控制線的讀取或?qū)懭胪ㄟ^(guò)微控制器接口實(shí)現(xiàn),可以直接連接到TMPZ80微處理器中。它有一個(gè)128字節(jié)的字符發(fā)生器也可以控制外部顯示RAM中的數(shù)據(jù),達(dá)64K字節(jié)。配置的文字,圖形和外部字符發(fā)生器RAM數(shù)據(jù)能很容易控制其顯示在窗

51、口中,可以自由移動(dòng)、分配內(nèi)存范圍。該器件支持非常廣泛的字符格式,液晶顯示器允許通過(guò)編程設(shè)置選擇不同的組合。它可以用于文字,圖形和結(jié)合文本模式及其他各種屬性的功能。</p><p>  3.2.2 T6963C指令集</p><p>  T6963C共分為十大類,26條指令,詳細(xì)信息如下表:</p><p>  表二 T6963C指令集</p><

52、p>  3.3 晶振、復(fù)位電路</p><p>  3.3.1 晶振電路</p><p>  單片機(jī)的晶振電路如圖2所示,其中XTAL1和XTAL2分別為片內(nèi)振蕩電路的輸入輸出端。一般電容取20~47uF,本系統(tǒng)晶體的振蕩頻率為24MHz。晶振電路產(chǎn)生的振蕩脈沖經(jīng)過(guò)內(nèi)部觸發(fā)器進(jìn)行二分頻后,成為單片機(jī)的時(shí)鐘脈沖信號(hào),為單片機(jī)提供一個(gè)基本時(shí)鐘信號(hào)。</p><p>

53、;<b>  圖2 晶振電路</b></p><p>  3.3.2 復(fù)位電路</p><p>  復(fù)位操作是單片機(jī)的基本操作,單片機(jī)在進(jìn)入運(yùn)行前和在運(yùn)行過(guò)程中程序出錯(cuò)或操作失誤使系統(tǒng)不能正常運(yùn)行時(shí),需要進(jìn)行復(fù)位操作,復(fù)位操作后,程序?qū)?000H開(kāi)始重新執(zhí)行。</p><p>  復(fù)位信號(hào)從單片機(jī)的RST引腳輸入,復(fù)位操作有上電自動(dòng)復(fù)位、按鍵

54、電平復(fù)位和外部脈沖復(fù)位三種方式,本電路采用了按鍵電平復(fù)位,電路圖如圖3.。</p><p><b>  圖3 復(fù)位電路</b></p><p>  3.4 液晶顯示屏與單片機(jī)接口電路</p><p>  液晶顯示屏共有18個(gè)引腳,其中VDD、RST兩腳接電源,VSS、FS1、CE三腳接地,CON、FG兩腳懸空,D0~D7分別與單片機(jī)P2.0~P

55、2.7相連接,WR與P1.7腳相連,RD與P1.6腳相連,C/D與P1.5腳相連,電路圖見(jiàn)圖4.</p><p>  3.5 控鍵、喇叭與單片機(jī)接口電路</p><p>  本游戲共有6個(gè)控件,分別是:四個(gè)方向鍵,用于控制箱子的移動(dòng)方向;一個(gè)確定鍵,用于刷新初始化界面進(jìn)入游戲界面;一個(gè)選關(guān)鍵,用于選關(guān)。一個(gè)喇叭,用于按鍵發(fā)聲,以提示按鍵是否有效,電路圖見(jiàn)圖4.</p><

56、;p>  控件、喇叭與單片機(jī)的接線是:上移鍵接P1.0;左移鍵接P1.1;右移鍵接P1.2;下移鍵接P1.3;確定鍵接P1.4;選關(guān)鍵接P1.5;喇叭經(jīng)過(guò)分壓式偏置共射放大電路將信號(hào)放大再與單片機(jī)P3.1口相連,如圖4:</p><p>  圖4 揚(yáng)聲器放大電路</p><p>  至此,游戲的硬件電路結(jié)構(gòu)及連線全部介紹完成,仿真電路圖如圖5所示,整個(gè)電路圖以網(wǎng)絡(luò)標(biāo)號(hào)的形式給出,避免

57、連線過(guò)多顯得電路擁擠。</p><p>  圖5 推箱子游戲硬件電路圖</p><p>  4 推箱子游戲的軟件部分設(shè)計(jì)</p><p>  本部分主要介紹游戲的軟件部分設(shè)計(jì),包括游戲流程圖;液晶屏驅(qū)動(dòng)代碼設(shè)計(jì);初始化代碼設(shè)計(jì)游戲時(shí)間代碼設(shè)計(jì);游戲關(guān)數(shù)代碼設(shè)計(jì);游戲步數(shù)代碼設(shè)計(jì);過(guò)關(guān)代碼設(shè)計(jì);方向控制代碼設(shè)計(jì);按鍵發(fā)聲代碼設(shè)計(jì);數(shù)據(jù)表格設(shè)計(jì)等幾個(gè)方面,現(xiàn)就對(duì)這幾個(gè)方

58、面做具體分析。</p><p><b>  4.1 游戲流程圖</b></p><p>  4.1.1 液晶驅(qū)動(dòng)程序調(diào)用規(guī)則流程圖</p><p>  本游戲用到了液晶PG160128A,勢(shì)必用到驅(qū)動(dòng)代碼,包括讀狀態(tài)函數(shù);寫(xiě)指令函數(shù);讀數(shù)據(jù)函數(shù);寫(xiě)數(shù)據(jù)函數(shù);自動(dòng)讀寫(xiě)函數(shù);畫(huà)圓、打點(diǎn)函數(shù);設(shè)指針函數(shù);顯示漢字、字符函數(shù)等等,現(xiàn)以流程圖的形式給出其

59、互相調(diào)用規(guī)則(A函數(shù)指向B函數(shù),表示B調(diào)用了A)。</p><p>  4.1.2 方向函數(shù)所調(diào)用的函數(shù)流程圖</p><p>  在游戲中設(shè)置了四個(gè)方向鍵,用以控制箱子的移動(dòng)情況,在這四個(gè)函數(shù)里又都調(diào)用了其他子函數(shù),現(xiàn)以流程圖的形式給出調(diào)用到的子函數(shù)及數(shù)組。</p><p>  4.1.3 主函數(shù)流程圖</p><p>  在主函數(shù)的運(yùn)行過(guò)

60、程中,程序會(huì)隨著確定鍵的按下進(jìn)入主循環(huán)而不斷地掃描鍵盤,判斷是否有鍵按下,再調(diào)用相關(guān)函數(shù)做相應(yīng)的處理,同時(shí)兩個(gè)定時(shí)器中斷有條件開(kāi)啟,在中斷到來(lái)時(shí)響應(yīng)中斷,執(zhí)行相關(guān)的中斷操作,流程圖如下:</p><p>  4.2 液晶屏驅(qū)動(dòng)代碼設(shè)計(jì)</p><p>  4.2.1 讀狀態(tài)程序</p><p>  unsigned char Read_State()//返回液晶顯示

61、屏的當(dāng)前狀態(tài)</p><p>  {unsigned char a;</p><p>  P2=0xff;//讀狀態(tài)之前先將數(shù)據(jù)線拉高</p><p>  _CD=1;// 為指令、狀態(tài)操作條件</p><p>  _RD=0;//讀操作條件</p><p>  _RD=1;//為下次讀做準(zhǔn)備</p>&

62、lt;p>  a=Pin;//將狀態(tài)保存</p><p>  return a;}</p><p>  4.2.2 是否可讀寫(xiě)程序</p><p>  void Enable()</p><p>  {while(1) //bit0指令寫(xiě)狀態(tài)位,bit1數(shù)據(jù)讀/寫(xiě)狀態(tài)位,為1時(shí)候空閑</p><p>  if((

63、Read_State()&3)==3)break;}//如果狀態(tài)的低2為1則可讀寫(xiě)</p><p>  4.2.3 是否可自動(dòng)讀寫(xiě)程序</p><p>  void Aut_Write()</p><p>  {while(1) //bit3數(shù)據(jù)自動(dòng)寫(xiě)狀態(tài)位,為1時(shí)候空閑</p><p>  if((Read_State()&

64、8)==8)break;} //如果狀態(tài)的第4為1則可自動(dòng)讀寫(xiě)</p><p>  4.2.4寫(xiě)單參數(shù)程序</p><p>  //Data1為傳入的參數(shù),Com為傳入的指令;寫(xiě)入順序?yàn)橄葦?shù)據(jù)后寫(xiě)指令。</p><p>  void Write_Data1(unsigned char Data1,unsigned char Com)</p><p

65、>  {Enable();//判斷是否可讀寫(xiě)</p><p>  _CD=0;//為數(shù)據(jù)操作條件</p><p>  Pin=Data1;//將數(shù)據(jù)送數(shù)據(jù)線</p><p>  _WR=0;//寫(xiě)操作</p><p>  _WR=1;//為下次寫(xiě)做裝備</p><p><b>  Enable();&l

66、t;/b></p><p>  _CD=1; // 為指令、狀態(tài)操作條件</p><p>  Pin=Com; //將指令送數(shù)據(jù)線</p><p><b>  _WR=0;</b></p><p><b>  _WR=1;}</b></p><p>  4.2.5寫(xiě)雙參

67、數(shù)程序</p><p>  // Data1/Data2為傳入的參數(shù),Com為傳入的指令,先Data1后Data2,最后寫(xiě)指令。</p><p>  void Write_Data2(unsigned char Data1,unsigned char Data2,unsigned char Com)</p><p>  {Enable();//判斷是否可讀寫(xiě)<

68、/p><p>  _CD=0; //為數(shù)據(jù)操作條件</p><p>  Pin=Data1; //將數(shù)據(jù)1送數(shù)據(jù)線</p><p>  _WR=0; //寫(xiě)操作</p><p>  _WR=1; //為下次寫(xiě)做裝備</p><p><b>  Enable();</b></p><

69、p><b>  _CD=0;</b></p><p>  Pin=Data2; //將數(shù)據(jù)2送數(shù)據(jù)線</p><p><b>  _WR=0;</b></p><p><b>  _WR=1;</b></p><p><b>  Enable();</b&

70、gt;</p><p><b>  _CD=1;</b></p><p>  Pin=Com; //將指令送數(shù)據(jù)線</p><p><b>  _WR=0;</b></p><p><b>  _WR=1;}</b></p><p>  4.2.6寫(xiě)指令

71、程序</p><p>  void Write_Com(unsigned char Com)</p><p>  {Enable();//判斷是否可讀寫(xiě)</p><p>  _CD=1; // 為指令、狀態(tài)操作條件</p><p>  Pin=Com; //將指令送數(shù)據(jù)線</p><p>  _WR=0;//寫(xiě)操作&l

72、t;/p><p>  _WR=1;}//為下次寫(xiě)做裝備</p><p>  4.2.7寫(xiě)8字節(jié)數(shù)據(jù)程序</p><p>  // Addr表示數(shù)據(jù)首地址,Way表示寫(xiě)的方式</p><p>  void Write_8_Data(unsigned char Addr,unsigned char Way)</p><p> 

73、 {Aut_Write();//判斷是否能自動(dòng)寫(xiě)</p><p>  Write_Com(AUT_WR);//自動(dòng)寫(xiě)開(kāi)始</p><p>  Write_Data1(Addr,Way);</p><p>  Write_Com(AUT_WO);}//自動(dòng)寫(xiě)結(jié)束</p><p>  4.2.8設(shè)置數(shù)據(jù)顯示在屏幕上的坐標(biāo)程序</p>

74、<p>  // (以字節(jié)為單位),x表示顯示的行(0~15),y表示顯示的列(0~19)</p><p>  void Set_xy(unsigned char x,unsigned char y)</p><p>  {unsigned int a;a=x*20+y;</p><p>  Write_Data2(a&0xff,a>>

75、;8,ADR_POS);}</p><p>  4.2.9設(shè)置數(shù)據(jù)存儲(chǔ)起始地址</p><p>  void Set_Addr(unsigned char Addr1,unsigned char Addr2)</p><p>  {Write_Data2(Addr1,Addr2,ADR_POS);}</p><p>  4.2.10 CGRA

76、M偏置地址設(shè)置函數(shù)</p><p>  void Set_CGRAM()</p><p>  {Write_Data2(1,0,CGR_POS);}</p><p>  4.2.11液晶初始化函數(shù)</p><p>  //(文本區(qū)首地址D1,文本區(qū)首地址D2, 文本區(qū)寬度, 圖形區(qū)首地址D1, </p><p>  

77、//圖形區(qū)首地址D2, 圖形區(qū)寬度, 光標(biāo)形狀, 顯示方式, 顯示開(kāi)關(guān))</p><p>  void LCD_Init(unsigned char Txt1,unsigned char Txt2,unsigned char Txt_Wide,</p><p>  unsigned char Map1,unsigned char Map2,unsigned char Map_Wid

78、e,</p><p>  unsigned char Guang_Biao,unsigned char Disp_Mode,unsigned char Kai_Guan)</p><p>  {Write_Data2(Txt1,Txt2,TXT_STP);</p><p>  Write_Data2(Txt_Wide,0,TXT_WID);</p>&

79、lt;p>  Write_Data2(Map1,Map2,GRH_STP);</p><p>  Write_Data2(Map_Wide,0,GRH_WID);</p><p>  Write_Com(CUR_SHP|Guang_Biao);</p><p>  Write_Com(Disp_Mode);</p><p>  Writ

80、e_Com(DIS_SW|Kai_Guan);}</p><p>  4.2.12顯示一個(gè)漢字子程序</p><p>  //x表示顯示的行(0~15),y表示顯示的列(0~19),n表示字在表格中的位置</p><p>  void Han_Zi(unsigned char x,unsigned char y,unsigned char Addr)</p&g

81、t;<p>  {Set_xy(x,y);</p><p>  Write_8_Data(Addr,INC_WR);</p><p>  Write_8_Data(Addr+2,INC_WR);</p><p>  Set_xy(x+1,y);</p><p>  Write_8_Data(Addr+1,INC_WR);<

82、/p><p>  Write_8_Data(Addr+3,INC_WR);}</p><p>  4.2.13 清屏程序</p><p>  void Clear_LCD()</p><p>  {unsigned int a;</p><p>  Set_xy(0,0);//從最左上角開(kāi)始</p><

83、p>  for(a=0;a<320;a++)//清屏320字節(jié)</p><p>  Write_8_Data(0x83,INC_WR);}// 數(shù)據(jù)寫(xiě),地址加1</p><p>  4.2.14 自定義字符寫(xiě)入CGROM函數(shù)</p><p>  void Write_CGORM()</p><p>  {unsigned int

84、a;</p><p>  Set_CGRAM();Set_Addr(0,0x0c);</p><p>  for(a=0;a<992;a++)//992字節(jié)</p><p>  Write_8_Data(Tab[a],INC_WR);}</p><p>  4.2.15 設(shè)置點(diǎn)顯示在屏幕上的坐標(biāo)(以位為單位)</p>&l

85、t;p>  //x表示顯示的行(0~127),y表示顯示的列(0~159),n=1表示打一點(diǎn),n=0清除一點(diǎn)</p><p>  void Point(unsigned char x,unsigned char y,bit n)</p><p>  {unsigned char point;</p><p>  unsigned int temp;</p

86、><p>  temp=x*20+y/8+320;point=0xf7-y%8;</p><p>  if(n)point|=0xf8;</p><p>  else point&=0xf7;</p><p>  Write_Data2(temp&0xff,temp>>8,0x24);//設(shè)置寫(xiě)地址</p>

87、;<p>  Write_Com(point);}</p><p>  4.2.16 畫(huà)圓子程序,其中x0,y0表示圓心,R表示半徑</p><p>  //先打第一象限內(nèi)的1/4段圓弧,再依據(jù)對(duì)稱原理打出其他3段圓弧</p><p>  void Circle(unsigned char x0,unsigned char y0,unsigned R,

88、bit n)</p><p>  {unsigned char i,j=0;</p><p>  Point(x0,y0,n);</p><p>  for(i=0;i<=R;i++)</p><p>  { while(1)</p><p>  { if(R*R-i*i<=j*j)break; j++;}

89、</p><p>  Point(x0-j,y0+i,n);Point(x0-i,y0+j,n); //第一象限打點(diǎn)</p><p>  Point(x0+j,y0+i,n);Point(x0+i,y0+j,n); //第二象限打點(diǎn)</p><p>  Point(x0+j,y0-i,n);Point(x0+i,y0-j,n); //第三象限打點(diǎn)</p>

90、<p>  Point(x0-j,y0-i,n);Point(x0-i,y0-j,n); //第四象限打點(diǎn)</p><p><b>  j=0; }}</b></p><p>  4.3 初始化代碼設(shè)計(jì)</p><p>  //初始化代碼里包含定時(shí)器0、1的相關(guān)參數(shù)設(shè)置,初始化開(kāi)機(jī)界面顯示等。</p><p&g

91、t;  EA=ET0=ET1=1;//開(kāi)啟中斷總開(kāi)關(guān),允許外部中斷0、1中斷</p><p>  TMOD=0x11;//將定時(shí)器0、1都設(shè)為定時(shí)模式且工作在方式一。</p><p>  TH0=64800/256;//定時(shí)器0初始值裝載,用于按鍵發(fā)聲</p><p>  TL0=64800%256;</p><p>  TH1=0x3c;/

92、/ 定時(shí)器1初始值裝載,每25ms中斷一次</p><p><b>  TL1=0xb0;</b></p><p>  Init_disply();//調(diào)用開(kāi)機(jī)界面顯示子函數(shù),包含了開(kāi)機(jī)界面的所有內(nèi)容</p><p>  4.4 游戲時(shí)間代碼設(shè)計(jì)</p><p>  if(F) //當(dāng)程序檢測(cè)到讀時(shí)間標(biāo)志位F=1(由定時(shí)

93、器1控制)時(shí)會(huì)刷新一次時(shí)間。</p><p>  {F=0;//為下一次做準(zhǔn)備</p><p>  Set_xy(13,17);//設(shè)置百位數(shù)字顯示的位置</p><p>  Write_8_Data(0x10+Time/100,0xc4);//得到時(shí)間的百位數(shù)據(jù)</p><p>  Set_xy(13,18); //設(shè)置十位數(shù)字顯示的位置&

94、lt;/p><p>  Write_8_Data(0x10+Time%100/10,0xc4);//得到時(shí)間的十為數(shù)據(jù)</p><p>  Set_xy(13,19); //設(shè)置個(gè)位數(shù)字顯示的位置</p><p>  Write_8_Data(0x10+Time%10,0xc4);}//得到時(shí)間的個(gè)位數(shù)據(jù)</p><p>  4.5 游戲選關(guān)代碼

95、設(shè)計(jì)</p><p>  //當(dāng)按下選關(guān)按鍵后,主程序調(diào)用選關(guān)函數(shù),程序代碼如下:</p><p>  void Choice_Customs()</p><p>  {Time=Steps=0;//選關(guān)時(shí)將時(shí)間、步數(shù)歸零</p><p>  New_Step();//更新步數(shù)顯示</p><p>  Custom=C

96、ust;//將選得的關(guān)傳給關(guān)數(shù)寄存器</p><p>  New_Custom();//更新關(guān)數(shù)顯示</p><p>  Dispaly();//更新地圖顯示</p><p>  Cust++;//沒(méi)按下一次鍵鍵關(guān)數(shù)加一</p><p>  if(Cust==18)Cust=1;}//如果關(guān)數(shù)等于18則回到第一關(guān)(游戲總共17關(guān))</p

97、><p>  4.6 步數(shù)、關(guān)數(shù)更新代碼設(shè)計(jì)</p><p>  4.6.1 步數(shù)更新代碼設(shè)計(jì)</p><p>  //當(dāng)按下任意一個(gè)方向鍵,且箱子能移動(dòng)時(shí),會(huì)調(diào)用游戲步數(shù)更新子程序</p><p>  void New_Step()</p><p>  {Set_xy(7,17); //設(shè)置百位數(shù)字顯示的位置</p

98、><p>  Write_8_Data(0x10+Steps/100,0xc4); //得到步數(shù)的百位數(shù)據(jù)</p><p>  Set_xy(7,18); //設(shè)置十位數(shù)字顯示的位置</p><p>  Write_8_Data(0x10+Steps%100/10,0xc4); //得到步數(shù)的十位數(shù)據(jù)</p><p>  Set_xy(7,19)

99、; //設(shè)置個(gè)位數(shù)字顯示的位置</p><p>  Write_8_Data(0x10+Steps%10,0xc4);} //得到步數(shù)的個(gè)位數(shù)據(jù)</p><p>  4.6.2 關(guān)數(shù)更新代碼設(shè)計(jì)</p><p>  void New_Custom()</p><p>  {Set_xy(1,18);// 設(shè)置十位數(shù)字顯示的位置</p&g

100、t;<p>  Write_8_Data(0x10+Custom/10,0xc4);// 得到關(guān)數(shù)的十位數(shù)據(jù)</p><p>  Set_xy(1,19);// 設(shè)置個(gè)位數(shù)字顯示的位置</p><p>  Write_8_Data(0x10+Custom%10,0xc4);}// 得到關(guān)數(shù)的個(gè)位數(shù)據(jù)</p><p>  4.7 過(guò)關(guān)代碼設(shè)計(jì)</p

101、><p>  //當(dāng)所有箱子都推到指定位置時(shí),會(huì)調(diào)用過(guò)關(guān)子程序,代碼如下:</p><p>  void Pass()</p><p>  {unsigned char i,j,a=1;//內(nèi)存空間分配</p><p>  for(i=0;i<8;i++)//掃描8行</p><p>  {if(!a)break;/

102、/如果a=0則直接跳出函數(shù)</p><p>  for(j=0;j<9;j++) //掃描9列 </p><p>  //如果關(guān)卡數(shù)組表格中此位置是叉圖形或箱子和叉重合后的圖

103、 </p><p>  if(Customs[Custom-1][i][j]==5||Customs[Custom-1][i][j]==4)</p><p>  //如果動(dòng)作跟蹤數(shù)組里此位置是箱子和叉重合后的圖,則將a置1</p><p>  if(Follow_Action[i][j

104、]==5)a=1;</p><p>  //如果動(dòng)作跟蹤數(shù)組里此位置不是箱子和叉重合后的圖,則將a置0,并退出</p><p>  else {a=0;break;}}</p><p>  if(a){Custom++;//如果a=1則將關(guān)數(shù)加一(因?yàn)樗邢渥佣家淹坪茫梢赃^(guò)關(guān))</p><p>  Steps=Time=0;//過(guò)關(guān)時(shí)將時(shí)間

105、、步數(shù)歸零</p><p>  New_Step();//更新步數(shù)顯示</p><p>  if(Custom==18)Custom=1;//如果關(guān)數(shù)等于18則回到第一關(guān)(游戲總共17關(guān))</p><p>  New_Custom();//更新關(guān)數(shù)顯示</p><p>  Dispaly();}}//更新地圖顯示</p><

106、;p>  4.8圖形顯示子程序</p><p>  圖形顯示子程序包括地圖顯示程序和原來(lái)位置顯示子程序兩個(gè)</p><p>  4.8.1 地圖顯示子程序</p><p>  //在調(diào)用過(guò)關(guān)函數(shù)或選關(guān)函數(shù)時(shí),會(huì)調(diào)用到顯示子函數(shù),功能是刷新地圖</p><p>  void Dispaly()</p><p>  

107、{unsigned char i,j,a;</p><p>  for(i=0;i<8;i++)//掃描8行</p><p>  {for(j=0;j<9;j++)//掃描9列</p><p>  {Follow_Action[i][j]=Customs[Custom-1][i][j];將關(guān)卡數(shù)組中的數(shù)據(jù)傳給跟蹤數(shù)組

108、 </p><p>  a=Follow_Action[i][j];//將跟蹤數(shù)組中的數(shù)據(jù)傳給動(dòng)態(tài)內(nèi)存</p><p>  sw

109、itch(a)//根據(jù)內(nèi)存中的數(shù)據(jù)做出判斷</p><p>  {case 0:a=0x80;break;//如果是0(空白)則將空白字模的地址80H傳給內(nèi)存</p><p>  //如果是1(人物)則將人物字模的地址94H傳給內(nèi)存,并記錄人物位置所在坐標(biāo)</p><p>  case 1:a=0x94;x_Coordinate=i;y_Coordinate=j;b

110、reak;</p><p>  case 2:a=0x84;break;// 如果是2(墻壁)則將墻壁字模的地址84H傳給內(nèi)存</p><p>  case 3:a=0x8c;break;// 如果是3(箱子)則將箱子字模的地址8cH傳給內(nèi)存</p><p>  case 4:a=0x88;break;// 如果是4(叉)則將叉字模的地址88H傳給內(nèi)存</p&

111、gt;<p>  case 5:a=0x90;break;}//如果是5(箱子和叉重合)則將地址90H傳給內(nèi)存</p><p>  Han_Zi(2*i,2*j,a);}}}//調(diào)用寫(xiě)漢字程序,將圖形顯示出來(lái)</p><p>  4.8.2原來(lái)位置顯示子程序</p><p>  //此程序顯示當(dāng)人物移動(dòng)后,人物本身位置所要顯示的圖形</p>

112、<p>  void _Display()</p><p>  {if(a==0||a==3||a==1) //如果原來(lái)人物這個(gè)位置是空白或是箱子則顯示一個(gè)空白</p><p>  {Han_Zi(2*x_Coordinate,2*y_Coordinate,0x80);// 將空白圖形顯示出來(lái)</p><p>  Follow_Action[x_Coo

113、rdinate][y_Coordinate]=0;}//更新跟蹤數(shù)組中的內(nèi)容</p><p>  //如果人物本身這里是一個(gè)叉圖形或是箱子或叉重合后的圖則顯示一個(gè)叉</p><p>  if(a==4||a==5)</p><p>  {Han_Zi(2*x_Coordinate,2*y_Coordinate,0x88);// 將叉圖形顯示出來(lái)</p>

114、<p>  Follow_Action[x_Coordinate][y_Coordinate]=4;}}// 更新跟蹤數(shù)組中的內(nèi)容</p><p>  4.9 中斷代碼設(shè)計(jì)</p><p>  中斷代碼設(shè)計(jì)包括定時(shí)器0和1兩段,定時(shí)器0為中斷發(fā)聲代碼,定時(shí)器1為中斷計(jì)時(shí)代碼,代碼如下:</p><p>  4.9.1 定時(shí)器0中斷發(fā)聲程序</p&g

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論