找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 7045|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于單片機(jī)智能小車設(shè)計(jì)相關(guān)論文資料

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:195969 發(fā)表于 2017-5-10 12:52 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
業(yè)

      基于單片機(jī)智能小車設(shè)計(jì)
Design based on microcomputer smart car


           學(xué)院名稱: 電子信息與電氣工程學(xué)院
           專業(yè)班級(jí):自動(dòng)化2013級(jí)2班     
           學(xué)生姓名:魯順
           學(xué)    號(hào):    13020610225
           指導(dǎo)教師姓名:楊欣
           指導(dǎo)教師職稱:講師

                           2017 5
畢業(yè)設(shè)計(jì)(論文)原創(chuàng)性聲明和使用授權(quán)說明
原創(chuàng)性聲明
本人鄭重承諾:所呈交的畢業(yè)設(shè)計(jì)(論文),是我個(gè)人在指導(dǎo)教師的指導(dǎo)下進(jìn)行的研究工作及取得的成果。盡我所知,除文中特別加以標(biāo)注和致謝的地方外,不包含其他人或組織已經(jīng)發(fā)表或公布過的研究成果,也不包含我為獲得安陽工學(xué)院及其它教育機(jī)構(gòu)的學(xué)位或?qū)W歷而使用過的材料。對(duì)本研究提供過幫助和做出過貢獻(xiàn)的個(gè)人或集體,均已在文中作了明確的說明并表示了謝意。
       名:               日   期:       
指導(dǎo)教師簽名:               日  期:       
使用授權(quán)說明
本人完全了解安陽工學(xué)院關(guān)于收集、保存、使用畢業(yè)設(shè)計(jì)(論文)的規(guī)定,即:按照學(xué)校要求提交畢業(yè)設(shè)計(jì)(論文)的印刷本和電子版本;學(xué)校有權(quán)保存畢業(yè)設(shè)計(jì)(論文)的印刷本和電子版,并提供目錄檢索與閱覽服務(wù);學(xué)?梢圆捎糜坝、縮印、數(shù)字化或其它復(fù)制手段保存論文;在不以贏利為目的前提下,學(xué)校可以公布論文的部分或全部內(nèi)容。

作者簽名:                   日   期:        
目錄
摘要。        5
Abstract.        6
          7
第一章 方案設(shè)計(jì)與論證        9
1.1 設(shè)計(jì)任務(wù)及要求        9
1.2 設(shè)計(jì)方案論證        9
1.2.1 單片機(jī)選擇        9
1.2.2 電機(jī)驅(qū)動(dòng)芯片的選擇        11
1.2.3 路況檢測模塊        12
2 系統(tǒng)硬件電路與實(shí)現(xiàn)        14
2.1 主控模塊電路設(shè)計(jì)        14
2.1.1 STC89C52單片機(jī)的簡介        14
2.1.2時(shí)鐘電路        16
2.1.3復(fù)位電路        18
2.2紅外遙控模塊的電路設(shè)計(jì)        19
2.2.1紅外遙控的實(shí)現(xiàn)原理        20
2.2.2紅外發(fā)射器        21
2.2.3紅外接收器        22
2.3電機(jī)驅(qū)動(dòng)模塊的設(shè)計(jì)        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藍(lán)牙無線傳輸模塊        31
2.5.1藍(lán)牙模塊的選擇        31
2.5.2顯示模塊的電路顯示        35
2.6智能防撞報(bào)警模塊        36
2.6.1智能防撞報(bào)警模塊原理        36
3系統(tǒng)軟件設(shè)計(jì)與實(shí)現(xiàn)        38
3.1整體程序的構(gòu)架        39
3.2紅外遙控解碼的實(shí)現(xiàn)        39
3.3電機(jī)驅(qū)動(dòng)        42
3.4 小車尋跡        42
3.5 小車防撞報(bào)警        44
4 小車系統(tǒng)原理圖        46
總結(jié)        48
參考文獻(xiàn)        50
附錄        52
元件清單        52
系統(tǒng)程序        53













基于單片機(jī)智能小車設(shè)計(jì)
摘要:隨著科學(xué)技術(shù)的不斷進(jìn)步,關(guān)于汽車的研究也成為人們關(guān)注的焦點(diǎn),智能車輛將成為未來的必然產(chǎn)物,本設(shè)計(jì)產(chǎn)品就是根據(jù)這一大背景下提出來的,本設(shè)計(jì)是基于STC89C52單片機(jī)控制及傳感器技術(shù)的,來實(shí)現(xiàn)小車自動(dòng)自動(dòng)尋線尋跡,利用超聲波模塊來完成避障功能,小車前輪由兩個(gè)電機(jī)驅(qū)動(dòng)左右兩個(gè)輪,通過兩個(gè)電機(jī)的轉(zhuǎn)速及轉(zhuǎn)動(dòng)時(shí)間的差別,達(dá)到小車正常行駛和轉(zhuǎn)向的目的。安裝藍(lán)牙模塊,通過手機(jī)app來實(shí)現(xiàn)無線通信,來控制小車的行駛。
關(guān)鍵詞:智能小車;STC89S52單片機(jī);尋線;避障;超聲波傳感器;藍(lán)牙






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.




隨著科學(xué)技術(shù)的飛速發(fā)展,關(guān)于智能汽車的研究也就備受人們的關(guān)注。每年舉行的全國電子大賽中,各種功能的智能小車項(xiàng)目都占很大的比例,全國的各個(gè)高校也都非常重視智能小車課題的研究。可見其研究意義很大。智能小車是現(xiàn)代科學(xué)技術(shù)的新產(chǎn)品,將會(huì)是以后的發(fā)展方向和必然產(chǎn)物,他可以在沒有人直接參與的情況下,利用外加的設(shè)備或裝備,使小車的某個(gè)工作狀態(tài)或者參數(shù)自動(dòng)的按照預(yù)定的規(guī)定運(yùn)行?捎糜诳茖W(xué)探索偵察等的用途。智能小車的控制器模塊主要接收傳感器部分發(fā)送過來的實(shí)時(shí)信號(hào),并且根據(jù)之前燒錄到單片機(jī)中的軟件程序,來命令智能小車做出相應(yīng)的動(dòng)作,就像是人的大腦部分。而執(zhí)行器模塊和傳感器模塊則像是人體的四肢和眼睛耳朵一樣。單片機(jī)具備構(gòu)造簡單、可靠性高、多功能、適合在惡劣環(huán)境中工作、抗干擾能力高及小型化等優(yōu)勢,他滲透到生活的各個(gè)領(lǐng)域,可以說哪一個(gè)范疇都能找到單片機(jī)的蹤影,首先應(yīng)用最廣泛的就是生產(chǎn)自動(dòng)化領(lǐng)域的應(yīng)用,能降低勞動(dòng)程度,提高生產(chǎn)效率,還可以應(yīng)用實(shí)時(shí)測量方面、智能化儀表、智能化產(chǎn)品、家用電器、國防現(xiàn)代化、信息通信領(lǐng)域等。這些年來,單片機(jī)技術(shù)突飛猛進(jìn),一些高功能的單片機(jī)如雨后春筍大量涌現(xiàn),技術(shù)日新月異,是我們做智能小車的首選。

第一章 方案設(shè)計(jì)與論證
1.1 設(shè)計(jì)任務(wù)及要求
本智能小車的設(shè)計(jì)要求如下:
●具有單片機(jī)控制核心模塊;
●具有電機(jī)驅(qū)動(dòng)模塊;
       ●具有超聲波避障模塊;
●具有光電感應(yīng)模塊;
       ●具有七段數(shù)碼管顯示模塊;
       ●具有無線藍(lán)牙傳輸模塊;
●具有防撞報(bào)警模塊;

1.2 設(shè)計(jì)方案論證1.2.1 單片機(jī)選擇
方案一:采用MSP430單片機(jī)
MSP430系列單片機(jī)他具有處理能力強(qiáng)、超低功耗、片內(nèi)資源豐富等優(yōu)點(diǎn)。但是也有很多不足之處,比如價(jià)格較高,比較適用于復(fù)雜的應(yīng)用系統(tǒng),當(dāng)用戶設(shè)計(jì)需要更多考慮成本時(shí),MSP430單片機(jī)并不一定合適。
方案二:采用STC89C52單片機(jī)
全靜態(tài)工作,工作范圍:0Hz~24MHz;
●三級(jí)程序存儲(chǔ)器加密;
●128×8位內(nèi)部RAM;
●32位雙向輸入輸出線;
兩個(gè)十六位定時(shí)器/計(jì)數(shù)器
五個(gè)中斷源,兩級(jí)中斷優(yōu)先級(jí);
●一個(gè)全雙工的異步串行口;
●間歇和掉電兩種工作方式;
方案選擇:
綜上所述:通過以上兩種方案的比較,在本系統(tǒng)中的單片機(jī)選
第二個(gè)方案,MSP430對(duì)系統(tǒng)的控制比較麻煩并且價(jià)位較高,所以選擇使用STC89S52作為控制器芯片。
1.2.2 電機(jī)驅(qū)動(dòng)芯片的選擇
方案一:使用L298N芯片來驅(qū)動(dòng)普通直流電機(jī),用該芯片作為電機(jī)驅(qū)動(dòng),操縱便利,比較平穩(wěn),直流電機(jī)具有能耗低、性能優(yōu)越、振動(dòng)小、噪聲低、維護(hù)成本低、調(diào)整范圍廣等優(yōu)點(diǎn),普通直流電機(jī)結(jié)構(gòu)緊湊,體積小,造型美觀,通用性強(qiáng),采用新型密封裝置的直流電機(jī)保護(hù)性能好,對(duì)環(huán)境適應(yīng)性強(qiáng),可在惡劣的環(huán)境中連續(xù)工作。        
方案二:采用步進(jìn)電機(jī),步進(jìn)電動(dòng)機(jī)最主要的功能就是能夠控制位置,你要它在什么地方停止,它就在什么地方停止,并且可以實(shí)現(xiàn)開環(huán)控制無需反饋信號(hào),優(yōu)點(diǎn)是中低輸出力矩大、性價(jià)比高,只有伺服的四分之一左右,缺點(diǎn)是振動(dòng)大、發(fā)熱大高速性能差、有丟步的可能,需要專門的驅(qū)動(dòng)器。        
方案選擇:
本智能小車設(shè)計(jì)采用方案一更好,購買方便,價(jià)錢合理。
1.2.3 路況檢測模塊
方案一:使用超聲波傳感器,超聲波是一種機(jī)械波,依靠介質(zhì)才能傳播,從發(fā)射信號(hào)開始到接收到信號(hào)結(jié)束來計(jì)算往返的時(shí)間差,并且將信號(hào)放大后放到主控制芯片當(dāng)中從而判定距離,這就是它工作的原理。現(xiàn)在應(yīng)用比較廣泛的還有一種方法也是利用同樣的原理實(shí)現(xiàn)的,比如紅外光探頭,同樣可以在高精度下完成測量,并且簡化了電路,它的使用成本低、易于操作,在智能機(jī)器人發(fā)揮著很大的作用。        方案二:使用視覺傳感器,它主要是由攝像頭及處理圖像的控制器組成,廣泛的應(yīng)用于生產(chǎn)現(xiàn)場,用于檢測零部件的優(yōu)良,從而避免次品外流,可以同時(shí)測量多個(gè)目標(biāo),具有高精度的特點(diǎn),其優(yōu)點(diǎn)是尺寸小,價(jià)格合理,但是算法復(fù)雜,運(yùn)行速度慢。
方案選擇:
        綜合以上方案,采用方案一較為合理,因?yàn)楸驹O(shè)計(jì)的智能小車實(shí)現(xiàn)避障功能即可,無需太復(fù)雜,并不需要經(jīng)過傳輸回來的圖像來分析前方障礙物。





2 系統(tǒng)硬件電路與實(shí)現(xiàn)
本智能小車采用了STC89C52單片機(jī)作為主要控制芯片來處理各個(gè)模塊的運(yùn)行,系統(tǒng)整體硬件總框圖如圖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 系統(tǒng)硬件總體框圖


2.1 主控模塊電路設(shè)計(jì)
2.1.1 STC89C52單片機(jī)的簡介
STC89C52是STC公司生產(chǎn)的一種低功耗、高性能CMOS8位微控制器,其主要特點(diǎn)是:
全靜態(tài)工作,工作范圍:0Hz~24MHz;
●三級(jí)程序存儲(chǔ)器加密;
●128×8位內(nèi)部RAM;
●32位雙向輸入輸出線;
兩個(gè)十六位定時(shí)器/計(jì)數(shù)器
五個(gè)中斷源,兩級(jí)中斷優(yōu)先級(jí);
●一個(gè)全雙工的異步串行口;
●間歇和掉電兩種工作方式;


2.1 STC89C52的管腳圖
1)主要特性:
        file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB35.tmp.jpg
        2.1.1
用戶應(yīng)用程序空間為8K字節(jié)
片上集成512字節(jié)RAM
具有EEPROM功能
3個(gè)16位定時(shí)器/計(jì)數(shù)器。即定時(shí)器T0、T1、T2
●PDIP封裝

2.2紅外遙控模塊的電路設(shè)計(jì)
2.2.1紅外遙控的實(shí)現(xiàn)原理
怎么樣才能讓燒錄的程序去分析0位和1位是紅外遙控能夠?qū)崿F(xiàn)的至關(guān)重要步驟,高電平脈沖后的低電平的脈寬的不一樣也就定義了是位0還是位1,位0代表的是脈沖寬度0.565ms、時(shí)間間隔為0.56ms、周期為1.125ms;而位1代表的脈沖脈寬為0.565ms、時(shí)間間隔為1.685ms、周期為2.25ms。
        解碼和上訴紅外遙控實(shí)現(xiàn)原理類似,也是如何讓程序去識(shí)別分析0位和1位。位0和位1的相同點(diǎn)是都是從低電平0.565ms開始的,不同點(diǎn)在于它們的高電平寬度不同,所以高電平寬度就是區(qū)分位0還是位1的關(guān)鍵。紅外遙控的流程圖如圖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        充電放大        解調(diào)        解碼
                             2.2.1

2.2.2紅外發(fā)射器
該電路的主要控制器件是采用PPM進(jìn)行編碼遙控器芯片HT6221,紅外遙控發(fā)射器電路圖如圖2.2.2所示。各個(gè)開關(guān)的功能分別為:K1停止;K2右轉(zhuǎn);K3左轉(zhuǎn);K4啟動(dòng);K5加速;K6循跡;K7制動(dòng);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                     鍵盤        編碼調(diào)制        LED

                2.2.2
2.2.3紅外接收器
紅外線接收器的主要特點(diǎn):
●小型設(shè)計(jì)
內(nèi)置專用IC
●寬角度及長距離接收
●抗干擾能力強(qiáng)
●能抵擋環(huán)境干擾光纖
●低電壓工作
●紅外線接收器的結(jié)構(gòu)
脈沖信號(hào)輸出端,直接接單片機(jī)的IO口
●GND接系統(tǒng)的地線(0V)
●VCC接系統(tǒng)的電源正極(+5V)
該模塊的電路如圖2.2.3所示。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB65.tmp.jpg

           2.2.3


2.3電機(jī)驅(qū)動(dòng)模塊的設(shè)計(jì)
2.3.1 L293D芯片簡介
L293D驅(qū)動(dòng)芯片主要特點(diǎn)是:
工作電壓高,最高工作電壓可達(dá)36V
●該芯片可以驅(qū)動(dòng)兩臺(tái)直流電機(jī)
一、直流電機(jī)驅(qū)動(dòng)模塊的參數(shù)
輸入邏輯電壓:5.0V
輸入電機(jī)電壓:5.0V-36.0V
輸出驅(qū)動(dòng)電流:1000mA
尺寸:(長)34mm * (寬)18mm * (高)8mm
連接方式:
P1:控制M1電機(jī)PWM1輸入引腳。
D1:控制M1電機(jī)轉(zhuǎn)向輸入引腳。
P2:控制M2電機(jī)PWM2輸入引腳。
D2:控制M2電機(jī)轉(zhuǎn)向輸入引腳。
GND:電源地接口。
5V:邏輯電源+5V接口。
VC:輸入電機(jī)驅(qū)動(dòng)電壓接口。
GND: 電源地接口。
M1+:M1電機(jī)驅(qū)動(dòng)輸出引腳正極。
M1-:M1電機(jī)驅(qū)動(dòng)輸出引腳負(fù)極。
M2+:M2電機(jī)驅(qū)動(dòng)輸出引腳正極。
M2-:M2電機(jī)驅(qū)動(dòng)輸出引腳負(fù)極。
電機(jī)驅(qū)動(dòng)模塊的硬件電路圖如圖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、此模塊性能穩(wěn)定,測度距離精確,模塊高精度,盲區(qū)小,圖2.4.1為HC-SR04超聲波模塊實(shí)物圖。

2、 主要技術(shù)參數(shù):
使用電壓:DC---5V  
靜態(tài)電流:小于2mA      
電平輸出:高5V     
電平輸出:底0V        
感應(yīng)角度:不大于15度  
探測距離:2cm-450cm
高精度 可達(dá)0.2cm
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB68.tmp.jpg
         2.4.1
3、電氣參數(shù)

        電氣參數(shù)
    HC-SR04超聲波模塊
        工作電壓
[size=12.0000pt]        DC15V
        工作電流
[size=12.0000pt]        15mA
        工作頻率
          40Hz
        最遠(yuǎn)射程
[size=12.0000pt]        4m
        最近射程
          2cm
[size=12.0000pt]        測量角度
[size=12.0000pt]        15度
[size=12.0000pt]        輸入觸發(fā)信號(hào)
      10us的TTL脈沖
[size=12.0000pt]        輸出會(huì)回響信號(hào)
輸出TTL電平信號(hào)與射程成比例
[size=12.0000pt]         規(guī)格尺寸
[size=12.0000pt]        45*20*15mm

2.4.2 循跡模塊
小車循跡的原理:使用紅外探測法使小車延黑線行駛,其主要特點(diǎn)是紅外線在不同顏色的物體上反射性質(zhì)不同,在小車行駛過程中不斷地向地面發(fā)射紅外光,當(dāng)紅外光遇到白色紙質(zhì)地板時(shí)發(fā)生漫反射,反射光被裝在小車上的接收管接收;如果遇到黑線則紅外光被吸收,小車上的接收管接收不到紅外光,小車前方探頭實(shí)物如圖2.4.2所示。
         file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB69.tmp.jpg
                   2.4.2

2.4.3傳感器的選擇:
ST系列集成紅外探頭價(jià)格便宜、體積小、使用方便、性能可靠、用途廣泛,所以該系統(tǒng)中最終選擇了LM324反射傳感器作為紅外光的發(fā)射和接收器件,其內(nèi)部結(jié)構(gòu)和外接電路均較為簡單,其硬件原理圖如圖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的特點(diǎn):
  ●短跑保護(hù)輸出
  ●真差動(dòng)輸入級(jí)
  ●可單電源工作:3V-32V
  ●每封裝含四個(gè)運(yùn)算放大器。
  ●具有內(nèi)部補(bǔ)償?shù)墓δ堋?/font>
  ●共模范圍擴(kuò)展到負(fù)電源
  ●行業(yè)標(biāo)準(zhǔn)的引腳排列
  ●輸入端具有靜電保護(hù)功能

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB6B.tmp.jpg
       2.4.3-2


2.5藍(lán)牙無線傳輸模塊
2.5.1藍(lán)牙模塊的選擇
ZS-040是比較早的產(chǎn)品,AT指令集很少,包括修改藍(lán)牙名(限于從機(jī)),修改密碼,修改波特率,詢問版本號(hào)等幾個(gè)基本功能,在本次設(shè)計(jì)中我們只需實(shí)現(xiàn)簡單的通信,因此選用ZS-040模塊,產(chǎn)品實(shí)物圖如圖2.5.1所示。
        file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB7C.tmp.jpg
             2.5.1-1
藍(lán)牙模塊ZS-040的主要特征:
●無線收發(fā)
1、靈敏度(誤碼率)達(dá)到 -80dBm
2、-4 -> 6dBm 功率可調(diào)輸出
性能概要 完整的藍(lán)牙解決方案
1、藍(lán)牙 2.0 帶 EDR, 2Mbps-3Mbps 調(diào)制度
2、外置 8Mbit FLASH
3、可選 PIO 控制
4、 標(biāo)準(zhǔn) HCI 端口(UART or USB)
5、 USB 協(xié)議: Full Speed USB1.1, Compliant With 2.0
6、模塊可以作為 SMD 貼片工藝
7、RoHS 制程
8、引腳半孔工藝
低功耗
高性能無線收發(fā)系統(tǒng)
低成本
應(yīng)用領(lǐng)域
1、藍(lán)牙車載免提
2、藍(lán)牙 GPS
3、藍(lán)牙 PCMCIA , USB Dongle
4、藍(lán)牙數(shù)據(jù)傳送
軟件
  CSR
二、 藍(lán)牙通信模塊的分析處理,引腳定義如圖2.5.1-2所示。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB7D.tmp.jpg
    2.5.1-2
1) ZS-040藍(lán)牙轉(zhuǎn)串口模塊的作用是將從手機(jī)藍(lán)牙發(fā)送過來的指令接收到后轉(zhuǎn)換成串口的形式通過單片機(jī)的串口傳給單片機(jī)。只需將該模塊的RXD接上51單片機(jī)的TXD引腳,TXD接51的RXD,然后接單片機(jī)的VCC供電,因?yàn)槲覀冎挥盟邮帐謾C(jī)藍(lán)牙信號(hào),不發(fā)送數(shù)據(jù),參考原理圖如圖2.5.1-3所示。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB7E.tmp.jpg
            2.5.1-3
2.5.2顯示模塊的電路顯示
本系統(tǒng)采用一個(gè)七段數(shù)碼管顯示器,其電路原理圖如圖2.6.2所示。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB7F.tmp.jpg
                2.6.2
當(dāng)手機(jī)app控制智能小車前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)時(shí),一位七段數(shù)碼管分別顯示12、3、4。

2.6智能防撞報(bào)警模塊

2.6.1智能防撞報(bào)警模塊原理
智能防撞報(bào)警系統(tǒng)是現(xiàn)代智能小車必裝的一個(gè)系統(tǒng)模塊,有很大的研究價(jià)值,有十分重要的現(xiàn)實(shí)意義。使智能小車能夠自動(dòng)的判別前方是否有障礙物,如果前方遇到有障礙物則會(huì)自動(dòng)的調(diào)節(jié)狀態(tài)以避開障礙物所帶來的嚴(yán)重?fù)p失,同時(shí)在即將遇到障礙物之前,能夠觸發(fā)報(bào)警系統(tǒng),以警告主人避免危險(xiǎn)。

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB80.tmp.png將智能小車放在空曠無人的地面上,位于小車前端的兩個(gè)探頭能夠感應(yīng)前方是否有阻礙行駛的障礙物,與此同時(shí),朝下的探頭也會(huì)同時(shí)接收到來自路面路況的實(shí)時(shí)信息狀況,當(dāng)小車運(yùn)行到障礙物旁邊時(shí),裝置在小車上面的主控芯片STC89C52單片機(jī)就會(huì)接收到此時(shí)的路況信息,進(jìn)而去改變小車的運(yùn)行方向,使小車趕緊掉頭行駛,同時(shí)發(fā)出報(bào)警信號(hào)。報(bào)警模塊硬件圖如圖2.6.1所示。








                   2.6.1
當(dāng)智能小車前面遇到障礙物時(shí),主控芯片單片機(jī)分析之后會(huì)送給P0.6一個(gè)高電平信號(hào),使得三極管V1導(dǎo)通,從而引起SB1蜂鳴器導(dǎo)通,發(fā)出報(bào)警信號(hào)。

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系統(tǒng)軟件設(shè)計(jì)與實(shí)現(xiàn)
在進(jìn)行智能小車的系統(tǒng)軟件設(shè)計(jì)時(shí),我們將所有涉及到的模塊程序全部都放入到到遙控器中,這種方法主要是為了方便控制,并且不占用CPU,因?yàn)檫b控模塊、尋跡模塊、以及避障模塊等都同時(shí)用到了實(shí)時(shí)檢測掃描,這樣不僅占用CPU,而且幾個(gè)程序同時(shí)運(yùn)行還會(huì)產(chǎn)生矛盾沖突使小車無法正常工作。各個(gè)模塊的整體控制如圖3.1所示。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB85.tmp.png













         3.1

當(dāng)遙控器發(fā)送紅外信號(hào)時(shí),會(huì)開啟STC89C52單片機(jī)外部中斷0,使主程序立刻進(jìn)入中斷函數(shù),并且進(jìn)行解碼。完成解碼任務(wù)以后,主程序再接收遙控的反饋信息,主程序?qū)Ρ冗b控器輸入值之后進(jìn)入相應(yīng)模塊執(zhí)行相關(guān)操作,由電機(jī)驅(qū)動(dòng)來完成各個(gè)模塊的處理操作,所以在圖3.1中最終箭頭是指向電機(jī)控制模塊的。
3.1整體程序的構(gòu)架
程序框圖如圖3.1.1所
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB95.tmp.png
3.1.1
3.2紅外遙控解碼的實(shí)現(xiàn)
因?yàn)楦鱾(gè)模塊的程序控制都放在了遙控模塊這一單元里面,所以整個(gè)智能小車的主要線索就是紅外遙控的解碼,并且發(fā)揮了整個(gè)系統(tǒng)入口的作用。
每當(dāng)遙控器上有按鍵被按下時(shí),脈寬波形便被由1腳接收到由遙控器發(fā)送的紅外信號(hào)所解碼,于此同時(shí)促使主控芯片單片機(jī)產(chǎn)生中斷,而且開啟定時(shí)器、脈沖個(gè)數(shù)計(jì)數(shù)。記錄出每一個(gè)脈沖所經(jīng)歷的時(shí)間和脈沖的總數(shù),等到一幀的數(shù)據(jù)發(fā)送完成以后,單片機(jī)結(jié)束計(jì)數(shù),并且關(guān)閉定時(shí)器。然后再進(jìn)入判斷階段,首先判斷這一幀數(shù)據(jù)中的脈沖個(gè)數(shù),如果脈沖個(gè)數(shù)大于31個(gè)則將數(shù)據(jù)全部舍棄,要是剛剛好則判斷接收到的脈沖是1還是0,接收完之后將數(shù)據(jù)保存起來,再來比對(duì)數(shù)據(jù)的是否正確,首先比對(duì)前導(dǎo)碼是否符合,也就是看一下使用中的遙控器是不是與小車匹配的遙控器,如果都正確之后再來將碼值存起來。主程序只需要調(diào)用一個(gè)swich函數(shù)來對(duì)相應(yīng)碼值進(jìn)行對(duì)應(yīng)函數(shù)的調(diào)用就可以了,比如手動(dòng)按下了下 鍵,則調(diào)用后退函數(shù)來完成小車的后退動(dòng)作。如圖3.2所示
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB96.tmp.png
                         3.2


3.3電機(jī)驅(qū)動(dòng)
從整體上上來看,電機(jī)驅(qū)動(dòng)在小車運(yùn)行中占主導(dǎo)作用,就像是人體的四肢,它用來執(zhí)行小車的所有動(dòng)態(tài)操作,任何一個(gè)模塊所執(zhí)行命令的外在表現(xiàn)。
電機(jī)驅(qū)動(dòng)包括驅(qū)動(dòng)控制直流電機(jī)的前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)以及暫停這五個(gè)功能,這五個(gè)功能不僅僅只是遙控器按下上下左右之后才執(zhí)行,而是每一個(gè)模塊都會(huì)有執(zhí)行電機(jī)驅(qū)動(dòng)模塊的操作,所以在設(shè)計(jì)程序時(shí),最合理的設(shè)計(jì)應(yīng)該是將這些前進(jìn)、后退、左右轉(zhuǎn)向單獨(dú)編譯成一個(gè)個(gè)的函數(shù)塊,每一個(gè)子模塊的運(yùn)行就只需調(diào)用這些函數(shù)就可完成。這樣做就節(jié)省了很大的程序空間。舉個(gè)例子,在編寫前進(jìn)函數(shù)時(shí),為了滿足小車前進(jìn)功能,只需將P0.0P0.3賦值1010就可完成,其他左轉(zhuǎn)右轉(zhuǎn)只是改變相應(yīng)P0.0P0.3的碼值則可實(shí)現(xiàn)。

3.4 小車尋跡
當(dāng)主人打開尋跡模塊功能后,就會(huì)不停地掃描單片基中與四個(gè)前方探測器相連接的IO端口,每當(dāng)檢測到哪個(gè)探測器有信號(hào)進(jìn)入了,就會(huì)立刻進(jìn)入之前編寫過的判斷處理程序,,當(dāng)左面的第一和第二級(jí)傳感器檢測到了黑線,就會(huì)使小車左轉(zhuǎn)向,當(dāng)小車右面的第一第二級(jí)傳感器檢測到了黑線,則會(huì)使小車右轉(zhuǎn)向,在經(jīng)過不斷地調(diào)整后,小車會(huì)繼續(xù)延著黑線行駛,并不斷地重復(fù)上訴動(dòng)作,從而實(shí)現(xiàn)了小車的尋跡功能。
3.4為小車尋跡模塊的程序流程圖



file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB97.tmp.png
                3.4 尋跡程序流程圖
3.5 小車防撞報(bào)警
當(dāng)開啟防撞報(bào)警功能的時(shí)候,智能小車就會(huì)進(jìn)入防撞報(bào)警函數(shù),控制小車該模塊功能的單片機(jī)IO口是P3.7,首先判斷小車前方是否有懸崖或者障礙物,如果沒有則繼續(xù)前進(jìn),如果有則會(huì)后退并且報(bào)警,進(jìn)而再坐轉(zhuǎn)彎而避免危險(xiǎn),3.5為防撞報(bào)警模塊的程序流程圖。
























                3.5 防撞報(bào)警程序流程圖





file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB98.tmp.png

    4 小車系統(tǒng)原理圖
硬件電路總設(shè)計(jì)圖如圖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
致謝
時(shí)間猶如白駒過隙,轉(zhuǎn)眼間畢業(yè)論文就要完成了,同時(shí)也意味著我們即將離開美好的大學(xué)校園到社會(huì)上去實(shí)現(xiàn)自身的人身價(jià)值了。可以說經(jīng)歷了這次的畢業(yè)設(shè)計(jì)和論文真的讓我成長了好多,從一開始拿到題目的迷茫無助,努力的翻閱資料到后來完成題目時(shí)的欣悅,這一整個(gè)過程都?xì)v歷在目,這種將成為大學(xué)生活中一段美好的回憶。
        很早以前就想做一個(gè)智能小車玩玩,所以在畢業(yè)設(shè)計(jì)選題目的時(shí)候我就直接沒有考慮其他的項(xiàng)目了,當(dāng)拿到這個(gè)題目的時(shí)候,我的畢業(yè)指導(dǎo)老師著重強(qiáng)調(diào)了對(duì)軟件的學(xué)習(xí)和對(duì)電路的設(shè)計(jì),智能小車所涉及到的功能模塊比較多并且電路的復(fù)雜度也不低,對(duì)于一個(gè)新手來說從開始的設(shè)計(jì)電路到仿真和焊接這一系列的步驟能一氣呵成的完成實(shí)屬不易,但是在指導(dǎo)老師的悉心教導(dǎo)以及自己的努力下終于還算是小有成就的完成了。        
在不斷的努力下我的畢業(yè)設(shè)計(jì)終于完成了。開始的時(shí)候,我還以為所謂的畢業(yè)設(shè)計(jì)和畢業(yè)論文只是對(duì)所學(xué)知識(shí)的總結(jié),并非難事,到后來遇到了好多困難,舉步維艱,之前學(xué)習(xí)的理論知識(shí)太多了,都沒有用到實(shí)踐中去,真正做起來的時(shí)候不知道從哪里入手,不知道自己為實(shí)現(xiàn)什么樣的目的要怎么規(guī)劃達(dá)到目的的過程,
才明白了“紙上得來終覺淺,才知此事要躬行”的道理。畢業(yè)設(shè)計(jì)不僅是對(duì)所學(xué)知識(shí)的總結(jié)和應(yīng)用,更是在實(shí)際應(yīng)用中培養(yǎng)自身如何做一項(xiàng)完整事情的培訓(xùn),可以說是學(xué)校在畢業(yè)前對(duì)學(xué)生踏入社會(huì)的一次做事能力的培訓(xùn)。
        














              參考文獻(xiàn)
[1] 楊永輝.《現(xiàn)代電子技術(shù)》[J] .智能小車的多傳感器數(shù)據(jù)融合.2005
[2] 何立民.《單片機(jī)與嵌入式系統(tǒng)應(yīng)用》[J].基于HCS12的小車智能控制系統(tǒng)設(shè)計(jì).2007
[3] 譚浩強(qiáng).《C程序設(shè)計(jì)》.北京:清華大學(xué)出版社,2005,7
[4] 張立.《電子世界》[J].電動(dòng)小車的循跡.2004
[5] 武慶生,仇梅.單片機(jī)原理與應(yīng)用(M).電子科技大學(xué)出版,1998,12
[6] 徐科軍.傳感器與檢測技術(shù)[M].電子工業(yè)出版社,2007
[7] 劉瑞新.單片機(jī)原理及應(yīng)用教程 .機(jī)械工業(yè)出版社,2003,7
[8] 劉湘濤,江世明.單片機(jī)原理與應(yīng)用[M].電子工業(yè)出版社,2006
[9] 何立民.單片機(jī)初級(jí)教程[M].北京航空航天大學(xué)出版社,1999
[10] 熊建云. Protel99 SE.北京:機(jī)械工業(yè)出版社,2007
[11] 鄭郁正.單片機(jī)原理及應(yīng)用.四川大學(xué)出版杜,2003
[12] 盧靜,陳非凡,張高飛等.基于單片機(jī)的無刷直流電動(dòng)機(jī)控制系統(tǒng)設(shè)計(jì).北京機(jī)械工業(yè)學(xué)院學(xué)報(bào),2002,10
[13] 張燕,曾光宇.光電式傳感器的應(yīng)用與發(fā)展[J].科技情報(bào)開發(fā)與經(jīng)濟(jì),2007
[14] 曹開田.基于單片機(jī)的紅外遙控密碼鎖的設(shè)計(jì)與實(shí)現(xiàn)[J].應(yīng)用研究,2010
[15] 裴彥純.陳志超.基于單片機(jī)系統(tǒng)的紅外遙控器應(yīng)用[J].現(xiàn)代儀器,2004
[16] 賴麒文.8051單片機(jī)C語言徹底應(yīng)用[M].科學(xué)出版社,2002
[17] 郭天祥.51單片機(jī)C語言教程.北京:電子工業(yè)出版社, 2009













附錄元件清單
位號(hào)
名稱
位號(hào)
名稱
C3
104瓷片電容
X1
7P座子
R6,R7,R24,R25
4.7k色環(huán)電阻
Z2
插件晶振
D1,D2,D3
紅色發(fā)光二極管
R23
10k色環(huán)電阻
D4
綠色發(fā)光二極管
D5
發(fā)光二極管
IC3
插件IC
IC5
LM393插件IC
IC1
單片機(jī)芯
J1,J2
跳線
IR1
紅外接收
P2
4P彎排針
J7
3P排針
R14
15k色環(huán)電阻
C1
電解電容
R15
4.7k色環(huán)電阻
USB1
USB歐姆座
R22
220歐色環(huán)電阻
M1
2P座子
R26
1.5k色環(huán)電阻
RL1
光敏電阻
X1
7P座子
P8
4P排母
R8
220歐色環(huán)電阻
RX1
排阻
C6
104瓷片電容
S1
撥動(dòng)開關(guān)
C9
104瓷片電容
S3
按鍵
C14
104瓷片電容
SB1
無緣蜂鳴器
CA1
電解電容
SM1
數(shù)碼管
M2
2P座子
V1
插件三極管
M3
2P座子
W1
可調(diào)電位器
P1
2P座子
R20
560
RL2
光敏電阻
R21
560
S4
按鍵
R22
560
W2
可調(diào)電位器
R23
560
D6
發(fā)光二極管
R24
560
R17
15k色環(huán)電阻
R25
10K
R27
1.5k色環(huán)電阻
R7
4.7k色環(huán)電阻
2個(gè)
墊圈
R24
4.7k色環(huán)電阻
4個(gè)
通孔銅柱
R25
4.7k色環(huán)電阻
17個(gè)
螺絲
D2
紅色發(fā)光二極管
2個(gè)
輪子防滑圈
D3
紅色發(fā)光二極管
10個(gè)
螺帽
2個(gè)
直流減速電機(jī)
1個(gè)
銅柱
1個(gè)
5號(hào)四節(jié)電池盒
1個(gè)
黑色底板
3個(gè)
2P單頭塑插線
1個(gè)
主板
1個(gè)
7P雙頭塑插線
1個(gè)
電機(jī)固定板
紅外遙控器
2個(gè)
電機(jī)與輪子緊鎖柱
4個(gè)
輪子
1個(gè)
藍(lán)牙模塊
1個(gè)
鐵棒
1個(gè)
超聲波模塊
1個(gè)
緊鎖插
1個(gè)
4P排母

系統(tǒng)程序
#include <reg52.h> //包含51單片機(jī)相關(guān)的頭文件
#include <intrins.h>
sbit LeftLed=P2^0;                        //定義前方左側(cè)指示燈端口
sbit RightLed=P0^7;                       //定義前方右側(cè)指示燈端口
sbit FontLled=P1^7;

sbit LeftIR=P3^5;                         //定義前方左側(cè)紅外探頭端口
sbit RightIR=P3^6;                        //定義前方右側(cè)紅外探頭端口
sbit FontIR=P3^7;                         //定義前方正前方紅外探頭端口

sbit M1A=P0^0;                            //定義左側(cè)電機(jī)驅(qū)動(dòng)A
sbit M1B=P0^1;                            //定義左側(cè)電機(jī)驅(qū)動(dòng)B

sbit M2A=P0^2;                            //定義右側(cè)電機(jī)驅(qū)動(dòng)A
sbit M2B=P0^3;                            //定義右側(cè)電機(jī)驅(qū)動(dòng)B

sbit B1=P0^4;                             //定義語音識(shí)識(shí)別傳感器端口
sbit SB1=P0^6;                            //定義蜂鳴器端口
sbit IRIN=P3^3;                                       //定義紅外接收端口

unsigned char code  LedShowData[]={0x03,0x9F,0x25,0x0D,0x99,  //定義數(shù)碼管顯示數(shù)據(jù)
                                   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;                         //定義閃動(dòng)頻率計(jì)數(shù)變量
bit EnableLight=0;                                    //定義指示燈使能位
#define ShowPort P2                                   //定義數(shù)碼管顯示端口
unsigned char temp = 1;
void tingzhi()
{
   M1A=0;                                   //M1電機(jī)A端初始化為0
   M1B=0;                                   //M1電機(jī)B端初始化為0
   M2A=0;                                   //M2電機(jī)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)  //延時(shí):i>=12 ,i的最小延時(shí)單12 us
{
  i=i/10;
  while(--i);
}   
void delay_nms(unsigned int n)  //延時(shí)n ms
{
  n=n+1;
  while(--n)  
  delay_nus(900);         //延時(shí) 1ms,同時(shí)進(jìn)行補(bǔ)償

}  

void delayms(unsigned char x)                         //0.14mS延時(shí)程序
{
  unsigned char i;                                    //定義臨時(shí)變量
  while(x--)                                          //延時(shí)時(shí)間循環(huán)
  {
    for (i = 0; i<13; i++) {}                         //14mS延時(shí)
  }
}

void Delay()                                          //定義延時(shí)子程序
{
  unsigned int DelayTime=30000;                       //定義延時(shí)時(shí)間變量
  while(DelayTime--);                                 //開始進(jìn)行延時(shí)循環(huán)
  return;                                             //子程序返回
}
void ControlCar(unsigned char ConType)    //定義電機(jī)控制子程序
{

  tingzhi();
switch(ConType)                          //判斷用戶設(shè)定電機(jī)形式
{
  case 1:  //前進(jìn)                         //判斷用戶是否選擇形式1
  {
    //tingzhi();                                                      //進(jìn)入前進(jìn)之前 先停止一段時(shí)間  防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位
        //Delay1ms(50);
        LeftLed = 0 ;
        qianjin();
    break;
  }
  case 2: //后退                          //判斷用戶是否選擇形式2
  {
   // tingzhi();                                                              //進(jìn)入后退之前 先停止一段時(shí)間  防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位
   // Delay1ms(50);
    LeftLed = 1 ;         
        houtui();                                //M2電機(jī)反轉(zhuǎn)
    break;
  }
  case 3: //左轉(zhuǎn)                          //判斷用戶是否選擇形式3
  {
     //tingzhi();                                                                  //進(jìn)入左轉(zhuǎn)之前 先停止一段時(shí)間  防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位
        // Delay1ms(50);
         zuozhuan();                               //M2電機(jī)正轉(zhuǎn)
         break;
  }
  case 4: //右轉(zhuǎn)                          //判斷用戶是否選擇形式4
  {
   // tingzhi();                                                                  //進(jìn)入右轉(zhuǎn)之前 先停止一段時(shí)間  防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位
//        Delay1ms(50);
        youzhuan();                                //M1電機(jī)正轉(zhuǎn)
                                          //M2電機(jī)反轉(zhuǎn)
        break;
  }
  case 8: //停止                          //判斷用戶是否選擇形式8
  {
    tingzhi();
        break;                                //退出當(dāng)前選擇
  }
}
}

void ControlCar_yaokong(unsigned char ConType)    //定義電機(jī)控制子程序        (紅外遙控單獨(dú)設(shè)置一個(gè) switch  case  語句  )
{

  tingzhi();
switch(ConType)                          //判斷用戶設(shè)定電機(jī)形式
{
  case 1:  //前進(jìn)                         //判斷用戶是否選擇形式1
  {
    tingzhi();                                                      //進(jìn)入前進(jìn)之前 先停止一段時(shí)間  防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位
        Delay1ms(150);
        LeftLed = 0 ;
        qianjin();
    break;
  }
  case 2: //后退                          //判斷用戶是否選擇形式2
  {
    tingzhi();                                                              //進(jìn)入后退之前 先停止一段時(shí)間  防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位
    Delay1ms(150);
    LeftLed = 1 ;         
        houtui();                                //M2電機(jī)反轉(zhuǎn)
    break;
  }
  case 3: //左轉(zhuǎn)                          //判斷用戶是否選擇形式3
  {
     tingzhi();                                                                  //進(jìn)入左轉(zhuǎn)之前 先停止一段時(shí)間  防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位
         Delay1ms(150);
         zuozhuan();                               //M2電機(jī)正轉(zhuǎn)
         break;
  }
  case 4: //右轉(zhuǎn)                          //判斷用戶是否選擇形式4
  {
     tingzhi();                                                                  //進(jìn)入右轉(zhuǎn)之前 先停止一段時(shí)間  防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位
         Delay1ms(150);
     youzhuan();                                //M1電機(jī)正轉(zhuǎn)  //M2電機(jī)反轉(zhuǎn)
          break;
  }
  case 8: //停止                          //判斷用戶是否選擇形式8
  {
    tingzhi();
        break;                                //退出當(dāng)前選擇
  }
}
}
void Robot_Avoidance()                   //機(jī)器人避障子程序
{

   LeftLed=LeftIR;                        //前方左側(cè)指示燈指示出前方左側(cè)紅外探頭狀態(tài)
   RightLed=RightIR;                      //前方右側(cè)指示燈指示出前方右側(cè)紅外探頭狀態(tài)
   FontLled= FontIR;
   SB1=FontIR;

    if(FontIR == 0)                          //如果前面避障傳感器檢測到障礙物
   {
      ControlCar(8);                       //停止
      delay_nms (300);                                           //停止300MS   防止電機(jī)反相電壓沖擊  導(dǎo)致系統(tǒng)復(fù)位
          ControlCar(2);                                           //后退  
          delay_nms (1000);                                           //后退1500MS  
          ControlCar(3);                                           //
          delay_nms (1800);        
  }
   else
   {
      ControlCar(1);                      //右側(cè)沒有信號(hào)時(shí),開始向左轉(zhuǎn)一定的角度
      delay_nms (10);
   }
    ControlCar(1);
}
//機(jī)器人循跡子程序
void Robot_Traction()                     //機(jī)器人循跡子程序
{
   LeftLed=LeftIR;                        //前方左側(cè)指示燈指示出前方左側(cè)紅外探頭狀態(tài)
   RightLed=RightIR;                      //前方右側(cè)指示燈指示出前方右側(cè)紅外探頭狀態(tài)
   FontLled= FontIR;
   SB1=LeftIR;
   if(LeftIR == 0 && RightIR == 0)    //三個(gè)紅外檢測到黑線,就前進(jìn)
   {
      ControlCar(1);                      //左側(cè)沒有信號(hào)時(shí),開始向右轉(zhuǎn)一定的角度
      delay_nms (10);
   }

   else if(LeftIR == 0 && RightIR == 1)
   {
      ControlCar(3);                      //右側(cè)沒有信號(hào)時(shí),開始向左轉(zhuǎn)一定的角度
      delay_nms (10);
   }

   else if(LeftIR == 1 && RightIR == 0)
   {
      ControlCar(4);                      //右側(cè)沒有信號(hào)時(shí),開始向左轉(zhuǎn)一定的角度
      delay_nms (10);
   }
    ControlCar(8);
}

void main()                               //主程序入口
{

  bit RunFlag=0;                          //定義小車運(yùn)行標(biāo)志位
  LedFlash=3000;                                       //對(duì)閃燈數(shù)據(jù)進(jìn)行初始化
  //EX1=1;                                               //同意開啟外部中斷1
  IT1=1;                                               //設(shè)定外部中斷1為低邊緣觸發(fā)類型
  EA=1;                                                //總中斷開啟
  ControlCar(8);                          //初始化小車運(yùn)行狀態(tài)
  while(1)                                //程序主循環(huán)
  {
             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外部中斷函數(shù)
{
  unsigned char j,k,N=0;                              //定義臨時(shí)接收變量

  EX1 = 0;                                            //關(guān)閉外部中斷,防止再有信號(hào)到達(dá)   
  delayms(15);                                        //延時(shí)時(shí)間,進(jìn)行紅外消抖
  if (IRIN==1)                                        //判斷紅外信號(hào)是否消失
  {  
     EX1 =1;                                          //外部中斷開
         return;                                          //返回
  }

  while (!IRIN)                                       //IR變?yōu)楦唠娖,跳過9ms的前導(dǎo)低電平信號(hào)。
  {
      delayms(1);                                     //延時(shí)等待
  }

  for (j=0;j<4;j++)                                   //采集紅外遙控器數(shù)據(jù)
  {
    for (k=0;k<8;k++)                                 //分次采集8位數(shù)據(jù)
    {
       while (IRIN)                                   //IR 變?yōu)榈碗娖,跳過4.5ms的前導(dǎo)高電平信號(hào)。
       {
         delayms(1);                                  //延時(shí)等待
       }

       while (!IRIN)                                  //IR 變?yōu)楦唠娖?/font>
       {
         delayms(1);                                  //延時(shí)等待
       }

       while (IRIN)                                   //計(jì)算IR高電平時(shí)長
       {
         delayms(1);                                  //延時(shí)等待
         N++;                                         //計(jì)數(shù)器加加
         if (N>=30)                                   //判斷計(jì)數(shù)器累加值
             {
           EX1=1;                                     //打開外部中斷功能
               return;                                    //返回
         }                  
       }

      IRCOM[j]=IRCOM[j] >> 1;                         //進(jìn)行數(shù)據(jù)位移操作并自動(dòng)補(bǔ)零

      if (N>=8)                                       //判斷數(shù)據(jù)長度
      {
         IRCOM[j] = IRCOM[j] | 0x80;                  //數(shù)據(jù)最高位補(bǔ)1
      }
      N=0;                                            //清零位數(shù)計(jì)錄器
    }
  }

  if (IRCOM[2]!=~IRCOM[3])                            //判斷地址碼是否相同
  {
     EX1=1;                                           //打開外部中斷
     return;                                          //返回
  }

  for(j=0;j<10;j++)                                   //循環(huán)進(jìn)行鍵碼解析
   {
      if(IRCOM[2]==RecvData[j])                       //進(jìn)行鍵位對(duì)應(yīng)
      {
       // ControlCar(j);
                ControlCar_yaokong(j);                               //數(shù)碼管顯示相應(yīng)數(shù)碼
      }
   }
   EX1 = 1;                                           //外部中斷開
}
//-------------------------------------------------------------------------------------------------------

藍(lán)牙模塊程序:
#include<reg52.h>

        //HL-1小車驅(qū)動(dòng)接線定義
    #define Left_moto_go      {P0_0=1,P0_1=0;}    //左邊電機(jī)向前走
        #define Left_moto_back    {P0_0=0,P0_1=1;}    //左邊電機(jī)向后轉(zhuǎn)
        #define Left_moto_Stop    {P0_0=0,P0_1=0;}    //左邊電機(jī)停轉(zhuǎn)                     
        #define Right_moto_go     {P0_2=1,P0_3=0;}        //右邊電機(jī)向前走
        #define Right_moto_back   {P0_2=0,P0_3=1;}        //右邊電機(jī)向后走
        #define Right_moto_Stop   {P0_2=0,P0_3=0;}        //右邊電機(jī)停轉(zhuǎn)   

        #define left     'C'
    #define right    'D'
        #define up       'A'
    #define down     'B'
        #define stop     'F'

        #define uint    unsigned int                          //重定義無符號(hào)整數(shù)類型
    #define uchar   unsigned char                         //重定義無符號(hào)字符類型

        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; //接收緩沖字節(jié)
        uchar code  LedShowData[]={0x03,0x9F,0x25,0x0D,0x99,  //定義數(shù)碼管顯示數(shù)據(jù)
                            0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9

        #define ShowPort P2                                   //定義數(shù)碼管顯示端口

/************************************************************************/        
//延時(shí)函數(shù)        
   void delay(unsigned int k)
{   
     unsigned int x,y;
         for(x=0;x<k;x++)
           for(y=0;y<2000;y++);
}

/************************************************************************/
//字符串發(fā)送函數(shù)
          void send_str( )
                   // 傳送字串
    {
            unsigned char i = 0;
            while(str != '\0')
           {
                SBUF = str;
                while(!TI);                                // 等特?cái)?shù)據(jù)傳送
                TI = 0;                                        // 清除數(shù)據(jù)傳送標(biāo)志
                i++;                                        // 下一個(gè)字符
           }        
    }
                  void send_str1( )
                   // 傳送字串
    {
            unsigned char i = 0;
            while(str1 != '\0')
           {
                SBUF = str1;
                while(!TI);                                // 等特?cái)?shù)據(jù)傳送
                TI = 0;                                        // 清除數(shù)據(jù)傳送標(biāo)志
                i++;                                        // 下一個(gè)字符
           }        
    }        

                          void send_str2( )
                   // 傳送字串
    {
            unsigned char i = 0;
            while(str2 != '\0')
           {
                SBUF = str2;
                while(!TI);                                // 等特?cái)?shù)據(jù)傳送
                TI = 0;                                        // 清除數(shù)據(jù)傳送標(biāo)志
                i++;                                        // 下一個(gè)字符
           }        
    }        

                          void send_str3()
                   // 傳送字串
    {
            unsigned char i = 0;
            while(str3 != '\0')
           {
                SBUF = str3;
                while(!TI);                                // 等特?cái)?shù)據(jù)傳送
                TI = 0;                                        // 清除數(shù)據(jù)傳送標(biāo)志
                i++;                                        // 下一個(gè)字符
           }        
    }        

              void send_str4()
                   // 傳送字串
    {
            unsigned char i = 0;
            while(str4 != '\0')
           {
                SBUF = str4;
                while(!TI);                                // 等特?cái)?shù)據(jù)傳送
                TI = 0;                                        // 清除數(shù)據(jù)傳送標(biāo)志
                i++;                                        // 下一個(gè)字符
           }        
    }        


/************************************************************************/
//前速前進(jìn)
     void  run(void)
{

         Left_moto_go ;   //左電機(jī)往前走
         Right_moto_go ;  //右電機(jī)往前走
}

//前速后退
     void  backrun(void)
{

         Left_moto_back ;   //左電機(jī)往后走
         Right_moto_back ;  //右電機(jī)往后走
}

//左轉(zhuǎn)
     void  leftrun(void)
{


          Left_moto_go ;   //左電機(jī)往前走
         Right_moto_back ;  //右電機(jī)往后走
}

//右轉(zhuǎn)
     void  rightrun(void)
{


         Left_moto_back ;   //左電機(jī)往前走
         Right_moto_go ;  //右電機(jī)往前走
}
//STOP
     void  stoprun(void)
{

         Left_moto_Stop ;   //左電機(jī)往前走
         Right_moto_Stop ;  //右電機(jī)往前走
}
/************************************************************************/
void sint() interrupt 4          //中斷接收3個(gè)字節(jié)
{

    if(RI)                         //是否接收中斷
    {
       RI=0;
       dat=SBUF;
       if(dat=='O'&&(i==0)) //接收數(shù)據(jù)第一幀
         {
            buff=dat;
            flag=1;        //開始接收數(shù)據(jù)
         }
       else
      if(flag==1)
     {
      i++;
      buff=dat;
      if(i>=2)
      {i=0;flag=0;flag_REC=1 ;}  // 停止接收
     }
         }
}
/*********************************************************************/                 
/*--主函數(shù)--*/
        void main(void)
{
        TMOD=0x20;  
    TH1=0xFd;                     //11.0592M晶振,9600波特率
    TL1=0xFd;
    SCON=0x50;  
    PCON=0x00;
    TR1=1;
        ES=1;   
    EA=1;   

        while(1)                                                        /*無限循環(huán)*/
        {
          if(flag_REC==1)                                    //
           {
                flag_REC=0;
                if(buff[0]=='O'&&buff[1]=='N')        //第一個(gè)字節(jié)為O,第二個(gè)字節(jié)為N,第三個(gè)字節(jié)為控制碼
                switch(buff[2])
             {
                      case up :                                                    // 前進(jìn)
                          send_str( );
                          run();
                          ShowPort=LedShowData[1];
                          break;
                      case down:                                                // 后退
                           send_str1( );
                          backrun();
                          ShowPort=LedShowData[2];
                          break;
                      case left:                                                // 左轉(zhuǎn)
                           send_str3( );
                          leftrun();
                          ShowPort=LedShowData[3];  
                          break;
                      case right:                                                // 右轉(zhuǎn)
                          send_str2( );
                          rightrun();
                          ShowPort=LedShowData[4];
                          break;
                      case stop:                                                // 停止
                           send_str4( );
                          stoprun();
                          ShowPort=LedShowData[0];
                          break;

             }


         }
        }
}        
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

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

快速回復(fù) 返回頂部 返回列表