普中51控制火焰传感器_基于普中实验板 51单片机 led点阵贪吃蛇

2023-05-16

主程序:

#include

#include

#include "ds1302.h"

#define uchar unsigned char

#define uint unsigned int

#define max_length 64

#define up 1

#define down 2

#define left 3

#define right 4

sbit k_up=P3^0;

sbit k_down=P3^3;

sbit k_left=P3^2;

sbit k_right=P3^7;

uchar code zong[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};

//显示行的表格数据

uchar code

redblue[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

//显示列的表格数据

uint  speed=2000; //控制速度的变量

uchar  lastx,lasty,gc=2;

//lastx,lasty,用来存最后一节蛇的坐标,gc是控制速度的

uchar idata snakex[max_length],snakey[max_length];

//蛇每一节的坐标,因为变量很多,所以加idata,声明其存储的区

uchar length; //蛇身长度变量

uchar direction;  //蛇头方向

bit live;  //蛇死还是活

uchar foodx,foody;  //食物的坐标

bit exist;

void delay(uchar i)

{

uchar j;

while(i--)for(j=110;j>0;j--);

}

void move();

void init();

void creatfood();

void drawsnake();

void drawfood();

void playgame();

void keyscan();

void eatfood();

void gameover();

bit zwall();

bit zself();

void main()

{

init();

playgame();

gameover();

}

void init() //初始化

{

snakex[0]=1;

snakey[0]=7;

snakex[1]=0;

snakey[1]=7;

length=2;

direction=4;

live=1;

srand(gettime()); //从ds1302读出秒,作为随机数种子

}

void playgame()

{

uint p;

while(k_right);  //按右键开始游戏

delay(5);

while(live)

{

if(zwall()&&zself())

{

if(!exist)creatfood();

exist=1;

eatfood();

for(p=speed;p>0;p--) //循环显示,控制速度

{

drawsnake();

drawfood();

}

move();

}

else live=0;

}

}

void drawsnake()  //显示蛇

{

uchar i;

for(i=0;i

{

P0=zong[snakey[i]];

P2=redblue[snakex[i]];

keyscan(); //键盘扫描加到这里,即起到延时作用,又提高按键灵活性

P0=0;

P2=0xff;

}

}

void creatfood()

{

uchar i;

loop: foodx=((int)rand()%8);

foody=((int)rand()%8);

for(i=0;i

{

if((foodx==snakex[i])&&((foody)==snakey[i]))

goto loop;

}

}

void drawfood() //显示食物

{

if(exist)

{

P0=zong[foody];

P1=redblue[foodx];

keyscan(); //键盘扫描加到这里,即起到延时作用,又提高按键灵活性

P0=0;

P1=0xff;

}

}

void keyscan() //键盘扫描

{

if(k_up==0)

{

delay(5);

if(k_up==0)

{

if(direction!=down)direction=up;

}

}

if(k_down==0)

{

delay(5);

if(k_down==0)

{

if(direction!=up)direction=down;

}

}

if(k_left==0)

{

delay(5);

if(k_left==0)

{

if(direction!=right)direction=left;

}

}

if(k_right==0)

{

delay(5);

if(k_right==0)

{

if(direction!=left)direction=right;

}

}

}

void move()

{

uchar k;

lastx=snakex[length-1];

lasty=snakey[length-1];

for(k=length-1;k>0;k--)

{

snakex[k]=snakex[k-1];

snakey[k]=snakey[k-1];

}

switch(direction)

{

case up: snakey[0]++;

break;

case down: snakey[0]--;

break;

case left: snakex[0]--;

break;

case right: snakex[0]++;

break;

}

}

bit zwall()  //判断是否撞到墙

{

if((snakex[0]>7)||(snakey[0]>7))return

0;

else return 1;

}

bit zself()  //判断是否撞到自己

{

uchar i;

for(i=3;i

{

if((snakex[0]==snakex[i])&&(snakey[0]==snakey[i]))

return 0;

}

return 1;

}

void eatfood()

{

if((snakex[0]==foodx)&&(snakey[0]==foody))

{

length++;

exist=0;

snakex[length-1]=lastx;

snakey[length-1]=lasty;

if(length<20)

{

speed-=gc; //控制速度

gc+=11;

}

else speed-=2;

}

}

void gameover() //游戏结束,全亮

{

P0=0xff;

P2=0;

}

ds1302的驱动程序:

#include

#define uchar unsigned char

sbit ACC7=ACC^7;

sbit ACC0=ACC^0;

sbit scl=P3^6;

sbit sda=P3^4;

sbit rst=P3^5;

void w1byte(uchar date)

{

uchar i;

ACC=date;

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

{

scl=0;

sda=ACC0;

scl=1;

ACC>>=1;

}

}

uchar r1byte()

{

uchar i;

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

{

scl=0;

ACC>>=1;

ACC7=sda;

scl=1;

}

return (ACC);

}

uchar rbyte(uchar command)

{

uchar a;

rst=0;

scl=0;

rst=1;

w1byte(command|0x01);

a=r1byte();

rst=0;

return(a);

}

uchar gettime()

{

uchar readval;

readval=rbyte(0x80);

readval=((readval&0x70)>>4)*10+(readval&0x0f);

return (readval);

}

另外我还做了个基于protues的点阵贪吃蛇,很简单,就画了个图,把键盘扫描改为中断方式,程序没怎么调,速度没调好,懒的调了,可以到http://download.csdn.net/detail/wlx1993/5585257去下载

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

普中51控制火焰传感器_基于普中实验板 51单片机 led点阵贪吃蛇 的相关文章

随机推荐