基于單片機的貪食蛇設計_第1頁
基于單片機的貪食蛇設計_第2頁
基于單片機的貪食蛇設計_第3頁
基于單片機的貪食蛇設計_第4頁
基于單片機的貪食蛇設計_第5頁
已閱讀5頁,還剩33頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、基于單片機的貪食蛇設計一 題目要求: 使用8051單片機和點陣顯示屏實現貪吃蛇的基本功能二 題目分析: 1,貪吃蛇的基本功能: A,能夠蛇形移動 B,能夠任意改變方向 C,能夠吃到食物并增長 D,撞到四邊的墻蛇死 F,吃到自己蛇死 E,放置新的食物2,拓展部分: A,能夠過關 B,在游戲開始和結束都顯示一些相關花樣 C,過關能顯示關數 D,增加串口通信功能 F,增加紅外遙控功能3,貪吃蛇關鍵算法分析: A,蛇身的形成: 使用20個RAM來存儲蛇身X坐標,20個RAM來存儲蛇身Y坐標 顯示時只須將X坐標輸出到行,Y坐標輸出列即可 B,蛇的方向: 使用兩個存儲單元分別來存儲代表方向的X坐標和Y坐標

2、 向上: X=0,Y=1 向下: X=0,Y=-1 向左: X=-1,Y=0向右: X=1,Y=0 C,蛇的移動: 只須將蛇頭的X坐標和Y坐標分別與方向的X坐標和Y坐標相加 原來蛇身各節的前一節X從標和Y坐標分別與后一節的X坐標和Y 坐標交換即可 D,吃食物: 只要判斷蛇頭的X,Y坐標是否與食物的X,Y坐標相同,相同則判斷 吃到食物,反之,沒吃到食物 F,吃到食物蛇增長一節: 當判斷為吃到食物后只須讓蛇移動時多交換一次即可實現 G,判斷蛇是否撞墻: 只要判斷蛇頭的X坐標或Y坐標是否等于點陣最外邊時的X或Y 坐標 H,判斷蛇是否吃到自己: 只須將蛇頭X,Y坐標與每一節蛇身的X,Y坐標進行比較如果

3、相等到 則視為吃到自己 I,放置新的食物: 根據游戲者控制蛇吃到食物的時間的不同而產生的坐標,是隨機的食物 三 功能描述: 開機即顯示 “SNAKE”,當按下KEY5則顯示蛇的形狀,再按下KEY5 進入游戲,即可開始游戲,此時即可通按下KEY1,KEY2,KEY3,KEY4來控 制上,下,左,右,此時按下KEY5可退出游戲,上述按鍵也可用紅外遙控來實現.此時吃到食物即可增長一節,撞到邊框即蛇死,吃到自己蛇死,死亡則顯示”GAMEOVER” ,長到20節即過一關,并顯示關數,10過完則重新開始.四 系統硬件設計:系統主原理圖:五 系統軟件設計:A 流程序圖設計1, 系統主流程圖:2, 按鍵子程序

4、流程圖:3, 蛇移動子程序流程圖:4, 判斷蛇是否死亡子程序流程圖:5, 蛇吃食物子程序流程圖:6, 過關子程序流程圖: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為串口;=;字節定義區;= SNAKE_TAIL_X EQU 27H ;蛇尾X坐標暫存器SNAKE_TAIL_Y EQU 28H ;蛇尾Y坐標暫存器 FOOD_X EQU 29H

5、 ;食物X坐標 FOOD_Y EQU 2AH ;食物Y坐標SNAKE_CHANG EQU 2BH ;蛇的節數PUT_FOOD EQU 2CH ;放食物隨機碼產生器PASS_NUM EQU 2DH ;過關數目TIME EQU 2EH ;過關時間調節暫存器 TIME_400 EQU 32H ;400延時XX EQU 33H ;方向X坐標暫存YY EQU 34H ;方向Y坐標暫存X EQU 35H ;方向X坐標Y EQU 36H ;方向Y坐標 SNAKE_TOU_X EQU 40H ;蛇頭 X坐標 存儲單元 SNAKE_TOU_Y EQU 54H ;蛇頭 Y坐標 存儲單元SNAKE_SHEN1_X

6、EQU 41H ;蛇身第一節 X坐標 存儲單元 SNAKE_SHEN1_Y EQU 55H ;蛇身第一節 Y坐標 存儲單元SNAKE_SHEN2_X EQU 42H ;蛇身第二節 X坐標 存儲單元SNAKE_SHEN2_Y EQU 56H ;蛇身第二節 Y坐標 存儲單元H_Y_8 EQU 37H ;Y坐標大于8的寄存器L_Y_8 EQU 38H ;Y坐標小于8的寄存器IR_COM1 EQU 39H ;紅外接收操作碼寄存器IR_COM2 EQU 3AH ;紅外接收操作反碼寄存器;=;位定義區;= B_GAME_ON_OFF BIT 00H ;啟停標志位BT0 BIT 01H ;定時器0中斷標志B

7、_KEYTEST BIT 02H ;有鍵按下標志位B_SNAKE_DED BIT 03H ;蛇死亡標志位B_SNAKE_FOOD BIT 04H ;蛇吃到實物標志位 B_PASS BIT 05H ;過關標志位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節;=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 ;剛進入游戲模式時蛇為三節,初始 X,Y 坐標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 ;第三節之后的蛇身 X,Y 坐標清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 ;初始化隨機碼產生器歸0 MOV X,#1 ;初始化方向向右MOV Y,#0MOV FOOD_X,#4 ;第一顆食物X,Y坐標MOV FOOD_Y,#13MOV SNAKE_CHANG,#3 ;初始化蛇長為3節 CLR BT0 ;T0中斷標志位初始化CLR B_KEYTES

10、T ;鍵盤測試標志位初始化 CLR B_SNAKE_DED ;蛇死亡標志位初始化CLR B_SNAKE_FOOD ;蛇吃到食物標志位初始化CLR B_GAME_ON_OFF ;啟停位清零SETB EA ;開中斷SETB EX0 ;開INT0中斷SETB EX1 ;開外部中斷INT1SETB IT0 ;INT0負邊緣觸發CLR IT1 ;INT1邊緣觸發方式MOV TMOD,#01H ;定時器0工作方式SETB ET0 ;開定時器0SETB ES ;開串口中斷 MOV TMOD,#20H ;定時器1用作串口通信波特率產生器ANL PCON,#3FH ;SMOD=0 波特率不倍增 MOV TH1,

11、#0FDH ;波特率為9600MOV TL1,#0FDHSETB TR1 ;開始定時MOV SCON,#50H ;串口設為工作模式1 接收 MOV SP,#70H ;堆棧初始化JB B_PASS,GOTO_GAME ;過關則直接跳入游戲;=;等待游戲開始 并顯示SNAKE 啟停鍵按下則顯示PLAYGAME 并進入游戲模式;=SNAKE: CALL DISP_SNAKE ;等待開始時顯示SNAKEJNB B_GAME_ON_OFF,SNAKE ;啟停標志位為0表示啟停鍵沒按下繼續等待 CLR B_GAME_ON_OFF ;清除啟停標志位SHEXIN:CALL DISP_SHEXIN ;啟停鍵按下

12、顯示PLAYGAME進入游戲JNB B_GAME_ON_OFF,SHEXIN CLR B_GAME_ON_OFF ;清除啟停標志位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中斷標志CALL KEYTEST ;調用鍵盤測試程序JNB B_KEYTEST,NOKEY ;判斷是否有鍵按下CALL REA

13、DKEY_X_Y ;有鍵按下調用鍵盤操作子程序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 ;對移動次數進行計數從而產生隨機碼CALL SNAKE_MOVE ;調用蛇身移動子程序=1CALL SNAKE_DED ;判斷蛇是否死亡子程序=2JB B_SNAKE_DED,GAMEOVER ;死亡則顯示G

14、AMEOVERCALL SNAKE_FOOD ;判斷是否吃到食物子程序=3JNB B_SNAKE_FOOD,MAINDISP CALL SNAKE_ZHANGCHANG ;吃到食物則增長一節并重放食物=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 ;繼續循環GAMEOVER: CLR TR0CLR B_GAME_ON_OFFCA

15、LL DISP_GAMEOVER ;啟停鍵在游戲中按下則結束顯示GAMEOVERJNB B_GAME_ON_OFF,GAMEOVER ;再次按下啟停鍵則進入SNAKE進行等待CLR B_GAME_ON_OFF ;清除啟停標志位GOTO_START:JMP START ;=;T0中斷服務子程序 重送初值 置標志位;=T0_SET: MOV DPTR,#65536-20000MOV TH0,DPHMOV TL0,DPLSETB BT0RETI;=;INTO中斷服務子程序 啟 , 停;=GAME_ON_OFF: ;INTO中斷服務子程序 CLR EX0JB P3.2,OUT CALL DEL_10M

16、SJB P3.2,OUT SETB B_GAME_ON_OFF ;置啟停標志位為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 ;向上鍵按下則置方向標志 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 ;向下鍵按下則置方向標志 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 ;向左鍵按下則置方向標志 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 ;向右鍵按下則置方向標志 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坐標加上 方向X坐標MOV R0,#SNAKE_TOU_XMOVE_CHANGE_X: ;依次將前一個蛇身X坐標轉向下一蛇身X坐標 XCH A,R0INC R0DJNZ R1,MOVE_CHANGE_X;MOV SNAKE_TAIL_X,A MOV R1,SNAKE_CHANGMOV A,SNAKE_TOU_YADD A,Y ;蛇頭Y坐標加上 方向Y坐標MOV R0,#SNAKE_TOU_YMOVE_CHANGE_Y: ;依次將前一個蛇身Y坐標轉向下一蛇身Y坐標 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坐標 ORL A,#0F0H ;高位為鍵盤因此屏蔽掉 MOV P1,A ;X坐標輸出 INC R0 ;下一節蛇身的X坐標 MOV A,R1 ;Y坐標到R2 MOV R2,A CALL COUNT_Y ;計算出Y坐標的高8位和低8位 MOV P0,H_Y_8 ;輸出Y坐標的高8位 MOV P2,L_Y_8 ;輸出Y坐標的低8位 INC R1 ;取下一節的Y坐標 CALL DEL ;延時 MOV P0,#00H

21、MOV P2,#00H CJNE R0,#53H,GAME_DISP_20 ;20節蛇身是否全部顯示完 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坐標計算子程序 Y坐標大于8的存在H_Y_8中 , 小于8的存在L_Y_8中;=COUNT_Y: MOV H_Y_8,#00H ;初始化Y坐標的高8位和低8位MOV L_Y_8,#00HCJNE R2,#0,COUNT_Y_H

22、;Y坐標為0則不要調整JMP COUNT_Y_OUTCOUNT_Y_H: CLR CMOV A,#8SUBB A,R2 JNC COUNT_Y_L ;判斷Y坐標是否大于8CLR C ;大于8則調整MOV A,R2SUBB A,#8 MOV R2,A ;調整后的Y坐標存回R2SETB CMOV A,#00HCOUNT_Y_H_1: ;將Y坐標高8位轉化為可輸出的字節存入H_Y_8RLC ADJNZ R2,COUNT_Y_H_1MOV H_Y_8,AJMP COUNT_Y_OUTCOUNT_Y_L: ;Y坐標小于8則執行下面的操作 SETB CMOV A,#00HCOUNT_Y_L_1: ;將Y坐

23、標低8位轉化為可輸出的字節存入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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論