加载中…
个人资料
舍_子云
舍_子云
  • 博客等级:
  • 博客积分:0
  • 博客访问:1,233
  • 关注人气:49
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

单片机红外遥控小车程序

(2011-08-01 00:49:17)
标签:

it

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++;}
                  else if(d==1) {pwm=1;delay1(0xf8,0x30);pwm=0;delay1(0xb9,0xb0);n++;}
               }
          }
     else delay(0x3c,0xb0);
     return; 
}

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有