历史上的今天
返回首页

历史上的今天

今天是: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(;

推荐阅读

史海拾趣

Globaltech Semiconductor Co Ltd公司的发展小趣事

Globaltech的创立可以追溯到21世纪初,当时创始人凭借在电源管理IC设计领域的深厚经验,决定创立一家专注于此领域的公司。公司初期聚焦于线性稳压器和开关稳压器等基础产品的研发,这些产品广泛应用于PC、通讯和消费类电子产品中。通过持续的技术创新和产品优化,Globaltech迅速在市场上站稳脚跟,赢得了多家知名电子制造商的青睐。

GradConn Ltd公司的发展小趣事

在电子行业的快速发展中,GradConn也面临着诸多挑战,如市场竞争加剧、技术更新换代加速等。然而,公司凭借敏锐的市场洞察力和持续的创新精神,不断克服这些挑战,实现了持续发展。GradConn不仅关注当前的市场需求,还积极预测未来的技术趋势,提前布局新产品研发。这种前瞻性的战略眼光使GradConn能够在激烈的市场竞争中保持领先地位,并持续为客户提供优质的产品和服务。

ASPEED Technology公司的发展小趣事

自成立以来,ASPEED Technology一直致力于自主创新技术的研发与客户需求的快速响应。公司拥有一支专业的研发团队,不断推出具有竞争力的新产品和解决方案。同时,ASPEED还积极拓展全球市场,与众多知名企业和机构建立了合作关系,为公司的发展奠定了坚实的基础。正是这种持续的创新与研发精神,使得ASPEED在电子行业中不断发展壮大,成为了一家备受瞩目的企业。

以上五个故事均基于ASPEED Technology公司发展起来的相关事实,展现了公司在并购、产品创新、合作研发等方面的努力和成果。这些故事不仅反映了ASPEED在电子行业中的成长轨迹,也展示了其不断追求卓越、推动行业发展的决心和实力。

Daniel Woodhead公司的发展小趣事

随着技术的不断进步,Daniel Woodhead公司开始将目光投向更广阔的市场。公司推出了一系列基于自家微处理器的电子产品,如个人计算机、服务器和工作站等。这些产品凭借其出色的性能和稳定性,在市场上获得了良好的口碑。同时,公司还加大了品牌宣传力度,通过赞助科技展会和举办技术研讨会等活动,进一步提升了品牌影响力。

Analog Microwave Design公司的发展小趣事

随着通信技术的不断进步,对微波器件的性能要求也越来越高。Analog Microwave Design公司敏锐地捕捉到了这一市场变化,开始致力于研发更高性能的微波器件。经过多次试验和改进,公司成功开发出了一款具有低损耗、高稳定性的微波放大器,这一创新产品在市场上引起了热烈反响。公司凭借这一技术突破,迅速扩大了市场份额,并树立了行业内的技术领先地位。

思瑞浦微电子科技(3PEAK INCORPORATED)公司的发展小趣事

随着市场的不断变化和客户需求的多样化,Analog Microwave Design公司意识到单一的产品线已经无法满足市场需求。为了丰富和完善产品线,公司开始加大对新产品的研发力度。除了继续深耕微波器件领域外,公司还积极拓展相关领域的产品线,如射频模块、天线等。通过不断推出新产品,公司不仅满足了客户的多样化需求,还进一步巩固了市场地位。

问答坊 | AI 解惑

十天学会AVR视频教程

第一讲:开发板和软件的操作使用 1、 介绍配件。 2、 安装软件(ICC AVR 和AVR STUDIO)及其使用,包括新建工程、程序下载,仿真调试;整板测试;板上资源。 3、 着重介绍一下USB接口的仿真器。 第二讲:AVR单片机的概述和C语言的基础知识 ...…

查看全部问答>

嵌入式CAN总线控制器与DSP的接口

现场总线是一种开放式、 数字化、多点通信的控制系统局域网络, 是当今自动化领域中最具有应用前景的技术之一。CAN总线是现场总线中的应用热点,CAN总线支持分布式控制和适时控制的串行通信网络。   由于CAN总线具有通信速率高、开放性好、报文短 ...…

查看全部问答>

DS2-电力载波通讯PLC

DS2-电力载波通讯PLC   什么是电力载波通讯PLC技术?   电力载波通讯PLC(英文:Power line communication)是电力系统特有的通信方式,电力载波通讯是指利用现有电力线,通过载波方式将模拟或数字信号进行高速传输的技术。最大特点是不需要重 ...…

查看全部问答>

单片机破解的常用方法及应对策略

单片机破解的常用方法及应对策略…

查看全部问答>

办公室的[危险品]手雷鼠标

在办公室里看到有人手持一个手雷,你会作何感想?别着急,这很可能就是这样一款手雷鼠标。它的功能跟普通的鼠标完全一样,只是增加了一个手雷的外壳。…

查看全部问答>

如何在驱动中创建虚拟串口与USB通信???

最近要在原来的板子上添加3G模块,用的是中兴的MC8630,但该模块的AT指令是通过串口来发送接收的,而相关的数据信息是通过USB来进行的 如此一来,我们是这样设想的:在原来的板子上模拟一个虚拟串口来接收上层的AT指令,然后该虚拟串口再把接收到的指令 ...…

查看全部问答>

wince 下mfc变成如何改变常规定时器的优先级

小弟最近在用mfc编程。用常规定时器定时接收串口中的数据,但是当我点击界面中其它按钮的时候,接收到的串口数据有丢失现象。请问可不可以把常规定时器的优先级设高一些,让其它如鼠标消息的优先级设低一些,从而使接收数据不丢失。 …

查看全部问答>

sd卡的 RCA作用

小弟目前正在研究SD卡协议相关,对CMD3的Response中的RCA不是很理解,不知道具体作用是做什么的,与读写卡操作时的逻辑地址,物理地址有什么样的关系?…

查看全部问答>

通用寄存器和cpu内部寄存器的区别是?

通用寄存器和cpu内部寄存器的区别是?…

查看全部问答>