仿真版本:Proteus8.6及以上版本
程序編譯:Keil5 C51
編程語言:C語言
設(shè)計編號:【Z06】
1.? 簡介
? 本文提出了一種基于51單片機的12864貪吃蛇設(shè)計。本系統(tǒng)由AT89C51單片機為控制核心,制作一個貪吃蛇游戲機,通過LCD12864顯示屏為載體顯示數(shù)據(jù),并用四個輸入端表示四個上下左右控制鍵和三個確認、返回、暫停功能鍵,實現(xiàn)地圖設(shè)置、難度設(shè)置。
2.? 主要功能
a.支持按鍵實現(xiàn)地圖設(shè)置、難度設(shè)置。
b. 支持按鍵實現(xiàn)確認、返回、暫停。
3.? 源程序(Keil5)
本設(shè)計采用keil5 C51軟件(內(nèi)附安裝包)實現(xiàn)程序設(shè)計。如需用keil4打開程序,可自行通過.c和.h文件新建工程即可。
while(1)
{
if(flag_exit_game==1)//如果游戲過程中按下返回鍵 則立即結(jié)束游戲 返回菜單
break;
if(flag_game_over==1)
break;
ET1=1; //允許掃描按鍵 貪吃蛇游戲難度決定蛇2次移動之間的間隔時間 也就是檢測按鍵的時間
tcs_key_flag=0; //允許捕獲按鍵 在檢測按鍵時間內(nèi) 只允許生產(chǎn)一個拐點 即捕獲到一個有效的
//按鍵以后 就置一這個變量 不允許再增加拐點
while(tcs_stop==0);
switch(tcs_nd)
{
case 0: {delay_ms(10); break;}
case 1: {delay_ms(50); break;}
case 2: {delay_ms(100); break;}
}
ET1=0;
switch(tou.direction)//這個switch用來根據(jù)蛇頭的x y value值以及當前蛇頭移動的方向
//取出蛇頭要到達的下一個點 存入check中 來判斷是否撞墻 吃到食物 什么的···
{
case 0: {
check.x=tou.x;
if(tou.y==63)
check.y=0;
else
check.y=tou.y+1;
check.value=tou.value;
break ;
}//->向右y+1 其他不變
case 1: { //↓ 向下y不變
check.y=tou.y;
if(tou.value==0x80)// value==0x80 則 x+1 value=0x01
{
if(tou.x==7)
check.x=0;
else
check.x=tou.x+1;
check.value=0x01;
}
else
{
check.x=tou.x;
check.value=tou.value<<1;
}
break ;
}
case 2: {
check.x=tou.x;
if(tou.y==0)
check.y=63;
else
check.y=tou.y-1;
check.value=tou.value;
break ;
}//<-向左y-1 其他不變
case 3: { //↑ 向上y不變
check.y=tou.y;
if(tou.value==0x01)// value==0x01 則 x-1 value=0x80
{
if(tou.x==0)
check.x=7;
else
check.x=tou.x-1;
check.value=0x80;
}
else
{
check.x=tou.x;
check.value=tou.value>>1;
}
break ;
}
}
he=test_point_exist(check.x,check.y,check.value); // 檢測蛇頭移動的下一個點是否幾經(jīng)有點存在
if(he==check.value) //如果前面的點已經(jīng)存在 則可以是食物 或者是墻和蛇身
{
if( (check.x==food.x) && (check.y==food.y) && (check.value==food.value) )//吃到食物
{
tcs_df++;
cs1=1; cs2=0;
write_lcd_shuzi(2,32,tcs_shuzi[tcs_df/100] ); //顯示分數(shù)的百位
write_lcd_shuzi(2,40,tcs_shuzi[ (tcs_df%100)/10] ); // 十
write_lcd_shuzi(2,48,tcs_shuzi[tcs_df%10] ); // 個
cs1=0; cs2=1;
food.direction=tou.direction;//食物本沒有方向 但是為了下面的語句
tou=food; //食物就成了蛇頭···蛇頭的方向依然不變
hui=wei.direction; //先記錄下尾巴本來的移動方向
wei.direction=611;//這次行動尾巴不動 這樣蛇身就自然加一了···611代表下面的尾巴不動
do
{
food_produce();
he=test_point_exist(food.x,food.y,food.value);
}
while(he==food.value);
draw_lcd_point(food.x,food.y,food.value);//上面有說過 這個是產(chǎn)生并顯示食物
}
else//撞到身體或者墻
{
flag_game_over=1; // 游戲結(jié)束
}
}
else //什么都么有遇到 繼續(xù)前進
{
check.direction=tou.direction;//這么做的理由同上 為了保持蛇頭當前的移動方向
tou=check;
draw_lcd_point(tou.x,tou.y,tou.value);//畫出此時的蛇頭
}
//下面是對尾巴的操作
if ( (wei.x == queue.dat[queue.front].x) && ( wei.y==queue.dat[queue.front].y ) && ( wei.value== queue.dat[queue.front].value) ) //如果尾巴到達拐點
{
check=queue_out(&queue);
wei.direction=check.direction; //尾巴按照拐點指示的方向走
}
else //如果沒有到達拐點 尾巴移動的方向不變
{
}
switch( wei.direction ) //這個是尾巴的移動 以及尾巴節(jié)點數(shù)據(jù)的修改
{
case 0: { wei_you(); break; }
case 1: { wei_xia(); break; }
case 2: { wei_zuo(); break; }
case 3: { wei_shang(); break; }
case 611: { wei.direction=hui; break;} //這次移動 吃到實物 還原尾巴本來的移動方向
}
}
TR0=0;
TR1=0;
ET1=0; //退出游戲時 關(guān)閉游戲過程中用到的定時器0和1 然后定時器中斷也要關(guān)閉
}
4.? 仿真proteus8.6
? 本設(shè)計采用proteus8.6軟件(內(nèi)附安裝包)實現(xiàn)仿真設(shè)計,如下圖所示。proteus軟件一般存在高低版本兼容問題,該仿真是通過proteus8.6導出的,所以請盡量使用proteus8.6打開文件,低于proteus8.6的版本不能夠正常使用,高于proteus8.6的版本除了proteus8.8/8.9理論上可以正常使用。
仿真界面:
5.? 設(shè)計報告
設(shè)計報告主要包括硬件電路、軟件設(shè)計、仿真調(diào)試等等,僅供參考。
6.? 資料清單
設(shè)計資料主要包括C程序+仿真+設(shè)計報告+使用說明+元件清單+操作視頻等。
7.? 資料獲取鏈接
百度網(wǎng)盤下載鏈接:【Z06】百度網(wǎng)盤下載鏈接
更多單片機仿真設(shè)計合集:單片機仿真設(shè)計合集