专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

红外遥控及智能小车程序

作者:佚名   来源:本站原创   点击数:  更新时间:2011年07月04日   【字体:
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit inl1=P2^0;   //左电机输出1
sbit inl2=P2^1;   //左电机输出2
sbit inr1=P2^2;   //右电机输出1
sbit inr2=P2^3;   //右电机输出2
sbit s_left=P2^4; //左传感器
sbit s_right=P2^5; //右传感器
sbit s_mid=P2^6;  // 中间传感器
sbit barrier=P2^7;//障碍物扫描传感器
sbit beep=P1^0;//探到铁报警接蜂鸣器
uint b_count=0;// 障碍物扫描位置基数
uchar alter_time=0;//报警计数值
uchar go_go=1;//小车前进中断标志
sbit  left_light=P1^2;
sbit  right_light=P1^1;
uchar second=0;
sbit P32=P3^2;
uchar b_left,b_right;
/****红外遥控程勋数据****/
        uchar irtime;
 uchar startflag;
 uchar irdata[33];
 uchar irreceok;
 uchar irproseok;
 uchar dis[8];
 uchar bitnum;
 uchar cd,flag,yaokong;
 uchar ircode[4];
 uchar right=0,left=0,stop_stop=0,model=0;
 uchar kuai;
   void stop(void);
   void delay(uint a);
 void ir_key()   //遥控键盘识别
{
 
  if(ircode[2]==0x51&&ircode[3]==0xAE&&flag==1)
  {
    yaokong=~yaokong;    //打开遥控模式
   flag=0;
  }
  
   if(ircode[2]==0x55&&ircode[3]==0xAA&&flag==1) //前进后退模式选择
    {
        model=~model;
     right=0;
            left=0;
         flag=0;
    }

    if(ircode[2]==0x56&&ircode[3]==0xA9&&flag==1)
    {           //遥控前进标志位
      stop_stop=~stop_stop;
   left=0;
            right=0;
      flag=0; 
    }

   if(ircode[2]==0x17&&ircode[3]==0xE8&&flag==1)  //遥控左拐标志位
    {
        left=1;
    
           right=0;
           stop_stop=0;
        flag=0;
    } 
if(ircode[2]==0x16&&ircode[3]==0xE9&&flag==1)   //遥控右转标志位
    {
   
     right=1;
   
            stop_stop=0;
   left=0;
   flag=0;
    }
 if(ircode[2]==0x11&&ircode[3]==0xEE&&flag==1)   //遥控右转标志位
    {
   
     kuai=~kuai;
   flag=0;
    }
}
void timer1init()  //定时器1初始化
{
  TMOD=0x21;
 TH1=0x00;
 TL1=0x00;
 ET1=1;
        TR1=1;
}

void int1init()    //外部中断1初始化
{
  IT1=1;
 EX1=1;
 EA=1; 
}
void irpros(void)  //红外处理函数
{

 uchar k,j,i;
 uchar value;
 k=1;
   for(j=0;j<4;j++)
   {
  for(i=0;i<8;i++)
  {
  value=value>>1;
  if(irdata[k]>6)
  {
    value=value|0x80;
  }
  k++;
  }
  ircode[j]=value;

  }
 irproseok=1;

}
void irwork()  //红外解码函数
{
 uchar i;
    dis[0]=ircode[0]/16;
   dis[1]=ircode[0]%16;
   dis[2]=ircode[1]/16;
   dis[3]=ircode[1]%16;
   dis[4]=ircode[2]/16;
   dis[5]=ircode[2]%16;
   dis[6]=ircode[3]/16;
   dis[7]=ircode[3]%16;
 for(i=0;i<8;i++)
 {
   if(dis[i]>9)
  {
    cd=dis[i]-9;
   dis[i]=0x10+cd;
  }
} 
  flag=1;

}
void  inti() //初始化定时器0,中断0
{ P2=0xff;
        P0=0xff;
 P1=0xff;
 P3=0xff;
 EX0=1;
 IT0=1;
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 ET0=1;
        TR0=0;
}
void delay(uint a)    ////延时 1ms
{ 
 int i;
 for (; a>0; a--)
  for(i=0; i<110; i++);
}
void  go_along(void)    //直走
{
 inl1=1;
 inl2=0;

 inr1=1;
 inr2=0;
}
void  go_left(void)    // 向左转
{  left_light=0;
 inl1=0;
 inl2=0;


 inr1=1;
 inr2=0;
}
void  go_right(void) //向右转
{ right_light=0;
 inl1=1;
 inl2=0;


 inr1=0;
 inr2=0;
}
void go_back(void) //后退
{
 inl1=0;
 inl2=1;

 inr1=0;
 inr2=1; 
}

void left_back(void)  //左转弯后退
{ left_light=0;
 inl1=0;
 inl2=0;

 inr1=0;
 inr2=1;  
}

void right_back(void) //右转弯后退
{ right_light=0;
 inl1=0;
 inl2=1;

 inr1=0;
 inr2=0;  
}
 
void stop(void)    //停止
{
 inl1=0;
 inl2=0;
 
 inr1=0;
 inr2=0;
}

void kill_stop(void)   //杀停
{
 inl1=1;
 inl2=1;
 
 inr1=1;
 inr2=1; 
}
/***************先扫描中间传感器如不再黑线上刹停,扫描
左右两个传感器,如果左边在黑线上,向右转,如果右边在黑
向上向左转知道都在黑向上前进*******************/
void scan_sensor(void)   //扫描前面传感器 并前行
{
      if(s_mid==1)
 {
          kill_stop();
       delay(3);
    stop();
    delay(3);
  if (s_right==0)
 { 
  go_right();
  delay(7);
  
 }
 else
 if (s_left==0)
 {
  go_left();
  delay(7);
 }
 else {
       stop();
       delay(4);
       go_along();
       delay(5);
   }
      }
   else{ 
      kill_stop();
    delay(3);
    stop();
    delay(3);
   if(s_right==0)
   {
     go_right();
  delay(6);
   }
   else
   if(s_left==0)
    {
      go_left();
   delay(6);
     }
  else {
     go_along();
     delay(6);
  }
  }
 
}
/**********如果遇见障碍物先向左转到180度还有障碍物,
之后向右转到没有障碍物为止之后前进***************/ 
void bizhang() //避开障碍物函数
{   
 if(barrier==0)
 { if(b_count<=100)
   {
     go_left();
     delay(5);
     b_count++;  
   }
   else{
            left_back();
         delay(10);
       }
 }
 else{  if(b_left==1)
        {
       go_left();
    delay(50);
   b_left=0;
       }
    if(b_right==1)
        {
       left_back();
    delay(50);
    b_right=0;
       }
    go_along();
    delay(5);
         b_count=0;
   }
}
/****发现铁片则停止三秒钟****/
void fironalter()    //发现铁报警清楚函数
{      
 if(second==3)
  {
            second=0; 
     beep=1;
     go_along();
      delay(300);
     EX0=1; 
            go_go=1;
   }
} 
main()
{   
     int1init();
     timer1init();
     inti();
   while(1)
   {    
     if(irreceok)
    {
      irpros();
   irreceok=0;
    }
    if(irproseok)
    {
      irwork();
   irproseok=0;
    }
    ir_key();
      if(yaokong==0xff)    //遥控模式
        { if(kuai==0)
     { stop();
   delay(5);
      }
   if(model==0)   //前行模式
   { if(go_go==1)
    {
     if(left==0xff)
     {   stop();
         delay(2);
        go_left();
     delay(5);
      }
      else
      if(right==0xff)
      {  stop();
         delay(2);
         go_right();
      delay(5);
      }
      else
      if(stop_stop==0xff)
      {     stop();
         delay(5);
       
      }
      else
      {
        go_along();
     delay(5);
      }
     }
      else
          {
           stop();
           delay(5);
     }
   }
   
   else    //后退模式
   {  if(go_go==1)
   {
    if(left==0xff)
     {  stop();
         delay(2);
        left_back();
     delay(5);
      }
      else
      if(right==0xff)
      {  stop();
         delay(2);
         right_back();
      delay(5);
      }
      else
      if(stop_stop==0xff)
      {  stop();
     delay(5);
       
      }
      else
      {
        go_back();
     delay(5);
      }
    }
   else
   {
     stop();
     delay(5);
    }
   }
   left=0;
   right=0;

  }
  else   //循迹模式
  {
       if(go_go==1)
          {     stop();
            delay(5);
         if(s_right==0&&s_left==0&&s_mid==0)
                 bizhang();
      else 
         scan_sensor();
        }
      else
       {
          stop();
       }
  }
   fironalter();
   left_light=1;
   right_light=1;
 }
}
 


 void int0()  interrupt 0
 {
   beep=0;
   kill_stop();
   delay(10);
   alter_time=0;
   TR0=1;
   go_go=0;
   EX0=0;
 }
 void  timer0()   interrupt 1
 {
 
  TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 alter_time++;
        if(alter_time==20)
  {
     alter_time=0;
                   second++;
    }
}
 void timer1() interrupt 3
{
  irtime++;
}
 void int1() interrupt 2
 {
   if(startflag)
 {
  if(irtime>32)
  {
    bitnum=0;
  }
  irdata[bitnum]=irtime;
  irtime=0;
  bitnum++;
  if(bitnum==33)
  {
    bitnum=0;
   irreceok=1;
  }
 
 }
 else
 {
   startflag=1;
  irtime=0;
 }
 
 }         
关闭窗口

相关文章