第十七課   用單晶片89C2051-12閃避前方障礙物

89C2051-12的電源電壓是2.7V6V之間, 89C2051-24電源電壓是4.5V5.5V之間, 本自走車採用三顆電池, 4.5V, 因此建議採用89C2051-12 , 以防電壓不足.

  創意自走車套件所附的89C2051已燒錄有練習1的範例程式.

 

例題   閃避前方的障礙物

假若右前方有障礙物, 則左馬達反轉, 左輪後退, 玩具車向左轉 .

假若左前方有障礙物, 則右馬達反轉, 右輪後退, 玩具車向右轉

電路說明:

1  反相器的目的:

89C2051的輸入電壓在1.8V (0.2 *   Vcc+0.9) 以上為1 , CMOS 反相器在2.25V(0.5*Vcc)以上為1 , 比較適合本教材的感測器電路.

2  10KΩ電阻及100μF電容器目的:

在電源開啟時, 讓硬體電路穩定後, 再啟動軟體程式

3        本電路可在創意自走車所附的兩個小麵包板上做出來, 參考右頁圖片.

4        如果要走地面黑色路線 , 請把紅外線感測器朝向地面, 馬達電線的正負端子互換位置 , 程式不必改變. , R1可試改用300Ω,R103MΩ(並兩個6MΩ)

5         Keil公司網站提供免費下載的試用版編譯程式, 編譯後會佔用2K以後的記憶體 , 超出89C2051的記憶範圍 , 不可用.


例題 (程式 1)   ( Keil-C ) 本程式已燒錄在本創意自走車所附的89C2051單晶片中

#include<at892051.h>    // at892051.h 這個檔案裡有各個暫存器對應的記憶位址

main()

{

  while (1)            // 讓程式反覆執行

  {

   if (P1_2==1)        // 如果右前方有障礙物

     P1_3=1;         // 左輪反轉

   if (P1_2==0)       // 如果右前方無障礙物

      P1_3=0;        // 左輪前進

   if (P1_4==1)        //  如果左前方有障礙物

      P1_5=1;        // 右輪反轉

  if (P1_4==0)       // 如果左前方無障礙物

      P1_5=0;        // 右輪前進

   }

}

例題二   閃避前方的障礙物 (先後退再轉彎)  本電路和例題相同

假若右前方有障礙物, 則車子先後退, 再向左轉 .

假若左前方有障礙物, 則向右轉 (不後退)

 

#include<at892051.h>    // at892051.h 這個檔案裡有各個暫存器對應的記憶位址

void delay(unsigned int dly);

main()

{

  while (1)            // 讓程式反覆執行

  {

   if (P1_2==1)        // 如果右前方有障礙物

     {

      P1_3=1;         // 左輪反轉

      P1_5=1;         // 右輪反轉

      delay(100);       // 讓車子後退一段時間

      P1_5=0;      //右輪前進,車子開始向左轉

      delay(40);        // 讓車子轉彎一段時間

   }

   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--;

  }


-------------------------------------------------------------------------------------------------------------------------

例題三  閃避前方的障礙物

假若右前方有障礙物, 則車子左右搖擺五次, 再轉彎前進.

假若左前方有障礙物, 則向右轉 (不後退)

 

#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--;

  }