找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 27770|回復: 4
打印 上一主題 下一主題
收起左側(cè)

基于單片機的多功能智能小車設計論文

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:298227 發(fā)表于 2018-3-28 11:53 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
做的課程設計,主要包括以下內(nèi)容:
1.總體方案設計與論證
2.各模塊硬件電路設計
3.系統(tǒng)軟件設計
3.總結(jié)與展望


摘要

隨著計算機、微電子、材料、機械、通信等技術的快速發(fā)展,智能化的小車和機器人的發(fā)展速度也越來越快,作為21世紀自動化領域內(nèi)非常偉大的成就它已經(jīng)和人們的生產(chǎn)生活緊密的聯(lián)系在了一起。根據(jù)題目的要求,本設計的智能遙控小車主要由兩大部分構成:一個紅外遙控部分,一個智能小車部分。其中紅外遙控部分采用專用編碼芯片HT6221作為發(fā)射端,一體化紅外接收頭作為接收端;智能小車部分采用微控制器AT89C52單片機作為其控制核心,用紅外反射式光電傳感器進行障礙物和路線的檢測,用步進電機控制小車的啟停、速度快慢以及轉(zhuǎn)向,用直射式光電檢測器、施密特觸發(fā)器等元件組成的電路來檢測小車車輪轉(zhuǎn)速,用LCD1602液晶顯示屏來實時顯示小車運行的速度、時間和路程。

經(jīng)過硬件和軟件的綜合設計,本設計的智能遙控小車基本上實現(xiàn)了遙控控制、自動躲避障礙、自動沿著特定的路線行駛、實時顯示速度、路程等功能。


目錄

第一章 緒論              1

1.1 課題背景和意義              1

1.2 課題研究現(xiàn)狀和發(fā)展趨勢              1

1.2.1 研究現(xiàn)狀              1

1.2.2 發(fā)展趨勢              2

1.3 課題內(nèi)容和要求              2

第二章 總體方案設計與論證              4

2.1 遙控控制模塊設計與論證              4

2.2 電機驅(qū)動模塊設計與論證              5

2.3 避障循跡模塊設計與論證              6

2.4 數(shù)據(jù)顯示模塊設計與論證              6

2.5 轉(zhuǎn)速測量模塊設計與論證              7

2.6 電源模塊設計與論證              7

第三章 各模塊硬件電路設計              9

3.1 紅外遙控發(fā)射器模塊              9

3.1.1 紅外遙控模塊的工作原理              9

3.1.2 HT6221編碼芯片簡介              10

3.1.3 紅外遙控發(fā)射器

3.2 單片機控制模塊

3.2.1 單片機模塊電路

3.2.2 復位電路

3.2.3 振蕩電路

3.3 紅外接收器及解碼

3.4 電機驅(qū)動模塊              16

3.4.1 步進電機的工作原理              16

3.4.2 ULN2003芯片簡介              17

3.4.3 步進電機驅(qū)動電路設計              18

3.5 避障循跡模塊

3.6 轉(zhuǎn)速檢測模塊

3.7 數(shù)據(jù)顯示模塊

3.8 電源模塊

第四章 系統(tǒng)軟件設計

4.1 系統(tǒng)總體程序流程圖              24

4.2 避障循跡模塊程序設計              25

4.2.1 避障程序流程圖              25

4.2.2 循跡程序流程圖              26

4.3 數(shù)據(jù)顯示模塊程序設計              27

第五章 總結(jié)與展望              28

5.1 總結(jié)              28

5.2 改進與展望              28

參考文獻              29

致謝

附錄A 各模塊電路圖

附錄B 程序              39



第一章 緒論

1.1 課題背景和意義

隨著計算機、微電子、信息技術的快速發(fā)展,智能化技術的發(fā)展速度越來越快,智能化與人們生活的聯(lián)系也越來越緊密,智能化是未來社會發(fā)展的必然趨勢。智能小車實際上就是一個可以自由移動的智能機器人,比較適合在人們無法工作的地方工作,也可取代人們完成一些復雜、危險性質(zhì)的工作。作為現(xiàn)代自動控制領域內(nèi)十分偉大的一項發(fā)明智能小車、機器人已經(jīng)和人們的生產(chǎn)生活緊密的聯(lián)系在了一起。

智能小車,是一個包含周圍環(huán)境探測、識別反應、自動控制等功能于一體的綜合系統(tǒng),它綜合地運用了微控制器、傳感、遙控、機械結(jié)構、電子基礎、自動控制等多學科的知識。智能小車是一個復雜而又龐大的系統(tǒng),其內(nèi)部有許多塊控制芯片作為其控制核心,多種傳感器來采集外部環(huán)境信息并將接收到的信息傳給主控制器,然后由控制器來控制其各個模塊執(zhí)行相應的動作。智能小車由于成本較低,甚至還能夠勝任一些人們都無法勝任的工作,它已逐步深入到工業(yè)、農(nóng)業(yè)以及社會生活的各個方面。本課題設計的智能小車中用到的遙控技術、顯示技術、單片機控制系統(tǒng)、傳感技術、自動避障技術已廣泛應用于工農(nóng)業(yè)生產(chǎn)、國防軍事、醫(yī)療衛(wèi)生、宇宙探測等諸多領域,特別是其在軍事偵察、反恐、防暴、防核化及污染等危險和惡劣環(huán)境中有著廣闊的應用前景,由此可見其有著及其重要的研究意義。

1.2 課題研究現(xiàn)狀和發(fā)展趨勢

  1.2.1 研究現(xiàn)狀

智能小車、機器人的發(fā)展研究從上世紀60年代至今已有幾十年的歷史,自從上世紀60年代末期,第一臺能夠自主移動機器人問世以后,經(jīng)過幾十年的發(fā)展智能機器人已經(jīng)從最初的示教模仿機器人發(fā)展到現(xiàn)在的具有感知功能的智能機器人,在技術上取得了很大的進步許多國家都對智能機器人進行了大量的研究。由于各國的科研實力不同,其水平也有高低,其中美國和日本在該項技術的研究處于領先地位。

法國提出了讓智能機器人具有自動認知功能的一項科技計劃,使其能夠在復雜的環(huán)境中通過自主感知判斷來自動執(zhí)行各種動作。美國發(fā)明的智能機器人,可以幫助人們送信件、食品等生活用品,還可以牽引吸塵器來打掃衛(wèi)生。日本目前已經(jīng)研制成功的人形機器人,其可以模仿人們的各種面部表情而且非常逼真。近年來發(fā)明的的手術機器人已經(jīng)廣泛的應用在實際醫(yī)療手術中而且穩(wěn)定性好,安全性高。我國的智能小車、機器人的研究已經(jīng)有三十多年的歷史,特別是在軍事領域的應用方面已經(jīng)取得了較大的成果,已經(jīng)相繼研制出了復雜的智能機器人,危險作業(yè)機器人、仿人機器人、復合結(jié)構移動機器人等。國內(nèi)的許多高校也都在不停的進行著這方面的研究而且也有了層出不窮的成果,例如中科院研制的能夠和人對話的機器人、上海交大研制的具有較強越障能力的仿人關節(jié)結(jié)構的機器人等。與此同時,我國也開展了智能移動機器人基礎理論研究,在某些方面取得了世界領先的成果,正在逐漸縮小與發(fā)達國家的差距。

  1.2.2 發(fā)展趨勢

隨著各方面技術的不斷進步與完善,各個國家對于智能小車、機器人的科研能力都再逐步的加強,未來的智能機器人可能會朝著以下幾個方面發(fā)展:使用高強度的輕質(zhì)材料讓機器人的結(jié)構越來越靈巧動作執(zhí)行也更加靈活;應用網(wǎng)絡化技術來遠距離操作控制機器人群體為人們工作;通過復雜生物機電系統(tǒng)和人機耦合系統(tǒng)來研究出具有仿生感知、生物神經(jīng)的仿人機器人。相信未來會有具有更高智能化的、更加生動有趣的智能機器人出現(xiàn)在我們的周圍,而且會極大的改變和方便人們的生產(chǎn)生活。

1.3 課題內(nèi)容和要求

本設計的智能小車用微處理器(即單片機)作為整個系統(tǒng)的控制核心部分,主要包括單片機控制模塊、遙控模塊、避障模塊、循跡模塊、數(shù)據(jù)顯示模塊等模塊。要求能夠?qū)崿F(xiàn)以下幾種功能:

(1)遙控功能,即通過遙控器來控制小車的啟動、停止、左轉(zhuǎn)、右轉(zhuǎn)、后退等動作。

(2)自動避障功能,即小車在前方遇到障礙時可以立即做出反應,自動左轉(zhuǎn)或右轉(zhuǎn)躲避障礙。

(3)自動循跡功能,即小車可以自動沿著規(guī)定的路線行駛。

(4)能夠?qū)崟r顯示小車行駛的速度、路程等數(shù)據(jù)。

要求通過此次的實際動手設計掌握以下基本技能:

(1)學會電子產(chǎn)品的設計開發(fā)過程;

(2)掌握單片機原理、遙控原理、顯示原理等;

(3)能夠熟練進行系統(tǒng)的硬件電路設計以及軟件設計;

(4)熟練使用相關的電子設計和仿真軟件;

(5)查閱國內(nèi)外相關文獻,掌握智能小車的最新研究動態(tài)和未來發(fā)展趨勢。

第二章 總體方案設計與論證

本設計方案采用微處理器(AT89C52單片機)作為整個系統(tǒng)控制的中心,主要由兩個部分構成,紅外遙控發(fā)射部分和智能小車部分。其中智能小車部分主要由以下子模塊構成:單片機控制模塊、電源模塊、電機驅(qū)動模塊、循跡避障模塊、轉(zhuǎn)速檢測模塊、紅外接收器和數(shù)據(jù)顯示模塊組成;紅外遙控發(fā)射部分主要由遙控按鍵、編碼芯片、紅外發(fā)射三個部分構成。其總體設計框圖包括兩個部分,如圖2.1所示:

   a 遙控部分框圖                         b 小車部分框圖

                 圖2.1 系統(tǒng)總體設計框圖

2.1 遙控控制模塊設計與論證

目前比較常用的遙控控制方式有兩種,紅外遙控控制系統(tǒng)和無線遙控控制系統(tǒng)。

方案一:選擇紅外遙控裝置作為小車的遙控控制器。紅外遙控是通過遙控發(fā)射器內(nèi)的編碼芯片將按鍵信息調(diào)制成一串0和1的二進制代碼,然后通過紅外線發(fā)出,最后被紅外接收裝置接收進行解碼,再運用單片機對解碼后的碼信息進行識別,然后再根據(jù)不同的碼信息進行不同的控制操作[9]。

方案二:選擇無線電遙控裝置作為小車的遙控控制器。無線電遙控是利用不同頻率的無線電波對遠方的各種機構進行控制的遙控設備。這些信號被遠方的接收設備接收后,可以驅(qū)動其他各種相應的機械或者電子設備去完成各種操作[6]。

紅外遙控和無線遙控是對不同的載波來說的,紅外遙控器是用紅外線來傳送控制信號的,它的特點是有方向性中間不能被阻擋,在室內(nèi)使用時大概在7m的范圍內(nèi)有效;無線遙控器是用無線電波來傳送控制的信號的,它的特點是無方向性,可以不面對面控制,距離遠,有效距離可達數(shù)十米甚至數(shù)公里。

以上兩種方案均可作為本設計的遙控控制器,雖然無線遙控控制的距離更遠也更加靈敏,但對于本設計來說使用紅外遙控已經(jīng)足夠了,而且紅外遙控的原理更加簡單易懂,所以本設計采用方案一即紅外遙控作為小車的遙控控制系統(tǒng)。

2.2 電機驅(qū)動模塊設計與論證

目前比較常用的小車驅(qū)動電機主要有兩種選擇:

方案一:選擇直流電機作為小車的動力驅(qū)動。直流電機是將直流電能轉(zhuǎn)換為機械能的一種裝置,因其轉(zhuǎn)動力矩大、體積較小、重量很輕、使用方便,所以其在一些小型的電動裝置中的應用較多。直流電機的運行方式是這樣的:在它里面有圓形的磁體會產(chǎn)生磁場,當給它轉(zhuǎn)子上的繞組通電時,通電線圈在磁場中便會產(chǎn)生洛倫茲力帶著線圈即轉(zhuǎn)子轉(zhuǎn)動,當轉(zhuǎn)子轉(zhuǎn)動時通電線圈內(nèi)的磁場方向?qū)淖儯岳@組上的電流也要變換流向,在方向一直不變的洛倫茲力控制下電機將向順時針或逆時針持續(xù)轉(zhuǎn)動。由H型橋式電路直接驅(qū)動直流電機控制電機的正反轉(zhuǎn),通過軟件編程使單片機輸出不同占空比的PWM(脈寬調(diào)制信號)來控制直流電機的轉(zhuǎn)速進而控制小車的行駛速度[6]。

方案二:選擇步進電機作為小車的動力驅(qū)動。步進電機是將輸入端輸入的電脈沖信號轉(zhuǎn)變?yōu)檗D(zhuǎn)子的角位移的可以實現(xiàn)精確定位的電機。電機轉(zhuǎn)動的快慢取決于脈沖信號的頻率、轉(zhuǎn)動的圈數(shù)取決于脈沖的個數(shù),在不超載的情況下其轉(zhuǎn)動速度不受負載的影響,即給步進電機輸入一個脈沖信號,電機的轉(zhuǎn)子則轉(zhuǎn)過一個角度,給其加上連接不斷的脈沖波形則步進電機就能持續(xù)轉(zhuǎn)動下去[5]。

相比直流電機,步進電機轉(zhuǎn)過的角度是由脈沖信號控制的其可以實現(xiàn)小車的精確定位停車,步進電機調(diào)速也更加容易,只要輸入不同頻率的脈沖信號就能控制小車的行駛速度,而且它還有很好的止動能力。所以在本設計中我們選用了步進電機作為小車的驅(qū)動電機。

2.3 避障循跡模塊設計與論證

目前主要有兩種方案來實現(xiàn)小車的自動避障功能:

方案一:采用紅外反射式光電傳感器、電壓比較器及一些電阻構成的障礙物檢測電路來檢測小車前方的障礙。障礙物檢測電路安裝在小車前部的中間及左右兩邊,來檢測小車前方的障礙物。其障礙檢測過程如下:紅外發(fā)光二極管發(fā)出紅外光,如果遇到小車前面的障礙物,紅外線就會被物體反射回來,被光敏三極管吸收此時光敏三極管導通,并在輸出端輸出低電平信號至單片機,然后單片機調(diào)用尋跡避障子程序控制小車做出相應的避障反應,當左邊遇到障礙物時單片機會自動調(diào)用右轉(zhuǎn)子程序控制其右轉(zhuǎn),當右邊遇到障礙物時單片機會自動調(diào)用左轉(zhuǎn)子程序控制其左轉(zhuǎn)。當無障礙物時,發(fā)出的紅外線不被反射,光敏三極管截止,輸出高電平信號,小車繼續(xù)向前行駛[8]。

方案二:采用超聲波原理來檢測小車前方的障礙。其檢測障礙的原理如下:先由超聲波發(fā)射器向小車前方發(fā)射超聲波,超聲波在向前傳播過程中,若遇到障礙物則會被反射回去,反射波被超聲波回收裝置接收后會產(chǎn)生一個電信號然后被轉(zhuǎn)化為高低電平信號反饋給單片機,若為高電平則說明前方遇到障礙,然后由單片機調(diào)用避障子程來控制小車做出相應的躲避障礙的動作[7]。

在本設計我們采用了第一種方案實現(xiàn)小車的自動避障功能。

2.4 數(shù)據(jù)顯示模塊設計與論證

根據(jù)題目的要求小車可以實時顯示其運動的速度、距離等數(shù)據(jù)。主要有兩種方案來實現(xiàn):

方案一:用共陽極數(shù)碼管和可編程的鍵盤接口芯片組成數(shù)據(jù)顯示電路,接口芯片直接與單片機的I/O口相連,由單片機精確控制實現(xiàn)LED動態(tài)顯示。

方案二:用LCD液晶顯示屏直接與單片機相連組成數(shù)據(jù)顯示電路。LCD液晶顯示屏是一種專門用來顯示字符和數(shù)字的點陣型液晶模塊,它是由若干個5X7或5X11點陣字符位組成的,一個字符占據(jù)一個點陣字符位,每位之間有一個點距的間隔將字符隔開,行與行之間也有間隔[8]。

由于本設計需要顯示的數(shù)據(jù)較多,若用LED數(shù)碼管來顯示需多個數(shù)碼管才能滿足要求,這樣電路設計過于復雜,相反只用一個LCD液晶顯示屏即可顯示要求數(shù)據(jù),所以本設計我們采用方案二即LCD顯示屏來顯示實時數(shù)據(jù)。

2.5 轉(zhuǎn)速測量模塊設計與論證

方案一:選擇霍爾開關型傳感器測量小車車輪轉(zhuǎn)速。具體做法是:在非磁性材料制作的轉(zhuǎn)子上,固定好一片鋼性磁體,將霍爾開關型傳感器的感知接收面和磁體的磁極相對, 并在安裝架上安裝好(注意磁場方向不要弄錯),輪子轉(zhuǎn)動時磁體會跟著轉(zhuǎn)動,在磁體轉(zhuǎn)到和傳感器的接收面相對時, 霍爾傳感器便輸出一個脈沖信號, 由兩個脈沖間的時間間隔,便可算出轉(zhuǎn)速,然后再根據(jù)車輪半徑編程便可算出小汽車運行的速度[10]。

方案二:選擇直射式光電檢測器測量小車車輪轉(zhuǎn)速。具體做法是: 在小車的驅(qū)動輪的主軸上安裝一個開有十個透光槽的圓形葉片,保持葉片和驅(qū)動輪能夠同步轉(zhuǎn)動,然后在驅(qū)動輪旁安裝好直射式光電檢測器,葉片隨著車輪的轉(zhuǎn)動不斷切割紅外發(fā)射管與紅外接受管之間的紅外線通路,當葉片轉(zhuǎn)動至透光槽與紅外線通路重合時,檢測器導通,紅外接受管通過電流,當葉片轉(zhuǎn)動至使透光槽遮住時,光通路斷開。隨著車輪不斷的轉(zhuǎn)動,便會輸出連續(xù)的脈沖序列,測出脈沖的個數(shù)便可知葉片轉(zhuǎn)過的孔數(shù),從而可計算出車輪轉(zhuǎn)動的轉(zhuǎn)角和轉(zhuǎn)速,然后再根據(jù)車輪半徑由軟件編程便可算出小車運行的速度[11]。

以上兩種方案都能夠測出小車車輪的轉(zhuǎn)速。但是在本設計中,對于方案一來說,要想在很小的小車車輪上密集安裝磁片比較困難,而且彼此之間也容易產(chǎn)生干擾。因此本設計擬采用方案二測量小車的轉(zhuǎn)速。

2.6 電源模塊設計與論證

電源是整個小車系統(tǒng)運行的基本條件,它的性能的好壞直接決定整個系統(tǒng)運行的穩(wěn)定性和性能。小車的供電電源包含兩部分,單片機控制模塊電源和電機驅(qū)動模塊電源,我們將單片機及其外圍電路和步進電機分開供電,兩者互相不影響,實現(xiàn)穩(wěn)定供電。由于步進電機需較高的供電電壓而單片機和其邏輯單元最大供電電壓不能超過5V,因此需設計穩(wěn)壓電路。

方案一:采用8節(jié)1.5V干電池串聯(lián)共12V直接給步進電機供電,然后經(jīng)過由LM7805穩(wěn)壓芯片構成的穩(wěn)壓電路將電壓降至5V后給電片機及其外圍邏輯電路供電。但是本方案由于電池電量有限,而且數(shù)量較多的干電池重量較大會給驅(qū)動電機帶來太大負擔,也占用了太大的空間在體積較小的小車上使用太不方便,所以放棄了該方案。

方案二:采用12V蓄電池直接給步進電機供電,將電壓降至5V后給單片機及其外圍電路供電。蓄電池具有較長的續(xù)航能力以及電壓輸出的值基本不怎么變化,但是因為蓄電池的體積和質(zhì)量過大,并不適合本設計的使用,所以我們并沒有使用蓄電池來供電。

方案三:采用3節(jié)4.2V鋰電池串聯(lián)的方式共直接給步進電機供電,然后經(jīng)過由穩(wěn)壓芯片構成的穩(wěn)壓電路將電壓降至5V后給單片機及其外圍邏輯電路供電。本方案鋰電池的電量較足并且可以充電重復利用,3節(jié)鋰電池重量和占用的空間都較小,因此該方案比較可行,最終我們選擇了該方案作為小車的驅(qū)動電源[14]。


第三章 各模塊硬件電路設計

本設計的遙控智能小車的硬件部分共分為兩大模塊:紅外遙控發(fā)射器硬件模塊和智能小車部分硬件模塊。其中紅外遙控發(fā)射硬件模塊包含遙控按鍵、編碼芯片、紅外發(fā)射三個子模塊;智能小車部分硬件模塊包含單片機控制模塊、電機驅(qū)動模塊、避障循跡模塊、顯示模塊、紅外接收器模塊、電源模塊6個子模塊。

首先介紹紅外遙控發(fā)射器部分即遙控按鍵、編碼芯片、紅外發(fā)射三個子模塊的硬件設計。

3.1 紅外遙控發(fā)射器模塊

  3.1.1 紅外遙控模塊的工作原理

紅外線遙控是比較常見的一種遙控設備,它是利用波長為0.76~1.5μm之間的紅外線來傳送控制信號的遙控設備。其占據(jù)空間小、價格便宜、使用方便,在我們常用的家用電器比如電視、DVD,錄音機、空凋等和一些小型電動玩具裝置上均已應用了紅外線遙控設備。但是紅外遙控也有缺點比如容易受到空間和距離的限制,一般在7m的范圍內(nèi)有效且發(fā)射和接收之間不能被物體隔擋,但對于本設計的智能小車來說已經(jīng)能夠滿足要求。

紅外遙控系統(tǒng)一般由兩大部分組成:一個紅外發(fā)射部分,一個紅外接收部分。其中發(fā)射部分主要由按鍵鍵盤、編碼調(diào)制、LED紅外發(fā)送器構成,它最重要的部分就是應用編碼芯片對按鍵信息進行編碼和發(fā)送;接收部分由光電轉(zhuǎn)換放大器、解調(diào)、解碼電路構成,其最重要的部分是對接收到的編碼進行解調(diào)。其原理如圖3.1所示:

                      圖3.1 紅外遙控系統(tǒng)原理框圖

按下遙控器的一個按鍵,遙控器的編碼芯片會對按鍵信息進行編碼,然后通過LED紅外發(fā)射器發(fā)出脈沖編碼,被紅外接收頭接收后將編碼解出并輸入到單片機的外部中斷,對接收到的脈沖編碼進行位“0”和位“1”的識別,再根據(jù)不同的碼信息調(diào)用相應的子程序來對小車進行不同的控制操作。

  3.1.2 HT6221編碼芯片簡介

HT6221是合泰公司生產(chǎn)的多功能遙控編碼芯片,工作電壓在1. 8V-3.5V,其采用PPM(Pulse Position Modulation)進行編碼,周期能編碼16位地址碼和8位數(shù)據(jù)碼,最多能同時支持32個活動鍵。其引腳結(jié)構如圖3.2所示:

               

                  圖3.2 HT6221引腳圖

其各引腳說明如下表3-1所示:

3-1HT6221芯片引腳說明

引腳號

引腳名稱

          描述

0

AIN

低8位地址碼輸入

1-8

C1-C8

鍵盤列控制

9

  LED

按鍵指示燈

10-13

  R1-R4

鍵盤行控制, 高電平有效

14

  DOUT

串行數(shù)據(jù)輸出引腳, 38KHz發(fā)射頻率

15

  VDD

1.8V- 3.5V

16

  DT

最重要數(shù)據(jù)位(DT)代碼設置

17、18

  X2、X1

455KHz振蕩器輸出,455KHz振蕩器輸入

19

  VSS

接地

    遙控編碼有兩種:位0和位1,其低電平脈寬相同但高電平脈寬不一樣。采用脈寬調(diào)制的串行碼,以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的脈沖表示二進制的“0”;以脈寬為0.565ms、間隔1.685ms、周期為2.25ms的脈沖表示二進制的“1”。其波形如圖3.3所示:

   

       圖3.3 遙控碼的“0”和“1”(注:接收端的波形與發(fā)射斷相反)

  3.1.3 紅外遙控發(fā)射器

遙控發(fā)射器專用芯片很多,在本設計中我們運用了HT6221芯片來實現(xiàn)紅外編碼的發(fā)射。其電路如圖3.4所示:   

圖3.4 遙控發(fā)射器電路原理圖

圖3.4中當有任意一個按鍵按下后,按鍵指示燈(D1)發(fā)光,HT6221編碼芯片能夠產(chǎn)生脈沖編碼,該脈沖編碼會被調(diào)制成38KHz的脈沖信號然后通過圖中的紅外發(fā)射二極管(D2)發(fā)射出去[8]。

所按的按鍵不同其發(fā)出的編碼脈沖也不同,按鍵所代表的功能也就不同,其各按鍵的功能分配如下表3-2所示:


3-2 按鍵功能分配表

             按鍵

              功能

              K1

        控制小車的啟動

              K2

        控制小車的停止

              K3

        控制小車的加速

              K4

        控制小車的左轉(zhuǎn)

              K5

        控制小車的右轉(zhuǎn)

              K6

        控制小車的倒退

下面是智能小車部分即單片機控制模塊、紅外接收器模塊、電機驅(qū)動模塊、避障循跡模塊、顯示模塊、電源模塊6個子模塊的硬件設計介紹。

3.2 單片機控制模塊

  3.2.1 單片機模塊電路

本設計我們采用AT89C52單片機作為智能小車部分的控制核心,AT89C52單片機是AT89系列的標準型8位單片機,其與標準MCS-51指令系統(tǒng)和8052產(chǎn)品引腳兼容,功耗低、性能強大、價格便宜適用于許多較為復雜控制的場合。AT89C52單片機的內(nèi)部結(jié)構如下:一個以ALU為中心的8位中央處理器,256字節(jié)內(nèi)部數(shù)據(jù)存儲器(RAM),8K字節(jié)用來存儲程序的Flash內(nèi)部程序存儲器即片內(nèi)ROM(可反復擦寫1000次),4個8位可編程I/O口(P0、P1、P2、P3),3個16位定時/計數(shù)器,8個中斷源,兩個中斷優(yōu)先級的中斷控制系統(tǒng),一個全雙工串行通信口,一個片內(nèi)振蕩器和時鐘電路[1]。AT89C52單片機最小應用系統(tǒng)主要由單片機、復位電路、振蕩電路等部分組成。本設計的單片機控制模塊原理圖如圖3.5所示:

                             圖3.5 單片機控制模塊

本設計中我們使用了AT89C52單片機的大部分引腳,其具體的引腳功能分配如下表3-3所示:

3-3 單片機引功能分配表

       引腳

                  功能分配

   P0.0-P0.7

接LCD1602的D0-D7引腳,作為數(shù)據(jù)信息的輸出引腳

   P1.0-P1.2

接LCD1602的RS、RW、E引腳,作為數(shù)據(jù)信息的控制端

P1.3-P1.5、P1.7

連接避障循跡電路的輸出端

     P1.6

連接轉(zhuǎn)速測量電路的脈沖輸出端

    P2.4-P2.7

連接電機驅(qū)動芯片的脈沖信號輸入端

      P3.2

外部中斷,連接紅外接收器的輸出端

   VCC

接+5V電源

   GND

接地

  3.2.2 復位電路

單片機的復位,是為了初始化單片機的工作狀態(tài),有時當程序運行出錯或因操作錯誤而使系統(tǒng)處于鎖死狀態(tài),為了擺脫困境,也可按復位鍵重新初始化單片機。RST引腳是復位信號的輸入端,要實現(xiàn)復位操作必須使RST引腳上至少保持兩個機器周期的高電平,再從高電平變?yōu)榈碗娖酵瓿蓮臀。復位電路由按鍵復位和上電復位兩種方式,本設計采用按鍵復位實現(xiàn)復位操作。單片機按鍵復位電路如圖3.6所示:

      

                       圖3.6 復位電路

按鍵復位是通過按鍵使復位引腳經(jīng)電阻R0與VCC電源接通來實現(xiàn)的,按下復位鍵時,RST引腳為高電平;松開復位按鍵后,RST引腳逐漸將為低電平,復位結(jié)束。

  3.2.3 振蕩電路

AT89C52單片機內(nèi)有一個高增益反相放大器,其輸入端為芯片引腳XTAL1,輸出端為芯片引腳XTAL2。只要在片外通過XTAL1和XTAL2引腳跨接振蕩元件(如晶體振蕩器),則可構成一個穩(wěn)定的自激振蕩器,單片機通電后即可工作。其外部振蕩電路如圖3.7所示:

      

                         圖3.7 振蕩電路

AT89C52單片機內(nèi)部RAM容量很小,當單片機需要存放大量數(shù)據(jù)時就必須擴展外部數(shù)據(jù)存儲器。此外AT89C52單片機的I/O口數(shù)量和功能很有限,也常常要擴展外部接口芯片。由于本設計不需要太多的I/O口,內(nèi)部程序存儲器也夠用,所以不用擴展外部數(shù)據(jù)存儲器和外部接口芯片。

3.3 紅外接收器及解碼

紅外接收器也叫做一體化紅外接收頭,其內(nèi)部是由紅外監(jiān)測二極管,放大器,限副器,帶通濾波器,積分電路,比較器等構成的。紅外監(jiān)測二極管接收到紅外信號后,會把信號送到放大器和限幅器,限幅器把脈沖幅度控制在一定的水平。交流信號進入帶通濾波器,帶通濾波器只允許30khz到60khz的負載波通過,然后脈沖信號再通過解調(diào)電路和積分電路進入比較器,由比較器輸出高低電平信號,還原出發(fā)射端的信號波形。但為了提高接收的靈敏度輸出的高低電平和發(fā)射端是反相的。紅外接收頭有很多的種類,一般都有電源引腳、信號輸出引腳和接地引腳。根據(jù)發(fā)射端調(diào)制載波的不同應選用相應解調(diào)頻率的接收頭,本設計我們采用一體化紅外接收頭1838來解調(diào)HT6221編碼芯片的編碼。其實物圖如圖3.8所示:

                          

                          圖3.8 1838紅外接收頭

由于紅外接收頭內(nèi)部放大器也很大的增益,這樣很會容易引起干擾,因此在接收頭的電源引腳上須加上大小在22uf以上的濾波電容。本設計的紅外接收電路如圖3.9所示:

         

                              圖3.9 紅外接收電路圖

其中U6為1838紅外接收頭,電容C4為濾波電容,DOUT 是解調(diào)信號的輸出端,直接與單片機的P3.2引腳即INT0中斷相連[8]。

解碼的重點是怎樣識別位0和位1,由于位0和位1的低電平脈寬相同但高電平脈寬不一樣。所以需要根據(jù)高電平的寬度區(qū)別位0和位1,如果從0.56ms低電平信號過后延時了0.56ms以后如果能讀到低電平信號說明該位為0反之則為1,為了可靠起見延時必須介于0.56ms和1.12ms之間,否則如果該位為0讀到的已是下一位的高電平,因此我們?nèi)∑渲虚g值即(1.12ms+0.56ms)/2=0.84ms。

當按下遙控器的按鍵后,便有紅外脈沖編碼信號發(fā)出,經(jīng)紅外接收頭接收解碼后在其輸出端輸出檢波整形后的方波信號,然后直接輸入至單片機外部中斷進行碼信息的識別,單片機再調(diào)用相應子程序執(zhí)行對應的操作。具體解碼操作流程圖如圖3.10所示:

               

                     圖3.10 紅外接收解碼流程圖

3.4 電機驅(qū)動模塊

  3.4.1 步進電機的工作原理

步進電機是一種將電脈沖信號轉(zhuǎn)變?yōu)榻俏灰苹蚓位移的電機。電機轉(zhuǎn)動的快慢取決于脈沖信號的頻率、轉(zhuǎn)動的圈數(shù)取決于脈沖的個數(shù),在不超載的情況下其轉(zhuǎn)動速度不受負載的影響,即給步進電機輸入一個脈沖信號,電機的轉(zhuǎn)子就轉(zhuǎn)過一個固定角度(步距角),給其輸入連續(xù)的脈沖信號步進電機就能連續(xù)轉(zhuǎn)動[5]。

在本設計中我們采用步距角為1.8度的四相步進電機作為小車的驅(qū)動電機,其內(nèi)部結(jié)構及元件圖如圖3.11所示:

                  圖3.11 步進電機結(jié)構和元件圖

四相步進電機有著比較小的體積和轉(zhuǎn)矩,該電機共有5根引出線,分別是內(nèi)部四組繞組線圈A、B、C、D的四根引出線,一根電源引出線,其采用單極性直流電源供電,使A、B、C、D四相繞組輪流供電,轉(zhuǎn)子就會沿著A、B、C、D方向轉(zhuǎn)動。其旋轉(zhuǎn)角度與脈沖數(shù)成正比,旋轉(zhuǎn)頻率與脈沖頻率成正比。

本設計的步進電機采用四相八拍的工作方式,即A-AB-B-BC-C-CD-D-DA-A

的通電順序工作。當通電順序為A-AB-B-BC-C-CD-D-DA時電機正轉(zhuǎn),當通電順序為DA-D-CD-C-BC-B-AB-A時電機反轉(zhuǎn)。步進電機工作時的時序波形圖如圖3.12所示:

                   圖3.12 步進電機工作時序波形圖

  3.4.2 ULN2003芯片簡介

ULN2003驅(qū)動芯片可以直接用來驅(qū)動電流小于0.5A的步進電機。ULN2003芯片是美國TI公司和Sprague公司開發(fā)的高壓大電流達林頓晶體管陣列電路具有較高的電流增益和工作電壓、較寬的溫度范圍、較強的驅(qū)動負載能力等特點,適和應用于各種高速大功率的驅(qū)動系統(tǒng)中。其內(nèi)部結(jié)構及引腳如圖3.13所示:

               

                        圖3.13 ULN2003芯片引腳圖

其引腳說明如表3-4所示:

3-4ULN2003芯片引腳說明

             引腳

           功能說明

           IN1-IN7

     脈沖信號輸入端(接單片機)

              GND

            接地

          OUT1-OUT7

     驅(qū)動信號輸出端(接步進電機)

             COM

          接+5V電源

ULN2003驅(qū)動芯片的輸出結(jié)構是集電極開路的,所以要在輸出端接一個上拉電阻,通常單片機驅(qū)動ULN2003時,上拉2K的電阻較為合適。

  3.4.3 步進電機驅(qū)動電路設計

由于單片機的輸出電流太小,而步進電機需要較大的驅(qū)動電流,所以需要驅(qū)動電路來連接單片機和步進電機。本設計中我們采用四相步進電機作為小車的驅(qū)動電機,用單極性直流電源供電。采用ULN2003芯片直接驅(qū)動步進電機,步進電機驅(qū)動電路如圖3.14所示:

圖3.14 步進電機驅(qū)動電路

ULN2003的輸入端直接與單片機的P2.4-P2.7引腳相連,單片機輸出不同的脈沖信號,這些脈沖信號經(jīng)ULN2003驅(qū)動芯片放大后分別控制步進電機的啟動、停止、正轉(zhuǎn)、反轉(zhuǎn)、加速和減速。本設計中只要對步進電機的各相繞組按合適的時序通電,就能使步進電機轉(zhuǎn)動。正、反轉(zhuǎn)可由輸入不同順序的脈沖信號來控制以實現(xiàn)小車的前進和后退;我們使用兩個步進電機分別控制小車的左輪和右輪,通過單片機輸出不同頻率的脈沖使左右兩個車輪具備不同的轉(zhuǎn)速,由轉(zhuǎn)速差實現(xiàn)小車的轉(zhuǎn)向,當左側(cè)車輪轉(zhuǎn)速大于右側(cè)車輪時小車右轉(zhuǎn),當右側(cè)車輪轉(zhuǎn)速大于左側(cè)時小車左轉(zhuǎn)。

3.5 避障循跡模塊

本設計我們采用了紅外反射式光電傳感器、電壓比較器及一些電阻來構成障礙物檢測電路,并直接與單片機的P1.4引腳相連,其可將檢測到的模擬信號轉(zhuǎn)化為高低電平信號然后輸入到單片機,單片機根據(jù)輸入的高低電平信號來判斷是否有障礙物,若有則調(diào)用自動避障子程序控制小車做出相應的避障動作。障礙物檢測電路如圖3.15所示:

圖3.15 障礙物檢測電路

圖中U3紅外反射式光電傳感器是由紅外發(fā)光二級管和光敏三極管組成的,紅外發(fā)光二級管用來發(fā)射紅外線,光敏三極管用來接收被反射回來的紅外線。紅外接收/檢測器有一個內(nèi)置的只允許紅外光線通過的光濾波器和一個只允許38.5 kHz左右電信號通過的電子濾波器,這樣就防止了外來光源對紅外接收器的干涉。

U4是電壓比較器,它能夠?qū)⑤斎氲哪M電壓信號轉(zhuǎn)化為高低電平信號,當3腳電平大于4腳時,輸出端1腳輸出為高電平,反之輸出為低電平。障礙物檢測電路安裝在小車前部的中間及左右兩邊,來檢測小車前方的障礙物。其障礙檢測過程如下:紅外二極管發(fā)出紅外光,如果遇到小車前面的障礙物,紅外線就會被物體反射回來并被光敏三極管吸收,此時光敏三極管導通并在輸出端輸出低電平信號至單片機,然后單片機調(diào)用尋跡避障子程序控制步進電機做出相應的避障反應,當左邊遇到障礙物時小車右轉(zhuǎn),當右邊遇到障礙物時小車左轉(zhuǎn)。當無障礙物時,發(fā)出的紅外線不被反射,光敏三極管截止,輸出高電平信號,小車繼續(xù)向前行駛[9]。

循跡的原理和避障的原理是相同的,循跡電路安裝在小車底部,循跡是通過辨別黑白色來行走。工作過程如下:紅外發(fā)光二極管發(fā)出紅外光,當遇到黑色,不反射紅外光,比較器輸出為高電平;當遇到白線,紅外光被反射回來,比較器輸出為低電平。單片機根據(jù)輸入電平的變化判斷小車的行駛路線是否偏離,然后調(diào)用自動避障子程序?qū)崿F(xiàn)小車的自動循跡,當左邊檢測到白色時小車右轉(zhuǎn),當右邊檢測到白色時小車左轉(zhuǎn);當兩邊檢測到的都是黑色時小車前進,當兩邊檢測到的都是白色時小車停止。

3.6 轉(zhuǎn)速檢測模塊

施密特觸發(fā)器是具有特殊功能的非門,當它的輸入端的電壓上升到某個值時,輸出端會立即從高電平跳變?yōu)榈碗娖?而當輸入端的電壓下降到某一個值時,輸出端會立即從低電平跳變?yōu)楦唠娖。本設計采用直射式光電檢測器、施密特觸發(fā)器、三極管和若干電阻構成的電路與單片機的P1.6引腳相連來測量小車車輪的轉(zhuǎn)速,其實物圖和電路圖如圖3.16所示:

                          

                      圖3.16 透射式光電測速實物和電路圖

具體的轉(zhuǎn)速檢測方法是:在小車的驅(qū)動輪的主軸上安裝一個開有十個透光槽的圓形葉片,保持葉片和驅(qū)動輪能夠同步轉(zhuǎn)動,然后在驅(qū)動輪旁安裝好直射式光電檢測器,葉片隨著車輪的轉(zhuǎn)動不斷切割紅外發(fā)射管與紅外接受管之間的光通路,當葉片轉(zhuǎn)動至透光槽與光通路重合時,光通路導通,光敏三極管通過電流,輸出端會輸出一個低電平信號,當葉片轉(zhuǎn)動至使透光槽遮住時,光通路斷開,輸出端會輸出一個高電平信號。隨著車輪不斷的轉(zhuǎn)動,光通路不斷的導通和斷開,輸出端便會輸出連續(xù)的脈沖序列,測出脈沖的個數(shù)便可知葉片轉(zhuǎn)過的孔數(shù),由葉片轉(zhuǎn)過的孔數(shù)可以知道車輪轉(zhuǎn)過的圈數(shù),從而可計算出車輪轉(zhuǎn)動的轉(zhuǎn)速,然后再根據(jù)車輪半徑便可算出小車運行的速度和路程[11]。

3.7 數(shù)據(jù)顯示模塊

本設計中小車的數(shù)據(jù)顯示電路采用液晶顯示屏LCD1602,LCD1602具有8位并行2線或者3線串行兩種接口方式。LCD1602液晶顯示模塊具有體積小、功耗低、顯示內(nèi)容豐富、超薄輕巧等優(yōu)點。具體的液晶顯示電路如圖3.17所示:

   

                       圖3.17 LCD液晶顯示電路

電路中LCD1602與AT89C52單片機使用并行數(shù)據(jù)通信。引腳1接電源電壓正極,引腳0、14、15分別接電源電壓負極,為LCD1602提供電源與背光電源;2腳接一個10K電位器用于調(diào)節(jié)背光燈光度;3、4、5腳分別接P1.0、P1.1、P1.2腳作為單片機控制信號輸入與輸出端;6—13腳接單片機的P0.0—P0.7腳作為單片機數(shù)據(jù)信息輸入端。數(shù)據(jù)顯示的原理為:首先通過數(shù)據(jù)顯示子程序?qū)⑿≤嚨乃俣、路程等?shù)據(jù)信息計算出來,然后再將這些數(shù)據(jù)信息通過單片機的P0.0-P0.7引腳直接輸出至LCD1602的DO-D7引腳[8]。

3.8 電源模塊

電源是整個小車系統(tǒng)運行的基本條件,它的性能的好壞直接決定整個系統(tǒng)運行的穩(wěn)定性和性能。小車的供電電源包含兩部分,單片機控制模塊電源和電機驅(qū)動模塊電源,我們將單片機及其外圍電路和步進電機分開供電,兩者互相不影響,實現(xiàn)穩(wěn)定供電。

本設計中我們采用3節(jié)4.2V鋰電池串聯(lián)共12.6V直接給步進電機供電,用于驅(qū)動小車電機,也可降至5V后給單片機及其他邏輯單元供電。這三節(jié)電池的體積和重量都比較小,便于安裝在小車底座,不會造成電機負載過大,而且價格低、電流驅(qū)動能力強。為了給單片機及其他邏輯單元供電,必須將鋰電池組的電壓降至5V,這里我們采用LM7805穩(wěn)壓芯片進行降壓,穩(wěn)壓電路如圖3.18所示:

圖3.18 5V穩(wěn)壓電路

第四章 系統(tǒng)軟件設計

在進行微機控制系統(tǒng)設計時,除了系統(tǒng)硬件設計外,大量的工作就是如何根據(jù)每個對象的實際需要設計應用程序,小車能否實現(xiàn)要求功能取決于軟件的編程是否合理。本設計采用模塊化程序設計法進行系統(tǒng)軟件的設計,主要包含主程序、避障循跡子程序、數(shù)據(jù)顯示子程序等程序模塊。由于本人水平和能力有限只完成了部分模塊的程序設計。

4.1 系統(tǒng)總體程序流程圖

系統(tǒng)的總體程序流程圖如圖4.1所示:

      

                      圖4.1 系統(tǒng)程序流程圖

在圖4.1系統(tǒng)程序流程圖中,開始時先是系統(tǒng)的初始化,包括定時器初始化,外部中斷的初始化,液晶顯示器的初始化。其中避障循跡子程序用于控制小車自動躲避障礙和自動沿著特定的黑線行駛;數(shù)據(jù)顯示子程序主要是將測得的車輪轉(zhuǎn)速換算成小車的行駛的速度、路程等數(shù)據(jù)進而在LCD1602液晶顯示屏顯示。

4.2 避障循跡模塊程序設計

  4.2.1 避障程序流程圖

      

                           圖4.2 避障程序流程圖

圖4.2所示為小車避障程序流程圖,小車在行駛過程中由位于小車前部的四個障礙物檢測電路不斷檢測小車周圍環(huán)境,若遇到障礙物則將低電平信號輸入至單片機,然后由單片機調(diào)用避障子程序控制小車作出相應的避障動作。如果左邊遇到障礙則調(diào)用右轉(zhuǎn)子程序,右邊遇到障礙則調(diào)用左轉(zhuǎn)子程序,前方遇到障礙則調(diào)用左轉(zhuǎn)或右轉(zhuǎn)子程序,沒有遇到障礙則調(diào)用直行子程序。具體的程序請見附錄B避障子程序。

4.2.2 循跡程序流程圖

      

                          圖4.3 循跡程序流程圖

圖4.3所示為循跡程序流程圖,小車在循跡行駛過程中安裝在小車底部的四個紅外反射式光電開關不斷檢測小車的行駛路線,若小車偏離黑線則將檢測到的低電平信號輸入至單片機,單片機再調(diào)用循跡子程序控制小車使其沿著黑線行駛,如果小車偏向黑線左邊則調(diào)用右轉(zhuǎn)子程序,偏向黑線右邊則調(diào)用左轉(zhuǎn)子程序,在黑線上則調(diào)用直走子程序,完全偏離黑線則調(diào)用后退子程序。具體的程序請見附錄B循跡子程序。

4.3數(shù)據(jù)顯示模塊程序設計

                  

                      圖4.4 數(shù)據(jù)顯示程序流程圖

在圖4.4數(shù)據(jù)顯示程序流程圖中,首先初始化LCD1602,然后在液晶的第一行顯示“路程: cm”,液晶第二行顯示“速度: cm/s”然后由主程序不斷調(diào)用數(shù)據(jù)顯示程序不斷刷新cm或者cm/s前面的數(shù)字實現(xiàn)實時顯示的目的。具體的程序請見附錄B數(shù)據(jù)顯示子程序。

第五章 總結(jié)與展望

5.1 總結(jié)

本設計的智能小車基本上實現(xiàn)了題目要求的各項功能,可以用遙控來控制小車的啟停、左轉(zhuǎn)、右轉(zhuǎn)、前進、倒退,小車能自動沿著黑線行駛,遇到障礙時能夠自動躲避障礙,而且可以實時顯示運行的速度、路程等數(shù)據(jù)。通過本次設計讓我學會了電子產(chǎn)品的設計開發(fā)過程,掌握了紅外遙控原理、步進電機的驅(qū)動原理、采用紅外反射式光電開關檢測障礙的原理、顯示原理等自己以前并不了解的新知識,對單片機的結(jié)構和其控制系統(tǒng)也有了更深的理解和認識,對于Altium Designer、Proteus等電路設計和仿真軟件的操作也更加熟練,特別是在、自己最不擅長的軟件編程方面也有了一定的提高。

但是由于本人水平和能力有限,本設計中還存在一些不足之處。例如由于安裝在小車上面的紅外傳感器檢測范圍有限,存在一些檢測盲區(qū),光電檢測也容易收到外界環(huán)境和太陽光的干擾,有時可能會導致小車的循跡避障功能失效;小車是利用轉(zhuǎn)速差來轉(zhuǎn)彎的但是這種方法轉(zhuǎn)彎不夠順暢也不能持續(xù)轉(zhuǎn)彎并且對電機的損耗也較大,這些都有待進一步的改進和完善。

5.2 改進與展望

在本設計中我們可以采用超聲波避障來代替紅外避障以減少外界干擾;多安裝幾個尋跡電路,在小車的車頭底部左右兩邊各一個,中間底部左右兩邊各一個,車尾底部左右兩邊各一個,這樣可提高小車尋跡功能的可靠性和靈敏性;通過多組速度(不同脈沖所對應的速度)的實際測試,尋找更合適的轉(zhuǎn)向速度,以提高轉(zhuǎn)向的精確度。

我們還可以為小車添加語音控制模塊,用語音來控制小車的一些狀態(tài),這樣將大大增加其人機交互控制的趣味性。


致謝

    不知不覺三個月的時間過去了,從開始的搜集查找相關文獻資料確定一個大體的設計思路到后來一步步的進行各個模塊的具體設計再到現(xiàn)在最終設計的完成,特別感謝我的指導老師楊安平老師在設計過程中給予我的極大幫助,雖然老師平時很忙,但每周仍會抽出兩次時間來對我不懂的地方進行耐心的指導,并對我的設計方案提出一些改進的意見,教會了我解決相關問題的具體思路和方法,并且在我不擅長的硬件設計和軟件設計方面給予了我細心的講解。本設計能夠順利完成設計任務,除了楊老師外還有很多同學也對我的設計進行了一些指導和幫助,在此對你們表示最誠摯的感謝!

    最后還要感謝各位評閱老師在百忙之中抽出時間對本論文進行評閱,謝謝!



單片機源程序如下:
  1. #include<uart.h>
  2. #define LeftIR P1_2      //左邊紅外接收連接到P1_2
  3. #define RightIR P3_5    //右邊紅外接收連接到P3_5
  4. #define LeftLaunch P1_3 //左邊紅外發(fā)射連接到P1_3
  5. #define RightLaunch P3_6 //右邊紅外發(fā)射連接到P3_6
  6. void delay_nus(unsigned int i)
  7. {
  8.   i=i*10/12;
  9.   while(--i);
  10. }
  11. void Hardware_delay_1ms(void)
  12. {
  13.    TMOD &=0xF0;
  14.    TMOD |=0x01;  //T0——16位定時器器模
  15.   TH0 = 0xFC;
  16.    TL0 =0x18;    //64536
  17.    TF0=0;        //清除定時器溢出標志
  18.    TR0=1;         //啟動定時器   
  19.   while(TF0==0);  //等待計數(shù)完成
  20.   TR0=0;         //停止定時器
  21. }
  22. void delay_nms(int n) //延時ms
  23. {
  24.     int j;
  25.     for(j=n;j>0;j--)
  26.      Hardware_delay_1ms();   
  27. }
  28. void IRLaunch(unsigned char IR)
  29. {
  30. int counter;
  31. if(IR==‘L’)              //左邊發(fā)射
  32. for(counter=0;counter<38;counter++)
  33. {
  34. LeftLaunch=1;
  35. delay_nus(13);
  36. LeftLaunch=0;
  37. delay_nus(13);
  38. }
  39. if(IR=='R')              //右邊發(fā)射
  40. for(counter=0;counter<38;counter++)
  41. {
  42. RightLaunch=1;
  43. delay_nus(13);
  44. RightLaunch=0;
  45. delay_nus(13);
  46. }
  47. }
  48. void Forward(void)          //直行子程序
  49. {
  50. P1_1=1;
  51. delay_nus(1700);
  52. P1_1=0;
  53. P1_0=1;
  54. delay_nus(1300);
  55. P1_0=0;
  56. delay_nms(20);
  57. }
  58. void Left_Turn(void)      //左轉(zhuǎn)子程序
  59. {
  60. int i;
  61. for( i=1;i<=23;i++)
  62. {
  63. P1_1=1;
  64. delay_nus(1300);
  65. P1_1=0;
  66. P1_0=1;
  67. delay_nus(1300);
  68. P1_0=0;
  69. delay_nms(20);
  70. }
  71. }
  72. void Right_Turn(void)      //右轉(zhuǎn)子程序
  73. {
  74. int i;
  75. for( i=1;i<=23;i++)
  76. {
  77. P1_1=1;
  78. delay_nus(1700);
  79. P1_1=0;
  80. P1_0=1;
  81. delay_nus(1700);
  82. P1_0=0;
  83. delay_nms(20);
  84. }
  85. }
  86. void Backward(void)        //后退子程序
  87. {
  88. int i;
  89. for( i=1;i<=65;i++)
  90. {
  91. P1_1=1;
  92. delay_nus(1300);
  93. P1_1=0;
  94. P1_0=1;
  95. delay_nus(1700);
  96. P1_0=0;
  97. delay_nms(20);
  98. }
  99. }
  100. int main(void)
  101. {
  102. int irDetectLeft,irDetectRight;
  103. uart_Init();
  104. printf("Program Running!\n");
  105. while(1)
  106. {
  107. IRLaunch('R');                  //右邊發(fā)射
  108. irDetectRight = RightIR;        //右邊接收
  109. IRLaunch('L');                  //左邊發(fā)射
  110. irDetectLeft = LeftIR;          //左邊接收
  111. if((irDetectLeft==0)&&(irDetectRight==0))//同時接到紅外線
  112. {
  113. Backward();
  114. Left_Turn();
  115. Left_Turn();
  116. }
  117. else if(irDetectLeft==0)        //只有左邊接收到紅外線
  118. {
  119. Backward();
  120. Right_Turn();
  121. }
  122. else if(irDetectRight==0)       //只有右邊接收到紅外線
  123. {
  124. Backward();
  125. Left_Turn();
  126. }
  127. else
  128. Forward();
  129. }
  130. }


  131. 循跡子程序
  132. #include <uart.h>
  133. #define LD1    P1_2;   //左左檢測燈
  134. #define LD2    P1_3;   //中左檢測燈
  135. #define RD1    P3_5;   //中右檢測燈
  136. #define RD2    P3_6;   //右右檢測燈
  137. void delay_nus(unsigned int i)
  138. {
  139.   i=i*10/12;
  140.   while(--i);
  141. }  
  142. void Hardware_delay_1ms(void)
  143. {
  144.    TMOD &=0xF0;
  145.    TMOD |=0x01; //T0——16位定時器器模
  146.   TH0 = 0xFC;
  147.    TL0 =0x18;    //64536
  148.   TF0=0;        //清除定時器溢出標志
  149.    TR0=1;         //啟動定時器   
  150.   while(TF0==0);//等待計數(shù)完成
  151.    TR0=0;         //停止定時器
  152. }
  153. void delay_nms(int n)
  154. {
  155.     int j;
  156.     for(j=n;j>0;j--)
  157.      Hardware_delay_1ms();   
  158. }
  159. void Forward(void)           //直行子程序
  160. {
  161. P1_1=1;
  162.                             delay_nus(1440);
  163.                             P1_1=0;
  164.                             P1_0=1;
  165.                 delay_nus(1400);
  166.                             P1_0=0;
  167.                             delay_nms(20);
  168.               }
  169. void Left_Turn(void)      //左轉(zhuǎn)子程序
  170.                             {
  171.                             int i;
  172.                             for( i=1;i<=15;i++)
  173.                                           {
  174.                                           P1_1=1;
  175.                                           delay_nus(1420);
  176.                                           P1_1=0;
  177.                                           P1_0=1;
  178.                                           delay_nus(1400);
  179.                                           P1_0=0;
  180.                                           delay_nms(20);
  181.                                           }
  182.                             }
  183. void Right_Turn(void)       //右轉(zhuǎn)子程序
  184.                             {
  185.                             int i;
  186.                             for( i=1;i<=15;i++)
  187.                                           {
  188.                                           P1_1=1;
  189.                                 delay_nus(1440);
  190.                                           P1_1=0;
  191.                                           P1_0=1;
  192.                                 delay_nus(1420);
  193.                                           P1_0=0;
  194.                                           delay_nms(20);
  195.                                           }
  196.                             }
  197. void Backward(void)        //后退子程序
  198.                             {
  199.                             int i;
  200.                             for( i=1;i<=65;i++)
  201.                                           {
  202.                                           P1_1=1;
  203.                                 delay_nus(1400);
  204.                                           P1_1=0;
  205.                                           P1_0=1;
  206.                                 delay_nus(1440);
  207.                                           P1_0=0;
  208.                                           delay_nms(20);
  209.                                           }
  210.                             }
  211. int main ()
  212. {
  213. int L1,L2,R1,R2;
  214. uart_Init();
  215. printf("Program Running!\n");
  216.               while(1)
  217.               {
  218. L1=LD1;
  219.                   L2=LD2;
  220.                   R1=RD1;
  221.                   R2=RD2;
  222. if((L1==1)&&(R2==0))         //左燈檢測到黑色右燈檢測到白色 左轉(zhuǎn)
  223.                             {
  224.                             Left_Turn();
  225.                             }
  226. else if((L1==0)&&(R2==1))      //左燈檢測到白色右燈檢測到黑色 右轉(zhuǎn)
  227.                             {
  228.                   Right_Turn();
  229.                             }
  230. else if((L1==0)&&(L2==0)&&(R1==0)&&(R2==0)) //四個燈都檢測到白色 后退
  231.                             {
  232.                             Backward();
  233.                             }
  234. else if((L1==1)&&(L2==1)&&(R1==1)&&(R2==1))//四個燈都檢測到黑色 后退
  235.                             {
  236.                             Backward();
  237.                             }
  238. else      //前進
  239.                             {
  240.                             Forward();
  241.                             }
  242.               }
  243.    }
  244. 數(shù)據(jù)顯示子程序
  245. bit lcd_busy()                //判忙函數(shù)
  246. {
  247.               bit result;
  248.               RS=0;
  249.               RW=1;
  250.               E=1;
  251.               _nop_();
  252.               _nop_();
  253.               _nop_();
  254.               _nop_();
  255.               result = (bit)(P0&0x80);
  256.               E=0;
  257.               return result;
  258. }
  259. void lcd_write_cmd(uchar cmd)   //液晶寫指令
  260. {
  261.               while(lcd_busy());
  262.               RS=0;
  263.               RW=0;
  264.               E=0;
  265.               _nop_();
  266.               _nop_();
  267.               P0=cmd;
  268.               _nop_();
  269.               _nop_();
  270.               _nop_();
  271.               _nop_();
  272.               E=1;
  273.               _nop_();
  274.               _nop_();
  275.               _nop_();
  276.               _nop_();
  277.               E=0;                           
  278. }
  279. void lcd_write_dat(uchar dat)                            //液晶寫數(shù)據(jù)指令
  280. {
  281. ……………………

  282. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
基于單片機的智能小車設計.doc (1.04 MB, 下載次數(shù): 162)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發(fā)
ID:517182 發(fā)表于 2019-4-20 16:28 | 只看該作者
怎么沒有完整的電路設計圖?發(fā)出來學習學習
回復

使用道具 舉報

板凳
ID:717081 發(fā)表于 2020-3-30 21:11 | 只看該作者
搜獲很大,很詳細
回復

使用道具 舉報

地板
ID:720168 發(fā)表于 2021-1-18 15:30 | 只看該作者
你好,發(fā)射電路的NPN是哪種類型
回復

使用道具 舉報

5#
ID:960382 發(fā)表于 2021-8-13 16:34 | 只看該作者
看看步進電機,也玩玩這個
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表