【基于單片機(jī)貪吃蛇游戲設(shè)計(jì)(論文)10000字】_第1頁(yè)
【基于單片機(jī)貪吃蛇游戲設(shè)計(jì)(論文)10000字】_第2頁(yè)
【基于單片機(jī)貪吃蛇游戲設(shè)計(jì)(論文)10000字】_第3頁(yè)
【基于單片機(jī)貪吃蛇游戲設(shè)計(jì)(論文)10000字】_第4頁(yè)
【基于單片機(jī)貪吃蛇游戲設(shè)計(jì)(論文)10000字】_第5頁(yè)
已閱讀5頁(yè),還剩22頁(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)介

[5].。本次程序代碼都是用C語(yǔ)言編寫的,值得注意的是在編寫LCD12864顯示軟件代碼之前必須要先掌握漢字取模的方法。要得到需要的文字或圖形,可以借助取模軟件來(lái)完成。軟件編譯主要步驟:(1)第一步,下載keiluVision4后打開(kāi),在Project里面找到創(chuàng)建新工程,選中創(chuàng)建來(lái)創(chuàng)建一個(gè)新的工程文件,將其命名,最后點(diǎn)擊Save按鈕以保存。新項(xiàng)目保存后,選擇使用的單片機(jī)型號(hào)。(2)建立一個(gè)新項(xiàng)目之后,接下來(lái)就是新程序和各種文件,在保存了程序文件之后,需要在項(xiàng)目中添加這些文件。(3)此時(shí)可進(jìn)行源程序編寫,此次編程采用c語(yǔ)言進(jìn)行編寫,程序代碼依照需要的各個(gè)功能和順序編寫完成后就可以進(jìn)行程序編譯和模擬。接著可以翻譯所有的源文件并通過(guò)單擊工具欄圖標(biāo)BuildTarget生成應(yīng)用程序。KeiluVision4在Build應(yīng)用出現(xiàn)語(yǔ)法錯(cuò)誤時(shí),OutputWindow-Build界面上就會(huì)提示存在Error或者Warning,當(dāng)顯示“0Error0Warning”時(shí),代表所編寫的程序沒(méi)有語(yǔ)法和邏輯上的錯(cuò)誤,可以進(jìn)行編譯并生成hex文件了。如果存在有錯(cuò)誤的語(yǔ)法和代碼,系統(tǒng)也會(huì)準(zhǔn)確給予提式,找到有錯(cuò)誤或者預(yù)警的程序代碼,雙擊錯(cuò)誤的部分,軟件就可以自動(dòng)定位到出錯(cuò)的位置,就可以檢查并且改正對(duì)應(yīng)的語(yǔ)法錯(cuò)誤或者拼寫錯(cuò)誤。KeiluVision4將在編輯器窗口中,點(diǎn)擊該行,打開(kāi)源文件,系統(tǒng)會(huì)自動(dòng)定位到對(duì)應(yīng)的地方。在軟件成功生成程序后,調(diào)試的工作就可以正式進(jìn)行了。(4)當(dāng)調(diào)試完成沒(méi)有問(wèn)題后,系統(tǒng)就會(huì)生成對(duì)應(yīng)的以HEX為后綴的文件,將文件下載到EPROM編程器。HEX文件可以直接燒錄進(jìn)單片機(jī)。最后將程序使用專門的燒錄軟件stc-isp和燒錄器燒錄進(jìn)單片機(jī)。圖4-3KeiluVision4界面圖4-3KeiluVision4界面第5章調(diào)試的步驟及調(diào)試過(guò)程中出現(xiàn)的問(wèn)題以及解決方法5.1PROTEUS仿真程序軟件編譯器使用的是keiluVision4。單片機(jī)程序編寫完之后,沒(méi)有問(wèn)題就可以使用Proteus進(jìn)行仿真。之前已經(jīng)先使用keiluVision4編寫好了程序代碼并且生成了單片機(jī)可以識(shí)別的hex文件。接下來(lái)就可以使用Proteus進(jìn)行畫圖了,首先選擇左的主菜單欄中的第一項(xiàng)File,在下拉菜單中選擇NewDesign,建立后就可以繪制電路了。在搜索欄中搜索需要用到的元器件,首先是找到單片機(jī),之后就開(kāi)始找到各種元器件,并且按照電路圖布局和連線。最后先在Proteus上畫完硬件電路后就開(kāi)始仿真。硬件電路圖畫完之后點(diǎn)擊單片機(jī),在彈出的窗口里選擇之前用keiluVision4編譯生成帶hex后綴的文件加載進(jìn)去,就可開(kāi)始仿真,接下來(lái)就是等待仿真結(jié)束,當(dāng)提示ANALYSERERRORS時(shí),說(shuō)明出錯(cuò)了,要認(rèn)真檢查電路圖排除一切出錯(cuò)的地方,仿真才能成功。本系統(tǒng)的設(shè)計(jì)為貪吃蛇游戲控制系統(tǒng),模塊分別有按鍵模塊、單片機(jī)、時(shí)鐘控制模塊、LCD12864顯示模塊、蛇運(yùn)動(dòng)控制模塊、游戲控制模塊。主要功能都是通過(guò)LCD12864屏幕來(lái)顯示。本設(shè)計(jì)仿真測(cè)試圖如圖5-1所示。圖5-1仿真測(cè)試圖圖5-1仿真測(cè)試圖5.2硬件安裝首先是需要的元器件,本次實(shí)物制作需要的原件清單如下表:序號(hào)名稱數(shù)量19*15板子12STC89C52單片機(jī)1312864顯示屏1420P排針1520P排母16103排阻1740腳IC座1810UF電容1930PF電容21010K電阻111103電位器(臥式)112小按鍵113自鎖開(kāi)關(guān)114DC插口1154P排針116喇叭11712.000晶振118大按鍵619USB電源線或電池盒120錫絲若干21導(dǎo)線若干軟件調(diào)試及Proteus仿真都正常,接下來(lái)就是硬件的制作。此次硬件的制作選擇了用萬(wàn)用板進(jìn)行焊接,之所以沒(méi)有使用覆銅板,主要原因是這次制作因?yàn)楦鞣N外部條件的不允許,沒(méi)有支持刻板腐蝕等步驟的機(jī)器,所以最終確定使用萬(wàn)用板制作。首先就是線路的布局,如何在一塊萬(wàn)用板上在不影響美觀的條件下將各個(gè)元器件按電路圖連接起來(lái)。一開(kāi)始我先用畫好布局的圖紙,盡量把每根需要連接的線路做到最簡(jiǎn)化。在做完這些步驟后就可以開(kāi)始用電烙鐵進(jìn)行焊接。焊接時(shí)要先確認(rèn)好晶振、揚(yáng)聲器等元器件的正負(fù)極,在電池和USB中我選擇了更方便的usb接口,作用是提供5V電壓,用來(lái)給單片機(jī)供電。下面就是運(yùn)用我們實(shí)訓(xùn)課上學(xué)到的焊接的知識(shí)進(jìn)行焊接了,焊接前先選擇焊錫絲的粗細(xì),在使用電烙鐵安裝時(shí)應(yīng)考慮受熱、穩(wěn)固等因素。例如在用電烙鐵時(shí)不能太隨意,時(shí)間焊短了,錫絲沒(méi)有全部熔掉,就會(huì)造成“虛焊”的情況,但是焊接時(shí)間又不能過(guò)長(zhǎng),不然可能會(huì)燒壞電路或者元件。焊的時(shí)候基本1秒鐘焊一個(gè),就算沒(méi)焊好,也要等一會(huì)兒再焊。元器件中多出來(lái)的鐵絲也要整齊剪掉,芯片的擺放提前布置好,不要影響到后續(xù)的連線工作。連線時(shí)要注意導(dǎo)線的長(zhǎng)短,還有要嚴(yán)格按照事先準(zhǔn)備好的電路圖接線,注意單片機(jī)的每一個(gè)引腳,電焊時(shí)要注意不要燒到單片機(jī)和電路。焊接時(shí)單片機(jī)芯片先不要插入,等接好線后再插入,否則可能燒壞芯片引腳。每焊好一個(gè)模塊,就要用萬(wàn)能表檢查線路,確定沒(méi)有接錯(cuò)、短路等現(xiàn)象,確認(rèn)無(wú)誤后才能接著焊接。焊錫時(shí)只要控制好時(shí)間,就不會(huì)出現(xiàn)燒糊燒壞的情況。最后焊接完成后,測(cè)試后可實(shí)現(xiàn)功能。結(jié)論本設(shè)計(jì)是通過(guò)LCD12864進(jìn)行顯示的基于單片機(jī)的貪吃蛇游戲機(jī)。本文介紹了硬件電路,軟件設(shè)計(jì)及調(diào)試以及仿真設(shè)計(jì),軟件上在使用keil軟件的基礎(chǔ)上用C語(yǔ)言進(jìn)行了編程,又對(duì)軟件算法進(jìn)行了優(yōu)化,使整個(gè)程序簡(jiǎn)單、精煉,并對(duì)該搭建好的電路進(jìn)行了Proteus仿真,實(shí)物制作成功,功能可以實(shí)現(xiàn)。硬件上通過(guò)使用STC89C52單片機(jī)和LCD12864顯示系統(tǒng)搭建硬件電路,對(duì)一款貪吃蛇游戲的設(shè)計(jì)進(jìn)行了介紹,硬件電路不算復(fù)雜,使用單片機(jī)最小系統(tǒng)加顯示屏和按鍵就可實(shí)現(xiàn)基本游戲功能,為了添加趣味性還使用揚(yáng)聲器加入了音效。我在程序編寫和調(diào)試程序過(guò)程中也出現(xiàn)了不少的問(wèn)題,在經(jīng)過(guò)對(duì)程序的修改和調(diào)試后,最終得以成功完成設(shè)計(jì)內(nèi)容。由于外部條件和個(gè)人能力有限,還有許多功能可以在此基礎(chǔ)上擴(kuò)充。但通過(guò)這個(gè)設(shè)計(jì),我切實(shí)的接觸并實(shí)驗(yàn)了單片機(jī)和編程語(yǔ)言的使用,在個(gè)人知識(shí)面上也有更大的拓寬,希望接下來(lái)能夠更繼續(xù)深入學(xué)習(xí)。通過(guò)此次設(shè)計(jì),使我在單片機(jī)語(yǔ)言的基礎(chǔ)上更熟練地使用它并加深了對(duì)單片機(jī)語(yǔ)言模塊化程序設(shè)計(jì)的理解。設(shè)計(jì)的過(guò)程也是學(xué)習(xí)的過(guò)程,此次設(shè)計(jì)讓我對(duì)語(yǔ)言程序和單片機(jī)有了深入的學(xué)習(xí)了解。對(duì)編程和仿真也學(xué)習(xí)到了更多并且更加熟練,也讓我對(duì)大學(xué)學(xué)習(xí)的知識(shí)有了更深入的研究。在本次設(shè)計(jì)結(jié)束的同時(shí),衷心感謝老師的精心指導(dǎo)和幫助。附錄附錄1原理圖附錄2主要源程序代碼#include"reg52.h"#include"Lcd12864.h"#include"Key.h"#defineucharunsignedchar#defineuintunsignedintstaticunsignedlongSeed=1;#defineA48271L#defineM2147483647L#defineQ(M/A)#defineR(M%A)ucharflag_1=0;sbitkkk=P3^6;//sbitkk=P3^6;/************************************偽隨機(jī)數(shù)發(fā)生器*************************************/doubleRandom(void){ longTmpSeed; TmpSeed=A*(Seed%Q)-R*(Seed/Q); if(TmpSeed>=0) Seed=TmpSeed; else Seed=TmpSeed+M; return(double)Seed/M;}/**************************************為偽隨機(jī)數(shù)發(fā)生器播種***************************************/voidInitRandom(unsignedlongInitVal){ Seed=InitVal;}//延時(shí)子程序voiddelay(unsignedintt){ unsignedinti,j; for(i=0;i<t;i++) for(j=0;j<10;j++);}/*********************************初始化MPU**********************************/voidInitCpu(void){ TMOD=0x0; TH0=0; TL0=0; TR0=1; ET0=1; EA=1;}#defineN25structFood{ unsignedcharx; unsignedchary; unsignedcharyes;}food;//食物結(jié)構(gòu)體structSnake{ unsignedcharx[N]; unsignedchary[N]; unsignedcharnode; unsignedchardirection; unsignedcharlife;}snake;//蛇結(jié)構(gòu)體unsignedcharFlag=0;unsignedcharScore=0;unsignedcharSpeed=5;unsignedcharKeyBuffer=0;#defineFUNC1#defineUP2#defineDOWN3#defineLEFT4#defineRIGHT5#definePASSSCORE20//預(yù)定義過(guò)關(guān)成績(jī)voidTimer0Int(void)interrupt1{ switch(OSReadKey()) { case9: KeyBuffer=FUNC; /*if(++Speed>=10) Speed=1; Flag|=1<<1;//速度變化標(biāo)志置1*/ break; case13: KeyBuffer=DOWN; /*if(snake.direction!=2) snake.direction=1;*/ break; case17: KeyBuffer=UP; /*if(snake.direction!=1) snake.direction=2;*/ break; case21: KeyBuffer=RIGHT; /*if(snake.direction!=4) snake.direction=3;*/ break; case25: KeyBuffer=LEFT; /*if(snake.direction!=3) snake.direction=4;*/ break; default: break; } if(kkk==0) { delay(5); if(kkk==0) { flag_1=1; } }}/******************************畫墻壁,初始化界面*******************************/voidDrawBoard(void){ unsignedcharn; for(n=0;n<31;n++) { Lcd_Rectangle(3*n,0,3*n+2,2,1); Lcd_Rectangle(3*n,60,3*n+2,62,1); } for(n=0;n<21;n++) { Lcd_Rectangle(0,3*n,2,3*n+2,1); Lcd_Rectangle(90,3*n,92,3*n+2,1); } Lcd_HoriLine(93,31,35,1); Lcd_HoriLine(93,63,35,1);}/***************************打印成績(jī)****************************/voidPrintScore(void){ unsignedcharStr[3]; Lcd_WriteStr(6,0,"成績(jī)"); Str[0]=(Score/10)|0x30;//十位 Str[1]=(Score%10)|0x30;//個(gè)位 Str[2]=0; Lcd_WriteStr(7,1,Str);}/********************************打印速度級(jí)別*********************************/voidPrintSpeed(void){ unsignedcharStr[2]; Lcd_WriteStr(6,2,"級(jí)別"); Str[0]=Speed|0x30; Str[1]=0; Lcd_WriteStr(7,3,Str);}/***********************************游戲結(jié)束處理************************************/voidGameOver(void){ unsignedcharn; Lcd_Rectangle(food.x,food.y,food.x+2,food.y+2,0);//消隱出食物 for(n=1;n<snake.node;n++) { Lcd_Rectangle(snake.x[n],snake.y[n],snake.x[n]+2,snake.y[n]+2,0);//消隱食物,蛇頭已到墻壁內(nèi),故不用消去 } if(snake.life==0)//如果蛇還活著 Lcd_WriteStr(2,1,"勝利"); else//如果蛇死了 Lcd_WriteStr(2,1,"輸了"); Lcd_WriteStr(1,2,"游戲輸了");}/********************************游戲的具體過(guò)程,也是貪吃蛇算法的關(guān)鍵部分*********************************/voidGamePlay(void){ unsignedcharn; InitRandom(TL0); food.yes=1;//1表示需要出現(xiàn)新事物,0表示已經(jīng)存在食物尚未吃掉 snake.life=0;//表示蛇還活著 snake.direction=DOWN; snake.x[0]=6;snake.y[0]=6; snake.x[1]=3;snake.y[1]=6; snake.node=3; PrintScore(); PrintSpeed(); while(1) { if(food.yes==1) { while(1) { food.x=Random()*85+3; food.y=Random()*55+3;//獲得隨機(jī)數(shù) while(food.x%3!=0) food.x++; while(food.y%3!=0) food.y++; for(n=0;n<snake.node;n++)//判斷產(chǎn)生的食物坐標(biāo)是否和蛇身重合 { if((food.x==snake.x[n])&&(food.y==snake.y[n])) break; } if(n==snake.node) { food.yes=0; break;//產(chǎn)生有效的食物坐標(biāo) } } } if(food.yes==0) { Lcd_Rectangle(food.x,food.y,food.x+2,food.y+2,1); } for(n=snake.node-1;n>0;n--) { snake.x[n]=snake.x[n-1]; snake.y[n]=snake.y[n-1]; } switch(snake.direction) { caseDOWN:snake.x[0]+=3;break; caseUP:snake.x[0]-=3;break; caseRIGHT:snake.y[0]-=3;break; caseLEFT:snake.y[0]+=3;break; default:break; } for(n=3;n<snake.node;n++)//從第三節(jié)開(kāi)始判斷蛇頭是否咬到自己 { if(snake.x[n]==snake.x[0]&&snake.y[n]==snake.y[0]) { GameOver(); snake.life=1; break; } } if(snake.x[0]<3||snake.x[0]>=90||snake.y[0]<3||snake.y[0]>=60)//判蛇頭是否撞到墻壁 { GameOver(); snake.life=1; } if(snake.life==1) break;//蛇死,則跳出while(1)循環(huán) if(snake.x[0]==food.x&&snake.y[0]==food.y)//判蛇是否吃到食物 { Lcd_Rectangle(food.x,food.y,food.x+2,food.y+2,0);//消隱食物 snake.x[snake.node]=200; snake.y[snake.node]=200;//產(chǎn)生蛇新的節(jié)坐標(biāo)先放在看不見(jiàn)的位置 snake.node++;//蛇節(jié)數(shù)加1 food.yes=1;//食物標(biāo)志置1 if(++Score>=PASSSCORE) { PrintScore(); GameOver(); break; } PrintScore(); } for(n=0;n<snake.node;n++) { Lcd_Rectangle(snake.x[n],snake.y[n],snake.x[n]+2,snake.y[n]+2,1); }//根據(jù)蛇的節(jié)數(shù)畫出蛇 delay(Speed*1000); Lcd_Rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+2,snake.y[snake.node-1]+2,0); switch(KeyBuffer) { caseFUNC: KeyBuffer=0; if(++Speed>=10) Speed=1; PrintSpeed(); break; caseDOWN: KeyBuffer=0; if(snake.direction!=UP) snake.direction=DOWN; break; caseUP: KeyBuffer=0; if(snake.direction!=DOWN) snake.direction=UP; break; caseRIGHT: KeyBuffer=0; if(snake.direction!=LEFT) snake.direction=RIGHT; break; caseLEFT: KeyBuffer=0; if(snake.direction!=RIGHT) snake.direction=LEFT; break; default: break; } }//結(jié)束while(1)}voidmain(){ InitCpu();//初始化CPU Lcd_Reset();//初始化LCD屏 Lcd_Clear(0);//清屏 while(1) { if(flag_1==0) { Lcd_WriteStr(1,1,"貪吃蛇"); Lcd_WriteStr(1,2,"Hello,NCU"); DrawBoard();//畫界面 PrintScore(); PrintSpeed(); } if(flag_1==1) { Lcd_WriteStr(1,1,""); Lcd_WriteStr(1,2,""); GamePlay();//玩游戲 GameOver();//游戲結(jié)束 while(1);//重啟 }參考文獻(xiàn)易麗華.“看門狗”技術(shù)的實(shí)現(xiàn)[J].儀表技術(shù),2011(07):55-57.張仙妮

溫馨提示

  • 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ù)網(wǎng)僅提供信息存儲(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)論