利用51芯片製作智能循跡車子

在學習單片機視頻的同時,我結合開發板上寫了一些基本的例程,這些例程都是用c語言寫的,由於當時沒有學過彙編,只是課外有時間的時候看了一下,個人覺得用匯編寫代碼有點麻煩,所以一直都是用c語言寫。這些例程包括實現開發板上一些基本的功能,比如說跑馬燈的實現,數碼管的顯示,蜂鳴器的鳴叫,馬達的轉動等等。在學習完之後想利用51單片機芯片做一個小型的項目,就是練練手,由於我主要是走liinux + arm路線的,所以51這一部分只是一個過渡期,沒有花多大的時間研究。

在網上搜了一下,有人建議我做一個智能循跡小車,簡單的說就是黑線白板,小車在白板上沿着黑線走。想到這個問題的時候有點不可思議,然後在網上看別人做的車子,在黑色的膠帶上走動,說實話很羨慕,自己也想動手做做看。雖然說我會畫pcb,也可以做板子,但是爲了保證硬件不出問題,我就利用別人做的板子,直接在板子上焊接元器件,以及對車子進行組轉,首先需要保證能夠把程序下載到51芯片上,測試了一下沒問題,哈哈……可以了。在看了車子實現功能介紹後,以前那一陣的迷惑的心終於開解了,原來是如此的簡單,大體的說是利用紅外接收和紅外發射裝置來接收和發送信號,在車子跑出黑線的時候,紅外接收管接收到一個電平,既而傳給芯片,最後對馬達進行驅動,不過之前需要對馬達進行一些簡單的測試,比如前進,後退,左轉,右轉,左轉的時候就是讓左邊的馬達不轉,右邊的馬達轉動,就可以實現向左邊轉動,經過兩個禮拜的時間,終於可以讓車子在黑線上走了,在測試發射裝置是否是好的,將車子上電,用攝像頭照着它,在另一端看,有紅光,代表是好的,反之,則壞了,需要換一個。還有一個,下載車子程序之前,寫一段代碼對紅外發射和接收進行測試下,利用led進行測試,紅外裝置在黑色範圍內,led呈現亮的狀態,在外面則是暗的,這是一個很好的方法。

一下是我當初的一些代碼,很短,但是需要對它們瞭解,我感覺在主函數裏少用一些while比較好,否則會出現一些問題。

#include <reg52.h>               

sbit LeftLed = P0^7;                        //定義前方左側指示燈端口

sbit RightLed = P2^0;                      

sbit RightIR = P3^6;                       

sbit LeftIR = P3^7;                         //定義前方左側紅外探頭端口

sbit M1A= P0^0;                            //定義左側電機驅動A端

sbit M1B = P0^1;                            //定義左側電機驅動B端

sbit M2B = P0^2;                           

sbit M2A= P0^3;                         

void Delay()                                                       

{

       unsignedint i = 10000;          

       while(i--);       

}

void Delay1(unsigned int m)

{

       unsignedint i, j;

       for(i = 0; i < m; i++)

              for(j = 0; j < 60; j++);

}

void ControlCar(unsigned char ConType)   

{

       M1A = 0;

       M1B= 0;

       M2A = 0;

       M2B= 0;

       switch(ConType)                        

       {

              case1:  //前進                        

              {   

                     M1A = 1;                               

                     M2A = 1; 

                     LeftLed= 0;

                     RightLed= 0;                  

                     break;

              }

              case2: //後退                         

              {

                     LeftLed= 1;

                     RightLed= 1;

                     M1B= 1;                                

                     M2B= 1;                               

                     break;

              }

              case3: //左轉                         

              {

                     M2A = 1;

                     M1A = 0;

                     LeftLed= 0;

                     RightLed= 1;                          

                     break;

              }

              case4: //右轉                          

              {

                     M1A = 1;

                     M2A = 0;

                     LeftLed= 1;

                     RightLed= 0;                             

                     break;                                        

              }

              case5:

              {

                     LeftLed= 1;

                     RightLed= 1;

                     break;

              }

       }

}

 

void main()                               

{

       if(LeftIR == 0 && RightIR == 0)

       {

              Delay1(100000);

       }                                                    

       if(LeftIR == 0 && RightIR == 1)

       {    

             ControlCar(4);   

              Delay();                 

       }

       if(RightIR == 0 && LeftIR == 1 )                        

       {

              ControlCar(3);                                          

              Delay();

       }

       ControlCar(1); 

}

 

車子如下圖:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章