http://s3/middle/5221e813ta9604eb84d82&690
http://s7/middle/5221e813taaaababf9356&690
纯手工作品,车底用三夹板做的,车头部分做了好久,不过还是蛮灵活的。
程序已通过实际电路测试
#include<reg52.h>
#define uchar unsigned char
sbit ultra_red=P3^2; //红外接受端
sbit rs=P1^0;
sbit rw=P1^1;
sbit en=P1^2;
sbit a=P1^4;
sbit b=P1^5;
sbit pwm=P1^3;
uchar n,m,dat[4]=0;
bit r,ff=0,bb=0,c,d;
uchar code
table0[]={0x04,0x04,0x04,0x15,0x15,0x15,0x04,0x0C};//小
uchar code
table1[]={0x04,0x1F,0x08,0x14,0x1F,0x04,0x1F,0x04};//车
uchar code table2[]="Stop!";
uchar code table3[]="Forward!";
uchar code table4[]="Backward!";
uchar code table5[]="Turn left!";
uchar code table6[]="Turn right!";
uchar code table7[]="Forward left!";
uchar code table8[]="Forward right!";
uchar code table9[]="Backward left!";
uchar code table10[]="Backward right!";
////////////////////////////////////////////////////////
void delay(uchar H,uchar L)
{ TH0=H;TL0=L;
TF0=0;
while(!TF0);
}
void delay1(uchar H,uchar L)
{ TH0=H;TL0=L;
TF0=0;
while(!TF0) if(ultra_red==0)
n=0;
}
/////////////////////////////////////////////////////
void w_comd(uchar i)
{ en=1;rs=0;rw=0;
P0=i;
delay(0xff,0xce);
en=0;
delay(0xff,0xce);
}
////////////////////////////////////////////////
void w_data(uchar i)
{ en=1;rs=1;rw=0;
P0=i;
delay(0xff,0xce);
en=0;
delay(0xf8,0x30);
}
////////////////////////////////////////////////
void set_lcd1602()
{ w_comd(0x01);
delay(0xf9,0x98);
w_comd(0x02);
delay(0xf9,0x98);
w_comd(0x38);
w_comd(0x0c);
w_comd(0x06);
}
//////////////////////////////////////////////
void set_lcd1602_cgram(uchar addr,uchar *i)
{ uchar j;
w_comd(addr);
for(j=0;j<8;j++)
{ w_data(*i);
i++;
}
}
//////////////////////////////////////////////////
void view_lcd1602(uchar addr,uchar *i)
{ w_comd(addr);
while(*i>0)
{ w_data(*i);
i++;
}
}
/////////////////////////////////////////////
void display_lcd1602(uchar m)
{
switch(m)
{ case
0:w_comd(0x84);w_data(0x00);w_data(0x01);view_lcd1602(0x87,table2);break;
case
1:w_comd(0x82);w_data(0x00);w_data(0x01);view_lcd1602(0x85,table3);break;
case
2:w_comd(0x82);w_data(0x00);w_data(0x01);view_lcd1602(0x85,table4);break;
case
3:w_comd(0x81);w_data(0x00);w_data(0x01);view_lcd1602(0x84,table5);break;
case
4:w_comd(0x81);w_data(0x00);w_data(0x01);view_lcd1602(0x84,table6);break;
case
5:w_comd(0x87);w_data(0x00);w_data(0x01);view_lcd1602(0xc1,table7);break;
case
6:w_comd(0x87);w_data(0x00);w_data(0x01);view_lcd1602(0xc1,table8);break;
case
7:w_comd(0x87);w_data(0x00);w_data(0x01);view_lcd1602(0xc1,table9);break;
case
8:w_comd(0x87);w_data(0x00);w_data(0x01);view_lcd1602(0xc0,table10);break;
}
}
//////////////////////////////////////////////
void main()
{ TMOD=0x01;
TR0=1;
IT0=1;
EA=1;
P1=0;
set_lcd1602();
set_lcd1602_cgram(0x40,table0);
set_lcd1602_cgram(0x48,table1);
while(1)
{ if(ff==0 &&
bb==0) m=0;
else
if(ff==1 && bb==0) m=1;
else
if(ff==0 && bb==1) m=2;
w_comd(0x01);delay(0xf9,0x98);
display_lcd1602(m);
r=0;
dat[4]=0;
c=1;d=1;
EX0=1;
while(!r)
{ pwm=0x01;
delay(0xfa,0x24);
pwm=0;
delay(0xb7,0xbc);
}
}
}
////////////////////////////////////////
void int1()interrupt 0
{
uchar
i,j;
EX0=0;
dat[4]=0;n=0;
delay(0xf8,0x30);
if(ultra_red)
{ r=1;
return;
}
while(!ultra_red) delay(0xff,0x9c);
while(ultra_red) delay(0xff,0x9c);
for(i=0;i<4;i++)
for(j=0;j<8;j++)
{ while(!ultra_red) delay(0xff,0x9c);
while(ultra_red)
{ delay(0xff,0x9c);
n++;
}
dat[i]>>=1;
if(n>6) dat[i]=dat[i]|0x80;
n=0;
}
if(dat[2]==~dat[3])
{ switch(dat[2])
{
case 0x0c: ff=~ff;if(bb==1) bb=0;break;
case 0x08: bb=~bb;if(ff==1) ff=0;break;
case 0x1c: c=0;break;
case 0x5a: d=0;break;
}
}
else
{dat[4]=0;}
r=1;
if(ff==1
&& bb==0) {a=1;b=0;}
else
if(ff==0 && bb==1) {a=0;b=1;}
else
{a=0;b=0;}
n=0;
if(c==0|d==0)
{ if(ff==0 &&
bb==0 && c==0
&& d==1) m=3;
else if(ff==0 && bb==0
&& c==1
&& d==0) m=4;
else
if(ff==1 && bb==0
&& c==0
&& d==1) m=5;
else
if(ff==1 && bb==0
&& c==1
&& d==0) m=6;
else
if(ff==0 && bb==1
&& c==0
&& d==1) m=7;
else
if(ff==0 && bb==1
&& c==1
&& d==0) m=8;
w_comd(0x01);delay(0xf9,0x98);
display_lcd1602(m);
while(n<=6)
{ if(c==1)
{pwm=1;delay1(0xfc,0x18);pwm=0;delay1(0xb5,0xc8);n++;}
else if(d==1)
{pwm=1;delay1(0xf8,0x30);pwm=0;delay1(0xb9,0xb0);n++;}
else {delay1(0xb1,0xe0);n++;}
}
}
else delay(0x3c,0xb0);
return;
}
////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
#include<reg52.h>
#define uchar unsigned char
sbit ultra_red=P3^2; //红外接受端
sbit a=P0^1;
sbit b=P0^2;
sbit pwm=P1^0;
uchar n,dat[4]=0;
bit r,ff=0,bb=0,c,d;
////////////////////////////////////////////////////////
void delay(uchar H,uchar L)
{ TH0=H;TL0=L;
TF0=0;
while(!TF0);
}
void delay1(uchar H,uchar L)
{ TH0=H;TL0=L;
TF0=0;
while(!TF0) if(ultra_red==0)
n=0;
}
//////////////////////////////////////////////
void main()
{ TMOD=0x01;
TR0=1;
IT0=1;
EA=1;
P0=1;
while(1)
{ if(ff==1
&& bb==0) {a=1;b=0;}
else
if(ff==0 && bb==1) {a=0;b=1;}
else
{a=0;b=0;}
r=0;
dat[4]=0;
c=1;d=1;
EX0=1;
while(!r)
{ pwm=0x01;
delay(0xfa,0x24);
pwm=0;
delay(0xb7,0xbc);
}
}
}
////////////////////////////////////////
void int1()interrupt 0
{
uchar
i,j;
EX0=0;
dat[4]=0;n=0;
delay(0xf8,0x30);
if(ultra_red)
{ r=1;
return;
}
while(!ultra_red) delay(0xff,0x9c);
while(ultra_red) delay(0xff,0x9c);
for(i=0;i<4;i++)
for(j=0;j<8;j++)
{ while(!ultra_red) delay(0xff,0x9c);
while(ultra_red)
{ delay(0xff,0x9c);
n++;
}
dat[i]>>=1;
if(n>6) dat[i]=dat[i]|0x80;
n=0;
}
if(dat[2]==~dat[3])
{ switch(dat[2])
{
case 0x05: ff=~ff;if(bb==1) bb=0;break;
case 0x1b: bb=~bb;if(ff==1) ff=0;break;
case 0x07: c=0;break;
case 0x09: d=0;break;
}
}
r=1;
n=0;
if(c==0|d==0)
{
while(n<=6)
{ if(c==1)
{pwm=1;delay1(0xfc,0x18);pwm=0;delay1(0xb5,0xc8);n++;}