您的位置:首页 > 其它

微机原理 之“极品飞车”课程设计

2015-07-27 22:28 330 查看
#include<reg51.h>

#define uchar unsigned char
#define uint  unsigned int
#define YAN 1
uchar xdata *q=0xB000;
uchar xdata *w=0xB001;
uchar xdata *e=0xB002;
uchar xdata *r=0xB003;
uchar aa,bb,cc;
int ff;

uchar key;
int f1,f2,f3,f4,f5;

unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F

uchar cord_h;
uchar cord_l;
uchar xdata *keyin=0x8001;
uchar xdata *digit=0x8002;
uchar xdata *xians=0x8004;
int ss;                         //车速
int dd;
int ff1,ff2;                         //车速
char code table1[]={	//车辆前进
0x7c,0x3e,
0x79,0x9e,
0x73,0xce,
0x67,0xe6,
0x4f,0xf2,
0x1f,0xf8,
0x3f,0xfc,
0x7f,0xfe,

0x7f,0xfe,
0x7f,0xfe,
0x7f,0xfe,
0x7f,0xfe,
0x7f,0xfe,
0x7f,0xfe,
0x7f,0xfe,
0x7f,0xfe

};

char code table2[]={	 //车辆后退

0x7f,0xfe,
0x7f,0xfe,
0x7f,0xfe,
0x7f,0xfe,
0x7f,0xfe,
0x7f,0xfe,
0x7f,0xfe,
0x7f,0xfe,

0x7f,0xfe,
0x3f,0xfc,
0x1f,0xf8,
0x4f,0xf2,
0x67,0xe6,
0x73,0xce,
0x79,0x9e,
0x7c,0x3e

};

char code table3[]={	      //车辆左拐
0x00,0x00,
0xff,0x9f,
0xff,0xcf,
0xff,0xe7,
0xff,0xf3,
0xff,0xf9,
0xff,0xfc,
0xff,0xfe,

0xff,0xfe,
0xff,0xfc,
0xff,0xf9,
0xff,0xf3,
0xff,0xe7,
0xff,0xcf,
0xff,0x9f,
0x00,0x00
};

char code table4[]={	    //车辆右拐
0x00,0x00,
0xf9,0xff,
0xf3,0xff,
0xe7,0xff,
0xcf,0xff,
0x9f,0xff,
0x3f,0xff,
0x7f,0xff,

0x7f,0xff,
0x3f,0xff,
0x9f,0xff,
0xcf,0xff,
0xe7,0xff,
0xf3,0xff,
0xf9,0xff,
0x00,0x00
};
char code table5[]={	   //停车

0xff,0xff,
0xff,0xff,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0xff,0xff,
0xff,0xff,
0xff,0xff,

0xff,0xff,
0xff,0xff,
0xff,0xff,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0xff,0xff,
0xff,0xff
};

void delay1(int z)
{
int x,y;

for(x=0;x<z;x++)
for(y=0;y<100;y++)
{	}
}

void qian()
{
int num;
uchar flag;
*e=0x00;
flag=0x01;
for(num=0;num<=14;num=num+2)
{
*r=flag;
flag=flag<<1;
*q=table1[num];
*w=table1[num+1];
delay1(YAN);
}
*r=0x00;
flag=0x01;
for(num=16;num<=30;num=num+2)
{
*e=flag;
flag=flag<<1;
*q=table1[num];
*w=table1[num+1];
delay1(YAN);
}
// P3=dd;
}
void hou()
{
int num;
uchar flag;
*e=0x00;
flag=0x01;
for(num=0;num<=14;num=num+2)
{
*r=flag;
flag=flag<<1;
*q=table2[num];
*w=table2[num+1];
delay1(YAN);
}
*r=0x00;
flag=0x01;
for(num=16;num<=30;num=num+2)
{
*e=flag;
flag=flag<<1;
*q=table2[num];
*w=table2[num+1];
delay1(YAN);
}

}
void ting()
{
int num;
uchar flag;
*e=0x00;
flag=0x01;
for(num=0;num<=14;num=num+2)
{
*r=flag;
flag=flag<<1;
*q=table5[num];
*w=table5[num+1];
delay1(YAN);
}
*r=0x00;
flag=0x01;
for(num=16;num<=30;num=num+2)
{
*e=flag;
flag=flag<<1;
*q=table5[num];
*w=table5[num+1];
delay1(YAN);
}

}

void zuo()
{
int num;
uchar flag;
*e=0x00;
flag=0x01;
for(num=0;num<=14;num=num+2)
{
*r=flag;
flag=flag<<1;
*q=table3[num];
*w=table3[num+1];
delay1(YAN);
}
*r=0x00;
flag=0x01;
for(num=16;num<=30;num=num+2)
{
*e=flag;
flag=flag<<1;
*q=table3[num];
*w=table3[num+1];
delay1(YAN);
}

}
void you()
{
int num;
uchar flag;
*e=0x00;
flag=0x01;
for(num=0;num<=14;num=num+2)
{
*r=flag;
flag=flag<<1;
*q=table4[num];
*w=table4[num+1];
delay1(YAN);
}
*r=0x00;
flag=0x01;
for(num=16;num<=30;num=num+2)
{
*e=flag;
flag=flag<<1;
*q=table4[num];
*w=table4[num+1];
delay1(YAN);
}

}
uchar keyscan(void);

void motor_delay(void)
{
unsigned int i;
for(i=0;i<ss;i++)
;
}

void backward()
{
P1=0xfc;            //P0口低四位脉冲1100
motor_delay();
P1=0xf9;           //P0口低四位脉冲1001
motor_delay();
P1=0xf3;           //P0口低四位脉冲0011
motor_delay();
P1=0xf6;           //P0口低四位脉冲0110
motor_delay();
}

void forward( )	    //左转
{
P1=0xFC;           //P0口低四位脉冲1100
motor_delay();
P1=0xf6;           //P0口低四位脉冲0110
motor_delay();
P1=0xf3;           //P0口低四位脉冲0011
motor_delay();
P1=0xf9;          //P0口低四位脉冲1001
motor_delay();
}
void delay2(int ff)
{
int i,j;
for(i=0;i<ff;i++)
for(j=0;j<150;j++)

;
}

void stop(void)
{
P1=0xff ;          //停止输出脉冲
}
/*
void delay()
{
int i;
for(i=0;i<3277;i++)
;
} */
void main()
{

EA=1;                  //开总中断

ET0=1;                 //定时器T0中断允许
TMOD=0x01;             //使用定时器T0的模式2
TH0=5500/256; //定时器T0的高8位赋初值
TL0=5500%256; //定时器T0的高8位赋初值
TR0=1;                //从0开始累计中断次数
ET1=1;                 //定时器T0中断允许
TMOD=0x10;             //使用定时器T0的模式2
TH1=65036/256; //定时器T0的高8位赋初值
TL1=65036%256; //定时器T0的高8位赋初值
TR1=1;
ff1=ff2=1;
f1=f2=f3=f4=0;
f5=1;
while(1)
{

dd=0;
ss=3000;

if(key==0x08||key==0x02||key==0x04||key==0x06||key==0x05)
{
if(key==0x08) //前进
{
f1=1;
f2=f3=f4=f5=0;
AA:while(key!=0x02&&key!=0x05)
{
if(ff1)
{
ss=3000;
dd=0;
ff1=0;
}
if(key==0x08)
{
if(ss-150>2000)
ss=ss-150;
else if(ss-80>1000)
ss=ss-80;
else if(ss-50>300)
ss=ss-50;
if(dd<=255)
dd=dd+0x07;

}
aa=dd/100;
bb=(dd%100)/10;
cc=dd%10;

backward();

if(key==0x04)
{
f2=1;
f1=f3=f4=f5=0;
}
else if(key==0x06)
{
f3=1;
f1=f2=f4=f5=0;
}
else if(key==0x08)
{
f1=1;
f2=f3=f4=f5=0;
}

}
if(key==0x02)
{
ff2=1;
goto BB;
}
else if(key==0x05)
stop();

}
else if(key==0x02)
{

f4=1;
f1=f3=f2=f5=0;
BB: while(key!=0x08&&key!=0x05)
{
if(ff2)
{
ss=3000;
dd=0;
ff2=0;
}
if(key==0x02)
{
if(ss-150>2000)
ss=ss-150;
else if(ss-80>1000)
ss=ss-80;
else if(ss-50>300)
ss=ss-50;
if(dd<=255)
dd=dd+0x07;
}
aa=dd/100;
bb=(dd%100)/10;
cc=dd%10;

forward( );

if(key==0x02)
{
f4=1;
f1=f2=f3=f5=0;
}
else if(key==0x04)
{
f2=1;
f1=f3=f4=f5=0;
}
else if(key==0x06)
{
f3=1;
f1=f2=f4=f5=0;
}
}
if(key==0x08)
{
ff1=1;
goto AA;
}
else if(key==0x05)
stop();
}

else if(key==0x05)	   //停车
{
f5=1;
f1=f2=f3=f4=0;
while(key!=0x08&&key!=0x02)
{
aa=bb=cc=0x00;

stop();

if(key==0x05)
{
f5=1;
f1=f2=f3=f4=0;

}
else if(key==0x04)
{
f2=1;
f1=f3=f4=f5=0;
}
else if(key==0x06)
{
f3=1;
f1=f2=f4=f5=0;
}
}
if(key==0x08)
goto AA;
else if(key==0x02)
goto BB;
}

}

}
}

void Time0(void) interrupt 1 using 1 //"interrupt"声明函数为中断服务函数
//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器
{
TR0=0;
if(f1)
qian();
else if(f4)
hou();
else if(f2)
zuo();
else if(f3)
you();
else if(f5)
ting();

TH0=5500/256; //定时器T0的高8位赋初值
TL0=5500%256; //定时器T0的高8位赋初值
TR0=1;
}

void Time1(void) interrupt 3 using 2 //"interrupt"声明函数为中断服务函数
//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器
{
TR1=0;
cord_l=0;
*digit=0x3b;
*keyin=0xff;
cord_h=*keyin;
if(cord_h-0x0f!=0x00)
{
if(cord_h==0x0E)
cord_l=0x0d;
if(cord_h==0x0d)
cord_l=0x0c;
if(cord_h==0x0B)
cord_l=0x0b;
if(cord_h==0x07)
cord_l=0x0a;

}
else
{
*digit=0x37;
*keyin=0xff;
cord_h=*keyin;
if(cord_h-0x0f!=0x00)
{
if(cord_h==0x0e)
cord_l=0x0e;
if(cord_h==0x0d)
cord_l=0x03;
if(cord_h==0x0b)
cord_l=0x06;
if(cord_h==0x07)
cord_l=0x09;

}
else
{
*digit=0x2f;
*keyin=0xff;
cord_h=*keyin;
if(cord_h-0x0f!=0x00)
{
if(cord_h==0x0e)
cord_l=0x0f;
if(cord_h==0x0d)
cord_l=0x02;
if(cord_h==0x0b)
cord_l=0x05;
if(cord_h==0x07)
cord_l=0x08;

}
else
{
*digit=0x1f;
*keyin=0xff;
cord_h=*keyin;
if(cord_h-0x0f!=0x00)
{
if(cord_h==0x0e)
cord_l=0x00;
if(cord_h==0x0d)
cord_l=0x01;
if(cord_h==0x0b)
cord_l=0x04;
if(cord_h==0x07)
cord_l=0x07;

}
}
}
}
key=cord_l;

*xians=dofly[aa];
*digit=0x04;
delay2(1);
*xians=dofly[bb];
*digit=0x02;
delay2(1);
*xians=dofly[cc];
*digit=0x01;
delay2(1);

TH1=50000/256; //定时器T0的高8位赋初值
TL1=50000%256; //定时器T0的高8位赋初值
TR1=1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: