很多人對(duì)智能小車比較感興趣,想做但又苦于沒有單片機(jī)基礎(chǔ),所以會(huì)覺得太難沒敢做。其實(shí),人總是對(duì)于未知領(lǐng)域的東西總會(huì)覺得那是很高深的,可并不知道那些“高深”知識(shí)也許只要你邁進(jìn)一小步就能掌握?!叭f事開頭難”就是這個(gè)道理。
下面我們就開始制作過程了
51單片機(jī),以AT89S52為例,AT89c52或STC89c52等常用51單片機(jī)都可以通用。 具體什么是單片機(jī),你可以認(rèn)為是一個(gè)微控制器,并且你可以按你的思路編寫程序到里面,從而達(dá)到智能控制你的小車的目的。 準(zhǔn)備一臺(tái)電腦就可以先開始了。 先下載 編程軟件:keil 程序燒寫軟件:progisp 方便起見再下個(gè)仿真軟件:proteus
接下來先講下51單片機(jī)最小系統(tǒng)板的搭建 準(zhǔn)備材料: 1、焊接工具:電烙鐵,松香(最好不要用焊錫膏),錫焊絲。新手可以加個(gè)烙鐵架,也可自己做一個(gè)。 2、洞洞板或覆銅板1塊(10*15CM); 3、40PIN插座1個(gè); 4、晶振1個(gè)(建議11.592M,以后做其他用時(shí)方便); 5、30P瓷片電容2個(gè); 6、 LED 若干(最好8個(gè)以上); 7、at89s52單片機(jī)一塊; 8、AT isp下載線一條(燒寫程序用); 9、10Uf電解電容一個(gè); 10、10K排阻一個(gè)(9腳的); 11、10K電阻一個(gè); 12、輕觸按鍵1個(gè); 13、2.54間距10PIN牛角座一個(gè)。 AT89S52引腳圖 借助防真軟件Proteus來講下最小系統(tǒng) 因軟件里沒有AT89S52這個(gè)元件,講的時(shí)候用的是89C52,實(shí)際搭建時(shí)只要相應(yīng)引腳接上是一樣的。
這么多引腳,是不是眼睛看花了,覺得引腳太多了。先別急,引腳多是一件好事,想象一下,假如一個(gè)引腳可以控制一個(gè)電機(jī)的轉(zhuǎn)動(dòng)、停止、加速、減速等等(當(dāng)然不僅僅能控制電機(jī)),是不是有點(diǎn)小激動(dòng)呢。也許等你以后弄高大上的東東時(shí),你可能還會(huì)覺得引腳太少了,不夠用呢。 AT89S52可以供我們用的IO口(輸入/輸出口)有四組,每組8個(gè),一共是32個(gè)IO口。所以做個(gè)簡單的避障小車或者循線小車是綽綽有余的。
為了驗(yàn)證最小系統(tǒng)搭建是否正確,我們用Keil編制一個(gè)簡單的程序,然后在仿真軟件Proteus里面模擬一下。 所以請(qǐng)將這兩個(gè)軟件安裝到電腦上(不會(huì)安裝的可以舉手)。紙上談兵階段程序燒寫軟件progisp先不用管他,但是你可以順帶也將其安裝好。 好,請(qǐng)先打開Keil, 怎么安裝KEIL。 一:找到下載好的文件,解壓,打開文件夾,找到C51V900.exe,雙擊開始安裝,點(diǎn)擊Next; 二:在“I agree to all the terms of the preceding.....”前面打勾,再點(diǎn)Next;
在Destination Folder框內(nèi)輸入你要安放的路徑,然后點(diǎn)Next,
四、輸入你的名字與郵箱后,再點(diǎn)Next;
安裝讀條完成后,點(diǎn)擊finish完成安裝;
好,現(xiàn)在可以在你電腦桌面上找到KEIL圖標(biāo),請(qǐng)狠狠地雙擊它: 然后請(qǐng)點(diǎn)擊:project,選擇新建一個(gè)工程文件;
將文件寫個(gè)名字,再找好存放路徑(以后得找得到啊),占保存完成;
彈出對(duì)話框,點(diǎn)開Atmel
在里面找到At89S52芯片,點(diǎn)OK;
再彈出對(duì)話框,點(diǎn)OK;
現(xiàn)在恭喜您,你已經(jīng)建好了一個(gè)工程文件了(是不是覺得自己是個(gè)工程師了?想想還有點(diǎn)小激動(dòng)呢……。) 喂!喂!那個(gè)發(fā)呆的同學(xué)請(qǐng)回過神來……。 接下來我們要干嘛呢,別以為你就可以開始編程了,我們還得再在工程文件里面建立我們的C程序源文件才行,請(qǐng)看這里; 點(diǎn)擊新建圖標(biāo);
是不是發(fā)現(xiàn)你的KEIL里面多了一個(gè)1.TXT文件了;
先別激動(dòng),再聽我講,請(qǐng)看這里: 點(diǎn)擊保存圖標(biāo);
請(qǐng)注意了,這里絕對(duì)是容易弄錯(cuò)的重點(diǎn)了?。。。。。?! 保存時(shí)一定要將文件名以.C為后綴(也就是C源文件);
當(dāng)把這個(gè)C文件(這里以main為文件名,你可以取一個(gè)你喜歡的名字)建好以后,我們還不能直接往里面編程。我們得把它先添加到工程文件的資源里面,具體怎么做方法有很多,我只講一種,其他方法請(qǐng)自行摸索,請(qǐng)看: 右擊Source Group1,在下拉菜單里選擇“Add Files to Group......”;
彈出對(duì)話框里找到剛建好的main.c文件,并選擇中它,點(diǎn)ADD添加,然后Close關(guān)閉對(duì)話框;
在你在工程資源文件視窗里是不是可以找到main.c這個(gè)文件了?
能找到的同學(xué)請(qǐng)為自己喝彩一下,你真不錯(cuò)!因?yàn)槟悻F(xiàn)在開始就真的是一個(gè)程序工程師了!是不是又有點(diǎn)小激動(dòng)呢?好吧,我們開香檳慶祝一下。 “干杯?。?!” “喂,那位同學(xué)你怎么不過來一起喝?” …… “什么,你找不到這個(gè)C文件?!” …… “什么,你想一個(gè)人靜一靜,好吧,你站黑板前面靜一靜吧。” “來,我們接著干杯!” ......
請(qǐng)同學(xué)們把下圖的內(nèi)容寫到main.c這個(gè)文件里面,注意把輸入法換成英文模式。 不用著急,我知道你要說什么,紅框里面的內(nèi)容可以不輸,所以請(qǐng)換成英文模式。 如果你硬要全部寫上,那么請(qǐng)只有在必須輸入中文的時(shí)候才換成中文,是的,連輸個(gè)空格位都請(qǐng)用英文模式。
考慮到有些同學(xué)可能會(huì)輸錯(cuò),而導(dǎo)致后面編譯時(shí)出錯(cuò),我發(fā)下原文。好吧,你可以笑著復(fù)制下面的文字到你的main.c里了: #include'reg52.h' //51單片機(jī)頭文件,以后同學(xué)們可以慢慢研究 void delay(unsigned int time) // 延遲函數(shù)聲明 { unsigned int i,j; //定義變量 i,j for(i=0;i<500;i++) // FOR循環(huán) for(j=0;j<time;j++); // 套嵌FOR循環(huán) } void main() // 主函數(shù)聲明 { P3=~P3; // P3IO口取反 delay(100); // 調(diào)用延時(shí)函數(shù),執(zhí)行100次 }
點(diǎn)擊Project菜單,在里面找到Option for Target...這一欄,狠狠地點(diǎn)它。
彈出設(shè)置窗口,在里面選中Output,并在 Create HEX File前面打勾,然后點(diǎn)OK完成設(shè)置:
然后在找到“Rebuild all target fiels”圖標(biāo)(當(dāng)然也可以是Build圖標(biāo),當(dāng)你只有一個(gè)main.c文件時(shí),作用是一樣的),然后也請(qǐng)狠狠地點(diǎn)它,并注意看下信息框內(nèi)是不是有'0 Error(s), 0 Warning(s)',如果不是的話,說明程序某些地方有錯(cuò)誤或者需要注意的地方,不信的可以把程序里的某個(gè)小標(biāo)點(diǎn)改下試試。
請(qǐng)打開你的Proteus軟件 點(diǎn)擊新建圖標(biāo)(默認(rèn)模式):
點(diǎn)擊保存圖標(biāo),選擇好存放路徑,并命好名字,點(diǎn)保存完成:
選擇元器件模式圖標(biāo),然后狠狠地點(diǎn)P按鈕:
在關(guān)鍵詞里面輸入89C52,然后雙擊右邊查找到的89C52單片機(jī):
這里再看你的元件庫里是不是多了一個(gè) AT89C52 的元件(為什么不是AT89S52?因?yàn)檫@個(gè)軟件里沒有,而它是與S52可以通用的),
然后選中AT89C52后,在右邊的圖紙上面雙擊,就可以把AT89C52單片機(jī)安裝到我們的圖紙上:
然后我們雙擊這個(gè)安裝好的單片機(jī),彈出一個(gè)元器件編輯設(shè)置窗口,注意在Program File這一欄里填入我們先前生成好的HEX文件的路徑,可以點(diǎn)右側(cè)的圖標(biāo)方便找到你的HEX文件:
點(diǎn)OK完成程序的裝入后,我們點(diǎn)Play演示按鈕,是不是可以看到P3口的八個(gè)引腳在交替地紅、藍(lán)閃動(dòng)著:
來我們看下我們講的這個(gè)AT89S52單片機(jī),它有很多的引腳,我們經(jīng)常拿來用的主要有P0、P1、P3、P4四組,每組有八個(gè),一共32個(gè)端口。 以P3組為例:有P3.0~P3.7這八個(gè),這一組里面每一個(gè)都有一個(gè)用法相同的基本功能,就是能夠讀取外部傳過來的電平信號(hào)和向外部輸出電平信號(hào),這樣進(jìn)進(jìn)出出的是不是很有意思?所以叫它們?yōu)镮O口。 細(xì)心的同學(xué)會(huì)發(fā)現(xiàn)P3這組IO口都有一個(gè)另外的名字,比如P3.0又寫了RXD這個(gè)名字,等等。是的,有兩個(gè)名字的端口說明它們還有第二個(gè)功能,具體怎么用我們現(xiàn)在先不要去管它。 想像一下,你的小車上有一個(gè)傳感器和一個(gè)電機(jī),你希望在某個(gè)時(shí)間點(diǎn)上讀取到傳感器的信號(hào),然后你根據(jù)這個(gè)信號(hào)來給電機(jī)下達(dá)一個(gè)命令讓其是正轉(zhuǎn)、反轉(zhuǎn)、停止、加速、減速等等。這時(shí)你只需將傳感器的信號(hào)線接到其中一個(gè)IO口上(比如P3.0),然后將電機(jī)的兩根線(這里先不考慮驅(qū)動(dòng)的問題,驅(qū)動(dòng)可理解為只是把電流電壓放大了)接到另兩個(gè)IO口上(比如P3.1和P3.2)。
為便于觀察,我們將剛才的P3口上全部接上LED燈試一下,來,請(qǐng)?jiān)赑roteus里點(diǎn)停止按鈕結(jié)束剛才的演示;
然后,我們?cè)谠骷J较绿砑右粋€(gè)LED,關(guān)鍵詞輸入LED,在右邊找一個(gè)LED燈珠雙擊添加,好像很多,好吧,就是它了:LED-YELLOW,這是一個(gè)黃色的LED,我喜歡這個(gè),對(duì),就是它了!
然后我們把這個(gè)LED安裝到右側(cè)(安裝8個(gè)),注意先點(diǎn)一下旋轉(zhuǎn)按鈕,讓其轉(zhuǎn)成90度,這樣更美觀,等下也更好連線;
接下來我們點(diǎn)選擇終端模式,找到GND,安裝到圖紙上,并連好線;
好了,現(xiàn)在可以點(diǎn)演示按鈕,是不是容易觀察多了?
現(xiàn)在請(qǐng)對(duì)照你的程序源文件,我們一起來看看: 第一行:#include'reg52.h' reg52.h是一個(gè)52單片機(jī)的頭文件,這個(gè)文件你可以在Keil\C51\INC這個(gè)文件夾里找到,是軟件編寫人員已經(jīng)寫好了的一段代碼,包括一些寄存器的定義等等,你可以在里面按自己的習(xí)慣進(jìn)行修改,比如你可以把P0口改成:ILOVECSR1985,不過以后編程時(shí),凡是遇到要用到P0時(shí),你都必需寫成ILOVECSR1985。我建議你不要這樣做,我會(huì)受不了的。所以你可以理解這個(gè)reg52.h是方便我們編程的,你可以不需要弄明白,但用這個(gè)軟件編程時(shí)不能不寫,除非你是大神。 第二行:void delay(unsigned int time) 這是聲明一個(gè)函數(shù),名字叫delay(),并且這個(gè)函數(shù)執(zhí)行完后沒有值返回。 Void意思就是執(zhí)行完這個(gè)函數(shù)后沒有值返回。 delay(unsigned int time),其中delay是這個(gè)函數(shù)的名字,因?yàn)檫@個(gè)函數(shù)是我們自己編寫的,當(dāng)然也是我們自己給他取的名字,所以delay你可以改成你喜歡的名字,比如I_Love_you,或者dl都可以,但是當(dāng)你需要調(diào)用這個(gè)函數(shù)時(shí)你必須還能記得他的名字,因此函數(shù)名稱這個(gè)是真可以改的,但是無論怎么改名字,后面的()是不能丟掉的,因?yàn)檫@是一種格式。 unsigned int time,是這個(gè)函數(shù)的參數(shù),參數(shù)的名字叫time,并且它的數(shù)據(jù)類型是unsigned int(無符號(hào)的整型變量)。其中的time是我們自己取的名字,所以同樣的道理你也可以改成其他你喜歡的名字。 第三行:{ 他與第七行的:}是一對(duì)完整的格式符號(hào){},他們是成對(duì)出現(xiàn)的,如果只有一個(gè)出現(xiàn),那么就會(huì)像男人少了女人一樣,會(huì)讓整個(gè)程序都“瘋”掉的。你可以把這對(duì)括號(hào)中間包括的所有內(nèi)容都看成是他們的手下,是不允許別人來用他們的,除非是他們的主人,而他們的主人就是前面的delay()。 第四行:是同時(shí)定義了兩個(gè)變量:i 和 j 。你可以同時(shí)定義很多變量,把他們用,(逗號(hào))分開就行。你必需記住:程序里面的所有要用到的變量都必需在要用他們之前先定型數(shù)據(jù)類型的定義。 第五行:for(i=0;i<500;i++)
這是一個(gè)for循環(huán)函數(shù),意思是:i從0開始;判斷i<500是“真”還是“假”。是“真”,讓i=i+1,再執(zhí)行后面的一條語句,接著又進(jìn)行判斷,如此反復(fù)。直到判斷i<500是“假”退出循環(huán)。 第六行:同于第五行,他與第五行形成一個(gè)套嵌的循環(huán)。 第八行:void main()
這是一個(gè)主函數(shù)main(),需要注意的是每個(gè)程序必需有且僅有一個(gè)主函數(shù),并且無論它寫在第幾行,程序一定是從他開始執(zhí)行的。同時(shí)這個(gè)主函數(shù)的名字是不能改的。 第十行:P3=~P3; P3是我們所說的端口的名稱,機(jī)通過有頭文件的引用說明后,單片機(jī)一看到他就會(huì)認(rèn)識(shí):(哦,原來是你P3.0至P3.7這八兄弟啊,你們有什么事嗎?) ~是一個(gè)取反符號(hào),是0變成1,或者是1變成0 所以P3=~P3意思是把P3的值取反后再賦值給P3。 第十一行:delay(100);
調(diào)用函數(shù)delay(),給他的參數(shù)是100。而這個(gè)函數(shù)里面的內(nèi)容是什么前面上面我們已經(jīng)說過了。
現(xiàn)在我們整體來看下這個(gè)程序做了些什么。 仔細(xì)閱讀你會(huì)發(fā)現(xiàn),原來程序只是讓單片機(jī)做了兩件事, 第一件:讓P3口取反,具體地說是讓電平取反(這里對(duì)于單片機(jī)來說電平只有高或者低兩種情況); 第二件事:讓單片機(jī)在心里面默默地?cái)?shù)數(shù),具體點(diǎn)來說是從0數(shù)到100為一組,一共數(shù)了500組。 但是由于這個(gè)單片機(jī)做完第二件事之后,它會(huì)自動(dòng)地跑去又做第一件事,接著又做第二件事,以次反復(fù)。所以,你就看到了看到了燈一閃一閃的了。
好,同學(xué)們,下面我們來講一講怎么怎么來做個(gè)流水燈,并且我們這次要把P1的8個(gè)端口也加進(jìn)來: 先在Proteus里,將我們的模擬圖里的連線都刪除,并用鼠標(biāo)拖個(gè)選框,將8個(gè)LED都選進(jìn)去,然后右擊,選擇Block Copy(塊復(fù)制),并在圖紙適當(dāng)?shù)钠渌胤近c(diǎn)擊一下,再右擊鼠標(biāo)退出塊復(fù)制狀態(tài),就復(fù)制出了8個(gè)LED燈:
調(diào)整好LED位置(同樣可以選框選中,并拖曳鼠標(biāo)一起移動(dòng)),再在Terminals Mode(終端模式)下選擇DEFAULT(默認(rèn)),在LED左側(cè)并排添加上:
同樣在單片機(jī)的P1口與P3口對(duì)應(yīng)的位置也添加上(注意單片機(jī)右側(cè)的請(qǐng)先點(diǎn)X鏡像,再添加會(huì)方便很多):
再給我們的接線端命上名(注意方法也有很多,我說一種效率最高的方法),先點(diǎn)擊工具欄上的 Property Assignment Tool按鈕,彈出設(shè)置窗口,在String欄輸入'NET=LED#',點(diǎn)OK :
這時(shí)再將鼠標(biāo)移至接線端口的小圓圈上,你會(huì)發(fā)現(xiàn)鼠標(biāo)和之前的變化,從P1.0邊上那個(gè)開始,順次每個(gè)接線端點(diǎn)擊一下(請(qǐng)注意別點(diǎn)兩下),會(huì)有驚喜出現(xiàn)的,是不是這16個(gè)接線端都依你的設(shè)置快速地命好名了!
請(qǐng)先不要得意,不然你會(huì)后悔的!這時(shí)請(qǐng)?jiān)冱c(diǎn)擊工具欄上的Property Assignment Tool按鈕,彈出設(shè)置窗口,同樣地還在String欄輸入'NET=LED#',點(diǎn)OK ,再依次給LED邊上的接線端命上名(請(qǐng)注意看下與前面的命名是不是對(duì)得上):
這時(shí)請(qǐng)更不要得意,不然你會(huì)更后悔! 這時(shí)請(qǐng)第三次還是點(diǎn)擊工具欄上的Property Assignment Tool按鈕,彈出設(shè)置窗口,這時(shí)請(qǐng)點(diǎn)Cancel取消:
革命尚未成功,同志仍需努力,我們還得把LED的負(fù)極與GND接上,以及相應(yīng)端口與接線端都接好。如果你發(fā)現(xiàn)連不了的話,說明你的兩個(gè)點(diǎn)之間相隔太近,請(qǐng)同學(xué)們自行調(diào)整好距離。如果你連線時(shí)覺得有點(diǎn)累了,你可以在需要平行連線的地方(這樣的一方是不是非常多)將畫筆移到需要連線的其中一個(gè)點(diǎn)上試著雙擊一下,也許有人會(huì)有小驚喜,但我不保證你的小驚喜會(huì)不會(huì)出現(xiàn),因?yàn)橐苍S你點(diǎn)錯(cuò)了地方。接好后應(yīng)該如下圖:
第一次做是不是有點(diǎn)累或者不習(xí)慣?沒事,誰沒有第一次?等你熟悉了以后,我保證你可以在1分鐘之內(nèi)完成的這點(diǎn)小兒科事情的! 什么?你更快?只要30秒?。?! 好吧,壯士,大神,同學(xué),別這樣子!太快了也許你會(huì)覺得沒有樂趣的。 好吧,終于把原理圖完成了,為你們自己先鼓掌喝彩一下吧!
|