历史上的今天
今天是:2024年12月15日(星期日)
2021年12月15日 | 用单片机和LED灯阵制作的贪吃蛇趣味小游戏
2021-12-15 来源:eefocus
最近几天天气总是在下雨,对于不爱玩手机游戏的我来说过得太无聊了。
想想咋么才能让时间过得快一点呢,这个时候我看到电视里的一个广告类似贪吃蛇的,于是抱着试试看的想法 用单片机和LED灯阵做了一个贪吃蛇的游戏
基本功能都有,玩起来体验还可以,总算可以充分利用时间了。
下面我就把制作过程和文件分享给大家
用一个18650电池供电,用一个单片机进行控制
名称:8X8点阵贪吃蛇
功能:
按右键开始、中间可以选择速度1最慢9最快(飞一般的感觉)
速度2和9,哎呀呀,自己撞死了(可以穿墙,撞到自己的身体死亡)
按中间确定可查看吃到了多少
暂停
废话不多说先上实物图
实物图1

实物图2


焊接实物图1 由于时间比较急线布的有点乱啊

焊接实物图2

#include"reg52.h"
sbit d=P2^4;
sbit a=P2^0;
sbit w=P2^2;
sbit s=P2^6;
sbit key=P2^7;
unsigned char code n[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01},n0[8]={0x08,0x04,0x02,0x01,0x10,0x20,0x40,0x80};
unsigned char snake[8][8],xmax,ymax,xmin,ymin,max=0,min=200,eat=0,ch=‘d’,num=0,f=0,cun=0,food=1,hz=0,n1=0,v=2;
void late(unsigned int i)
{undefined
for(;i>0;i–);
}
void xian(unsigned char y0,unsigned char x0,unsigned char y1,unsigned char x1,unsigned char on)
//在数组snake[][]中绘直线的函数,(x0,y0)to(x1,y1) on,0:off 1:长亮 2:以1:1亮灭时间比闪烁
{undefined
char i,j,nx,ny;
if(x0>x1)
nx=-1;
else if(x0x1)
nx=0;
else
nx=1;
if(y0>y1)
ny=-1;
else if(y0y1)
ny=0;
else
ny=1;
for(i=y0,j=x0;i!=y1+ny||j!=x1+nx;i=ny+i,j=nx+j)
snake[j][i]=on;
}
void print(void)//把二维数组snake[][]转换点阵的函数,数组某元素为0时,对应的led灭,1为亮,2为闪烁。(以后用多色led点阵时也可以用这种方法控制颜色)
{undefined
unsigned char i,j;
P3=0x00;
P1=0x00;
for(i=0;i<8;i++)
{undefined
P3=0x00;
P1=~n[i];
for(j=0;j<8;j++)
{undefined
if(snake[j][i]==1)
{undefined
P3|=n0[j];
}
else if(snake[j][i]==2)
{undefined
if(hz%125>=60)
P3|=n0[j];
else
P3&=~n0[j];
}
else if(snake[j][i]==0)
P3&=~n0[j];
}
late(10);
}
}
void number(unsigned char su,unsigned char x,unsigned char y,unsigned char on,unsigned char in)
{ //在数组snake[][]从某坐标起绘数字的函数,on:显示样式,in:背景样式
xian(x+2,y,x+2,y+4,on);
if(su7||su4||su==1)
{undefined
if(su7)
xian(x,y,x+2,y,on);
if(su4)
{undefined
xian(x,y,x,y+2,on);
snake[y+2][x+1]=on;
}
}
else
{undefined
xian(x,y,x+2,y,on);
if(su!=0)
xian(x,y+2,x+2,y+2,on);
xian(x,y+4,x+2,y+4,on);
xian(x,y,x,y+4,on);
switch(su)
{undefined
case 5:snake[y+3][x]=in;
case 6:snake[y+1][x+2]=in;break;
case 9:snake[y+3][x]=in;break;
case 2:snake[y+1][x]=snake[y+3][x+2]=in;break;
case 3:snake[y+1][x]=snake[y+3][x]=in;
}
}
}
void main(void)
{undefined
unsigned int i,j;
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;//每10000微秒中断一次(每0.01秒执行一次中断函数)
EA=1;
ET0=1;
TR0=1;
//以上是有关时间中断的设置
start:
P3=0x00;
P1=0x00;
f=1;
cun=1;
while(cun)//等待开始
{undefined
n1++;
if(n1==240)
n1=0;
for(i=0;i<8;i++)
for(j=0;j<8;j++)
snake[j][i]=0;
switch(f)
{undefined
case 1://主界面:开>
xian(0,1,4,1,1);
xian(0,3,4,3,1);
xian(1,1,1,5,1);
xian(3,1,3,6,1);
xian(6,2,6,4,2);
snake[3][7]=2;
snake[6][0]=1;
print();
P3=0x00;
P1=0x00;
if(d==0)
cun=0;
break;
case 2://选择速度等级的界面
number(v,2,1,1,0);
snake[3][6]=2;
snake[3][0]=2;
if(d0&&v<9)
{
v++;
while(!d);
}
if(a0&&v>1)
{undefined
v–;
while(!a);
}
print();
}
if(key0)
{
while(!key);
if(f2)
f=1;
else
f++;
}
}
f=0;
cun=0;
for(i=0;i<8;i++)//snake[][]数组的初始化
for(j=0;j<8;j++)
snake[j][i]=100;//100代表空
snake[0][0]=101;snake[0][1]=102;snake[0][2]=103;//大于100代表蛇身,其中最大值代表蛇头,101代表蛇尾。
for(;
史海拾趣
|
第一讲:开发板和软件的操作使用 1、 介绍配件。 2、 安装软件(ICC AVR 和AVR STUDIO)及其使用,包括新建工程、程序下载,仿真调试;整板测试;板上资源。 3、 着重介绍一下USB接口的仿真器。 第二讲:AVR单片机的概述和C语言的基础知识 ...… 查看全部问答> |
|
现场总线是一种开放式、 数字化、多点通信的控制系统局域网络, 是当今自动化领域中最具有应用前景的技术之一。CAN总线是现场总线中的应用热点,CAN总线支持分布式控制和适时控制的串行通信网络。 由于CAN总线具有通信速率高、开放性好、报文短 ...… 查看全部问答> |
|
DS2-电力载波通讯PLC 什么是电力载波通讯PLC技术? 电力载波通讯PLC(英文:Power line communication)是电力系统特有的通信方式,电力载波通讯是指利用现有电力线,通过载波方式将模拟或数字信号进行高速传输的技术。最大特点是不需要重 ...… 查看全部问答> |
|
最近要在原来的板子上添加3G模块,用的是中兴的MC8630,但该模块的AT指令是通过串口来发送接收的,而相关的数据信息是通过USB来进行的 如此一来,我们是这样设想的:在原来的板子上模拟一个虚拟串口来接收上层的AT指令,然后该虚拟串口再把接收到的指令 ...… 查看全部问答> |
|
小弟最近在用mfc编程。用常规定时器定时接收串口中的数据,但是当我点击界面中其它按钮的时候,接收到的串口数据有丢失现象。请问可不可以把常规定时器的优先级设高一些,让其它如鼠标消息的优先级设低一些,从而使接收数据不丢失。 … 查看全部问答> |




