有有有,我有啊。
不过,这个程序就是在本站获得的,原理图就是我买的板子的那么几个部分,可以再分享给你。
程序是这样的:
#include <STC89C5xRC.H>
#include<intrins.h>
#define uchar unsigned char
#define lmax 15 //最大长度15
#define smin 50 //速度
sbit SER=P3^4;
sbit SRLCK=P3^6;
sbit RLCK=P3^5;
sbit up=P3^0; //上
sbit down=P3^1; //下
sbit left=P3^2; //左
sbit right=P3^3;//右
uchar lie[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
uchar x[lmax+1],y[lmax+1];
uchar time,n,o;
uchar si=0;
char addx,addy;
void time0()
{
TMOD=0x01;
TH0=0xfc;
TL0=0x18;
ET0=1;
EA=1;
TR0=1;
}
void send(uchar a)
{
int i;
SRLCK=0;
RLCK=0;
for(i=0;i<8;i++)
{
SER=a<<7;
SRLCK=1;
a=a>>1;
SRLCK=0;
}
RLCK=1;
}
void delay(unsigned int i)
{
while (i--);
}
int die()
{
int i,j=0;
if(x[1]>7||y[1]>7)j=1; //碰壁死亡
for(i=2;i<=n;i++) //自撞死亡
{
if(x==x[1]&&y==y[1])
{
j=1;
}
}
return j;
}
void anjian()
{
if(!up){addx=0;if(addy!=-1)addy=1;else addy=-1;}
if(!down){addx=0;if(addy!=1)addy=-1;else addy=1;}
if(!right){addy=0;if(addx!=-1)addx=1;else addx=-1;}
if(!left){addy=0;if(addx!=1)addx=-1;else addx=-1;}
}
uchar mux(uchar a)
{
if(a==7)return 0x01;
if(a==6)return 0x02;
if(a==5)return 0x04;
if(a==4)return 0x08;
if(a==3)return 0x10;
if(a==2)return 0x20;
if(a==1)return 0x40;
if(a==0)return 0x80;
return 0;
}
void magic1()
{
int i;
for(i=0;i<7;i++)
{
send(lie);
P0=0x00;
delay(20000);
send(0x00);
P0=0xff;
}
for(i;i>=0;i--)
{
send(lie);
P0=0x00;
delay(20000);
send(0x00);
P0=0xff;
}
}
void xianshi(int k)
{
int i;
while(k--)
{
for(i=0;i<=lmax;i++)
{
send(mux(y));
P0=0xff-mux(x);
anjian();
delay(100);
send(0x00); //消隐
P0=0xff;
}
}
}
void main()
{
int i;
o=smin;
time0();
while(1)
{
P3=0xff;
x[0]=5;y[0]=4;//食物
x[1]=0;y[1]=1;//蛇头
x[2]=0;y[2]=0;//蛇尾
n=2; //初始长度
addx=0;addy=0;
for(i=3;i<=lmax;i++){x=10;y=10;} //初始化赋值
while(1) //初始化显示
{
if(!up||!down||!left||!right)break;
xianshi(1);
}
while(1)
{
xianshi(o);
if(die()){o=smin;magic1();break;}//死亡判断
if(x[1]==x[0]&&y[1]==y[0]) //是否吃到食物
{
n++;
if(n==lmax)
{
n=2;o=o-10;
for(i=3;i<lmax+1;i++)
{
x=100;
y=100;
}
}
x[0]=si%8; //随机数0~8
y[0]=si%8;
}
for(i=n;i>1;i--){x=x[i-1];y=y[i-1];} //移动
x[1]=x[2]+addx;y[1]=y[2]-addy;
}
}
}
void Time00() interrupt 1 //中断1
{
TH0=0xfc;
TL0=0x18;
si++;
if(si==100)
{
si=0;
}
}
相关的电路原理图是这样的:
程序、硬件是经过运行检验过的。
|