本科畢業論文
基于單片機智能小車設計 Design based on microcomputer smart car
學院名稱: 電子信息與電氣工程學院 專業班級:自動化2013級2班 學生姓名:魯順 學 號: 13020610225 指導教師姓名:楊欣 指導教師職稱:講師
2017 年 5 月 畢業設計(論文)原創性聲明和使用授權說明 原創性聲明 本人鄭重承諾:所呈交的畢業設計(論文),是我個人在指導教師的指導下進行的研究工作及取得的成果。盡我所知,除文中特別加以標注和致謝的地方外,不包含其他人或組織已經發表或公布過的研究成果,也不包含我為獲得安陽工學院及其它教育機構的學位或學歷而使用過的材料。對本研究提供過幫助和做出過貢獻的個人或集體,均已在文中作了明確的說明并表示了謝意。 作 者 簽 名: 日 期: 指導教師簽名: 日 期: 使用授權說明 本人完全了解安陽工學院關于收集、保存、使用畢業設計(論文)的規定,即:按照學校要求提交畢業設計(論文)的印刷本和電子版本;學校有權保存畢業設計(論文)的印刷本和電子版,并提供目錄檢索與閱覽服務;學校可以采用影印、縮印、數字化或其它復制手段保存論文;在不以贏利為目的前提下,學校可以公布論文的部分或全部內容。
作者簽名: 日 期: 目錄 摘要。 5 Abstract. 6 引 言 7 第一章 方案設計與論證 9 1.1 設計任務及要求 9 1.2 設計方案論證 9 1.2.1 單片機選擇 9 1.2.2 電機驅動芯片的選擇 11 1.2.3 路況檢測模塊 12 2 系統硬件電路與實現 14 2.1 主控模塊電路設計 14 2.1.1 STC89C52單片機的簡介 14 2.1.2時鐘電路 16 2.1.3復位電路 18 2.2紅外遙控模塊的電路設計 19 2.2.1紅外遙控的實現原理 20 2.2.2紅外發射器 21 2.2.3紅外接收器 22 2.3電機驅動模塊的設計 23 2.3.1 L293D芯片簡介 24 2.4路況檢測模塊 26 2.4.1 HC-SR04超聲波模塊 26 2.4.2 循跡模塊 29 2.4.3傳感器的選擇: 30 2.5藍牙無線傳輸模塊 31 2.5.1藍牙模塊的選擇 31 2.5.2顯示模塊的電路顯示 35 2.6智能防撞報警模塊 36 2.6.1智能防撞報警模塊原理 36 3系統軟件設計與實現 38 3.1整體程序的構架 39 3.2紅外遙控解碼的實現 39 3.3電機驅動 42 3.4 小車尋跡 42 3.5 小車防撞報警 44 4 小車系統原理圖 46 總結 48 參考文獻 50 附錄 52 元件清單 52 系統程序 53
基于單片機智能小車設計 摘要:隨著科學技術的不斷進步,關于汽車的研究也成為人們關注的焦點,智能車輛將成為未來的必然產物,本設計產品就是根據這一大背景下提出來的,本設計是基于STC89C52單片機控制及傳感器技術的,來實現小車自動自動尋線尋跡,利用超聲波模塊來完成避障功能,小車前輪由兩個電機驅動左右兩個輪,通過兩個電機的轉速及轉動時間的差別,達到小車正常行駛和轉向的目的。安裝藍牙模塊,通過手機app來實現無線通信,來控制小車的行駛。 關鍵詞:智能小車;STC89S52單片機;尋線;避障;超聲波傳感器;藍牙
Design based on microcomputer smart car Abstract:Along with the advance of science and technology, the research on vehicle has become the focus of attention, intelligent vehicle will become the inevitable outcome of the future, the design of products is based on this background, this design is based on the STC89C52 single-chip microcomputer control and sensor technology, to realize the automatic automatic car line tracing, the use of ultrasonic module to complete obstacle avoidance function, the car front wheel driven by two motor around two rounds, through two motor rotation speed and the difference of time, achieve the goal of the car moving and steering.Install bluetooth module, realize the wireless communication through mobile phone app, to control the motion of the car.Key words:Smart car;STC89S52 ;microcontroller; Line; Obstacle avoidance; Ultrasonic sensor; bluetooth.
引言 隨著科學技術的飛速發展,關于智能汽車的研究也就備受人們的關注。每年舉行的全國電子大賽中,各種功能的智能小車項目都占很大的比例,全國的各個高校也都非常重視智能小車課題的研究。可見其研究意義很大。智能小車是現代科學技術的新產品,將會是以后的發展方向和必然產物,他可以在沒有人直接參與的情況下,利用外加的設備或裝備,使小車的某個工作狀態或者參數自動的按照預定的規定運行。可用于科學探索偵察等的用途。智能小車的控制器模塊主要接收傳感器部分發送過來的實時信號,并且根據之前燒錄到單片機中的軟件程序,來命令智能小車做出相應的動作,就像是人的大腦部分。而執行器模塊和傳感器模塊則像是人體的四肢和眼睛耳朵一樣。單片機具備構造簡單、可靠性高、多功能、適合在惡劣環境中工作、抗干擾能力高及小型化等優勢,他滲透到生活的各個領域,可以說哪一個范疇都能找到單片機的蹤影,首先應用最廣泛的就是生產自動化領域的應用,能降低勞動程度,提高生產效率,還可以應用實時測量方面、智能化儀表、智能化產品、家用電器、國防現代化、信息通信領域等。這些年來,單片機技術突飛猛進,一些高功能的單片機如雨后春筍大量涌現,技術日新月異,是我們做智能小車的首選。
第一章 方案設計與論證 1.1 設計任務及要求本智能小車的設計要求如下: ●具有單片機控制核心模塊; ●具有電機驅動模塊; ●具有超聲波避障模塊; ●具有光電感應模塊; ●具有七段數碼管顯示模塊; ●具有無線藍牙傳輸模塊; ●具有防撞報警模塊;
1.2 設計方案論證1.2.1 單片機選擇方案一:采用MSP430單片機 MSP430系列單片機他具有處理能力強、超低功耗、片內資源豐富等優點。但是也有很多不足之處,比如價格較高,比較適用于復雜的應用系統,當用戶設計需要更多考慮成本時,MSP430單片機并不一定合適。 方案二:采用STC89C52單片機 ●全靜態工作,工作范圍:0Hz~24MHz;
●三級程序存儲器加密;
●128×8位內部RAM;
●32位雙向輸入輸出線;
●兩個十六位定時器/計數器
●五個中斷源,兩級中斷優先級;
●一個全雙工的異步串行口;
●間歇和掉電兩種工作方式; 方案選擇: 綜上所述:通過以上兩種方案的比較,在本系統中的單片機選 第二個方案,MSP430對系統的控制比較麻煩并且價位較高,所以選擇使用STC89S52作為控制器芯片。 1.2.2 電機驅動芯片的選擇方案一:使用L298N芯片來驅動普通直流電機,用該芯片作為電機驅動,操縱便利,比較平穩,直流電機具有能耗低、性能優越、振動小、噪聲低、維護成本低、調整范圍廣等優點,普通直流電機結構緊湊,體積小,造型美觀,通用性強,采用新型密封裝置的直流電機保護性能好,對環境適應性強,可在惡劣的環境中連續工作。 方案二:采用步進電機,步進電動機最主要的功能就是能夠控制位置,你要它在什么地方停止,它就在什么地方停止,并且可以實現開環控制無需反饋信號,優點是中低輸出力矩大、性價比高,只有伺服的四分之一左右,缺點是振動大、發熱大高速性能差、有丟步的可能,需要專門的驅動器。 方案選擇: 本智能小車設計采用方案一更好,購買方便,價錢合理。 1.2.3 路況檢測模塊方案一:使用超聲波傳感器,超聲波是一種機械波,依靠介質才能傳播,從發射信號開始到接收到信號結束來計算往返的時間差,并且將信號放大后放到主控制芯片當中從而判定距離,這就是它工作的原理。現在應用比較廣泛的還有一種方法也是利用同樣的原理實現的,比如紅外光探頭,同樣可以在高精度下完成測量,并且簡化了電路,它的使用成本低、易于操作,在智能機器人發揮著很大的作用。 方案二:使用視覺傳感器,它主要是由攝像頭及處理圖像的控制器組成,廣泛的應用于生產現場,用于檢測零部件的優良,從而避免次品外流,可以同時測量多個目標,具有高精度的特點,其優點是尺寸小,價格合理,但是算法復雜,運行速度慢。 方案選擇:
綜合以上方案,采用方案一較為合理,因為本設計的智能小車實現避障功能即可,無需太復雜,并不需要經過傳輸回來的圖像來分析前方障礙物。
2 系統硬件電路與實現本智能小車采用了STC89C52單片機作為主要控制芯片來處理各個模塊的運行,系統整體硬件總框圖如圖2.1 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB2E.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB2F.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB30.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB31.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB32.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB33.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB34.tmp.png 圖2.1 系統硬件總體框圖
2.1 主控模塊電路設計 2.1.1 STC89C52單片機的簡介 STC89C52是STC公司生產的一種低功耗、高性能CMOS8位微控制器,其主要特點是: ●全靜態工作,工作范圍:0Hz~24MHz;
●三級程序存儲器加密;
●128×8位內部RAM;
●32位雙向輸入輸出線;
●兩個十六位定時器/計數器
●五個中斷源,兩級中斷優先級;
●一個全雙工的異步串行口;
●間歇和掉電兩種工作方式;
圖2.1 STC89C52的管腳圖 (1)主要特性: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB35.tmp.jpg 圖2.1.1 ●用戶應用程序空間為8K字節 ●片上集成512字節RAM ●具有EEPROM功能 ●共3個16位定時器/計數器。即定時器T0、T1、T2 ●PDIP封裝
2.2紅外遙控模塊的電路設計 2.2.1紅外遙控的實現原理 怎么樣才能讓燒錄的程序去分析0位和1位是紅外遙控能夠實現的至關重要步驟,高電平脈沖后的低電平的脈寬的不一樣也就定義了是位0還是位1,位0代表的是脈沖寬度為0.565ms、時間間隔為0.56ms、周期為1.125ms;而位1代表的脈沖脈寬為0.565ms、時間間隔為1.685ms、周期為2.25ms。
解碼和上訴紅外遙控實現原理類似,也是如何讓程序去識別分析0位和1位。位0和位1的相同點是都是從低電平0.565ms開始的,不同點在于它們的高電平寬度不同,所以高電平寬度就是區分位0還是位1的關鍵。紅外遙控的流程圖如圖2.2.1所示。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB36.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB37.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB47.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB48.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB49.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB4A.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB4B.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB4C.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB4D.tmp.png 充電放大 解調 解碼 圖2.2.1
2.2.2紅外發射器 該電路的主要控制器件是采用PPM進行編碼遙控器芯片HT6221,紅外遙控發射器電路圖如圖2.2.2所示。各個開關的功能分別為:K1停止;K2右轉;K3左轉;K4啟動;K5加速;K6循跡;K7制動;K8后退。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB4E.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB4F.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB50.tmp.png file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB51.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB52.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB63.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB64.tmp.png 鍵盤 編碼調制 LED
圖2.2.2 2.2.3紅外接收器 紅外線接收器的主要特點: ●小型設計 ●內置專用IC ●寬角度及長距離接收 ●抗干擾能力強 ●能抵擋環境干擾光纖 ●低電壓工作 ●紅外線接收器的結構 ●脈沖信號輸出端,直接接單片機的IO口 ●GND接系統的地線(0V) ●VCC接系統的電源正極(+5V) 該模塊的電路如圖2.2.3所示。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB65.tmp.jpg
圖2.2.3
2.3電機驅動模塊的設計 2.3.1 L293D芯片簡介 L293D驅動芯片主要特點是: ●工作電壓高,最高工作電壓可達36V ●該芯片可以驅動兩臺直流電機
一、直流電機驅動模塊的參數
輸入邏輯電壓:5.0V
輸入電機電壓:5.0V-36.0V
輸出驅動電流:1000mA
尺寸:(長)34mm * (寬)18mm * (高)8mm
連接方式:
P1:控制M1電機PWM1輸入引腳。
D1:控制M1電機轉向輸入引腳。
P2:控制M2電機PWM2輸入引腳。
D2:控制M2電機轉向輸入引腳。
GND:電源地接口。
5V:邏輯電源+5V接口。
VC:輸入電機驅動電壓接口。
GND: 電源地接口。
M1+:M1電機驅動輸出引腳正極。
M1-:M1電機驅動輸出引腳負極。
M2+:M2電機驅動輸出引腳正極。
M2-:M2電機驅動輸出引腳負極。 電機驅動模塊的硬件電路圖如圖2.3.1。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB66.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB67.tmp.jpg 圖2.3.1
2.4路況檢測模塊2.4.1 HC-SR04超聲波模塊 1、此模塊性能穩定,測度距離精確,模塊高精度,盲區小,圖2.4.1為HC-SR04超聲波模塊實物圖。
2、 主要技術參數:
●使用電壓:DC---5V
●靜態電流:小于2mA
●電平輸出:高5V
●電平輸出:底0V
●感應角度:不大于15度
●探測距離:2cm-450cm
●高精度 可達0.2cm file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB68.tmp.jpg 圖2.4.1 3、電氣參數
電氣參數 | | | | | | | | | | | | | | | | | | | [size=12.0000pt] 45*20*15mm |
2.4.2 循跡模塊 小車循跡的原理:使用紅外探測法使小車延黑線行駛,其主要特點是紅外線在不同顏色的物體上反射性質不同,在小車行駛過程中不斷地向地面發射紅外光,當紅外光遇到白色紙質地板時發生漫反射,反射光被裝在小車上的接收管接收;如果遇到黑線則紅外光被吸收,小車上的接收管接收不到紅外光,小車前方探頭實物如圖2.4.2所示。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB69.tmp.jpg 圖2.4.2
2.4.3傳感器的選擇: ST系列集成紅外探頭價格便宜、體積小、使用方便、性能可靠、用途廣泛,所以該系統中最終選擇了LM324反射傳感器作為紅外光的發射和接收器件,其內部結構和外接電路均較為簡單,其硬件原理圖如圖2.4.3所示,LM324引腳圖(管腳圖)如圖2.4.3-2所示。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB6A.tmp.jpg 圖 2.4.3-1
LM324的特點: ●短跑保護輸出 ●真差動輸入級 ●可單電源工作:3V-32V ●每封裝含四個運算放大器。 ●具有內部補償的功能。 ●共模范圍擴展到負電源 ●行業標準的引腳排列 ●輸入端具有靜電保護功能
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB6B.tmp.jpg 圖2.4.3-2
2.5藍牙無線傳輸模塊 2.5.1藍牙模塊的選擇 ZS-040是比較早的產品,AT指令集很少,包括修改藍牙名(限于從機),修改密碼,修改波特率,詢問版本號等幾個基本功能,在本次設計中我們只需實現簡單的通信,因此選用ZS-040模塊,產品實物圖如圖2.5.1所示。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB7C.tmp.jpg 圖2.5.1-1 藍牙模塊ZS-040的主要特征: ●無線收發 1、靈敏度(誤碼率)達到 -80dBm 2、-4 -> 6dBm 功率可調輸出 ●性能概要 完整的藍牙解決方案 1、藍牙 2.0 帶 EDR, 2Mbps-3Mbps 調制度 2、外置 8Mbit FLASH 3、可選 PIO 控制 4、 標準 HCI 端口(UART or USB) 5、 USB 協議: Full Speed USB1.1, Compliant With 2.0 6、模塊可以作為 SMD 貼片工藝 7、RoHS 制程 8、引腳半孔工藝 ● 低功耗 ● 高性能無線收發系統 ● 低成本 ● 應用領域 1、藍牙車載免提 2、藍牙 GPS 3、藍牙 PCMCIA , USB Dongle 4、藍牙數據傳送 ● 軟件 CSR 二、 藍牙通信模塊的分析處理,引腳定義如圖2.5.1-2所示。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB7D.tmp.jpg 圖2.5.1-2 (1) ZS-040藍牙轉串口模塊的作用是將從手機藍牙發送過來的指令接收到后轉換成串口的形式通過單片機的串口傳給單片機。只需將該模塊的RXD接上51單片機的TXD引腳,TXD接51的RXD,然后接單片機的VCC供電,因為我們只用它接收手機藍牙信號,不發送數據,參考原理圖如圖2.5.1-3所示。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB7E.tmp.jpg 圖2.5.1-3 2.5.2顯示模塊的電路顯示 本系統采用一個七段數碼管顯示器,其電路原理圖如圖2.6.2所示。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB7F.tmp.jpg 圖2.6.2 當手機app控制智能小車前進、后退、左轉、右轉時,一位七段數碼管分別顯示1、2、3、4。
2.6智能防撞報警模塊
2.6.1智能防撞報警模塊原理 智能防撞報警系統是現代智能小車必裝的一個系統模塊,有很大的研究價值,有十分重要的現實意義。使智能小車能夠自動的判別前方是否有障礙物,如果前方遇到有障礙物則會自動的調節狀態以避開障礙物所帶來的嚴重損失,同時在即將遇到障礙物之前,能夠觸發報警系統,以警告主人避免危險。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB80.tmp.png將智能小車放在空曠無人的地面上,位于小車前端的兩個探頭能夠感應前方是否有阻礙行駛的障礙物,與此同時,朝下的探頭也會同時接收到來自路面路況的實時信息狀況,當小車運行到障礙物旁邊時,裝置在小車上面的主控芯片STC89C52單片機就會接收到此時的路況信息,進而去改變小車的運行方向,使小車趕緊掉頭行駛,同時發出報警信號。報警模塊硬件圖如圖2.6.1所示。
圖2.6.1 當智能小車前面遇到障礙物時,主控芯片單片機分析之后會送給P0.6一個高電平信號,使得三極管V1導通,從而引起SB1蜂鳴器導通,發出報警信號。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB81.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB82.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB83.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB84.tmp.png3系統軟件設計與實現 在進行智能小車的系統軟件設計時,我們將所有涉及到的模塊程序全部都放入到到遙控器中,這種方法主要是為了方便控制,并且不占用CPU,因為遙控模塊、尋跡模塊、以及避障模塊等都同時用到了實時檢測掃描,這樣不僅占用CPU,而且幾個程序同時運行還會產生矛盾沖突使小車無法正常工作。各個模塊的整體控制如圖3.1所示。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB85.tmp.png
圖3.1
當遙控器發送紅外信號時,會開啟STC89C52單片機外部中斷0,使主程序立刻進入中斷函數,并且進行解碼。完成解碼任務以后,主程序再接收遙控的反饋信息,主程序對比遙控器輸入值之后進入相應模塊執行相關操作,由電機驅動來完成各個模塊的處理操作,所以在圖3.1中最終箭頭是指向電機控制模塊的。 3.1整體程序的構架程序框圖如圖3.1.1所示 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB95.tmp.png 圖3.1.1 3.2紅外遙控解碼的實現因為各個模塊的程序控制都放在了遙控模塊這一單元里面,所以整個智能小車的主要線索就是紅外遙控的解碼,并且發揮了整個系統入口的作用。 每當遙控器上有按鍵被按下時,脈寬波形便被由1腳接收到由遙控器發送的紅外信號所解碼,于此同時促使主控芯片單片機產生中斷,而且開啟定時器、脈沖個數計數。記錄出每一個脈沖所經歷的時間和脈沖的總數,等到一幀的數據發送完成以后,單片機結束計數,并且關閉定時器。然后再進入判斷階段,首先判斷這一幀數據中的脈沖個數,如果脈沖個數大于31個則將數據全部舍棄,要是剛剛好則判斷接收到的脈沖是1還是0,接收完之后將數據保存起來,再來比對數據的是否正確,首先比對前導碼是否符合,也就是看一下使用中的遙控器是不是與小車匹配的遙控器,如果都正確之后再來將碼值存起來。主程序只需要調用一個swich函數來對相應碼值進行對應函數的調用就可以了,比如手動按下了下 鍵,則調用后退函數來完成小車的后退動作。如圖3.2所示 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB96.tmp.png 圖3.2
3.3電機驅動從整體上上來看,電機驅動在小車運行中占主導作用,就像是人體的四肢,它用來執行小車的所有動態操作,任何一個模塊所執行命令的外在表現。 電機驅動包括驅動控制直流電機的前進、后退、左轉、右轉以及暫停這五個功能,這五個功能不僅僅只是遙控器按下上下左右之后才執行,而是每一個模塊都會有執行電機驅動模塊的操作,所以在設計程序時,最合理的設計應該是將這些前進、后退、左右轉向單獨編譯成一個個的函數塊,每一個子模塊的運行就只需調用這些函數就可完成。這樣做就節省了很大的程序空間。舉個例子,在編寫前進函數時,為了滿足小車前進功能,只需將P0.0—P0.3賦值1010就可完成,其他左轉右轉只是改變相應P0.0—P0.3的碼值則可實現。
3.4 小車尋跡當主人打開尋跡模塊功能后,就會不停地掃描單片基中與四個前方探測器相連接的IO端口,每當檢測到哪個探測器有信號進入了,就會立刻進入之前編寫過的判斷處理程序,,當左面的第一和第二級傳感器檢測到了黑線,就會使小車左轉向,當小車右面的第一第二級傳感器檢測到了黑線,則會使小車右轉向,在經過不斷地調整后,小車會繼續延著黑線行駛,并不斷地重復上訴動作,從而實現了小車的尋跡功能。 圖3.4為小車尋跡模塊的程序流程圖
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB97.tmp.png 圖3.4 尋跡程序流程圖 3.5 小車防撞報警當開啟防撞報警功能的時候,智能小車就會進入防撞報警函數,控制小車該模塊功能的單片機IO口是P3.7,首先判斷小車前方是否有懸崖或者障礙物,如果沒有則繼續前進,如果有則會后退并且報警,進而再坐轉彎而避免危險,圖3.5為防撞報警模塊的程序流程圖。
圖3.5 防撞報警程序流程圖
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB98.tmp.png
4 小車系統原理圖硬件電路總設計圖如圖4.1所示 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB99.tmp.jpg
圖4.1 硬件電路原理圖
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB9A.tmp.jpg最終主板PCB圖
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB9B.tmp.png前板PCB 致謝時間猶如白駒過隙,轉眼間畢業論文就要完成了,同時也意味著我們即將離開美好的大學校園到社會上去實現自身的人身價值了。可以說經歷了這次的畢業設計和論文真的讓我成長了好多,從一開始拿到題目的迷茫無助,努力的翻閱資料到后來完成題目時的欣悅,這一整個過程都歷歷在目,這種將成為大學生活中一段美好的回憶。
很早以前就想做一個智能小車玩玩,所以在畢業設計選題目的時候我就直接沒有考慮其他的項目了,當拿到這個題目的時候,我的畢業指導老師著重強調了對軟件的學習和對電路的設計,智能小車所涉及到的功能模塊比較多并且電路的復雜度也不低,對于一個新手來說從開始的設計電路到仿真和焊接這一系列的步驟能一氣呵成的完成實屬不易,但是在指導老師的悉心教導以及自己的努力下終于還算是小有成就的完成了。 在不斷的努力下我的畢業設計終于完成了。開始的時候,我還以為所謂的畢業設計和畢業論文只是對所學知識的總結,并非難事,到后來遇到了好多困難,舉步維艱,之前學習的理論知識太多了,都沒有用到實踐中去,真正做起來的時候不知道從哪里入手,不知道自己為實現什么樣的目的要怎么規劃達到目的的過程, 才明白了“紙上得來終覺淺,才知此事要躬行”的道理。畢業設計不僅是對所學知識的總結和應用,更是在實際應用中培養自身如何做一項完整事情的培訓,可以說是學校在畢業前對學生踏入社會的一次做事能力的培訓。
參考文獻[1] 楊永輝.《現代電子技術》[J] .智能小車的多傳感器數據融合.2005 [2] 何立民.《單片機與嵌入式系統應用》[J].基于HCS12的小車智能控制系統設計.2007 [3] 譚浩強.《C程序設計》.北京:清華大學出版社,2005,7 [4] 張立.《電子世界》[J].電動小車的循跡.2004 [5] 武慶生,仇梅.單片機原理與應用(M).電子科技大學出版,1998,12 [6] 徐科軍.傳感器與檢測技術[M].電子工業出版社,2007 [7] 劉瑞新.單片機原理及應用教程 .機械工業出版社,2003,7 [8] 劉湘濤,江世明.單片機原理與應用[M].電子工業出版社,2006 [9] 何立民.單片機初級教程[M].北京航空航天大學出版社,1999 [10] 熊建云. Protel99 SE.北京:機械工業出版社,2007 [11] 鄭郁正.單片機原理及應用.四川大學出版杜,2003 [12] 盧靜,陳非凡,張高飛等.基于單片機的無刷直流電動機控制系統設計.北京機械工業學院學報,2002,10 [13] 張燕,曾光宇.光電式傳感器的應用與發展[J].科技情報開發與經濟,2007 [14] 曹開田.基于單片機的紅外遙控密碼鎖的設計與實現[J].應用研究,2010 [15] 裴彥純.陳志超.基于單片機系統的紅外遙控器應用[J].現代儀器,2004 [16] 賴麒文.8051單片機C語言徹底應用[M].科學出版社,2002 [17] 郭天祥.51單片機C語言教程.北京:電子工業出版社, 2009
附錄元件清單
系統程序#include <reg52.h> //包含51單片機相關的頭文件 #include <intrins.h> sbit LeftLed=P2^0; //定義前方左側指示燈端口 sbit RightLed=P0^7; //定義前方右側指示燈端口 sbit FontLled=P1^7;
sbit LeftIR=P3^5; //定義前方左側紅外探頭端口 sbit RightIR=P3^6; //定義前方右側紅外探頭端口 sbit FontIR=P3^7; //定義前方正前方紅外探頭端口
sbit M1A=P0^0; //定義左側電機驅動A端 sbit M1B=P0^1; //定義左側電機驅動B端
sbit M2A=P0^2; //定義右側電機驅動A端 sbit M2B=P0^3; //定義右側電機驅動B端
sbit B1=P0^4; //定義語音識識別傳感器端口 sbit SB1=P0^6; //定義蜂鳴器端口 sbit IRIN=P3^3; //定義紅外接收端口
unsigned char code LedShowData[]={0x03,0x9F,0x25,0x0D,0x99, //定義數碼管顯示數據 0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9 unsigned char code RecvData[]={0x19,0x46,0x15,0x43,0x44,0x40,0x0D,0x0E,0x00,0x0F}; unsigned char IRCOM[7]; static unsigned int LedFlash; //定義閃動頻率計數變量 bit EnableLight=0; //定義指示燈使能位 #define ShowPort P2 //定義數碼管顯示端口 unsigned char temp = 1; void tingzhi() { M1A=0; //將M1電機A端初始化為0 M1B=0; //將M1電機B端初始化為0 M2A=0; //將M2電機A端初始化為0 M2B=0;
}
void qianjin() { M1A=1; M1B=0; M2A=1; M2B=0; }
void houtui() { M1A=0; M1B=1; M2A=0; M2B=1; }
void zuozhuan() { M1A=0; M1B=1; M2A=1; M2B=0; }
void youzhuan() { M1A=1; M1B=0; M2A=0; M2B=1; }
void Delay1ms(unsigned int i) { unsigned char j,k; do{ j = 10; do{ k = 50; do{ _nop_(); }while(--k); }while(--j); }while(--i);
}
void delay_nus(unsigned int i) //延時:i>=12 ,i的最小延時單12 us { i=i/10; while(--i); } void delay_nms(unsigned int n) //延時n ms { n=n+1; while(--n) delay_nus(900); //延時 1ms,同時進行補償
}
void delayms(unsigned char x) //0.14mS延時程序 { unsigned char i; //定義臨時變量 while(x--) //延時時間循環 { for (i = 0; i<13; i++) {} //14mS延時 } }
void Delay() //定義延時子程序 { unsigned int DelayTime=30000; //定義延時時間變量 while(DelayTime--); //開始進行延時循環 return; //子程序返回 } void ControlCar(unsigned char ConType) //定義電機控制子程序 {
tingzhi(); switch(ConType) //判斷用戶設定電機形式 { case 1: //前進 //判斷用戶是否選擇形式1 { //tingzhi(); //進入前進之前 先停止一段時間 防止電機反向電壓沖擊主板 導致系統復位 //Delay1ms(50); LeftLed = 0 ; qianjin(); break; } case 2: //后退 //判斷用戶是否選擇形式2 { // tingzhi(); //進入后退之前 先停止一段時間 防止電機反向電壓沖擊主板 導致系統復位 // Delay1ms(50); LeftLed = 1 ; houtui(); //M2電機反轉 break; } case 3: //左轉 //判斷用戶是否選擇形式3 { //tingzhi(); //進入左轉之前 先停止一段時間 防止電機反向電壓沖擊主板 導致系統復位 // Delay1ms(50); zuozhuan(); //M2電機正轉 break; } case 4: //右轉 //判斷用戶是否選擇形式4 { // tingzhi(); //進入右轉之前 先停止一段時間 防止電機反向電壓沖擊主板 導致系統復位 // Delay1ms(50); youzhuan(); //M1電機正轉 //M2電機反轉 break; } case 8: //停止 //判斷用戶是否選擇形式8 { tingzhi(); break; //退出當前選擇 } } }
void ControlCar_yaokong(unsigned char ConType) //定義電機控制子程序 (紅外遙控單獨設置一個 switch case 語句 ) {
tingzhi(); switch(ConType) //判斷用戶設定電機形式 { case 1: //前進 //判斷用戶是否選擇形式1 { tingzhi(); //進入前進之前 先停止一段時間 防止電機反向電壓沖擊主板 導致系統復位 Delay1ms(150); LeftLed = 0 ; qianjin(); break; } case 2: //后退 //判斷用戶是否選擇形式2 { tingzhi(); //進入后退之前 先停止一段時間 防止電機反向電壓沖擊主板 導致系統復位 Delay1ms(150); LeftLed = 1 ; houtui(); //M2電機反轉 break; } case 3: //左轉 //判斷用戶是否選擇形式3 { tingzhi(); //進入左轉之前 先停止一段時間 防止電機反向電壓沖擊主板 導致系統復位 Delay1ms(150); zuozhuan(); //M2電機正轉 break; } case 4: //右轉 //判斷用戶是否選擇形式4 { tingzhi(); //進入右轉之前 先停止一段時間 防止電機反向電壓沖擊主板 導致系統復位 Delay1ms(150); youzhuan(); //M1電機正轉 //M2電機反轉 break; } case 8: //停止 //判斷用戶是否選擇形式8 { tingzhi(); break; //退出當前選擇 } } } void Robot_Avoidance() //機器人避障子程序 {
LeftLed=LeftIR; //前方左側指示燈指示出前方左側紅外探頭狀態 RightLed=RightIR; //前方右側指示燈指示出前方右側紅外探頭狀態 FontLled= FontIR; SB1=FontIR;
if(FontIR == 0) //如果前面避障傳感器檢測到障礙物 { ControlCar(8); //停止 delay_nms (300); //停止300MS 防止電機反相電壓沖擊 導致系統復位 ControlCar(2); //后退 delay_nms (1000); //后退1500MS ControlCar(3); // delay_nms (1800); } else { ControlCar(1); //右側沒有信號時,開始向左轉一定的角度 delay_nms (10); } ControlCar(1); } //機器人循跡子程序 void Robot_Traction() //機器人循跡子程序 { LeftLed=LeftIR; //前方左側指示燈指示出前方左側紅外探頭狀態 RightLed=RightIR; //前方右側指示燈指示出前方右側紅外探頭狀態 FontLled= FontIR; SB1=LeftIR; if(LeftIR == 0 && RightIR == 0) //三個紅外檢測到黑線,就前進 { ControlCar(1); //左側沒有信號時,開始向右轉一定的角度 delay_nms (10); }
else if(LeftIR == 0 && RightIR == 1) { ControlCar(3); //右側沒有信號時,開始向左轉一定的角度 delay_nms (10); }
else if(LeftIR == 1 && RightIR == 0) { ControlCar(4); //右側沒有信號時,開始向左轉一定的角度 delay_nms (10); } ControlCar(8); }
void main() //主程序入口 {
bit RunFlag=0; //定義小車運行標志位 LedFlash=3000; //對閃燈數據進行初始化 //EX1=1; //同意開啟外部中斷1 IT1=1; //設定外部中斷1為低邊緣觸發類型 EA=1; //總中斷開啟 ControlCar(8); //初始化小車運行狀態 while(1) //程序主循環 { if(P3_2 == 0) { delay_nms(10); if(P3_2 == 0) { temp++; while(!P3_2); } } if(temp > 3) { temp = 1; } switch(temp) { case 1: ShowPort = LedShowData[1];Robot_Traction();EX1 = 0;break; case 2: ShowPort = LedShowData[2];Robot_Avoidance();EX1 = 0;break; case 3: ShowPort = LedShowData[3];EX1 = 1;break; } } } //----------紅外遙控------------------------------------------------------------- void IR_IN() interrupt 2 using 0 //定義INT2外部中斷函數 { unsigned char j,k,N=0; //定義臨時接收變量
EX1 = 0; //關閉外部中斷,防止再有信號到達 delayms(15); //延時時間,進行紅外消抖 if (IRIN==1) //判斷紅外信號是否消失 { EX1 =1; //外部中斷開 return; //返回 }
while (!IRIN) //等IR變為高電平,跳過9ms的前導低電平信號。 { delayms(1); //延時等待 }
for (j=0;j<4;j++) //采集紅外遙控器數據 { for (k=0;k<8;k++) //分次采集8位數據 { while (IRIN) //等 IR 變為低電平,跳過4.5ms的前導高電平信號。 { delayms(1); //延時等待 }
while (!IRIN) //等 IR 變為高電平 { delayms(1); //延時等待 }
while (IRIN) //計算IR高電平時長 { delayms(1); //延時等待 N++; //計數器加加 if (N>=30) //判斷計數器累加值 { EX1=1; //打開外部中斷功能 return; //返回 } }
IRCOM[j]=IRCOM[j] >> 1; //進行數據位移操作并自動補零
if (N>=8) //判斷數據長度 { IRCOM[j] = IRCOM[j] | 0x80; //數據最高位補1 } N=0; //清零位數計錄器 } }
if (IRCOM[2]!=~IRCOM[3]) //判斷地址碼是否相同 { EX1=1; //打開外部中斷 return; //返回 }
for(j=0;j<10;j++) //循環進行鍵碼解析 { if(IRCOM[2]==RecvData[j]) //進行鍵位對應 { // ControlCar(j); ControlCar_yaokong(j); //數碼管顯示相應數碼 } } EX1 = 1; //外部中斷開 } //-------------------------------------------------------------------------------------------------------
藍牙模塊程序: #include<reg52.h>
//HL-1小車驅動接線定義 #define Left_moto_go {P0_0=1,P0_1=0;} //左邊電機向前走 #define Left_moto_back {P0_0=0,P0_1=1;} //左邊電機向后轉 #define Left_moto_Stop {P0_0=0,P0_1=0;} //左邊電機停轉 #define Right_moto_go {P0_2=1,P0_3=0;} //右邊電機向前走 #define Right_moto_back {P0_2=0,P0_3=1;} //右邊電機向后走 #define Right_moto_Stop {P0_2=0,P0_3=0;} //右邊電機停轉
#define left 'C' #define right 'D' #define up 'A' #define down 'B' #define stop 'F'
#define uint unsigned int //重定義無符號整數類型 #define uchar unsigned char //重定義無符號字符類型
char code str[] = "收到指令,向前!\n"; char code str1[] = "收到指令,向后!\n"; char code str2[] = "收到指令,向左!\n"; char code str3[] = "收到指令,向右!\n"; char code str4[] = "收到指令,停止!\n";
bit flag_REC=0; bit flag =0;
unsigned char i=0; unsigned char dat=0; unsigned char buff[5]=0; //接收緩沖字節 uchar code LedShowData[]={0x03,0x9F,0x25,0x0D,0x99, //定義數碼管顯示數據 0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9
#define ShowPort P2 //定義數碼管顯示端口
/************************************************************************/ //延時函數 void delay(unsigned int k) { unsigned int x,y; for(x=0;x<k;x++) for(y=0;y<2000;y++); }
/************************************************************************/ //字符串發送函數 void send_str( ) // 傳送字串 { unsigned char i = 0; while(str != '\0') { SBUF = str; while(!TI); // 等特數據傳送 TI = 0; // 清除數據傳送標志 i++; // 下一個字符 } } void send_str1( ) // 傳送字串 { unsigned char i = 0; while(str1 != '\0') { SBUF = str1; while(!TI); // 等特數據傳送 TI = 0; // 清除數據傳送標志 i++; // 下一個字符 } }
void send_str2( ) // 傳送字串 { unsigned char i = 0; while(str2 != '\0') { SBUF = str2; while(!TI); // 等特數據傳送 TI = 0; // 清除數據傳送標志 i++; // 下一個字符 } }
void send_str3() // 傳送字串 { unsigned char i = 0; while(str3 != '\0') { SBUF = str3; while(!TI); // 等特數據傳送 TI = 0; // 清除數據傳送標志 i++; // 下一個字符 } }
void send_str4() // 傳送字串 { unsigned char i = 0; while(str4 != '\0') { SBUF = str4; while(!TI); // 等特數據傳送 TI = 0; // 清除數據傳送標志 i++; // 下一個字符 } }
/************************************************************************/ //前速前進 void run(void) {
Left_moto_go ; //左電機往前走 Right_moto_go ; //右電機往前走 }
//前速后退 void backrun(void) {
Left_moto_back ; //左電機往后走 Right_moto_back ; //右電機往后走 }
//左轉 void leftrun(void) {
Left_moto_go ; //左電機往前走 Right_moto_back ; //右電機往后走 }
//右轉 void rightrun(void) {
Left_moto_back ; //左電機往前走 Right_moto_go ; //右電機往前走 } //STOP void stoprun(void) {
Left_moto_Stop ; //左電機往前走 Right_moto_Stop ; //右電機往前走 } /************************************************************************/ void sint() interrupt 4 //中斷接收3個字節 {
if(RI) //是否接收中斷 { RI=0; dat=SBUF; if(dat=='O'&&(i==0)) //接收數據第一幀 { buff=dat; flag=1; //開始接收數據 } else if(flag==1) { i++; buff=dat; if(i>=2) {i=0;flag=0;flag_REC=1 ;} // 停止接收 } } } /*********************************************************************/ /*--主函數--*/ void main(void) { TMOD=0x20; TH1=0xFd; //11.0592M晶振,9600波特率 TL1=0xFd; SCON=0x50; PCON=0x00; TR1=1; ES=1; EA=1;
while(1) /*無限循環*/ { if(flag_REC==1) // { flag_REC=0; if(buff[0]=='O'&&buff[1]=='N') //第一個字節為O,第二個字節為N,第三個字節為控制碼 switch(buff[2]) { case up : // 前進 send_str( ); run(); ShowPort=LedShowData[1]; break; case down: // 后退 send_str1( ); backrun(); ShowPort=LedShowData[2]; break; case left: // 左轉 send_str3( ); leftrun(); ShowPort=LedShowData[3]; break; case right: // 右轉 send_str2( ); rightrun(); ShowPort=LedShowData[4]; break; case stop: // 停止 send_str4( ); stoprun(); ShowPort=LedShowData[0]; break;
}
} } } |