基于51单片机的点阵贪吃蛇

发布者:满足的36号最新更新时间:2020-04-29 来源: eefocus关键字:51单片机  点阵贪吃蛇  独立按键 手机看文章 扫描二维码
随时随地手机看文章

这是基于51单片机的贪吃蛇小游戏,用四个独立按键控制上下左右,用8*8点阵作为显示


程序如下:


#include

#include

#include

 

#define SNAKE 20

 

unsigned char x[SNAKE];        //存放蛇的X轴坐标

unsigned char y[SNAKE];        //存放蛇的Y轴坐标

 

unsigned char point_x;         //存放果实的X轴坐标

unsigned char point_y;         //存放果实的Y轴坐标

/*

//点阵模块接口定义

sbit LEDARRAY_LAT = P3^6;//储存寄存器是时钟

sbit LEDARRAY_CLK = P3^5;//移位寄存器时钟输入端

sbit LEDARRAY_DI = P3^4;//串行数据输入端

sbit up    = P3^0;

sbit down  = P3^1;

sbit left  = P3^2;

sbit right = P3^3;

unsigned char num[8][8]={

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0

};//定义8*8数组作为清屏数据(有点走弯路,也就不改了自己有能力可以自己改)

 

 

 

 

unsigned char move_flag=0;        //移动标志, 1 上,2 下,3 左,4 右;

unsigned char snake=3;            //蛇身长度   

unsigned int flag=1;              //是否需要生成果实

 

 

//SPI通信函数 发送一个直接数据给点阵模块

void Send_Byte( unsigned char dat)

{

unsigned char i;//循环次数数变量

LEDARRAY_CLK = 0;//拉低移位时钟

_nop_();

LEDARRAY_LAT = 0;//拉低储存时钟

_nop_();

 

for( i = 0 ; i < 8 ; i++ ) //?循环8次写入一个字节数据

{

if( dat&0x01 )

{

LEDARRAY_DI = 1;

}

else

{

LEDARRAY_DI = 0;

}

LEDARRAY_CLK = 1; //上升沿发送数据

// _nop_();

LEDARRAY_CLK = 0;

// _nop_();

dat >>= 1;

}

}

 

void chang_num()            //这个函数用来转码,把8*8数组中的‘0’,‘1’按列写成十六进制

{ int i,j;

for(j=0;j<8;j++) 

{

for(i=7;i>=0;i--)    

{  

Dis_num[j]*=2;  

Dis_num[j]+=num[i][j]&0x01;  

}

}

}

 

void Display(unsigned char* Dis_dat,delay)     //显示函数

{

unsigned char k, temp;

unsigned int i;

for(i = 0 ; i < delay ; i++)

{

temp = 0x7f;

for(k = 0 ; k < 8 ; k++) //一个字节8byte

{

Send_Byte(temp); //列选择

Send_Byte(Dis_dat[k]); //行数据

LEDARRAY_LAT =1;         //锁存数据

_nop_();

LEDARRAY_LAT = 0;

_nop_();

temp = (temp>>1)|0x80;

}

}

}

void key()

{

if(move_flag!=2&&(!up))

{

move_flag=1;

}

if(move_flag!=1&&(!down))

{

move_flag=2;

}

if(move_flag!=4&&(!left))

{

move_flag=3;

}

if(move_flag!=3&&(!right))

{

move_flag=4;

}

}

 

void move()       //这个函数是让蛇走起来的,如果蛇现在向上走就把蛇尾所在坐标改为0,把蛇头上方所在坐标改为1.其他同理

{

unsigned int i;

if(move_flag==1)

{

for(i=snake;i>0;i--)

{

x[i+1]=x[i];

y[i+1]=y[i];

}

x[1]=x[1]-1;

y[1]=y[1]; 

}

if(move_flag==2)

{

for(i=snake;i>0;i--)

{

x[i+1]=x[i];

y[i+1]=y[i];

}

x[1]=x[1]+1;

y[1]=y[1]; 

}

if(move_flag==3)

{

for(i=snake;i>0;i--)

{

x[i+1]=x[i];

y[i+1]=y[i];

}

x[1]=x[1];

y[1]=y[1]-1; 

}

if(move_flag==4)

{

for(i=snake;i>0;i--)

{

x[i+1]=x[i];

y[i+1]=y[i];

}

x[1]=x[1];

y[1]=y[1]+1; 

}

}

 

 

 

void bulid_point()        //生成果实函数

{

unsigned int i;  

if((x[1]==point_x)&&(y[1]==point_y))        //判断吃到果实

snake++;        //蛇的长度加1

flag=1;         //标志需要生成果实

}

while(flag)            //生成果实

{

point_x=(unsigned char)(rand()%8);

point_y=(unsigned char)(rand()%8);

for(i=1;i {

if(point_x !=x[i]&&point_y!=y[i])

flag=0;

}

}

}  

 

bit eat()            

{

}

void assign ()     //画蛇函数,在8*8二维数组中画出蛇,把蛇所在的每个坐标改为1

{

unsigned int i,j;

for(i=0;i<8;i++)

{

for(j=0;j<8;j++)

{

num[i][j]=0;

}

}

for(i=1;i {

num[x[i]][y[i]]=1;

}

num[point_x][point_y]=1;

}

 

 

 

void main()

{

snake=3;

//x[0]=4;y[0]=3;

x[1]=4;y[1]=4;

x[2]=4;y[2]=5;

x[3]=4;y[3]=6;

while(1)

{

key();

move();

bulid_point();

//eat();

assign ();

chang_num();

Display(Dis_num,200);

if(x[1]>7||y[1]>7)

{

while(1)

{

num[x[1]][y[1]]=0;

chang_num();

Display(Dis_num,200);

}

}

}  

}

关键字:51单片机  点阵贪吃蛇  独立按键 引用地址:基于51单片机的点阵贪吃蛇

上一篇:基于51单片机的贪吃蛇游戏
下一篇:STC89C52单片机 DAY 4 LED点阵模块

推荐阅读最新更新时间:2024-11-07 11:02

MCS-51单片机的无条件转移指令用法介绍
控制转移指令用于控制程序的流向,所控制的范围即为程序存储器区间,MCS-51系列单片机的控制转移指令相对丰富,有可对64kB程序空间地址单元进行访问的长调用、长转移指令,也有可对2kB字节进行访问的绝对调用和绝对转移指令,还有在一页范围内短相对转移及其它无条件转移指令,这些指令的执行一般都不会对标志位有影响。 MCS-51单片机的无条件转移指令用法介绍 无条件转移指令 这组指令执行完后,程序就会无条件转移到指令所指向的地址上去。长转移指令访问的程序存储器空间为16地址64kB,绝对转移指令访问的程序存储器空间为11位地址2kB空间。 LJMP addr16 ;addr16→(PC),给程序计数器赋予新值(16位地址) AJ
[单片机]
基于51单片机的万用表设计
1 工作原理 万用表是电气、电子行业中常用的仪器之一,本文通过对MCS-51单片机进行电路及软件开发,实现电阻、电感、电容的精确测量,同时利用DDS芯片发生任意频率波形。其系统整体结构框图如图1所示。 单片机取得按键值,从而判断工作模式,具体测量不同类型由硬件或软件选通相应电路。 电阻:被测电阻与内部已知电阻串联,测其公共端电压与两电阻总电压。 电容:采用被测电阻与内部已知电阻构成RC CMOS振荡器,记录其频率通过C=l/πRf求得(C:电容值,R:电阻值,f:频率值)。 电感:利用被测电感与内部已知电容构成LC振荡电路,记录其频率通过 求得(f:频率值,L:电感值,C:电容值)。 频率:将被测信号接
[单片机]
基于<font color='red'>51单片机</font>的万用表设计
MAX7219与51单片机的驳接
  MAX7219是一种高集成化的串行输入/输出的共阴极LED显示驱动器。每片可驱动8位7段加小数点的共阴极数码管,可以数片级联,而与微处理器的连接只需3根线。MAX7219内部设有扫描电路,除了更新显示数据时从单片机接收数据外,平时独立工作,极大地节省了MCU有限的运行时间和程序资源。   MAX7219芯片上包括BCD译码器、多位扫描电路、段驱动器、位驱动器和用于存放每个数据位的8×8静态RAM以及数个工作寄存器。通过指令设置这些工作寄存器,可以使MAX7219进入不同的工作状态。 1 管脚说明   图1是MAX7219的管脚分布图。其中:   (1)DIN 为串行数据输入端。当CLK为上升沿时,数据被载入16 b内部移位寄存
[单片机]
MAX7219与<font color='red'>51单片机</font>的驳接
51单片机驱动16*16点阵程序带原理图
下面是主程序还有一个包含文件完整版本请到 http://www.51hei.com/bbs/dpj-20624-1.html 下载 #include reg52.h #include 74HC595.h #define uchar unsigned char #define uint unsigned int uchar code table_L ={0xff,0x7f, 0xff,0xbf, 0xff,0xdf, 0xff,0xef, 0xff,0xf7, 0xff,0xfb, 0xff,0xfd, 0xff,0xfe, 0x7f,0xff, 0xbf,0xff, 0xdf,0xff,
[单片机]
<font color='red'>51单片机</font>驱动16*16<font color='red'>点阵</font>程序带原理图
多任务 51单片机纯C语言内核V1.03
#include reg52.h #define uchar unsigned char #define uint unsigned int #define ulong unsigned long /* Task_creat(1),Task_creat(2),Task_creat(3) ... ... Task_destroy(2) ... ... Task_destroy(1) ... ... Task_creat(4) ... //---------------------------------------------- TaskOrder - TaskCounter - TaskCountValue
[单片机]
PCF8591与AT89C51单片机的接口程序
  以AT89C51为主器件.I2C总线上连接4个PCF8591芯片,芯片地址分别为(OOOb、OlOb、020b、400b),89C51的P3.6作为SCL信号.P3.7做为SDA信号,每个芯片的模拟输入采用单端方式输入,参考电压VREF选用4.8V。参考电路如下图所示。下面程序为I2c协议、读取4路A,D转换数据以及写入D/A变换数值的C语言代码。
[单片机]
PCF8591与AT89C<font color='red'>51单片机</font>的接口程序
51单片机的串口通信(一)
随着多微机系统的广泛应用和计算机网络技术的普及,计算机的通信功能愈来愈显得重要。计算机通信是指计算机与外部设备或计算机与计算机之间的信息交换。 通信方式 有并行通信和串行通信两种。 并行通信通常是将数据字节的各位用多条数据线同时进行传送 。 图一:并行通信 串行通信是将数据字节分成一位一位的形式在。 图二:串行同行 串行通信的传输方向 单工是指数据传输仅能沿一个方向,不能实现反向传输。 半双工是指数据传输可以沿两个方向,但需要分时进行。 全双工是指数据可以同时进行双向传输。 串行通信常见的错误校验 奇偶校验、循环冗余校验 传输速率(比特率): 比特率是每秒钟传输二进制代码的位数,
[单片机]
<font color='red'>51单片机</font>的串口通信(一)
51 单片机 sprintf 数字格式问题
最近做51小车,期间发现,sprintf在51单片机上发生了一点小意外。 出现意外的源程序如下: #include reg51.h #include stdio.h typedef unsigned char uchar; typedef unsigned int uint; uchar n; uint dat; char buf ; void delay_ms(unsigned int nCount) { unsigned int j = 0,i=0; for (j = nCount; j != 0; j--) for(i = 7960; i != 0; i--); } #define UART #define SENDST
[单片机]
51 单片机 sprintf 数字格式问题
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved