基于單片機(jī)的游戲機(jī)設(shè)計(jì)_第1頁
基于單片機(jī)的游戲機(jī)設(shè)計(jì)_第2頁
基于單片機(jī)的游戲機(jī)設(shè)計(jì)_第3頁
基于單片機(jī)的游戲機(jī)設(shè)計(jì)_第4頁
基于單片機(jī)的游戲機(jī)設(shè)計(jì)_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

武漢理工大學(xué)畢業(yè)設(shè)計(jì)(論文)武漢理工大學(xué)畢業(yè)設(shè)計(jì)(論文)基于單片機(jī)的貪吃蛇游戲機(jī)設(shè)計(jì)學(xué)院(系):信息工程學(xué)院專業(yè)班級:學(xué)生姓名:指導(dǎo)教師:

學(xué)位論文原創(chuàng)性聲明本人鄭重聲明:所呈交的論文是本人在導(dǎo)師的指導(dǎo)下獨(dú)立進(jìn)行研究所取得的研究成果。除了文中特別加以標(biāo)注引用的內(nèi)容外,本論文不包括任何其他個(gè)人或集體已經(jīng)發(fā)表或撰寫的成果作品。本人完全意識到本聲明的法律后果由本人承擔(dān)。作者簽名:年月日學(xué)位論文版權(quán)使用授權(quán)書本學(xué)位論文作者完全了解學(xué)校有關(guān)保障、使用學(xué)位論文的規(guī)定,同意學(xué)校保留并向有關(guān)學(xué)位論文管理部門或機(jī)構(gòu)送交論文的復(fù)印件和電子版,允許論文被查閱和借閱。本人授權(quán)省級優(yōu)秀學(xué)士論文評選機(jī)構(gòu)將本學(xué)位論文的全部或部分內(nèi)容編入有關(guān)數(shù)據(jù)進(jìn)行檢索,可以采用影印、縮印或掃描等復(fù)制手段保存和匯編本學(xué)位論文。本學(xué)位論文屬于1、保密囗,在年解密后適用本授權(quán)書2、不保密囗。(請?jiān)谝陨舷鄳?yīng)方框內(nèi)打“√”)作者簽名:年月日導(dǎo)師簽名:年月日

本科生畢業(yè)設(shè)計(jì)(論文)任務(wù)書學(xué)生姓名:專業(yè)班級:指導(dǎo)教師:工作單位:武漢理工大學(xué)信息學(xué)院設(shè)計(jì)(論文)題目:基于單片機(jī)的貪吃蛇游戲機(jī)設(shè)計(jì)設(shè)計(jì)(論文)主要內(nèi)容:深入學(xué)習(xí)單片機(jī)知識及基于單片機(jī)的C語言編程;學(xué)習(xí)keil編程軟件以及proteus仿真軟件的使用;學(xué)習(xí)lcd液晶屏的使用及初始化編程;貪吃蛇游戲機(jī)能夠記錄游戲成績,并設(shè)置不同的等級和地圖;貪吃蛇的身體能夠隨著吃到食物變長,碰壁或吃到自己則死亡;熟悉和掌握論文的相關(guān)規(guī)范格式;要求完成的主要任務(wù):1.參考文獻(xiàn)不少于15篇,其中英文參考文獻(xiàn)不少于2篇,完成開題報(bào)告。2.熟練掌握基于單片機(jī)的C語言編程以及keil和protues的使用。3.在設(shè)計(jì)中完成不少于15張圖紙的描述。4.閱讀并翻譯與客體相關(guān)的英文資料,不少于20000字符;5.完成畢業(yè)設(shè)計(jì)周志。6.完成畢業(yè)論文的撰寫,不少于12000字;必讀參考資料:[1]李群芳,張世軍.單片微型計(jì)算機(jī)與接口技術(shù)[M].北京:電子工業(yè)出版社,2005.[2]馬德駿,張建宏.C語言程序設(shè)計(jì)[M].北京:科學(xué)出版社,2009.[3]王宏宇.VF游戲設(shè)計(jì)一貪吃蛇[J].中國科技信息,2007.[4]郭天祥.新概念51單片機(jī)C語言教程全攻略[M].北京:電子工業(yè)出版社,2009.[5]林銳,韓永泉.高質(zhì)量程序設(shè)計(jì)指南C語言[M].北京:電子工業(yè)出版社,2007.指導(dǎo)教師簽名:系主任簽名:院長簽名(章)武漢理工大學(xué)

本科生畢業(yè)設(shè)計(jì)(論文)開題報(bào)告1、目的及意義(含國內(nèi)外的研究現(xiàn)狀分析)現(xiàn)如今,游戲風(fēng)靡全球,各種游戲?qū)映霾桓F,大到網(wǎng)絡(luò)型的復(fù)雜游戲,小到手機(jī)游戲、單機(jī)游戲、智力游戲等簡單游戲。游戲機(jī)風(fēng)行的程度,是第一臺電子游戲機(jī)的研制者諾蘭-布什納爾先生始料不及的。在全世界最大的城市,直至最小的村莊,從紐約最輝煌的游樂場,到高加索最小的鄉(xiāng)鎮(zhèn)兒童娛樂點(diǎn),在千家萬戶,正在進(jìn)行著千千萬萬這樣的“戰(zhàn)斗”,伴隨著無數(shù)成功與失敗,興奮與懊喪。游戲機(jī)帶來了一個(gè)全球性的瘋狂癥,其他任何娛樂與之相比都望塵莫及。然而,究竟是什么原因使游戲機(jī)如此風(fēng)行呢?在回顧了游戲機(jī)發(fā)展簡史之后,我們不難悟出,技術(shù)進(jìn)步在游戲機(jī)發(fā)展過程中起到了極大的促進(jìn)作用。隨著科技與社會的發(fā)展,現(xiàn)代生活節(jié)奏越來越快,人們的工作生活壓力也隨之加大。人們生活的步調(diào)日益加快,越來越多的人加入了全球化的世界。人們不再拘泥于一塊天地,加班,出差成了現(xiàn)代人不可避免的公務(wù)。而此時(shí)設(shè)計(jì)一款操作簡單,生動(dòng)新穎,娛樂性強(qiáng),便于攜帶的隨時(shí)隨地娛樂的游戲機(jī)成了必需品,在繁忙的工作生活之余玩玩這款小游戲,不僅可以調(diào)節(jié)人們的情緒,使人心情舒暢,還能健腦益智,為更好地投入工作學(xué)習(xí)做好準(zhǔn)備。貪吃蛇這一游戲簡單易行,操作方便,娛樂性較強(qiáng),吸引了不少人。這一款游戲緊緊地抓住了人們的心理,雖然簡單,卻其樂無窮,在人們不斷追求更多的欲望下,該游戲給人們帶來了追逐的快感,以及成功后的滿足感,對于一直處于高壓下的現(xiàn)代人是很好的放松工具。第二次世界大戰(zhàn)以后,電子計(jì)算機(jī)技術(shù)得到了突飛猛進(jìn)的發(fā)展。先是由晶體管代替了笨重的真空管,后來出現(xiàn)了集成電路和大規(guī)模集成電路,使電子計(jì)算機(jī)一代一代實(shí)現(xiàn)更新,同時(shí)軟件技術(shù)也發(fā)展迅速。在美國,集中了許多計(jì)算機(jī)軟件的設(shè)計(jì)人才,他們工作之余,時(shí)常喜愛編一種能與人斗智的“游戲”,以此來鍛煉編程的能力。這種“游戲”花樣繁多,但其特點(diǎn)都是利用計(jì)算機(jī)軟件事先設(shè)計(jì)好的“分析”、“判斷”能力反過來與人較量。由于不斷修改更新,使計(jì)算機(jī)的“智力”水平與人難分高低。當(dāng)前科學(xué)技術(shù)飛速發(fā)展,特別是微電子技術(shù),計(jì)算機(jī)軟件與應(yīng)用技術(shù)的發(fā)展,使得人們的日常生活豐富多彩。單片微型計(jì)算機(jī)(簡稱單片機(jī))作為微型計(jì)算機(jī)家族的一員,以其獨(dú)特的結(jié)構(gòu),良好的穩(wěn)定性,便宜的價(jià)格在嵌入式領(lǐng)域廣泛應(yīng)用。與傳統(tǒng)的PC上設(shè)計(jì)的貪吃蛇游戲不同,本次設(shè)計(jì)利用Proteus硬件仿真軟件,采用單片機(jī)、液晶顯示屏、揚(yáng)聲器、按鍵等搭建硬件平臺,C語言編程,實(shí)現(xiàn)便攜地貪吃蛇游戲機(jī)的設(shè)計(jì)。雖然現(xiàn)在市面上存在各種各樣的游戲版本,可是貪吃蛇市場還是相當(dāng)?shù)拇?。因?yàn)樗奶厥庠谟谖烁钊?,愛不釋手。隨著游戲速度不斷加快,其刺激也更強(qiáng)。可以說該游戲的優(yōu)勢在于它的簡單易行,不論是手機(jī),還是小游戲機(jī)。都能很快順利的運(yùn)行。對于在外忙碌的人,不可能花費(fèi)大量的時(shí)間在娛樂上,大型游戲是行不通的。這樣的小游戲剛好迎合他們的需求。隨著終端設(shè)備開發(fā)能力的加強(qiáng),作為娛樂終端的游戲機(jī)也得到了很大程度的發(fā)展。只有得到了游戲終端技術(shù)的支持,才能做出更新、更高難的游戲。這也加速了游戲機(jī)在全球風(fēng)行程度,所以對于游戲機(jī)的研究和設(shè)計(jì)具有很重要的意義,這也是本課題研究的來源。2、基本內(nèi)容和技術(shù)方案針對貪吃蛇游戲機(jī)的設(shè)計(jì),使用到了單片機(jī)和lcd液晶顯示屏,以C語言為編程語言,使用keil軟件將程序編譯成.hex文件,通過單片機(jī)實(shí)現(xiàn)對lcd的顯示控制,來完成整個(gè)游戲的設(shè)計(jì)。游戲設(shè)計(jì)重點(diǎn)需要解決游戲界面的顯示和蛇身運(yùn)動(dòng)處理的問題。游戲界面顯示:設(shè)定lcd以2*2大小為一個(gè)單位點(diǎn)陣,定義貪吃蛇的每一節(jié)蛇身大小為一個(gè)單位點(diǎn)陣,豆子的大小,游戲地圖中障礙物的大小和一節(jié)蛇身大小相同,也是一個(gè)單位點(diǎn)陣。lcd要顯示各種游戲狀態(tài)對應(yīng)的界面,所以定義數(shù)組來存儲各種界面對應(yīng)的位圖數(shù)據(jù)。定義函數(shù)實(shí)現(xiàn)在lcd的某一坐標(biāo)位置增加一個(gè)單位點(diǎn)陣或刪除一個(gè)單位點(diǎn)陣的操作,這樣通過調(diào)用該函數(shù)實(shí)現(xiàn)增加蛇頭,消除蛇尾,實(shí)現(xiàn)在游戲界面上蛇的爬行。主要需要處理如下幾個(gè)問題:(1)運(yùn)動(dòng)處理。在每個(gè)時(shí)鐘到來時(shí),由蛇頭帶動(dòng)每個(gè)點(diǎn)陣的方向都向下一個(gè)點(diǎn)陣傳播,然后自己向新的方向運(yùn)動(dòng)一步。運(yùn)動(dòng)后,下一個(gè)點(diǎn)陣由于得到了上一個(gè)點(diǎn)陣的方向,就按照此方向同樣地運(yùn)動(dòng)一步。所以,它會馬上填補(bǔ)上一個(gè)點(diǎn)陣的位置,如此類推。實(shí)際上在設(shè)計(jì)貪吃蛇的時(shí)候,只需要把蛇尾的那個(gè)點(diǎn)陣去掉,然后在蛇頭的新方向上放一個(gè)點(diǎn)陣就可以了。因此定義一個(gè)函數(shù)用于更新點(diǎn)的坐標(biāo),只要知道蛇頭或蛇尾的坐標(biāo)和運(yùn)動(dòng)方向,就可以調(diào)用該函數(shù)更新蛇頭或蛇尾的坐標(biāo),同時(shí)調(diào)用相關(guān)顯示函數(shù),實(shí)現(xiàn)蛇運(yùn)動(dòng)處理。(2)吃到豆子的處理。蛇頭坐標(biāo)與豆子坐標(biāo)相等,則吃到豆子。如果吃到豆子,在蛇頭位置增加一個(gè)單位點(diǎn)陣,并更新豆子的坐標(biāo)。(3)放置新的豆子。通過更新豆子的坐標(biāo)實(shí)現(xiàn)放置新的豆子。放置豆子的過程中,還需要判斷新豆子的坐標(biāo)是否與蛇身或障礙物坐標(biāo)重疊,如果重疊,則需要重新放置和判斷,直到新的豆子不與蛇身或障礙物坐標(biāo)重疊為止。(4)死亡處理。蛇運(yùn)動(dòng)的過程中,若蛇頭碰到墻,障礙物或自己的身體,則游戲結(jié)束。3、進(jìn)度安排第1-4周:查閱相關(guān)文獻(xiàn)資料,明確研究內(nèi)容,了解研究所需的硬件設(shè)備、C編程語言等知識內(nèi)容。確定方案,完成開題報(bào)告。第5-8周:熟悉掌握編程語言與硬件環(huán)境,完成貪吃蛇游戲機(jī)的初步設(shè)計(jì)。第9-13周:完成貪吃蛇游戲機(jī)的詳細(xì)設(shè)計(jì),實(shí)現(xiàn)貪吃蛇游戲機(jī)的測試與運(yùn)行。第14-17周:完善畢業(yè)畢業(yè)設(shè)計(jì)論文,并答辯。4、指導(dǎo)教師意見指導(dǎo)教師簽名:年月日武漢理工大學(xué)畢業(yè)設(shè)計(jì)(論文)目錄TOC\o"1-2"\h\z\u摘要 摘要隨著科技的發(fā)展,現(xiàn)代生活節(jié)奏越來越快,人們的工作生活壓力也隨之加大。設(shè)計(jì)一款操作簡單,生動(dòng)新穎,娛樂性強(qiáng),便于攜帶的小游戲,在繁忙的工作生活之余玩玩這款小游戲,不僅可以調(diào)節(jié)人們的情緒,使人心情舒暢,還能健腦益智,為更好地投入工作學(xué)習(xí)做好準(zhǔn)備。本文基于單片機(jī)設(shè)計(jì)的貪吃蛇游戲,除了具有傳統(tǒng)意義上的貪吃蛇游戲的特點(diǎn):吃豆子蛇身增長,得分;分?jǐn)?shù)達(dá)到一定等級進(jìn)行升級以后,蛇運(yùn)動(dòng)速度加快等以外,本次設(shè)計(jì)加入了游戲暫停,中途退出,地圖選擇,背景提示音效等功能。為節(jié)省存儲空間,游戲算法上進(jìn)行了新的設(shè)計(jì),定義一個(gè)一維數(shù)組,利用位操作存儲讀取蛇頭的運(yùn)動(dòng)狀態(tài)信息。具體實(shí)現(xiàn)上,硬件系統(tǒng)平臺采用51系列單片機(jī),搭載LCD,鍵盤,構(gòu)成了一個(gè)輕巧便攜的游戲機(jī)系統(tǒng)。51系列單片機(jī)技術(shù)成熟,功能強(qiáng)大,應(yīng)用廣泛。使用單片機(jī)作為控制核心,可以簡化硬件電路,采用軟件編程控制單片機(jī)實(shí)現(xiàn)硬件電路的功能,降低能耗,降低成本。軟件采用C語言編程,方便靈活,大大加快了軟件開發(fā)速度,縮短了開發(fā)周期,并且便于移植。為提高開發(fā)效率和硬件穩(wěn)定性,采用了功能強(qiáng)大的硬件仿真軟件Proteus,依托該軟件提供的仿真環(huán)境搭配Keil作為軟件開發(fā)調(diào)試環(huán)境進(jìn)行仿真調(diào)試成功。文中具體介紹了使用到的各種硬件的特性,游戲的各種功能與詳細(xì)設(shè)計(jì),軟件的具體設(shè)計(jì)思路,各模塊的詳細(xì)介紹,部分模塊的程序流程圖,狀態(tài)遷移圖,關(guān)鍵部分代碼的詳細(xì)講解等。關(guān)鍵詞:貪吃蛇;51單片機(jī);游戲

AbstractWiththedevelopmentofscienceandtechnology,moreandmorefast-pacedmodernlife,thepressureofpeoplealsoincrease.Designingasimplegamewithvivid,novel,entertainingandeasytocarryon,itcansatisfypeople’sneeds.Onabusylife,toplaythissimplegame,notonlymayadjustpeople’smood,butalsomakepeoplesmart.Relaxingyourselflikethis,itcanimproveworkingandlearningefficiency.Inthispaper,thegameofGreedySnakeissuchagamebasedonMCU.InadditiontothetraditionalsenseoftheGreedySnakegamefeatures:Snakebodygrowsandscoreswitheatingabean;Scoresreachedacertainnumbertoupgradethelevelandspeed,manynewfeaturesareadded,forinstance,gamepauseorexitmidway,mapchoice,richaudioandotherfunctions.Inordertosavethestoragespace,thealgorithmsofgamemakesanewdesign.Bydefiningaonedimensionalarray,snakehead’smotionstatesarestoredandreadinthisarraywithbitoperation.Thehardwaresystemuses51MCUplatformwithtwoLCDs,keyboardsandaspeaker,ultimatelyformingacompactportablegamesystem.51MCU’stechnologyismature,powerfulandwidelyused.TheuseofMCUascontrolcore,youcansimplifythehardwarecircuit,achievehardwarefunctionsofthecircuitwithsoftwareprogrammingtocontroltheMCU,andreduceenergyconsumptionandcosts.SoftwareuseClanguageprogramming,itisconvenientandflexiblyeasytotransplant.Inordertoenhancetheefficiencyandhardwarestabilityofdevelop-ment,usingapowerfulhardwareemulationsoftwareProteus,basedonthesoftwaresimulationenvironmentprovidedwiththeKeilsoftwareasadebuggingenvironmenttodebugsuccessfully.Thearticleintroducestheuseofavarietyofhardwarefeatures,thegamefeaturesandthedetaileddesign,softwaredesignofthespecificideas,detailsofvariousmodules,somemodulesoftheprogramflowchart,statetransitiongraph,akeypartofthecodedetailsandsoon.KeyWords:GreedySnake;51MCU;Game1緒論1.1研究目的及意義現(xiàn)如今,游戲風(fēng)靡全球,各種游戲?qū)映霾桓F,大到網(wǎng)絡(luò)型的復(fù)雜游戲,小到手機(jī)游戲、單機(jī)游戲、智力游戲等簡單游戲。貪吃蛇游戲是一款非常經(jīng)典的小游戲,因?yàn)樗容^簡單有趣,無論老少都比較適合。貪吃蛇游戲機(jī)的設(shè)計(jì)對學(xué)習(xí)單片機(jī)與C語言設(shè)計(jì)者的能力提高和進(jìn)階都是一個(gè)很好的鍛煉機(jī)會。貪吃蛇游戲機(jī)的設(shè)計(jì)比較復(fù)雜,它涉及面廣、牽扯面多,如果不好好考慮和設(shè)計(jì),將難以成功開發(fā)出這款游戲機(jī)。在這個(gè)游戲機(jī)的設(shè)計(jì)中,牽扯到基于單片機(jī)C語言編程相關(guān)知識以及LCD12864的使用與學(xué)習(xí),如何利用單片機(jī)將C語言與游戲串聯(lián)起來。因此,如何設(shè)計(jì)和開發(fā)好這個(gè)游戲機(jī),對于提高C語言開發(fā)水平和單片機(jī)硬件電路的設(shè)計(jì)能力有極大的幫助,正是因?yàn)槿绱?,本次畢業(yè)設(shè)計(jì)的目的在于學(xué)習(xí)C語言程序設(shè)計(jì)的基本技術(shù)以及單片機(jī)相關(guān)知識,學(xué)習(xí)用KeilμVision4開發(fā)C程序的相關(guān)知識,熟悉貪吃蛇游戲機(jī)的基本需求,熟悉項(xiàng)目開發(fā)的完整過程。學(xué)會怎么進(jìn)行一個(gè)項(xiàng)目的需求分析、概要設(shè)計(jì)、詳細(xì)設(shè)計(jì)等過程。通過本次設(shè)計(jì)能夠使自己的相關(guān)知識得到一個(gè)明顯的提升。貪吃蛇之所以取這樣的名字,其用意還是很明顯的,貪吃蛇其實(shí)并不貪,它是人不斷地追求的象征,就像現(xiàn)代的人只有不斷努力向前才能得到自己想要的。而食物也是隨機(jī)出現(xiàn)的,就像現(xiàn)在社會存在的機(jī)會,而我們只有找好自己的目標(biāo)才能成功。雖然現(xiàn)在市面上存在各種各樣的游戲版本,可是貪吃蛇市場還是相當(dāng)?shù)拇蟆R驗(yàn)樗奶厥庠谟谖烁钊?,愛不釋手。隨著游戲速度不斷加快,其刺激也更強(qiáng)??梢哉f該游戲的優(yōu)勢在于它的簡單易行,不論是手機(jī),還是小游戲機(jī)。都能很快順利的運(yùn)行。對于在外忙碌的人,不可能花費(fèi)大量的時(shí)間在娛樂上,大型游戲是行不通的。這樣的小游戲剛好迎合他們的需求。1.2研究內(nèi)容與目標(biāo)貪吃蛇游戲是一款經(jīng)典的小游戲,前人根據(jù)不同的需求,使用不同的編程語言和算法實(shí)現(xiàn)過該游戲。本次作者基于51單片機(jī)這一常用的硬件平臺,充分發(fā)揮其性能,在嵌入式平臺利用C語言編程實(shí)現(xiàn)這款經(jīng)典游戲。由于嵌入式平臺對于硬件資源有著相對于PC機(jī)開發(fā)的應(yīng)用軟件更為苛刻的要求,特別是在RAM/ROM的存儲空間大小上,所以本次作者將研究重點(diǎn)放在如何處理蛇的運(yùn)動(dòng)軌跡方面,采用了一個(gè)unsignedchar型一維數(shù)組來存放蛇頭的運(yùn)動(dòng)軌跡,并考慮到蛇身的最大長度,充分節(jié)省有限的存儲空間,通過處理按鍵,完成了對蛇運(yùn)動(dòng)的控制以及游戲控制。顯示游戲信息和游戲運(yùn)行畫面的LCDl2864使用廣泛,技術(shù)相對成熟,故LCD底層驅(qū)動(dòng)采用前人成果,并在此基礎(chǔ)上設(shè)計(jì)了游戲的運(yùn)行界面。最終目標(biāo),利用所學(xué)知識,在C語言和單片機(jī)的基礎(chǔ)上,完成貪吃蛇游戲機(jī)的設(shè)計(jì)。1.3論文結(jié)構(gòu)安排本論文在實(shí)際研究、設(shè)計(jì)和測試總結(jié)的基礎(chǔ)上完成的,共分為四章節(jié)::緒論。介紹了論文研究設(shè)計(jì)的背景和意義、使用的相關(guān)技術(shù)以及研究的內(nèi)容和目標(biāo)。首先介紹小游戲機(jī)的特征和發(fā)展趨勢,然后具體介紹了貪吃蛇游戲發(fā)展方向和基本構(gòu)成。簡單闡述了貪吃蛇游戲機(jī)再現(xiàn)在社會中的存在意義,也簡單的闡述了所需要的技術(shù)和完成的功能。:對本設(shè)計(jì)的軟硬件環(huán)境進(jìn)行了說明。討論了所使用的硬件元件和開發(fā)語言、開發(fā)軟件等等,對本設(shè)計(jì)中所使用到的Keil、Proteus、C語言等進(jìn)行了詳細(xì)的介紹。:游戲機(jī)功能描述與總體方案設(shè)計(jì)。對本次設(shè)計(jì)貪吃蛇游戲機(jī)所要實(shí)現(xiàn)的功能進(jìn)行了描述和介紹??傮w方案設(shè)計(jì)將系統(tǒng)分為軟硬件等幾個(gè)小的模塊來進(jìn)行分別設(shè)計(jì)。:游戲機(jī)硬件電路的詳細(xì)設(shè)計(jì)。硬件設(shè)計(jì)是本次設(shè)計(jì)中至關(guān)重要的一環(huán),只有相應(yīng)的硬件電路設(shè)計(jì)出來之后,才能進(jìn)行相關(guān)的軟件程序設(shè)計(jì)。:軟件程序設(shè)計(jì),軟件是本設(shè)計(jì)的靈魂所在,貪吃蛇游戲功能的整體實(shí)現(xiàn)均有軟件程序來完成,程序設(shè)計(jì)分為:LCD初始化、按鍵程序設(shè)計(jì)、主函數(shù)模塊、游戲控制和貪吃蛇運(yùn)動(dòng)模塊;:仿真與實(shí)現(xiàn),游戲界面展示等等。:設(shè)計(jì)總結(jié)與展望。對本設(shè)計(jì)從方案設(shè)計(jì)到調(diào)試結(jié)果進(jìn)行了總結(jié)。2硬件及相關(guān)開發(fā)環(huán)境介紹針對游戲機(jī)的需求分析,系統(tǒng)采用的硬件設(shè)備主要包括51系列單片機(jī),LCDl2864,其主要運(yùn)行原理是使用單片機(jī)的I/O口驅(qū)動(dòng)LCD,向LCD的數(shù)據(jù)口寫數(shù)據(jù)或指令,使LCD12864顯示相應(yīng)的游戲信息和游戲界面[1]。軟件開發(fā)方面,使用到了簡單易讀的C語言,與匯編相比,C語言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢,利用KeilμVision4進(jìn)行C語言編譯,KeilC51軟件提供豐富的庫函數(shù)和功能強(qiáng)大的集成開發(fā)調(diào)試工具,硬件連線與仿真使用到了Proteus軟件,首先將C語言程序在keil中編譯生成hex文件,然后下載到單片機(jī)中,進(jìn)行仿真與實(shí)現(xiàn)。下面將簡單介紹相關(guān)的軟硬件環(huán)境。2.1AT89C51簡介AT89C51提供以下標(biāo)準(zhǔn)功能:4k字節(jié)Flash閃速存儲器,128字節(jié)內(nèi)部RAM,32個(gè)I/O口線,兩個(gè)16位定時(shí)/計(jì)數(shù)器,一個(gè)5向量兩級中斷結(jié)構(gòu),一個(gè)全雙工串行通信口,片內(nèi)振蕩器及時(shí)鐘電路。同時(shí),AT89C51可降至0Hz的靜態(tài)邏輯操作,并支持兩種軟件可選的節(jié)電工作模式??臻e方式停止CPU的工作,但允許RAM,定時(shí)/計(jì)數(shù)器,串行通信口及中斷系統(tǒng)繼續(xù)工作。掉電方式保存RAM中的內(nèi)容,但振蕩器停止工作并禁止其它所有部件工作直到下一個(gè)硬件復(fù)位。管腳說明:VCC:供電電壓。GND:接地。P0口:P0口為一個(gè)8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當(dāng)P0口的管腳第一次寫1時(shí),被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲器,它可以被定義為數(shù)據(jù)/地址的低八位。在FIASH編程時(shí),P0口作為原碼輸入口,當(dāng)FIASH進(jìn)行校驗(yàn)時(shí),P0輸出原碼,此時(shí)P0外部必須接上拉電阻。P1口:P1口是一個(gè)內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時(shí),將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗(yàn)時(shí),P1口作為低八位地址接收。P2口:P2口為一個(gè)內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個(gè)TTL門電流,當(dāng)P2口被寫“1”時(shí),其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時(shí),P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。P2口當(dāng)用于外部程序存儲器或16位地址外部數(shù)據(jù)存儲器進(jìn)行存取時(shí),P2口輸出地址的高八位。在給出地址“1”時(shí),它利用內(nèi)部上拉優(yōu)勢,當(dāng)對外部八位地址數(shù)據(jù)存儲器進(jìn)行讀寫時(shí),P2口輸出其特殊功能寄存器的內(nèi)容。P2口在FLASH編程和校驗(yàn)時(shí)接收高八位地址信號和控制信號。P3口:P3口管腳是8個(gè)帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個(gè)TTL門電流。當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。P3口也可作為AT89C51的一些特殊功能口,如下所示:P3.0RXD(串行輸入口)P3.1TXD(串行輸出口)P3.2/INT0(外部中斷0)P3.3/INT1(外部中斷1)P3.4T0(計(jì)時(shí)器0外部輸入)P3.5T1(計(jì)時(shí)器1外部輸入)P3.6/WR(外部數(shù)據(jù)存儲器寫選通)P3.7/RD(外部數(shù)據(jù)存儲器讀選通)P3口同時(shí)為閃爍編程和編程校驗(yàn)接收一些控制信號。RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時(shí),要保持RST腳兩個(gè)機(jī)器周期的高電平時(shí)間。ALE/PROG:當(dāng)訪問外部存儲器時(shí),地址鎖存允許的輸出電平用于鎖存地址的低位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時(shí),ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時(shí)目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲器時(shí),將跳過一個(gè)ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時(shí),ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。/PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個(gè)機(jī)器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時(shí),這兩次有效的/PSEN信號將不出現(xiàn)。/EA/VPP:當(dāng)/EA保持低電平時(shí),則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內(nèi)部程序存儲器。注意加密方式1時(shí),/EA將內(nèi)部鎖定為RESET;當(dāng)/EA端保持高電平時(shí),此間內(nèi)部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。XTAL1:反向振蕩放大器的輸入及內(nèi)部時(shí)鐘工作電路的輸入。XTAL2:來自反向振蕩器的輸出。振蕩器特性:XTAL1和XTAL2分別為反向放大器的輸入和輸出。該反向放大器可以配置為片內(nèi)振蕩器。石晶振蕩和陶瓷振蕩均可采用。如采用外部時(shí)鐘源驅(qū)動(dòng)器件,XTAL2應(yīng)不接。有余輸入至內(nèi)部時(shí)鐘信號要通過一個(gè)二分頻觸發(fā)器,因此對外部時(shí)鐘信號的脈寬無任何要求,但必須保證脈沖的高低電平要求的寬度。AT89C51設(shè)有穩(wěn)態(tài)邏輯,可以在低到零頻率的條件下靜態(tài)邏輯,支持兩種軟件可選的掉電模式。在閑置模式下,CPU停止工作。但RAM,定時(shí)器,計(jì)數(shù)器,串口和中斷系統(tǒng)仍在工作。在掉電模式下,保存RAM的內(nèi)容并且凍結(jié)振蕩器,禁止所用其他芯片功能,直到下一個(gè)硬件復(fù)位為止[2]。下圖為單片機(jī)管腳圖:圖189C51引腳圖2.2LCD12864簡介不帶中文字庫的128*64是一種具有4位/8位并行、2線或3線串行多種接口方式,利用該模塊靈活的接口方式和簡單、方便的操作指令,可構(gòu)成全中文人機(jī)交互圖形界面。低電壓低功耗是其一顯著特點(diǎn)。由該模塊構(gòu)成的液晶顯示方案與同類型的圖形點(diǎn)陣液晶顯示模塊相比,不論硬件電路結(jié)構(gòu)或顯示程序都要簡潔得多,且該模塊的價(jià)格也略低于相同點(diǎn)陣的圖形液晶模塊。LCDl2864功能強(qiáng)大,5V電壓驅(qū)動(dòng),帶背光,內(nèi)置8192個(gè)16*16點(diǎn)陣、顯示容量為128*64,內(nèi)部由A,B兩屏左右分布組成。LCDl2864顯示的點(diǎn)陣方式是128*64。橫向0-127共128個(gè)點(diǎn)陣,分為左右兩屏,各占0-63共64個(gè)點(diǎn)陣;縱向0-63共64個(gè)點(diǎn)陣,每8個(gè)縱向點(diǎn)陣(8個(gè)點(diǎn)陣可以看成8位,8位為1字節(jié))構(gòu)成一頁,將屏幕分成8頁。LCDl2864有18個(gè)引腳,其定義如下:1腳CSl:片選A屏,低電平有效2腳CS2:片選B屏,低電平有效3腳GND:地4腳VCC:電源5腳VO:液晶顯示對比度調(diào)節(jié)端6腳Rs:寄存器選擇。RS=0時(shí),選擇指令寄存器;RS=1時(shí),選擇數(shù)據(jù)寄存器7腳R/W:讀寫信號線。R/W=1時(shí),讀操作:R/W=0時(shí),寫操作8腳E:顯示板控制使能端9~16腳DB0-DB7:雙向三念I(lǐng)/O線17腳RST:復(fù)位端,低電平有效l8腳Vout:對比度調(diào)節(jié)供電LCDl2864并行方式時(shí),數(shù)據(jù)線DB0~DB7用來傳送數(shù)據(jù)和命令。CS1和CS2為液晶顯示器的左右半屏的選擇端口。液晶的亮度可以使用改變VO的輸入電壓來改變[3]。下圖為不帶字庫LCD128*64管腳圖:圖2LCDl2864管腳圖2.3軟件開發(fā)環(huán)境在本次開發(fā)中,采用了專門用于51系列單片機(jī)軟件開發(fā)的C51語言,這種語言與普通C語言相同,并提供了針對單片機(jī)的常量定義、庫函數(shù)等等。C是一種源于編寫UNIX操作系統(tǒng)的語言,它是一種結(jié)構(gòu)化語言,可產(chǎn)生緊湊代碼。由于匯編語言程序的可讀性和可移植性都較差,用匯編語言編寫單片機(jī)應(yīng)用系統(tǒng)程序的周期長,且調(diào)試和排錯(cuò)也比較困難。而一般效率高的高級語言難以實(shí)現(xiàn)匯編語言對于計(jì)算機(jī)硬件直接進(jìn)行操作(如對內(nèi)存地址的操作移位操作等的功能),而C語言既具有一般高級語言的特點(diǎn),又能直接對計(jì)算機(jī)的硬件進(jìn)行操作,并且采用C語言編寫的程序能夠很容易地在不同類型的計(jì)算機(jī)之間進(jìn)行移植[4],因此許多以前只能采用匯編語言來解決的問題現(xiàn)在可以改用C語言來解決。開發(fā)環(huán)境選擇了KeiluVision4編譯調(diào)試,硬件仿真軟件Proteus7.1仿真運(yùn)行。這樣做的目的是節(jié)省成本和縮短開發(fā)調(diào)試時(shí)間。Keil軟件是目前最流行開發(fā)51系列單片機(jī)的軟件,提供了包括C編譯器、宏匯編、連接器、庫管理和一個(gè)功能強(qiáng)大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個(gè)集成開發(fā)環(huán)境(uVision)將這些部份組合在一起,全Windows界面。另外重要的一點(diǎn),只要看一下編譯后生成的匯編代碼,就能體會到KeilC51生成的目標(biāo)代碼效率非常之高,多數(shù)語句生成的匯編代碼很緊湊,容易理解[5]。在開發(fā)大型軟件時(shí)更能體現(xiàn)高級語言的優(yōu)勢。Proteus軟件是英國Labcenter公司開發(fā)的電路分析與實(shí)物仿真軟件。它運(yùn)行于Windows操作系統(tǒng)上,可以繪制電路原理圖,仿真、分析各種模擬器件和集成電路,支持主流單片機(jī)系統(tǒng)和多種外圍芯片的仿真,提供軟件調(diào)試功能,支持第三方的軟件編譯和調(diào)試環(huán)境[6]。3游戲描述與設(shè)計(jì)方案3.1游戲描述貪吃蛇足一款經(jīng)典小游戲,游戲的規(guī)則是:玩家通過方向鍵(上,下,左,右)來控制貪吃蛇移動(dòng),在地圖上吃豆子。吃掉豆子后蛇身加長,并且會增加相應(yīng)分?jǐn)?shù),達(dá)到一定分?jǐn)?shù)以后升級,升級后,蛇身運(yùn)動(dòng)速度加快。貪吃蛇運(yùn)動(dòng)時(shí)撞到墻壁(屏幕框),障礙物或者蛇身結(jié)束游戲。本次貪吃蛇游戲機(jī)的特色功能如下:開機(jī)后,界面會出現(xiàn)一段開機(jī)動(dòng)畫,并顯示“歡迎使用貪吃蛇游戲機(jī)”字樣,隨后進(jìn)入選擇菜單,選擇菜單設(shè)置了游戲開始、等級選擇(本游戲共設(shè)置4個(gè)等級:容易、一般、困難、變態(tài))、音樂開關(guān)、地圖設(shè)置(游戲設(shè)計(jì)了四幅不同的地圖)等,可根據(jù)個(gè)人情況選擇不同的級別和地圖進(jìn)行游戲(若未選擇,默認(rèn)地圖為地圖一,等級容易,音樂顯示開)。游戲開始后,貪吃蛇會自動(dòng)移動(dòng),豆子會隨機(jī)出現(xiàn)在界面上,貪吃蛇吃到豆子蛇身加長,相應(yīng)的分?jǐn)?shù)等級等信息會顯示在右側(cè)的信息區(qū)。游戲分?jǐn)?shù)顯示是根據(jù)等級、蛇吃豆子的多少增加分?jǐn)?shù)、顯示分?jǐn)?shù)。蛇吃一個(gè)豆子,分?jǐn)?shù)加10,分?jǐn)?shù)從0開始。游戲等級顯示是根據(jù)蛇吃豆子增加分?jǐn)?shù)到某個(gè)特定值增加等級數(shù)。本次設(shè)計(jì)默認(rèn)等級從容易開始,吃10個(gè)豆子升到第二級一般級別,以此類推。3.2設(shè)計(jì)方案針對貪吃蛇游戲機(jī)的設(shè)計(jì),使用到了單片機(jī)和LCD液晶顯示屏,以C語言為編程語言,使用keil軟件將程序編譯成.hex文件,通過單片機(jī)實(shí)現(xiàn)對LCD的顯示控制,來完成整個(gè)游戲的設(shè)計(jì)。硬件方面主要分為三個(gè)模塊:單片機(jī)最小系統(tǒng)、按鍵模塊、LCD顯示模塊。游戲的難點(diǎn)是軟件設(shè)計(jì)方面,重點(diǎn)需要解決游戲界面的顯示和蛇身運(yùn)動(dòng)處理的問題。游戲界面顯示:設(shè)定LCD以2*2大小為一個(gè)單位點(diǎn)陣,定義貪吃蛇的每一節(jié)蛇身大小為一個(gè)單位點(diǎn)陣,豆子的大小,游戲地圖中障礙物的大小和一節(jié)蛇身大小相同,也是一個(gè)單位點(diǎn)陣。LCD要顯示各種游戲狀態(tài)對應(yīng)的界面,所以定義數(shù)組來存儲各種界面對應(yīng)的位圖數(shù)據(jù)。定義函數(shù)實(shí)現(xiàn)在LCD的某一坐標(biāo)位置增加一個(gè)單位點(diǎn)陣或刪除一個(gè)單位點(diǎn)陣的操作,這樣通過調(diào)用該函數(shù)實(shí)現(xiàn)增加蛇頭,消除蛇尾,實(shí)現(xiàn)在游戲界面上蛇的爬行。主要需要處理如下幾個(gè)問題:(1)運(yùn)動(dòng)處理。利用定時(shí)中斷完成對游戲中貪吃蛇移動(dòng)的處理,在每個(gè)時(shí)鐘到來時(shí),由蛇頭帶動(dòng)每個(gè)點(diǎn)陣的方向都向下一個(gè)點(diǎn)陣傳播,然后自己向新的方向運(yùn)動(dòng)一步。運(yùn)動(dòng)后,下一個(gè)點(diǎn)陣由于得到了上一個(gè)點(diǎn)陣的方向,就按照此方向同樣地運(yùn)動(dòng)一步。所以,它會馬上填補(bǔ)上一個(gè)點(diǎn)陣的位置,如此類推。實(shí)際上在設(shè)計(jì)貪吃蛇的時(shí)候,只需要把蛇尾的那個(gè)點(diǎn)陣去掉,然后在蛇頭的新方向上放一個(gè)點(diǎn)陣就可以了[7]。因此定義一個(gè)函數(shù)用于更新點(diǎn)的坐標(biāo),只要知道蛇頭或蛇尾的坐標(biāo)和運(yùn)動(dòng)方向,就可以調(diào)用該函數(shù)更新蛇頭或蛇尾的坐標(biāo),同時(shí)調(diào)用相關(guān)顯示函數(shù),實(shí)現(xiàn)蛇運(yùn)動(dòng)處理。蛇頭的方向可以通過按鍵捕獲實(shí)時(shí)獲得。而蛇尾的方向獲得要困難得多。為節(jié)省空間,定義一個(gè)unsignedchar型一維數(shù)組貪吃蛇的信息[8]。蛇身運(yùn)動(dòng)期間需要在該數(shù)組中記錄下每次蛇身移動(dòng)一步,蛇頭的運(yùn)動(dòng)方向。定義兩個(gè)變量分別代表蛇頭和蛇尾,每次存儲蛇頭運(yùn)動(dòng)方向后,代表蛇頭的變量加一,以便在下一位置繼續(xù)存儲蛇頭運(yùn)動(dòng)方向;代表蛇尾的變量則指向數(shù)組的開始位置,通過該變量讀取數(shù)組中蛇尾的運(yùn)動(dòng)方向,因?yàn)榇嬖谠摂?shù)組中蛇頭的運(yùn)動(dòng)方向,隨著蛇頭坐標(biāo)的移動(dòng),存在數(shù)組開始位置的運(yùn)動(dòng)方向即是蛇尾的運(yùn)動(dòng)方向,通過讀取的蛇尾運(yùn)動(dòng)方向便可以更新蛇尾坐標(biāo)。(2)吃到豆子的處理。蛇頭坐標(biāo)與豆子坐標(biāo)相等,則吃到豆子。如果吃到豆子,在蛇頭位置增加一個(gè)單位點(diǎn)陣,并更新豆子的坐標(biāo)。(3)放置新的豆子。通過更新豆子的坐標(biāo)實(shí)現(xiàn)放置新的豆子。放置豆子的過程中,還需要判斷新豆子的坐標(biāo)是否與蛇身或障礙物坐標(biāo)重疊,如果重疊,則需要重新放置和判斷,直到新的豆子不與蛇身或障礙物坐標(biāo)重疊為止。(4)死亡處理。蛇運(yùn)動(dòng)的過程中,若蛇頭碰到墻,障礙物或自己的身體,則貪吃蛇死亡,游戲結(jié)束。4硬件電路設(shè)計(jì)硬件方面主要分為三個(gè)模塊:單片機(jī)最小系統(tǒng)、按鍵模塊、LCD顯示模塊。4.1單片機(jī)最小系統(tǒng)單片機(jī)最小系統(tǒng),或者稱為最小應(yīng)用系統(tǒng),是指用最少的元件組成的單片機(jī)可以工作的系統(tǒng)。對51系列單片機(jī)來說,最小系統(tǒng)一般應(yīng)該包括:單片機(jī)、晶振電路、復(fù)位電路[10]。下圖為單片機(jī)的最小系統(tǒng)電路圖。圖3單片機(jī)最小系統(tǒng)4.2按鍵模塊本次設(shè)計(jì)一共設(shè)計(jì)了7個(gè)按鍵,分別是上、下、左、右、暫停/繼續(xù)、確定、返回/退出,分別連接到單片機(jī)的P1.0-P1.6端口,用戶通過四個(gè)按鍵控制蛇頭的上下左右移動(dòng)。按鍵模塊設(shè)計(jì)中利用了單片機(jī)的外部中斷,將P1.0-P1.6端口通過與門與單片機(jī)的INT0連接,七個(gè)按鍵尾端均接地,任意按鍵的按下均會使與門輸出由高電平變成低電平,從而觸發(fā)中斷。此時(shí),中斷服務(wù)程序通過檢測P1口的電平可以識別是哪個(gè)按鍵被按下,若P1.0為低電平則表明上鍵被按下,以此類推。啟動(dòng)/暫??刂疲狐c(diǎn)擊開始鍵進(jìn)入地圖選擇界面,再點(diǎn)開始鍵進(jìn)入游戲界面;游戲中,使用該鍵,實(shí)現(xiàn)暫停/開始控制。方向控制:用上、下、左、右鍵選擇菜單。用上、下、左、右鍵控制蛇頭運(yùn)動(dòng)方向。退出/返回按鍵:游戲中使用該鍵可以直接退出游戲,在游戲選擇菜單時(shí)使用該鍵可以返回到選擇菜單。圖4按鍵電路圖5外部中斷電路4.3LCD顯示電路設(shè)計(jì)液晶顯示模塊中,最主要的就是LCD液晶屏。根據(jù)LCD液晶屏顯示內(nèi)容的不同,液晶顯示模塊可以分為數(shù)顯液晶模塊、點(diǎn)陣字符液晶模塊和點(diǎn)陣圖形液晶模塊3種。本設(shè)計(jì)使用點(diǎn)陣圖形液晶模塊LCD12864。LCD12864液晶顯示模塊是128*64點(diǎn)陣型液晶顯示模塊,可顯示各種字符及圖形,可與CPU直接連接,具有8位標(biāo)準(zhǔn)數(shù)據(jù)總線、6條控制線及電源線,各引腳的信號說明參見表1。該電路設(shè)計(jì)中,片選信號CS1與CS2接P2.4和P2.3引腳,RS、R/W、E分別接引腳P2.2、P2.1、P2.0。VEE驅(qū)動(dòng)負(fù)電壓輸出,而V0接電位器,對LCD亮度進(jìn)行調(diào)節(jié)。51單片機(jī)的P0口為了實(shí)現(xiàn)準(zhǔn)3態(tài),采用了OC輸出,也就是集電極懸空輸出。這種電路結(jié)構(gòu),只有下拉能力,高電平輸出沒有電流。在高電平時(shí)表現(xiàn)為高阻態(tài),加上拉電阻,就會失去高阻態(tài),變成1、0兩態(tài)[11]。因此在P0口與LCD的I/O口之間接上排阻。表1LCD12864引腳說明管腳方向引腳說明VSS-邏輯電源地VDD-邏輯電源+5VV0ILCD調(diào)整電壓,應(yīng)用時(shí)接10K電位器可調(diào)端R/WI讀\寫選擇:高電平:讀數(shù)據(jù);低電平:寫數(shù)據(jù)EI讀寫使能,高電平有效,下降沿鎖定數(shù)據(jù)DB0I/O數(shù)據(jù)輸入輸出引腳DB1I/O數(shù)據(jù)輸入輸出引腳DB2I/O數(shù)據(jù)輸入輸出引腳DB3I/O數(shù)據(jù)輸入輸出引腳DB4I/O數(shù)據(jù)輸入輸出引腳DB5I/O數(shù)據(jù)輸入輸出引腳DB6I/O數(shù)據(jù)輸入輸出引腳DB7I/O數(shù)據(jù)輸入輸出引腳CS1I片選擇信號,高電平時(shí)選擇左半屏CS2I片選擇信號,高電平時(shí)選擇右半屏/RETI復(fù)位信號,低電平有效VEEOLCD驅(qū)動(dòng),負(fù)電壓輸出,對地接10K電位器LEDA-背光電源,LED+(5V)LEDK-背光電源,LED-(0V)顯示電路如下:圖6lcd顯示電路4.4整體電路圖圖7整體電路圖5軟件程序設(shè)計(jì)5.1軟件結(jié)構(gòu)設(shè)計(jì)根據(jù)貪吃蛇游戲需求分析,將游戲按照功能劃分成如下幾個(gè)模塊:1.主函數(shù)模塊主函數(shù)是整個(gè)程序運(yùn)行的一個(gè)縮影,是一個(gè)無限循環(huán)的程序。完成的操作包括初始化一系列硬件軟件,利用定時(shí)中斷完成對游戲時(shí)鐘的控制,調(diào)用其他模塊完成按鍵處理,蛇運(yùn)動(dòng)與游戲的處理。該模塊還負(fù)責(zé)對蛇的動(dòng)作與狀態(tài)的控制、屏幕上隨機(jī)生成新豆子,包括游戲開始時(shí)對蛇的初始化,蛇移動(dòng)的處理,,蛇吃食物后的處理,根據(jù)當(dāng)前蛇頭坐標(biāo)及蛇頭運(yùn)動(dòng)方向,更新下一步蛇頭的坐標(biāo),吃到豆子以后分?jǐn)?shù)增加,等級增加,速度變快等等。2.外部中斷控制按鍵模塊按鍵模塊分為按鍵檢測模塊和按鍵處理模塊兩部分。按鍵檢測模塊初始化按鍵對應(yīng)的管腳,利用外部中斷方式檢測具體是哪個(gè)按鍵被按下,將該按鍵對應(yīng)的變量值改變。按鍵處理模塊針對不同狀態(tài)下,對按鍵做不同的處理。3.定時(shí)中斷服務(wù)程序通過定時(shí)中斷來產(chǎn)生貪吃蛇運(yùn)動(dòng)的步進(jìn)信號,通過中斷程序與游戲級別相關(guān)聯(lián),游戲級別越高,產(chǎn)生步進(jìn)信號所需的時(shí)間越短。4.LCDl2864顯示模塊該模塊負(fù)責(zé)顯示游戲界面。針對游戲的不同狀態(tài)在LCDl2864上時(shí)時(shí)刷新顯示不同的畫面。5.2主函數(shù)模塊設(shè)計(jì)與實(shí)現(xiàn)main()函數(shù)是整個(gè)程序的入口地址,程序從此函數(shù)開始執(zhí)行,將各個(gè)模塊串聯(lián)起來,實(shí)現(xiàn)游戲的各種功能。首先完成軟件硬件的初始化任務(wù),然后進(jìn)入一個(gè)無限循環(huán)[12]。無限循環(huán)一直等待蛇體步進(jìn)信號IsToStep(由定時(shí)中斷服務(wù)程序設(shè)置),得到步進(jìn)信號后根據(jù)當(dāng)前方向direction控制蛇體向前步進(jìn)。步進(jìn)后判斷當(dāng)前蛇頭是否碰到食物,若碰到,則蛇身加一,將貪吃蛇移動(dòng)的下一坐標(biāo)顯示出來作為新的蛇頭,并產(chǎn)生新的食物再進(jìn)入首身相碰判斷;若未碰到食物,直接進(jìn)入貪吃蛇死亡判斷。若貪吃蛇未死亡則將IsToStep清零、更新得分后回到主循環(huán),否則退出游戲。程序框圖及詳細(xì)代碼如下:開始開始LCDLCD初始化啟動(dòng)定時(shí)器啟動(dòng)定時(shí)器0,開外部中斷NIsToStep=1??NIsToStep=1??YY按按drection方向前進(jìn)一個(gè)單位NN吃到豆子?吃到豆子?YY蛇身長度調(diào)整蛇身長度調(diào)整分?jǐn)?shù)、等級更新分?jǐn)?shù)、等級更新隨機(jī)產(chǎn)生新的豆子隨機(jī)產(chǎn)生新的豆子NIsToNewFoodNIsToNewFood=0?IsToStep=0IsToStep=0YYNDie=1?NDie=1?YY游戲結(jié)束游戲結(jié)束圖8主函數(shù)程序流程圖voidmain() {ON_init();while(1){page=2;j=0; count=0; for(i=0;i<sizeof(menu)>>5;i++) W_display(2,0,16+(i<<4),menu+(i<<5),0); Game_Tcs(); //貪吃蛇游戲控制程序 }}其中Game_Tcs()函數(shù)主要進(jìn)行游戲的控制,觸發(fā)各種事件的響應(yīng)。主要開發(fā)內(nèi)容包括蛇的方向、蛇的速度、蛇的位置的控制,吃食物、撞邊界、撞自己判斷、豆子自動(dòng)生成、等級速度自動(dòng)更新并調(diào)用其它模塊進(jìn)行相應(yīng)操作。具體功能要求:貪吃蛇按一定方向移動(dòng)、貪吃蛇根據(jù)按鍵改變方向、判斷貪吃蛇是否吃到豆子、判斷貪吃蛇是否死亡、地圖、等級、音樂的選擇、豆子的隨機(jī)生成、等級、分?jǐn)?shù)、速度自動(dòng)更新。通過設(shè)置以下函數(shù)或者參數(shù),具體實(shí)現(xiàn)上述功能:1.游戲初始化,設(shè)置voidGame_init()函數(shù),該負(fù)責(zé)蛇的初始化。具體包括初始化豆子的位置,蛇頭蛇尾坐標(biāo),游戲分?jǐn)?shù),根據(jù)選擇的等級初始化等級,據(jù)四副地圖中具體選擇了哪副地圖,初始化地圖,初始化音樂開關(guān)。同時(shí)初始化蛇運(yùn)動(dòng)軌跡數(shù)組,并在LCD12864上初始化顯示貪吃蛇和食物。2.貪吃蛇的移動(dòng),設(shè)置voidSnake_move(uchardrection,uchar*p)函數(shù),首先判斷是否產(chǎn)生步進(jìn)信號,若產(chǎn)生一個(gè)步進(jìn)信號,貪吃蛇就向前移動(dòng)一步,移動(dòng)的方向drection通過單片機(jī)的外部中斷才檢測處理,LCD顯示過程中,只更新顯示蛇頭,并將蛇尾坐標(biāo)刪除,即可產(chǎn)生蛇一直向前移動(dòng)的現(xiàn)象。3.貪吃蛇吃到豆子處理,設(shè)置Eat_food(uchardrection,uchar*x,uchar*y)函數(shù),通過該函數(shù)判斷貪吃蛇是否吃到豆子,若沒吃到則直接跳過函數(shù),若吃到豆子則判斷貪吃蛇蛇身是否達(dá)到了最大值,若達(dá)到最大值只做加分處理,若未能達(dá)到最大值,則貪吃蛇長度加1,按照此時(shí)貪吃蛇的運(yùn)動(dòng)方向加在蛇頭上。4.判斷貪吃蛇是否死亡,設(shè)置參數(shù)Die,若蛇頭坐標(biāo)與貪吃蛇自身、墻壁或者障礙物相同,則貪吃蛇死亡置Die為1,游戲結(jié)束。5.分?jǐn)?shù)、等級、速度自動(dòng)更新,貪吃蛇每吃掉一個(gè)豆子,相應(yīng)加10分,當(dāng)吃到10個(gè)豆子時(shí),游戲等級自動(dòng)升一級,速度變快(等級最高為4級,達(dá)到最高級之后速度等級不再增加)。6.豆子隨機(jī)生成,調(diào)用偽隨機(jī)函數(shù)rand(),TL0作為隨機(jī)數(shù)種子,達(dá)到產(chǎn)生隨機(jī)數(shù)的目的,將不同時(shí)間產(chǎn)生的隨機(jī)數(shù)分別作為新豆子的XY坐標(biāo),設(shè)置參數(shù)IsToNewFood,若新產(chǎn)生的坐標(biāo)與貪吃蛇、墻壁或者障礙物重合,則置1,重新產(chǎn)生坐標(biāo),直到不重合為止。5.3定時(shí)中斷服務(wù)程序定時(shí)器中斷服務(wù)程序作用是定時(shí)產(chǎn)生步進(jìn)信號,因硬件定時(shí)最大值不夠蛇體步進(jìn)最小間隔時(shí)間,我們用多次硬件定時(shí)來產(chǎn)生一個(gè)步進(jìn)信號。設(shè)計(jì)全局變量speed,初始值設(shè)置為25,每硬件中斷觸發(fā)一次speed減1。當(dāng)p減到0時(shí)置IsToStep為1并對speed重新賦值。值得注意的是,p的重新賦值應(yīng)參考此時(shí)游戲等級jibie,游戲的等級越高speed的賦值越小,speed與級別的關(guān)系為speed=25-(jibie<<3),級別每增加1級,相應(yīng)的速度增加1/3,即步進(jìn)間隔越短,蛇體移動(dòng)速度越快,游戲難度越大。流程圖及詳細(xì)代碼如下:進(jìn)入定時(shí)器中斷進(jìn)入定時(shí)器中斷sspeed=speed-1speedspeed=0?NYIstoStepIstoStep=1參考游戲級別重新為speed賦值參考游戲級別重新為speed賦值重新載入計(jì)數(shù)值重新載入計(jì)數(shù)值返回返回圖9定時(shí)中斷程序流程圖voidtimer()interrupt1//定時(shí)器中斷,產(chǎn)生步進(jìn)信號{if(!(speed--)){IsToStep=1;speed=25-(jibie<<3); //游戲速度}TH0=0xdd;TL0=0x00;}5.4外部中斷按鍵模塊設(shè)計(jì)該模塊包括兩部分:按鍵識別和按鍵處理。該模塊中按鍵識別與處理利用到了單片機(jī)的外部中斷,當(dāng)有按鍵按下去時(shí),產(chǎn)生中斷信號使單片機(jī)產(chǎn)生外部中斷。通過外部中斷服務(wù)程序用于按鍵識別并更新前進(jìn)方向全局變量direction。取出鍵盤檢測位的值再確定貪食蛇要改變的方向。當(dāng)貪食蛇正向上或向下移動(dòng)時(shí),按下上下方向鍵,鍵值都不進(jìn)行處理;而貪食蛇正向左或向右移動(dòng)時(shí),按下左右方向鍵,鍵值都不進(jìn)行處理。程序流程圖及具體程序如下:進(jìn)入進(jìn)入讀P1口讀P1口按鍵識別按鍵識別按鍵處理,為按鍵處理,為drection重新賦值返回返回圖10外部中斷程序流程圖voidKeyScanInterrupt()interrupt0 //外部中斷,判斷按鍵{switch(p1){case0xfe:key=1;//檢測按鍵 if(drection!=2)//按鍵處理 drection=1;//上 break; case0xfd:key=2; if(drection!=1) drection=2;//下 break; case0xfb:key=3; if(drection!=4) drection=3;//左 break; case0xf7:key=4; if(drection!=3) drection=4;//右 break; case0xef:key=5;break; //確定 case0xdf:key=7;break; //返回 case0xbf:key=6;break; //暫停 default:break;} }5.5LCD12864初始化LCDl2864顯示的點(diǎn)陣方式是128*64。橫向0-127共128個(gè)點(diǎn)陣,分為左右兩屏,各占0-63共64個(gè)點(diǎn)陣;縱向0-63共64個(gè)點(diǎn)陣,每8個(gè)縱向點(diǎn)陣(8個(gè)點(diǎn)陣可以看成8位,8位為1字節(jié))構(gòu)成一頁,將屏幕分成8頁,并按照縱向取模,字節(jié)倒序的方式顯示一字節(jié)內(nèi)容。由于將2*2點(diǎn)陣定義為單位點(diǎn)陣的大小,并定義單位點(diǎn)陣為豆子的大小,因此將屏幕按2*2比例從128*64縮小為64*32(即將2*2點(diǎn)陣看成LCDl2864上的一個(gè)最小點(diǎn)陣)。將游戲界面劃分成游戲區(qū)與信息區(qū)。本模塊提供了LCDl2864的初始化,顯示游戲界面的函數(shù),顯示漢字英文的函數(shù)、顯示游戲狀態(tài)的函數(shù)(游戲運(yùn)行或暫停)和顯示圖形的函數(shù)。詳細(xì)初始化子函數(shù)如下:voiddelay_ms(uinttime);//延時(shí)voidRead_busy(void);//讀忙判斷voidSend_command(ucharcmd);//寫指令voidSend_data(uchardat);//寫數(shù)據(jù) Read_data(ucharpage,ucharcolum);//讀數(shù)據(jù)voidOnOff(ucharonoff);//顯示開關(guān)voidSet_screen(ucharscreen);//選屏voidSet_page(ucharpage);//設(shè)置頁voidSet_line(ucharline);//設(shè)置行voidSet_colum(ucharcolum);//設(shè)置列voidClear(ucharscreen);//清屏voidW_display(ucharscreen,ucharpage,ucharcolum,uchar*p,ucharshadow);//漢字voidE_display(ucharscreen,ucharpage,ucharcolum,uchar*p);//英文數(shù)字顯示voidP_display(ucharscreen,uchar*p);//顯示圖片voidDot_display(ucharx,uchary);//顯示一個(gè)點(diǎn)voidDot_clear(ucharx,uchary); //清除一個(gè)點(diǎn)voidInit_lcd();//lcd12864初始化6仿真與實(shí)現(xiàn)上電開機(jī)后,LCDl2864界面左屏?xí)@示一段開機(jī)動(dòng)畫,同時(shí)在右屏動(dòng)態(tài)顯示“歡迎使用貪吃蛇游戲機(jī)!”,開機(jī)動(dòng)畫結(jié)束之后,會出現(xiàn)一幅貪吃蛇游戲的宣傳畫面,隨后進(jìn)入貪吃蛇游戲選擇菜單!開機(jī)界面如下所示:圖11開機(jī)動(dòng)畫開機(jī)動(dòng)畫之后,會有一個(gè)短暫的貪吃蛇等待界面;圖12游戲等待畫面隨后將進(jìn)入游戲菜單,進(jìn)行等級、地圖、音樂的選擇:本游戲設(shè)計(jì)了4幅地圖、4個(gè)游戲等級,可以根據(jù)個(gè)人情況通過上下按鍵選擇不同的功能菜單,然后按確認(rèn)鍵,LCD12864的右屏?xí)霈F(xiàn)一個(gè)子菜單,例如選擇地圖設(shè)置,點(diǎn)擊確認(rèn)后,在右側(cè)屏幕會出現(xiàn)地圖子菜單選擇,通過上下按鍵控制“→”,選擇之后直接點(diǎn)擊確認(rèn)。下圖為功能菜單選擇界面:圖13游戲開始圖14選擇級別圖15音樂開關(guān)圖16地圖選擇選擇好級別地圖之后,利用上下按鍵選擇到開始游戲,點(diǎn)擊確認(rèn),會出現(xiàn)一個(gè)動(dòng)態(tài)的loading……畫面,給用戶準(zhǔn)備時(shí)間,下載畫面結(jié)束后,直接進(jìn)入游戲,游戲界面劃分成游戲區(qū)與信息區(qū),左屏為游戲區(qū),右屏為信息區(qū)。規(guī)定2*2像素為一個(gè)單位,游戲開始后,游戲區(qū)顯示有一個(gè)長為2個(gè)單位的蛇,1個(gè)單位的豆子以及相應(yīng)的地圖。信息區(qū)顯示游戲的基本信息:音樂開關(guān)圖標(biāo),游戲等級、得分等。Loading畫面及游戲準(zhǔn)備運(yùn)行界面如下圖所示:圖17游戲開始前準(zhǔn)備畫面Loading動(dòng)態(tài)畫面結(jié)束之后,將直接進(jìn)入游戲畫面,開始貪吃蛇會自動(dòng)向右運(yùn)動(dòng)圖18地圖一圖19地圖二圖20地圖三圖21地圖四當(dāng)貪吃蛇碰到墻壁、障礙物或自己時(shí),游戲結(jié)束,游戲結(jié)束畫面如下:圖22游戲結(jié)束畫面7總結(jié)與展望經(jīng)過

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論