Obstacle avoidance by microcontroller AT89C2051-12

 

Ex 1   Obstacle avoidance

The Left motor turn reverse and car turn left when obstacle in right front of car

The right motor turn reverse and car turn right when obstacle in left front of car

89c2051-A

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

:

1  Why use Invertor 

for 89C2051 , input voltage higher than 1.8V (0.2 * Vcc+0.9) make  digital 1 ,but   for CMOS invertor , 2.25V(0.5*Vcc) make digital l  , The IR receiver circuit is easy to have voltage lower then 2.25 , but is difficult  to get smaller voltage then 1.8V.

2  the purpose of 10KΩ and 100μF

Let soft program start latter when hardware  became stable after power on.

 

3        for line follower  , please turn IR head to the ground , and change power lines of motors  . The program don’t need to change ,  R1 may try  300Ω or 150Ω,


Program 1   obstacle avoidance      ( Keil-C )

 

#include<at892051.h>    // memory address for register and I/O are in file at892051.h  

main()

{

  while (1)

  {

   if (P1_2==1)        // IF obstacle in right front

     P1_3=1;         // left motor turn reversely

   if (P1_2==0)       // If no obstacle in right front

      P1_3=0;        // left motor turn forward

   if (P1_4==1)        //  IF obstacle in left front

      P1_5=1;        // right motor turn reversely

  if (P1_4==0)       // If no obstacle in left front

      P1_5=0;        // right motor turn forward

 

   }

}

 

 

 

 

Ex2   See obstacle , reverse than turn

IF obstacle in right front :  Car reverse ---turn left ----go forward

. IF obstacle in left front :  Car turn right ( no reverse)

 

#include<at892051.h>  

void delay(unsigned int dly);

main()

{

  while (1)          

  {

   if (P1_2==1)      

     {

      P1_3=1;        

     P1_5=1;        

     delay(100);       // car reverse a few seconds

      P1_5=0;      // right motor go forward , car turn left.

      delay(40);        // delay seconds

   }

   if (P1_2==0)       // If no obstacle in right front

      P1_3=0;        // left motor go forward

      delay(1);        // wait for dispear of interference

   if (P1_4==1)        //  if obstacle in left front

      P1_5=1;        // right motor reverse

      delay(1);        // wait for dispear of interference

 

  if (P1_4==0)       // If no obstacle in left front

      P1_5=0;        // right motor go forward

      delay(1);        // wait for dispear of interference

   }

}

 

 

void delay(unsigned int dly)  // function for delay

 {

   dly=dly*300;

   while (dly>0)

      dly--;

  }

 

Ex3

 

#include<at892051.h>

void delay(unsigned int dly);

unsigned int aa;

main()

{

  while (1)

  {

   if (P1_2==1)

   {

      P1_3=1;

      P1_5=1;

      delay(1);

      for (aa=1;aa<=5;aa=aa+1)

         {

          P1_3=1;

          P1_5=0;

          delay(40);

          P1_3=0;

          P1_5=1;

          delay(40);       

         }

      P1_5=0;

      delay(100);

   }

   if (P1_2==0)

      P1_3=0;

          delay(1);

   if (P1_4==1)

      P1_5=1;

          delay(1);

   if (P1_4==0)

      P1_5=0;

      delay(1);   

  }

}

 

void delay(unsigned int dly)

  {

   dly=dly*300;

   while (dly>0)

      dly--;

  }

.