




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、基于單片機的貪食蛇設(shè)計一 題目要求: 使用8051單片機和點陣顯示屏實現(xiàn)貪吃蛇的基本功能二 題目分析: 1,貪吃蛇的基本功能: A,能夠蛇形移動 B,能夠任意改變方向 C,能夠吃到食物并增長 D,撞到四邊的墻蛇死 F,吃到自己蛇死 E,放置新的食物2,拓展部分: A,能夠過關(guān) B,在游戲開始和結(jié)束都顯示一些相關(guān)花樣 C,過關(guān)能顯示關(guān)數(shù) D,增加串口通信功能 F,增加紅外遙控功能3,貪吃蛇關(guān)鍵算法分析: A,蛇身的形成: 使用20個RAM來存儲蛇身X坐標(biāo),20個RAM來存儲蛇身Y坐標(biāo) 顯示時只須將X坐標(biāo)輸出到行,Y坐標(biāo)輸出列即可 B,蛇的方向: 使用兩個存儲單元分別來存儲代表方向的X坐標(biāo)和Y坐標(biāo)
2、 向上: X=0,Y=1 向下: X=0,Y=-1 向左: X=-1,Y=0向右: X=1,Y=0 C,蛇的移動: 只須將蛇頭的X坐標(biāo)和Y坐標(biāo)分別與方向的X坐標(biāo)和Y坐標(biāo)相加 原來蛇身各節(jié)的前一節(jié)X從標(biāo)和Y坐標(biāo)分別與后一節(jié)的X坐標(biāo)和Y 坐標(biāo)交換即可 D,吃食物: 只要判斷蛇頭的X,Y坐標(biāo)是否與食物的X,Y坐標(biāo)相同,相同則判斷 吃到食物,反之,沒吃到食物 F,吃到食物蛇增長一節(jié): 當(dāng)判斷為吃到食物后只須讓蛇移動時多交換一次即可實現(xiàn) G,判斷蛇是否撞墻: 只要判斷蛇頭的X坐標(biāo)或Y坐標(biāo)是否等于點陣最外邊時的X或Y 坐標(biāo) H,判斷蛇是否吃到自己: 只須將蛇頭X,Y坐標(biāo)與每一節(jié)蛇身的X,Y坐標(biāo)進行比較如果
3、相等到 則視為吃到自己 I,放置新的食物: 根據(jù)游戲者控制蛇吃到食物的時間的不同而產(chǎn)生的坐標(biāo),是隨機的食物 三 功能描述: 開機即顯示 “SNAKE”,當(dāng)按下KEY5則顯示蛇的形狀,再按下KEY5 進入游戲,即可開始游戲,此時即可通按下KEY1,KEY2,KEY3,KEY4來控 制上,下,左,右,此時按下KEY5可退出游戲,上述按鍵也可用紅外遙控來實現(xiàn).此時吃到食物即可增長一節(jié),撞到邊框即蛇死,吃到自己蛇死,死亡則顯示”GAMEOVER” ,長到20節(jié)即過一關(guān),并顯示關(guān)數(shù),10過完則重新開始.四 系統(tǒng)硬件設(shè)計:系統(tǒng)主原理圖:五 系統(tǒng)軟件設(shè)計:A 流程序圖設(shè)計1, 系統(tǒng)主流程圖:2, 按鍵子程序
4、流程圖:3, 蛇移動子程序流程圖:4, 判斷蛇是否死亡子程序流程圖:5, 蛇吃食物子程序流程圖:6, 過關(guān)子程序流程圖:7, 蛇顯示子程序流程圖:六 程序清單:;=;紅外遙控-串口-貪吃蛇;-2008/9/1-;=;硬件: P0,P2顯示碼輸出-行, P1.0-P1.3接74LS154為點陣列掃描信號; P1.4-P1.7為4個獨立鍵盤; P3.2 INT0為啟停鍵; P3.3 INT1為紅外接收; P3.0 P3.1為串口;=;字節(jié)定義區(qū);= SNAKE_TAIL_X EQU 27H ;蛇尾X坐標(biāo)暫存器SNAKE_TAIL_Y EQU 28H ;蛇尾Y坐標(biāo)暫存器 FOOD_X EQU 29H
5、 ;食物X坐標(biāo) FOOD_Y EQU 2AH ;食物Y坐標(biāo)SNAKE_CHANG EQU 2BH ;蛇的節(jié)數(shù)PUT_FOOD EQU 2CH ;放食物隨機碼產(chǎn)生器PASS_NUM EQU 2DH ;過關(guān)數(shù)目TIME EQU 2EH ;過關(guān)時間調(diào)節(jié)暫存器 TIME_400 EQU 32H ;400延時XX EQU 33H ;方向X坐標(biāo)暫存YY EQU 34H ;方向Y坐標(biāo)暫存X EQU 35H ;方向X坐標(biāo)Y EQU 36H ;方向Y坐標(biāo) SNAKE_TOU_X EQU 40H ;蛇頭 X坐標(biāo) 存儲單元 SNAKE_TOU_Y EQU 54H ;蛇頭 Y坐標(biāo) 存儲單元SNAKE_SHEN1_X
6、EQU 41H ;蛇身第一節(jié) X坐標(biāo) 存儲單元 SNAKE_SHEN1_Y EQU 55H ;蛇身第一節(jié) Y坐標(biāo) 存儲單元SNAKE_SHEN2_X EQU 42H ;蛇身第二節(jié) X坐標(biāo) 存儲單元SNAKE_SHEN2_Y EQU 56H ;蛇身第二節(jié) Y坐標(biāo) 存儲單元H_Y_8 EQU 37H ;Y坐標(biāo)大于8的寄存器L_Y_8 EQU 38H ;Y坐標(biāo)小于8的寄存器IR_COM1 EQU 39H ;紅外接收操作碼寄存器IR_COM2 EQU 3AH ;紅外接收操作反碼寄存器;=;位定義區(qū);= B_GAME_ON_OFF BIT 00H ;啟停標(biāo)志位BT0 BIT 01H ;定時器0中斷標(biāo)志B
7、_KEYTEST BIT 02H ;有鍵按下標(biāo)志位B_SNAKE_DED BIT 03H ;蛇死亡標(biāo)志位B_SNAKE_FOOD BIT 04H ;蛇吃到實物標(biāo)志位 B_PASS BIT 05H ;過關(guān)標(biāo)志位IRIN BIT P3.3;=;游戲開始;=ORG 00HJMP START_1ORG 03HJMP GAME_ON_OFF ;INT0啟停中斷ORG 0BHJMP T0_SET ;定時器T0中斷ORG 13HJMP IR_IN ;INT1紅外接收 ORG 23H JMP RI_SET ;串口通信ORG 30H;=;初始化 蛇總長20節(jié);=START_1: MOV PASS_NUM,#0
8、MOV TIME,#20 ;20*20MS=400MS 移動一次CLR B_PASSSTART: MOV TIME_400,TIME MOV SNAKE_TOU_X,#8 ;剛進入游戲模式時蛇為三節(jié),初始 X,Y 坐標(biāo)MOV SNAKE_TOU_Y,#8MOV SNAKE_SHEN1_X,#7MOV SNAKE_SHEN1_Y,#8MOV SNAKE_SHEN2_X,#6MOV SNAKE_SHEN2_Y,#8MOV R0,#SNAKE_SHEN2_X ;第三節(jié)之后的蛇身 X,Y 坐標(biāo)清0CLE_SNAKE_SHEN_X_17: INC R0MOV R0,#0CJNE R0,#53H,CLE_
9、SNAKE_SHEN_X_17MOV R0,#SNAKE_SHEN2_YCLE_SNAKE_SHEN_Y_17:INC R0MOV R0,#0CJNE R0,#67H,CLE_SNAKE_SHEN_Y_17 MOV IR_COM1,#00H ;紅外接收寄存器 MOV IR_COM2,#00H MOV PUT_FOOD,#0 ;初始化隨機碼產(chǎn)生器歸0 MOV X,#1 ;初始化方向向右MOV Y,#0MOV FOOD_X,#4 ;第一顆食物X,Y坐標(biāo)MOV FOOD_Y,#13MOV SNAKE_CHANG,#3 ;初始化蛇長為3節(jié) CLR BT0 ;T0中斷標(biāo)志位初始化CLR B_KEYTES
10、T ;鍵盤測試標(biāo)志位初始化 CLR B_SNAKE_DED ;蛇死亡標(biāo)志位初始化CLR B_SNAKE_FOOD ;蛇吃到食物標(biāo)志位初始化CLR B_GAME_ON_OFF ;啟停位清零SETB EA ;開中斷SETB EX0 ;開INT0中斷SETB EX1 ;開外部中斷INT1SETB IT0 ;INT0負邊緣觸發(fā)CLR IT1 ;INT1邊緣觸發(fā)方式MOV TMOD,#01H ;定時器0工作方式SETB ET0 ;開定時器0SETB ES ;開串口中斷 MOV TMOD,#20H ;定時器1用作串口通信波特率產(chǎn)生器ANL PCON,#3FH ;SMOD=0 波特率不倍增 MOV TH1,
11、#0FDH ;波特率為9600MOV TL1,#0FDHSETB TR1 ;開始定時MOV SCON,#50H ;串口設(shè)為工作模式1 接收 MOV SP,#70H ;堆棧初始化JB B_PASS,GOTO_GAME ;過關(guān)則直接跳入游戲;=;等待游戲開始 并顯示SNAKE 啟停鍵按下則顯示PLAYGAME 并進入游戲模式;=SNAKE: CALL DISP_SNAKE ;等待開始時顯示SNAKEJNB B_GAME_ON_OFF,SNAKE ;啟停標(biāo)志位為0表示啟停鍵沒按下繼續(xù)等待 CLR B_GAME_ON_OFF ;清除啟停標(biāo)志位SHEXIN:CALL DISP_SHEXIN ;啟停鍵按下
12、顯示PLAYGAME進入游戲JNB B_GAME_ON_OFF,SHEXIN CLR B_GAME_ON_OFF ;清除啟停標(biāo)志位GOTO_GAME: CLR B_PASS MOV DPTR,#65536-20000 ;定時器0定時初值MOV TH0,DPHMOV TL0,DPL SETB TR0 ;開定時器;=;游戲主程序 判斷鍵盤, 移動, 是否死亡, 吃食, 顯示;=MAIN_GAME: JNB BT0,MAIN_GAME ;等待T0中斷CLR BT0 ;清除T0中斷標(biāo)志CALL KEYTEST ;調(diào)用鍵盤測試程序JNB B_KEYTEST,NOKEY ;判斷是否有鍵按下CALL REA
13、DKEY_X_Y ;有鍵按下調(diào)用鍵盤操作子程序CJNE A,#0F0H,XX_X_YY_Y ;再次判斷是否有鍵按下JMP NOKEYXX_X_YY_Y: ;有鍵按下將取得的方向值送入 X,Y MOV X,XXMOV Y,YYNOKEY: DJNZ TIME_400,MAINDISP ;等待400MS到 MOV TIME_400,TIME ;重送初值CLR P3.7INC PUT_FOOD ;對移動次數(shù)進行計數(shù)從而產(chǎn)生隨機碼CALL SNAKE_MOVE ;調(diào)用蛇身移動子程序=1CALL SNAKE_DED ;判斷蛇是否死亡子程序=2JB B_SNAKE_DED,GAMEOVER ;死亡則顯示G
14、AMEOVERCALL SNAKE_FOOD ;判斷是否吃到食物子程序=3JNB B_SNAKE_FOOD,MAINDISP CALL SNAKE_ZHANGCHANG ;吃到食物則增長一節(jié)并重放食物=4JNB B_PASS,MAINDISPCLR TR0CALL SNAKE_PASSMOV A,PASS_NUMCJNE A,#10,GOTO_STARTJMP START_1MAINDISP: CALL GAME_DISP ;顯示蛇=5JB B_GAME_ON_OFF,GAMEOVERJMP MAIN_GAME ;繼續(xù)循環(huán)GAMEOVER: CLR TR0CLR B_GAME_ON_OFFCA
15、LL DISP_GAMEOVER ;啟停鍵在游戲中按下則結(jié)束顯示GAMEOVERJNB B_GAME_ON_OFF,GAMEOVER ;再次按下啟停鍵則進入SNAKE進行等待CLR B_GAME_ON_OFF ;清除啟停標(biāo)志位GOTO_START:JMP START ;=;T0中斷服務(wù)子程序 重送初值 置標(biāo)志位;=T0_SET: MOV DPTR,#65536-20000MOV TH0,DPHMOV TL0,DPLSETB BT0RETI;=;INTO中斷服務(wù)子程序 啟 , 停;=GAME_ON_OFF: ;INTO中斷服務(wù)子程序 CLR EX0JB P3.2,OUT CALL DEL_10M
16、SJB P3.2,OUT SETB B_GAME_ON_OFF ;置啟停標(biāo)志位為1表示按下 OUT: SETB EX0RETI;=;鍵盤測試子程序 有鍵按下則 B_KEYTEST=1;=KEYTEST: SETB B_KEYTEST MOV A,P1ANL A,#0F0H CJNE A,#0F0H,KEYTEST_OUTCLR B_KEYTESTKEYTEST_OUT: RET;=;讀鍵值并得出方向 ,即 X, Y的值;=READKEY_X_Y: JNB P1.4,PD_UP_DOWN1 ;判斷是否為向上鍵按下 JMP KEY_DOWNPD_UP_DOWN1: MOV A,Y CJNE A,#
17、0,KEY_DOWN MOV YY,#1 ;向上鍵按下則置方向標(biāo)志 MOV XX,#0 JMP READKEY_OUTKEY_DOWN: JNB P1.7,PD_UP_DOWN2 ;判斷是否為向下鍵按下 JMP KEY_LEFTPD_UP_DOWN2: MOV A,Y CJNE A,#0,KEY_LEFT MOV YY,#-1 ;向下鍵按下則置方向標(biāo)志 MOV XX,#0 JMP READKEY_OUTKEY_LEFT: JNB P1.5,PD_LEFT_RIGHT1 ;判斷是否為向左鍵按下 JMP KEY_RIGHTPD_LEFT_RIGHT1: MOV A,X CJNE A,#0,KEY_
18、RIGHT MOV XX,#-1 ;向左鍵按下則置方向標(biāo)志 MOV YY,#0 JMP READKEY_OUTKEY_RIGHT: JNB P1.6,PD_LEFT_RIGHT2 ;判斷是否為向右鍵按下 JMP READKEY_OUTPD_LEFT_RIGHT2: MOV A,X CJNE A,#0,READKEY_OUT MOV XX,#1 ;向右鍵按下則置方向標(biāo)志 MOV YY,#0READKEY_OUT: MOV A,P1 ;去抖 ANL A,#0F0H RET;=;蛇移動子程序;=SNAKE_MOVE: MOV R1,SNAKE_CHANG MOV A,SNAKE_TOU_XADD A
19、,X ;蛇頭X坐標(biāo)加上 方向X坐標(biāo)MOV R0,#SNAKE_TOU_XMOVE_CHANGE_X: ;依次將前一個蛇身X坐標(biāo)轉(zhuǎn)向下一蛇身X坐標(biāo) XCH A,R0INC R0DJNZ R1,MOVE_CHANGE_X;MOV SNAKE_TAIL_X,A MOV R1,SNAKE_CHANGMOV A,SNAKE_TOU_YADD A,Y ;蛇頭Y坐標(biāo)加上 方向Y坐標(biāo)MOV R0,#SNAKE_TOU_YMOVE_CHANGE_Y: ;依次將前一個蛇身Y坐標(biāo)轉(zhuǎn)向下一蛇身Y坐標(biāo) XCH A,R0INC R0DJNZ R1,MOVE_CHANGE_Y;MOV SNAKE_TAIL_Y,ARET;=
20、;蛇顯示子程序;=GAME_DISP: MOV R0,#SNAKE_TOU_X ;從蛇頭開始顯示 MOV R1,#SNAKE_TOU_YGAME_DISP_20: MOV A,R0 ;取X坐標(biāo) ORL A,#0F0H ;高位為鍵盤因此屏蔽掉 MOV P1,A ;X坐標(biāo)輸出 INC R0 ;下一節(jié)蛇身的X坐標(biāo) MOV A,R1 ;Y坐標(biāo)到R2 MOV R2,A CALL COUNT_Y ;計算出Y坐標(biāo)的高8位和低8位 MOV P0,H_Y_8 ;輸出Y坐標(biāo)的高8位 MOV P2,L_Y_8 ;輸出Y坐標(biāo)的低8位 INC R1 ;取下一節(jié)的Y坐標(biāo) CALL DEL ;延時 MOV P0,#00H
21、MOV P2,#00H CJNE R0,#53H,GAME_DISP_20 ;20節(jié)蛇身是否全部顯示完 MOV A,FOOD_X ;顯示食物 ORL A,#0F0H MOV P1,A MOV R2,FOOD_Y CALL COUNT_Y MOV P0,H_Y_8 MOV P2,L_Y_8 CALL DEL MOV P0,#00H MOV P2,#00H RET;=; Y坐標(biāo)計算子程序 Y坐標(biāo)大于8的存在H_Y_8中 , 小于8的存在L_Y_8中;=COUNT_Y: MOV H_Y_8,#00H ;初始化Y坐標(biāo)的高8位和低8位MOV L_Y_8,#00HCJNE R2,#0,COUNT_Y_H
22、;Y坐標(biāo)為0則不要調(diào)整JMP COUNT_Y_OUTCOUNT_Y_H: CLR CMOV A,#8SUBB A,R2 JNC COUNT_Y_L ;判斷Y坐標(biāo)是否大于8CLR C ;大于8則調(diào)整MOV A,R2SUBB A,#8 MOV R2,A ;調(diào)整后的Y坐標(biāo)存回R2SETB CMOV A,#00HCOUNT_Y_H_1: ;將Y坐標(biāo)高8位轉(zhuǎn)化為可輸出的字節(jié)存入H_Y_8RLC ADJNZ R2,COUNT_Y_H_1MOV H_Y_8,AJMP COUNT_Y_OUTCOUNT_Y_L: ;Y坐標(biāo)小于8則執(zhí)行下面的操作 SETB CMOV A,#00HCOUNT_Y_L_1: ;將Y坐
23、標(biāo)低8位轉(zhuǎn)化為可輸出的字節(jié)存入L_Y_8RLC ADJNZ R2,COUNT_Y_L_1MOV L_Y_8,ACOUNT_Y_OUT: RET;=;判斷蛇是否死亡子程序 死亡則置位B_SNAKE_DED=1;=SNAKE_DED: SETB B_SNAKE_DED MOV A,#-1 ;判斷蛇頭是否撞到左邊的墻CJNE A,SNAKE_TOU_X,X_16JMP SNAKE_DED_OUTX_16: MOV A,#16 ;判斷蛇頭是否撞到右邊的墻CJNE A,SNAKE_TOU_X,Y_0JMP SNAKE_DED_OUTY_0: MOV A,#0 ;判斷蛇頭是否撞到下邊的墻CJNE A,SN
24、AKE_TOU_Y,Y_17JMP SNAKE_DED_OUTY_17: MOV A,#17 ;判斷蛇頭是否撞到上邊的墻CJNE A,SNAKE_TOU_Y,SNAKE_DED_ZISHENJMP SNAKE_DED_OUTSNAKE_DED_ZISHEN: ;沒撞到墻則判斷是否撞到自已 MOV R0,#SNAKE_TOU_XMOV R1,#SNAKE_TOU_YSNAKE_DED_1: INC R1INC R0MOV A,R0CJNE A,SNAKE_TOU_X,SNAKE_DED_19MOV A,R1CJNE A,SNAKE_TOU_Y,SNAKE_DED_19JMP SNAKE_DED_OUTSNAKE_DED_19: CJNE R0,#53H,SNAKE_DED_1SNAKE_NDED_OUT: CLR B_SNAKE_DEDSNA
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年團員培養(yǎng)目標(biāo)入團考試試題及答案
- 全天候準(zhǔn)備消防工程師試題及答案計劃
- 2025年入團考試人際溝通試題及答案
- 2025年建造師考試要點提煉試題及答案
- 中級審計師備考復(fù)習(xí)計劃試題及答案
- 2025年團員創(chuàng)新實踐入團考試試題及答案
- 護理感染控制的規(guī)范試題及答案
- 初級審計師備考中的常見問題試題及答案
- 2024年高級審計師在機構(gòu)變革中的適應(yīng)能力試題及答案
- 外語學(xué)習(xí)中的個體差異與策略試題及答案
- GB/T 36447-2018多媒體教學(xué)環(huán)境設(shè)計要求
- GB/T 14832-2008標(biāo)準(zhǔn)彈性體材料與液壓液體的相容性試驗
- 校園青年志愿者培訓(xùn)(服務(wù)禮儀講解)
- 手機拍照技巧大全課件
- 送達地址確認書(訴訟類范本)
- 博士后研究人員進站審核表
- 電機檢測報告
- 高效水泥助磨劑PPT課件(PPT 66頁)
- 生物防治第三講
- 旁站監(jiān)理實施細則(完整版)
- 學(xué)業(yè)水平考試復(fù)習(xí)高中語文文言文課本翻譯
評論
0/150
提交評論