基于51单片机贪吃蛇小游戏

(仿真+程序)

功能介绍

具体功能:

1.用74HC573驱动点阵显示游戏画面;

2.上电后贪吃蛇会自动寻食;

3.按下四个按键中的任何一个就手动寻食了;

​演示视频:

基于51单片机贪吃蛇小游戏 

添加图片注释,不超过 140 字(可选)

程序

#include <reg51.h>
/***公众号:木子单片机****
************************************/
#define uchar unsigned char
#define SNAKE 20                 //最大长度
#define TIME 50                 //显示延时时间
#define SPEED 71               //速度控制


sbit keyenable=P3^6;			//方向使能
sbit up=P3^3;       //down
sbit down=P3^1;
sbit right=P3^2;
sbit left=P3^4;
uchar x[SNAKE+1]; // 声明20个
uchar y[SNAKE+1];   

uchar guozix[20]={4,5,7,4,3,6,1,0,3,6,2,1,0,4,5,7,0,6,1,7};
uchar guoziy[20]={4,7,1,0,2,1,1,6,3,2,4,3,5,1,5,3,1,2,7,0};
       
uchar time,n,i,e;              //延时时间,当前蛇长,通用循环变量,当前速度		
char addx,addy;                //位移偏移量


/********************
延时程序
*********************/
void delay(char MS)
{
	char us,usn;
	while(MS!=0)
	{
		    usn = 0;
			while(usn!=0)
			{
				us=0xff;
				while (us!=0){us--;};
				usn--;
			}
		    MS--;
	}
}
/*******************************************
判断碰撞
*******************************************/
bit knock()
{      
        bit k;
		k=0;
		if(x[1]>7||y[1]>7)
		{
		  k=1;                             //撞墙
		}
		for(i=2;i<n;i++)
	  	{
		   if((x[1]==x[i])&(y[1]==y[i]))
		   {
		      k=1;  //撞自己
		   }
		}
		return k;
}
/*****************
上下左右键位处理
*****************/
void turnkey()// interrupt 0 using 2  
{//up=1;
   if(keyenable)
   {
		if(left) // 控制左移动
		{
		   addy=0;
	   	  if(addx!=1)
		    addx=-1; 
		  else 
		    addx=1;
		}
		if(right)  // 控制右移动
		{
		   addy=0;
	 	   if(addx!=-1)
		    addx=1; 
		   else 
		    addx=-1;
		
		}
		if(up)		// 控制上移动
		{
		   addx=0;
		   if(addy!=-1)
	   	     addy=1;
		   else 
		     addy=-1;
		 }
		if(down)	  // 控制下移动
		{  
		   addx=0;
		   if(addy!=1)
		     addy=-1; 
		   else 
		    addy=1;
		}

    }
}
/*****************
乘方程序
*****************/
uchar mux(uchar temp) 
{
		if(temp==7)return 128;
		if(temp==6)return 64;
		if(temp==5)return 32;
		if(temp==4)return 16;
		if(temp==3)return 8;
		if(temp==2)return 4;
		if(temp==1)return 2;
		if(temp==0)return 1; // 在这个的范围之内
		return 0;
}
/*****************
显示时钟 显示程序
*****************/
void timer0(uchar k)
{
      while(k--)
     {  
	      for(i=0;i<SNAKE+1;i++)
		 {

		   // 显示具体的点了
		   P2=mux(x[i]);	// 每个都在变化的
		   P0=255-mux(y[i]);



		   turnkey();                     //上下左右键位处理
		   // 按键处理
		   delay(TIME);                   //显示延迟
		   P2=0x00;
		   P0=0xff;
		 }
     }
} 

硬件设计

使用元器件:

单片机:STC89C52;

(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)

添加图片注释,不超过 140 字(可选)

设计资料

01仿真图

本设计使用proteus7.8和proteus8.9两个版本设计!具体如图!

添加图片注释,不超过 140 字(可选)

02程序

本设计使用软件keil5版本编程设计!具体如图!

添加图片注释,不超过 140 字(可选)

03设计资料

        资料获取请关注同名公众号,全部资料包括仿真源文件 、程序(含注释)等。具体内容如下,全网最全! !

 

可以关注下方公众号!

点赞分享一起学习成长。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐