第十六課  創意組合應用 動動腦思考

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

         

 

想一想如何控制小車做下列動作::

拍手--前進幾秒後

又後退幾秒後停住

 

 

 
 


 

 


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

 

用單晶片89C2051-12控制創意自走車閃避前方的障礙物

http://www.me.tnit.edu.tw/~me017

 

例題   閃避前方的障礙物

 

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

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

電路說明:

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Ω


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

  }