• 方案介紹
    • 1.? 簡介
    • 2.? 主要功能
    • 3.? 源程序(Keil5)
    • 4.? 仿真proteus8.6
    • 5.? 設(shè)計報告
    • 6.? 資料清單
    • 7.? 資料獲取鏈接
  • 附件下載
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

基于51單片機的12864液晶貪吃蛇設(shè)計(一)!!!

04/29 08:45
253
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

單片機仿真設(shè)計合集資料獲取.pdf

共1個文件

資料清單:C程序+仿真+設(shè)計報告+使用說明+元件清單+操作視頻

仿真版本: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è)計合集

  • 單片機仿真設(shè)計合集資料獲取.pdf
    下載

相關(guān)推薦