在學習單片機視頻的同時,我結合開發板上寫了一些基本的例程,這些例程都是用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);
}
車子如下圖: