久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 17850|回復: 0
收起左側

單片機智能小車設計論文參考

[復制鏈接]
ID:210306 發表于 2017-6-12 05:45 | 顯示全部樓層 |閱讀模式
基于單片機的智能小車設計
The Design of Smart Car based on SingleChip Microcomputer
                        院:電氣工程學院
                  級:自動化1305
                        號:130302508  
                      名:王鵬超
                      師:楊穎鎮 (副教授)
20176   


   
隨著中國的高科技水平和工業自動化程度的不斷進步,不斷提高,工業自動化程不斷加快,在各種自動化產品或者兒童玩具中都有智能小車的身影,這極大地改變了人們的生活。在科技日新月異的今天,特別是在智能制造2025的大背景下,智能化十年內將成為一種趨勢。在大學所學的單片機及C語言基礎之上,我利用了軟件和硬件的基礎知識,軟件利用C語言編程、硬件利用電機驅動、避障,藍牙,單片機的一類超聲波避障循跡小車,根據STC89C52單片機設計的小車實用性強,功能齊全,技術先進,由電機驅動部分,單片機,超聲波部分,舵機部分,藍牙模塊等組成。它能利用藍牙模塊通信控制小車向前行駛、向后行駛、向左行駛和向右行駛,也可以通過紅外對管檢測黑線,當左紅外檢測黑線,車上接收信號,處理信息。當檢測到紅外線管的右側,汽車接收信號,處理信息,往右邊偏轉。也還利用紅外對管和超聲波檢測檢測障礙物,當檢測到前方的障礙物,在路的左側行駛,如果距離大于右側的車的距離,在路的右側,如果距離大于距離的路的左邊,向左邊行駛,如果距離小于對后驅動雙方20cm,則后退。小車使用STC89C52單片機控制電動汽車的速度和方向,從而實現自動跟蹤和避障功能。其中,汽車驅動由L293D驅動電路完成,速度由單片機控制。本系統采用52單片機STC89C52單片機編程來驅動汽車前進和后退,向左行駛、向右行駛、避障,電機的正反調速的電機驅動L293D輸出端的邏輯電平控制。從設計過程的角度來看,充分準備是非常重要的,經過前期準備,和開發嵌入式系統學習,避免了很多后續設計的問題。總的來說,已經做了充分的準備。在實踐過程中,通過查閱相關資料和咨詢相關人員,克服了系統設計過程中的大部分困難,基本達到了設計要求。并通過了軟件測試。
關鍵詞: 智能小車;單片機;超聲波避礙循跡
Abstract
With the rapid development of China's high-tech industry andthe development of intelligent vehicles, it has been widely used in the designof toys and other products, which has greatly enriched people's livesgreatly enrichedpeople's life. Now it is have a rapid development of science and technologyespecially inintelligent manufacturing time, It will be a trend in ten years. Based on theMCU and C language in the collegeuseSoftware and hardware combine, C languagesensor module, motor drivemodule, steering gear, ultrasonic module and a Bluetooth module. This paperbased on STC89C52 microcontroller design a ultrasonic avoid obstacles cartrackingIt has strongpracticabilitycompleteadvanced technology infraredsensor modulemotor drive module,steering gearultrasonic module anda Bluetooth module. In addition to mobile phone to control the car forward backwardleft and right but also the use ofinfrared to detect black line pipe when on the left side of theinfrared tube test to the black line, car to the left deflection on the right side ofthe infrared tube test to the black linecar to the right deflection.Also the infrared on the tube and the ultrasonic obstacle detection, thedetected obstacles in front when the car stopped steering gear to drive the ultrasonic left and right if left distances greater than theright distance car right, receive informationprocessing signalif the distance on the right greater than left distances on the leftturn, receive informationprocessing signal, if on both sides of the distance are less than20cm retreat. Using the STC89C52 MCU to control the electric car speed andsteering, so as to realize the automatic tracking and obstacle avoidancefunction. Which the car driven by the L293D driver circuit is completedthe speed by the single-chip microcomputercontrol.This design is completed based on Andrewsmobile phone intelligent car control system. The system uses 52 single-chipstc89C52 programming control motor forward and reverse to achieve the carforward backward turn left turn rightobstacle avoidanceand the motor forward and reverse speedfrom the motor drive L293D output logic level to control. From the whole designprocess to see the full preparation of the early is very importantafter the early preparation and the development of embedded systemslearningto avoid a lot offollow-up design may occur in the problem. Overallthe more fully preparedin the course of practice by consulting therelevant information and consulting the relevant personnel to overcome the system design process ofthe vast majority of difficultiesbasically to meet the design requirementsand passed the software test.
Keywords intelligent carMCUultrasonicobstacle avoidance tracking


   
    ... I
Abstract II
1 設計方案分析... 1
1.1 設計目的... 1
1.2 設計構思... 1
1.3 系統框圖... 1
2 硬件設計... 3
2.1 電機驅動的選擇... 3
2.1.1 方案一 L298N. 3
2.1.2 方案二 L9110S. 4
2.1.3 方案三 L293D. 5
2.2 單片機的選擇... 8
2.3 電源的供電方式... 10
2.4 超聲波避礙功能設計思路... 10
2.4.1 超聲波模塊選用及參數... 10
2.4.2 設計原理... 11
2.4.3 實物及接線圖... 11
2.5 循跡功能設計思路... 12
2.5.1 四路循跡模塊的原理及參數... 12
2.5.2 設計原理... 12
2.6藍牙模塊設計思路... 15
3 軟件設計... 16
3.1藍牙程序設計... 16
3.2 超聲波避障程序設計... 19
3.3 循跡程序設計... 22
4 系統調試... 26
4.1 舵機電壓過大,舵機無法運行... 26
4.2 無法循跡... 26
5 結論... 27
參考文獻... 28
    ... 29
附錄... 30
附錄一 實物圖... 30
附錄二 原理圖... 31
附錄三 源程序... 32


1 設計方案分析
1.1 設計目的
本次設計要求基于52單片機做到可以利用藍牙模塊來控制小車的向前行駛、向后行駛、向左行駛、向右行駛、并且能夠停止,實現自動規避障礙物的循跡等基本的功能。熟悉大學單片機定時器和計數器、循環語句、中斷語句、跳轉、宏定義以及中斷等基礎功能的使用,會使用基本的C語言編程,繪畫基礎的原理圖、電氣接線圖,了解單片機引腳的作用,并且能夠分清熟練應用。了解基礎的電機驅動型號,并且會判斷優劣,對其性能熟練掌握。會使用keil4 軟件與程序下載。實現小車的智能切換。一號鍵通過手機方向鍵控制小車,二號鍵小車自動避障,三號鍵小車尋跡,跟蹤黑線。
1.2 設計構思
通過搜索數據,進行方案論證和選擇,確定系統的整體結構。本設計是基于STC89C52單片機,通過藍牙控制小車的向前行駛、向后行駛、向左行駛彎、向右行駛彎、停止,通過手機按鍵切換實現超聲波避障、跟蹤及其他功能。單片機控制電機驅動,控制電機的正、負,旋轉。以實現汽車前進、倒車、左行駛、右駕駛、停車。藍牙接收模塊與手機上的藍牙相匹配,接收從移動終端發送的動作指令。接收到的指令,然后傳遞到微控制器,和微控制器跳轉到不同的子程序來控制電機驅動器的分析,通過傳遞的指令,從而使汽車向前移動,向后行駛、向左行駛、向右行駛、停止等不同的動作。電源7.4v 供給電機驅動,電機驅動5v 穩壓再給單片機。
1.3 系統框圖
小車整體的系統結框圖如圖1-3所示。該系統采用STC89C52單片機為核心芯片,配合外圍基礎電路共同完成初始信號采集、外圍路線檢測、路面障礙檢測、手機按鍵輸入、單片機信號顯示和小車舞臺手勢控制功能。道路是跟蹤基本信息單片機中斷查詢信號的反射式紅外發射接收脈沖調制的回報獲得路面,避障是通過協作中斷程序和查詢程序完成,以及LED顯示信息和汽車障礙運行狀態。本次設計的系統采用高性能的52單片機,本系統要求信息處理速度穩定,實時性強,通用性強,穩定可靠,能對汽車進行跟蹤和避障,并能達到極低的成本。





第 2 章 硬件設計
2.1 電機驅動的選擇
2.1.1 方案一 L298N
采用L298N作為本次設計的電機驅動如圖2-1所示。L298N由雙電源從5V至46v的H橋電路控制。從板上取電,電壓必須是5和7V之間。PWM轉速控制也可以進行。L298N是雙H橋電機驅動芯片中的每個H橋可以提供2A的電流,電源電壓范圍的2.5-48v,5V電源的邏輯部分,接受5vttl水平電平。正常情況下,電壓的電源部分應大于6V,否則芯片可能無法正常工作。


圖2-1  L298N實物圖

評價:
優點:使用簡單,可以板內取電,穩定性高,適合做畢業設計。
缺點:功率過大,耗電量大。

2.1.2 方案二 L9110S
采用 L9110S 作為本次設計的電機驅動,如圖2-2。L9110S也是雙H橋電路進行電機控制的,可實現電機正反轉。供電范圍3v到5v,無法板內取電。但是板子體積較小,容易安裝。
9110S一二通道推挽式功率放大電路設計為控制和驅動電機。將分立電路集成到單片集成電路中,降低了外圍器件的成本,提高了整個系統的可靠性。該芯片有兩個TTL/CMOS兼容的輸入級,具有良好的抗干擾性;兩個輸出端可直接驅動電機的正反向運動,它具有每通道的800ma直流大電流驅動能力,峰值電流能力可達1.5A的;同時它具有較低的輸出飽和電壓;反向沖擊目前的內部鉗位二極管可以釋放感性負載,使它在驅動繼電器、直流電機、步進電機或功率開關管使用安全可靠[1]。9110S廣泛應用于玩具、汽車、電機驅動、脈沖電磁閥驅動器、步進電機驅動器和開關功率管等電路。










圖2-2  L9110S實物圖

評價:
優點:本實用新型體積小,安裝方便,電源電壓小,功耗小,適合做畢業設計。靜態工作電流低,電壓范圍寬,帶負載能力強,外圍電路少及價格較便宜。
缺點:無法板內取電,不能PWM調速控制。
2.1.3 方案三 L293D
采用L293D作為本次設計的電機驅動,如圖2-3。L293D也是雙H橋電路進行電機控制的,可實現電機正反轉與及PWM調速控制,其中板內有5v穩壓芯片,有三路5v輸出。可以給單片機提供5v電壓。功耗也比較小。
L293比L293D高四倍,目前是H橋驅動。L293提供從4.5V至36V到1個雙向驅動電流和電壓;L293D提供雙向驅動電流高達600毫安的電流和電壓從4.5V至36V的兩裝置設計用于驅動感性負載如繼電器、電磁閥、直流雙極步進電機,可還提供電源負載其他高電流/電壓高,兼容所有TTL輸入。每個輸出是推挽驅動電路,與達林頓三極管和偽達林源。啟用1、2EN驅動器和3、4EN驅動器。當使能輸入高,相關驅動器啟用,其輸出處于活動狀態,并在同一階段作為他們的輸入。當使能輸入低,這些驅動器被禁用,他們的產出是在一個高阻抗狀態關閉。PS:1,2en1和2使能端(高電平使能);3,4en同樣,用適當的數據輸入,每對在全H橋可逆驅動形式驅動,適用于電磁閥或電機上的應用[2]。L293,一種高速卡外部輸出鉗位,應該用于電感瞬態抑制。VCC1和VCC2分離提供邏輯輸入減少器件的功耗。對L293和L293D工作溫度從0℃到70℃。
電源電壓VCC1(見注1),36 V;
輸出電源電壓VCC2,36V;
輸入電壓VI,V7 ;
輸出電壓范圍VO,3 V至+3 V;
峰值輸出電流,IO(非重復性的,T≤5毫秒)L293:±2 A;
峰值輸出電流,IO(非重復性的,T≤100毫秒)L293D:±1.2;
連續輸出電流,IO:L293±1;
連續輸出電流,IO:L293D±600毫安;
連續總功耗(或低于)25°C自由空氣的溫度(見注2和3)2075毫瓦;
連續總功耗在80°C外殼溫度(見注3)5000毫瓦;
最高結溫TJ 150°C;
焊接溫度1.6 mm(1/16英寸)的情況下,10秒260°C;
存儲溫度范圍,TSTG-65°C至150°C;
當超過“絕對最大額定值”時,可能會造成設備永久性損壞。這些壓力額定值只,該設備的功能操作在這些或任何其他條件超出“推薦工作條件下表示”不暗示。曝光絕對最大額定條件下長時間可能會影響器件的可靠性。原理圖如圖2-4。
注:
(1)所有電壓值與網絡的接地端子。
(2)對于上述25°C自由空氣的溫度,減免率16.6毫瓦/°C線性。
(3)對于上述25°C外殼溫度,減免率71.4毫瓦/°C線性的變化,可在個別的移動設備的電氣特性和熱電阻,內置的熱過載保護被激活功率水平略高于或低于額定耗散。


圖2-3  L293D實物圖

評價:
優點:本實用新型具有穩定性高、功耗低、可向單片機提供5V電壓的優點。還可以實現正、負電機和PWM調速功能。所以符合本設計的所有要求。
綜上所述:我采用 L293D 做本次設計的電機驅動。其穩定性高,功耗小,可以給單片機提供 5v 電壓。也可以實現電機正反轉及 PWM 調速的功能。所以符合本次設計的所有要求。


圖2-4  L293D原理圖輸入輸出
2.2 單片機的選擇
單片機芯片選型時,總的原則是[3]:
(1)該芯片所包含的功能或數量略大于設計要求,設計要求盡可能采用芯片,采用外圍器件。
(2)技術:從單片機技術指標的角度,選擇芯片,保證單片機應用系統在一定技術指標下的可靠運行;
(3)實用性:從單片機供應渠道和信譽程序的角度出發,選擇單片機制造商,保證單片機系統在長期可靠運行中的應用;
(4)開發:單片機的選型必須有可靠的開發工具,如程序開發工具、仿真調試方法。單片機是用來控制電機驅動,52結構ATMELat89cXX系列,at89sxx系列,at89c20系列(20針)或STC的單片機可以實現。按照目前比較流行的學習在學校,stc89xx系列單片機STC89C52單片機,和便宜,購買方便,所以選用STC89C52單片機微控制器[4]。單片機有很多種,按照功能可以劃分為以下幾種類型。
1)基本型。基本型為8XX51,如8051,8751,89c51等。8位CPU和指令系統的基本特性,適用于控制、128字節的內部RAM、21個特殊功能寄存器,32線并行I/O口、2個16位定時器計數器、一個全雙工串行通信口,5個中斷源,4kb芯片ROM芯片的時鐘振蕩器等。
2)增強型。8032,8052,8072等等。此類單片機的容量比基本型的大1到數倍,同時計數器數量增加到3個,同時增加了看門狗抗干擾及電源監控器。
3)低功耗型。這類型號帶有“C”字型的單片機采用CHMOS工藝,這類的特點就是功耗低。另外,52也有兩組程序內存安全系統,防止未經授權的復制程序。
STC89C52RC單片機是一種低功耗,高性能CMOS8位微控制器,采用STC公司生產的。它具有8K字節的系統內可編程閃存。STC89C52采用經典的MCS-51內核,但已經取得了很大的進步,與傳統的51單片機制作的芯片不具備的功能。一個8位的CPU和系統可編程Flash單片機STC89C52提供了一個高度靈活和高效的解決方案為許多嵌入式控制應用[5]。
52單片機具有多個定時器,RAM51是128,52是256位。最后的數字代表E2PROM的大小,最后數×4K,E2PROM。C51 4K C52 8K,。此外,RAM是不同的,超過51個2定時器,串行通信可以設置更高的波特率,定時器2的功能與其他兩個定時器是不一樣的。52是51的增強型,S52比C51定時器T2超過一個以上的RAM,ROM,128B、更多4K,中斷超過2個,超過一個看門狗,在掉電,數據指針等,有一些改進。S52的最高外部晶體振蕩器可達33MHz,C51,大概只有24mhz。
52具有以下標準功能[6]:8k字節Flash,512字節RAM,32個I/O線,看門狗定時器,內置4KB的EEPROM MAX810復位電路,定時器/計數器的外部中斷,一個向量級中斷結構(與傳統51向量中斷結構全雙工串行端口兼容)。此外,STC89C52可降至0Hz靜態邏輯操作,支持2種軟件,你可以選擇省電模式。在空閑模式下,CPU停止工作,并允許RAM,定時器/計數器,串行端口,中斷繼續工作。在掉電保護模式下,RAM的內容被保存,振蕩器被凍結,微控制器停止所有的工作,直到下一個中斷或硬件復位[7]。最大工作頻率35MHz,6t/12t可選。
實物如圖2-5。


圖2-5  單片機實物圖
2.3 電源的供電方式
18650個7.4v系列電池電壓供應L293D電機驅動,內置的5V穩壓器芯片的電機驅5V輸出,分別到轉向齒輪,四路跟蹤模塊,單片機。單片機具有5V輸出,然后超聲波模塊和藍牙模塊電源(如圖2-7所示)。


圖2-7 供電方式圖

2.4 超聲波避礙功能設計思路
2.4.1 超聲波模塊選用及參數
我選擇超聲波HC-SR04超聲波模型。HC-SR04超聲波測距模塊可以提供2cm-400cm非接觸距離傳感功能,測距精度可達3mm;模塊包括超聲波的發射、接收和控制電路。其工作原理是;
(1)IO端口觸發用于觸發測距,至少10us高電平信號是給定的;
(2)模塊自動發送8個40KHz的Fang Bo,自動檢測是否有信號返回;
(3)有一個信號返回,通過IO口回波輸出一個高電平,超聲波的持續時間由發射到返回時間。
2.4.2 設計原理
在小車中超聲波模塊不是單獨工作的,還需要舵機來跟他一起完成這項任務。
因為超聲波檢測的只是前方的障礙物,很難檢測到兩邊的障礙物。這樣就減少了汽車的左右兩側的碰撞。工作原理:舵機向左和右轉向齒輪驅動超聲波檢測的左距離和右距離,然后比較左側大于右向左運行,右邊大于左邊就向右行駛。左邊等于右邊就退后在再向左行駛。超聲波原理圖如下。


圖2-8  超聲波原理圖

2.4.3 實物及接線圖
如圖2.4.3接線,VCC供5V電源,GND為地線,TRIG觸發控制信號輸(單片機p24),ECHO(接單片機p25)回響信號輸出等四支線。實物如圖2-9。



圖2-9 接線圖及實物圖

2.5 循跡功能設計思路
2.5.1 四路循跡模塊的原理及參數
光環境的適應性的傳感器模塊,它有一對紅外發射和接收管、發射管發射的一個紅外檢測頻率,當障礙物的方向(反射),反射紅外接收管、比較器電路處理后,輸出的數字信號(信號輸出接口的低電平信號),可通過電位器旋鈕調節探測距離,2 ~ 60cm有效距離范圍內,工作電壓為3.3v-5v。傳感器的探測范圍可以電位器調節,具有干擾小、安裝方便、使用方便,可廣泛應用于機器人避障、避障、車線數和黑白線跟蹤和許多其他場合[8]。參數如下:
(1)當模塊檢測到前面的障礙信號時,電路板上的紅色指示燈被點亮,輸出口連續輸出低電平信號。
(2)傳感器是紅外反射探測,所以目標的反射率和形狀是探測距離的關鍵。其中,黑色探測距離最小,白色最大,小面積物體小,距離大。
(3)傳感器模塊輸出端口可直接與單片機IO口可以連接,可以直接驅動一個5V繼電器模塊或蜂鳴器模塊;連接:vcc-vcc;gnd-gnd;out-io 4,比較器LM339運行穩定;
(4)3.3v-5v直流電源可用于電源模塊。接通電源后,綠色電源指示燈亮。
2.5.2 設計原理
跟蹤模塊有四個紅外探測模塊。他們都用紅外發射接收管等分立元件探頭,因為使用接近傳感器的紅外反射式傳感器,反射光的光電二極管電流與不斷變化的強度,從而導致電壓連續變化[9]。因此,如果電平信號直接提供給微控制器,它很容易被誤讀,因此使用LM358比較器LM339或(添加滯后電路)防止關鍵輸出抖動作為中央控制電路的核心部件。當路由為黑色時,接收到的信號返回到微控制器。當信號為白色或接地時,由單片機相應端口接收的信號為0。用于產生基準電平的電位器,當光電二極管的光電流超過一定值時,正輸入電平高于運算放大器的參考電平,然后輸出電平跳變,信號可以進行單片機處理[10]。通過調整參考電平,傳感器的靈敏度和探測距離也可以被調整,以改變所接收的信號的強度和檢測的靈敏度。雙向探頭共同工作,根據兩路探頭的方向確定不同的返回值方向,通過單片機兩直流電機的運行狀態,調整小車的姿態,用導絲完成跟蹤任務的完成。主控板電路圖如圖2-10所示,小板原理圖如圖2-12。
四路尋跡模塊使用說明如下:
這個模塊提供了一個通用的紅外探測系統,智能機,如智能車和機器人。光環境的適應性的傳感器模塊,它有一對紅外發射和接收管、發射管發射的一個紅外檢測頻率,當障礙物的方向(反射),反射紅外接收管、比較器電路處理后,輸出的數字信號(信號輸出接口的低電平信號),可通過電位器旋鈕調節探測距離,2 ~ 60cm有效距離范圍內,工作電壓為3.3v-5v。傳感器的探測范圍可以電位器調節,具有干擾小、安裝方便、使用方便,可廣泛應用于機器人避障、避障、車線數和黑白線跟蹤和許多其他場合[11]。1當模塊檢測到前面的障礙信號時,電路板上的紅色指示燈被點亮,并輸出低電平信號檢測模塊、2~60cm的檢測距離,角度為35度,檢測距離可通過電位器順時針旋轉,調整電位器,檢測距離增大;逆時針旋轉電位器,降低檢測距離。傳感器是紅外反射探測,所以目標的反射率和形狀是探測距離的關鍵[12]。其中,黑色探測距離最小,白色最大,小面積物體小,距離大。傳感器模塊輸出端口可直接與單片機IO口可以連接,可以直接驅動一個5V繼電器模塊或蜂鳴器模塊;連接:vcc-vcc;gnd-gnd;out-io 4,比較器LM339運行穩定;3.3v-5v直流電源可用于電源模塊。當電源接通時,綠色電源指示燈亮起;6.3毫米的螺孔,便于固定、安裝;尺寸大小:中控板42mm×38mm×12mm(長×寬×高),小板25mm×12mm×12mm(長×寬×高)[13]。在交貨的各個模塊已經比較的電位器調節閾值電壓,買家也可以根據實際情況進行調整(提示:模塊反射距離,更容易引發)按照探頭的要求和控制面板連接,刪除所有對象的前面探針和探針指向太陽(光有探頭影響很大),每路調整電位器,直到燈剛熄滅,然后用白盾探頭,會發現LED燈,所以如果測試成功,那么我們可以在單片機控制板級測試通過輸出信號。


圖2-10 主控板電路圖


圖2-11 小板原理圖
2.6藍牙模塊設計思路
在小車中藍牙模塊做的是中間設備,作用是把手機app發來的信號傳給單片機,讓單片機進行相應的動作。藍牙模塊有vcc、gnd、txd和rxd等幾個引腳,但是我們用到的只有vcc、gnd和txd。因為我的小車只要接收手機給藍牙的信號,不要發送給手機,所以我們只要用到txd這個引腳。其中單片機的rxd是p30,txd是p31。

3章 軟件設計
3.1藍牙程序設計
在本次設計中,藍牙程序主要是在單片機的控制下,對藍牙模塊的輸入信息進行存儲分析,以控制電機的驅動,以控制小車前進,向后行駛、向左行駛、向右行駛。在這個過程中,單片機首先進行初始化,包括單片機各端口的設置方向,各變量的初始化,以及單片機的振蕩頻率的標定[14]。單片機定時讀取串口上藍牙模塊的數據,如果數據讀出串口,則讀取數據分析,藍牙程序流程圖如圖3-1所示。
void main(void)
{
TMOD=0x11;
TH1=(65536-100)/256; //100US
定時
TL1=(65536-100)%256;
TH0=0;
TL0=0;
T2CON=0x34;
T2MOD=0x00;
RCAP2H=0x FF;
RCAP2L=0x DC;
SCON=0x50;
PCON=0x00;
PS=1;
TR1=1;
ET1=1;
ES=1;
EA=1;
push_val_duoji=10; //舵機歸中
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( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
run();
break;
case down: // 向后行駛
send_str1( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
backrun();
break;
case left: // 向左行駛
send_str2( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
leftrun();
break;
case right: // 向右行駛


圖3-1 藍牙程序流程圖
3.2 超聲波避障程序設計
當按下2號鍵后,啟動超聲波避礙功能,小車向前行駛,一邊檢測中間、左邊和右邊有無障礙物,當超聲波距離30cm,左、右紅外有障礙,車停,舵機向右行駛90度,再向左行駛90度,檢查左邊的距離和右邊的距離。如果雙方之間的距離小于20cm,汽車將搬回。如果左邊的距離大于右邊,車就向右邊行駛。否則汽車將向左行駛。流程圖如圖3.1所示。部分程序如下:
void Start Module() //啟動測距信號
{
TRIG=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TRIG=0;
}
/***************************************************/
void Conut(void) //計算距離
{
time=TH0*256+TL0; //讀取脈寬長度
TH0=0;
TL0=0;
S=(time*1.7)/100; //算出來是 CM
void juli(void)
{
Start Module();
while(!ECHO); //當 RX 為零時等待
TR0=1; //開啟計數
while(ECHO); //當 RX 為 1 計數并等待
TR0=0; //關閉計數
Conut();
}
這部分程序是啟動測距,計算兩邊距離。
void COMM( void ) //小車方向函數
{
push_val_duoji=4; //舵機向向左行駛90 度
timer=0;
while(timer<=2500); //延時250MS 讓舵機轉到其位置
juli(); //計算距離
Delay Ms(20);
S2=S;
push_val_duoji=20; //舵機向右行駛90 度
timer=0;
while(timer<=2500); /延時250MS 讓舵機轉到其位置
juli(); //計算距離
Delay Ms(20);
S4=S;
push_val_duoji=10; //舵機歸中
timer=0;
while(timer<=2500); //延時250MS 讓舵機轉到其位置
if((S2<25)||(S4<25)) //只要左右各有距離小于25CM小車向后行駛
{
bjbackrun(); //向后行駛
timer=0;
while(timer<=4000);
}
if(S2>S4)
{
bjleftrun(); //車的左邊比車的右邊距離小向右行駛
timer=0;
while(timer<=2000);
}
else
{
bjrightrun(); //車的左邊比車的右邊距離大向左行駛
timer=0;
while(timer<=2000);
}
}
這段程序即是當測試出距離之后,小車選擇前進或者行進的方向。






圖3-2 超聲波程序流程圖
3.3 循跡程序設計
當按下3號鍵后,小車啟動循跡功能,小車流程圖如圖3.2所示。小車向前行駛的同時,檢測左邊和右邊是否有黑線,當左邊有黑線時向左行駛,當右邊有黑線時向右行駛。兩路紅外都沒有感應到地板時,小車停止。小車在循跡過程中的速度必須減慢,否則速度太快,小車會沖出黑線[15]。就無法完成循跡任務了。所以說,在循跡時,小車的速度必須要用PWM要控制。
while(flag_bj) /*無限循環
*/
{
if(timer>=1000) //100MS 檢測啟動檢測一次
{
timer=0;
juli(); //計算距離
Delay Ms(20);
if((S<30)||Right_led1==0||Left_led1==0) //超聲波小于30CM 、紅外 1、紅外 2 其中一個有遇到障礙物都停車進行超聲波測距(紅外 1,2 是超聲波兩邊的)
{
stoprun(); //小車停止
COMM(); //方向函數
}
else
if((S>30)&&Right_led1==1&&Left_led1==1) //超聲波大于30CM 紅外 1 和紅外2 都沒有遇到障礙就向前行駛。
bjrun();
}
if(flag_REC==1)
{
push_val_duoji=10; //舵機歸中
stoprun();
break;
}
}
while(flag_xj) /*無限循環*/
{
if(Left_led==0&&Right_led==0) //有信號為0 沒有信號為 1
{
xjrun();
}
else
{
if(Right_led==1&&Left_led==0) //左邊檢測到黑線向左行駛
{
xjleftrun();
}
if(Left_led==1&&Right_led==0) //右邊檢測到黑線向右行駛
{
xjrightrun();
}
if(Left_led==1&&Right_led==1) //兩邊檢測到黑線停止
{
stoprun();


圖5-3 自動尋跡模塊流程圖

第4章 系統調試
4.1 舵機電壓過大,舵機無法運行
在初步設計中避免超聲波車的障礙,自己寫的程序燒進去,但是超聲波舵機禁用函數無法運行。后來,我寫了一個程序,只適用于超聲波單獨作用,其結果是,超聲波可以工作。但我使用材料時,發現舵機的電源是從4.8V至6V。我經過咨詢別人,他告訴我,轉向齒輪和超聲波一起使用轉向電源3.3V。最后,我買了一個5V至3.3V模塊,將電機驅動5V到3.3V的功率轉向齒輪,成功解決了問題。
4.2 無法循跡
當按下3按鈕時,汽車跟蹤功能打開。在第一次測試中,汽車不能沿黑線行駛。正常來說,兩個紅外線傳感器安裝在汽車底部的左右兩側,當黑色線在左邊相遇時,汽車向左行駛;當右側遇到黑線時,汽車向右移動。但第一次,方向正好相反。修改后的程序來解決這個問題,但它仍然沒有跟蹤。汽車遇到黑線車輕微轉彎,直接走出黑線。后來,經過觀察,才發現車速太快了。小車的速度是1到10檔,程序可以改變跟蹤的速度。經過調節小車速度,完成了循跡功能。

5章 結論
本畢業設計是基于AT89C52單片機的智能小車控制,包括程序選型、硬件設計、軟件設計、軟件測試結果以及調試電路中遇到的問題。在此期間,完成的主要工作包括以下幾個方面。
(1)在設計前期收集電機驅動、單片機等相關數據,實現智能小車的工作原理。
(2)確定系統圖,電源模塊,單片機最小系統模塊,超聲波模塊、藍
比較了輪齒電路模塊和電機及其驅動電路模塊的實現方案,確定了最終智能小車控制的設計方案。
(3)根據智能小車控制原理圖,給出了電路接線圖。
(4)根據系統要實現向前行駛、向后行駛、向左行駛、向右行駛、避障、循跡功能編寫出小車端的軟件程序。
(5)經過硬件和軟件的調試,對整個系統進行了調試,并對系統的缺陷進行了查找完善。
(6)最終小車能夠實現向前行駛、向后行駛、左右行駛、避障、循跡等功能,實現了老師給出的基本要求。本設計完成了基于Android手機的智能小車控制系統。本系統采用52單片機STC89C52單片機編程來驅動汽車前進和后退運動的陽性和陰性對照,向左行駛、向右行駛、避障,電機的正反調速的電機驅動L293D輸出端的邏輯電平控制。從設計過程的角度充分準備是非常重要的,經過前期準備,并開發嵌入式系統學習,避免了很多后續設計的問題。總的來說,我們已經做了充分的準備。在實踐過程中,通過查閱相關資料和咨詢相關人員,克服了系統設計過程中的大部分困難,基本達到了設計要求。并通過了軟件測試。
參考文獻
[1]     郭惠,吳迅.單片機 C 語言程序設計完全自學手冊[M].電子工業出版社,2008.
[2]     王東鋒,王會良,董冠強. 單片機 C 語言應用 100 例[M].電子工業出版社,2009-03.
[3]     王曉明. 電動機的單片機控制[J]. 學術期刊,2002,13-15.
[4]     王淑芳,電機驅動技術[M].科學出版社,2008.
[5]      Graham J. Lee ,ProfessionalCocoa Application Security,2010:117-119
[6]     李學軍. 如何用MCS-52單片機擴展串口進行通訊[J]. 寧夏機械,2003,24-43.
[7]     韓毅,楊天. 基于HCS12單片機的智能尋跡模型車的設計與實現[J].學術期刊,2008,29(18):1535-1955.
[8]      B.Chopard,P.O.Luthi andP.-A.Queloz-«Cellular automata model of car traffic in a two-dimensional streetnetwork»in Journal of Physics A:Mathematical and General,29(10): 2325-2336,1996.
[9]     蔡自興,徐光佑.人工智能及應用(第二版)[M],清華大學出版社,1996
[10]  A.Cheng and K.Rajan-«A digital map/GPS based routing andaddressing scheme for wireless ad hoc networks»In Proc.of IEEE IntelligentVehicle Symposium (IV‘03),2003.
[11]張凱,錢鋒,劉漫丹.模糊神經網絡技術綜述.信息與控制[J],2003,32(5):431-435
[12]劉瑞正,趙海蘭.人工神經網絡研究五十年.計算機應用研究[J],1997(1):11-13
[13]  ChenZ F,Shi H Y,An Y J. Globally convergent approach based on chaotic theory for underwaterrobot motor optimization [A].InternationalConference on Robotics, Intelligent Systems andSignal Processing [C]. Chansha, 2003. 996-1001.
[14]  C.Bonnet-CHAUFFEUR 2 Final Report,Deliverable D24,Version 1.0,Contract numberIST-1999-10048,July 10,2003.
[15] 陳伯時著.電力拖動自動控制系統[M].第四版.北京:機械工業出版社,2009
[16]  Chen Z F, Shi H Y, An Y J.Globally convergent approach based on chaotic theory for underwater robot motoroptimization [A].International Conference on Robotics, Intelligent Systems andSignal Processing [C]. Chansha, 2003. 996-1001
致    謝
畢業設計完成了,在這個過程中學到了很多東西。首先要感謝我的導師,他在我完成論文的過程中,給予了我很大的幫助。在論文開始的初期,我對于論文的結構以及文獻選取等方面都有很多問題,是在老師的幫助下進行修改和完善的。本畢業設計是在指導老師悉心的關懷與指導下完成,在此對老師獻上最衷心地感謝。老師從畢業設計一開始就對我們嚴格要求,每周的周三都會和我們開見面會,詢問我們的畢設進度并了解我們遇到的困難,積極協助我們解決設計過程中的各種難題,并要求我們每天記錄在畢業設計中所作的工作進度及遇到的問題,讓我們去發現問題,解決問題。在我遇到難已解決的問題心中急躁時,老師總是及時的給予鼓勵,使我能夠有勇敢的克服困難,把畢業設計繼續進行下去。老師對學生的高度關注和對工作高度負責的精神值得我們尊敬,也是我今后走向工作崗位的榜樣。通過本次畢業設計,我不僅是對我們所學知識的一個匯總,同時也是考驗我們學習能力和動手能力的一個平臺;讓我們能學到更多的相關知識,更重要的是學到了面對困難的不放棄、不氣餒的態度,不驕不躁的辦事風格,奮發向上的精神,這些在我今后的生活和學習中都是一筆寶貴的財富。最后,我要再次感謝在畢業設計過程中對我提供過制作電路板等工具的同學和老師,以及在畢業設計中對我進行過指導的所有老師和同學。











附錄
附錄一  實物圖

























附錄二  原理圖

附錄三 源程序
#include<AT89x52.H>
#include<intrins.h>
#define uchar unsignedchar
#define uint unsignedint
#define Left_moto_go  {P1_0=1,P0_0=1;P0_1=0;}  //左電機正轉
#define Left_moto_back  {P1_0=1,P0_0=0;P0_1=1;} //左電機反轉
#define Lef_moto_Stop  {P1_0=0;}              //左電機停轉
#define Right_moto_go  {P1_1=1,P0_2=1;P0_3=0;} //右電機正轉
#define Right_moto_back  {P1_1=1,P0_2=0;P0_3=1;} //右電機反轉
#define Righ_moto_Stop  {P1_1=0;}              //右電機停轉
/***************************************************************/
#define ECHO  P2_4                        //超聲波接口定義
#define TRIG  P2_5                         //超聲波接口定義
#define Sevro_moto_PWM  P1_6 //接舵機信號端輸入PWM 信號調節速度 接P2_7
#define Left_moto_PWM  P1_0           //PWM 信號端左電機使能端借 P1_0
#define right_moto_PWM  P1_1           //PWM 信號端右電機使能端借 P1_1
#define Left_led  P2_2                 //P3_4 接四路尋跡模塊接口第三路輸出信號即中控板上面標記為OUT3
#define Right_led P2_3                //P3_5 接四路尋跡模塊接口第四路輸出信號即中控板上面標記為OUT4
#define Left_led1 P1_2                 //P1_2 接四路尋跡模塊接口第二路輸出信號即中控板上面標記為 OUT2(超聲波左邊的紅外)
#define Right_led1 P1_3              //P1_3 接四路尋跡模塊接口第一路輸出信號即中控板上面標記為 OUT1 (超聲波右邊的紅外)
unsigned char PWM_val_duoji= 0;      //變量定義
unsigned charpush_val_duoji =10     ;//舵機歸中,產生約,1.5MS 信號
unsigned char PWM_val_left=0;      //變量定義
unsigned charpush_val_left =0;       // 左電機占空比N/10
unsigned char PWM_val_right=0;    //變量定義
unsigned charpush_val_right =0;     // 左電機占空比N/10

bit Left_moto_stop =1;
bit right_moto_stop =1;

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

#define Car '1' //手機軟件 1 號鍵
#define Car1 '2' //手機軟件 2 號鍵
#define Car2 '3' //手機軟件 3 號鍵

char code str[] = "收到指令,向前!\n";
char code str1[] ="收到指令,向后!\n";
char code str2[] ="收到指令,向左!\n";
char code str3[] ="收到指令,向右!\n";
char code str4[] ="收到指令,停止!\n";

unsigned int time=0; //時間變量
unsigned int timer=0; //延時基準變量
unsigned int timer1=0; //延時基準變量
unsigned long S=0; //計算出超聲波距離值
unsigned long S1=0;
unsigned long S2=0;
unsigned long S3=0;
unsigned long S4=0;

bit flag_REC=0;      //串行接收標去位
bit flag =0;
bit flag_mss =0;
bit flag_bj =0;
bit flag_xj =0;
bit flag_hw =0;
unsigned char i=0;
unsigned char dat=0;
unsigned char buff[5]=0; /接收緩沖字節

/***************************************************************/
//延時函數
void Delay Us2x(uchar t)
{
while(--t);
}
void Delay Ms(uchar t)
{
while(t--)
{
Delay Us2x(245); //大致延時 1m S
Delay Us2x(245);
}
}
/***************************************************************/
//
前速向前行駛 可以調節各功能速度占空比調節小車的速度
void run(void)
{
push_val_left=6; //手機遙控向前行駛速度的占空比是5 0 到 10 10 最大
push_val_right=6;
Left_moto_go ; /左電機往前走
Right_moto_go ; //右電機往前走
}
void bjrun(void)
{
push_val_left=4; //舵機避礙和魔術手速度的占空比是5 0 到 10 10 最大
push_val_right=4;
Left_moto_go ; //左電機往前走
Right_moto_go ; //右電機往前走
}
void xjrun(void) //循跡速度的占空比是 1 0 到 10 10 最大
{
push_val_left=1;
push_val_right=1;
Left_moto_go ; //左電機往前走
Right_moto_go ; //右電機往前走
}
//前速向后行駛
void backrun(void)
{
push_val_left=6;
push_val_right=6;
Left_moto_back ; //左電機往后走
Right_moto_back ; //右電機往后走
}
void bjbackrun(void)
{
push_val_left=4;
push_val_right=4;
Left_moto_back ; //左電機往后走
Right_moto_back ; //右電機往后走
}
//向左行駛
void leftrun(void)
{
push_val_left=5;
push_val_right=3;
Left_moto_go ; //左電機往前走
//STOP
void stoprun(void)
{
push_val_left=0;
push_val_right=0;
Lef_moto_Stop ; // 停止
Righ_moto_Stop ; //停止
}
/**************************************************************/
void Start Module() //啟動測距信號
{
TRIG=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TRIG=0;
}
/***************************************************/
void Conut(void) //計算距離
{
time=TH0*256+TL0; //讀取脈寬長度
TH0=0;
TL0=0;
S=(time*1.7)/100; //算出來是 CM
void juli(void)
{
Start Module();
while(!ECHO); //當 RX 為零時等待
TR0=1; //開啟計數
while(ECHO); //當 RX 為 1 計數并等待
TR0=0; //關閉計數
Conut();
}
/***************************************************************/
/* PWM 調制舵機信號 */
/***************************************************************/
/* 舵機調速 */
/*調節 push_val_duoji 的值改變電機轉速,占空比 */
void PWM_Servomoto(void)
{
if(PWM_val_duoji<=push_val_duoji)
Sevro_moto_PWM=1;
else
Sevro_moto_PWM=0;
if(PWM_val_duoji>=100)
PWM_val_duoji=0;
}
/**************************************************************/
/* PWM 調制電機轉速 */
/***************************************************************/
/* 左電機調速 */
/*調節 push_val_left 的值改變電機轉速,占空比 */
void PWM_out_left_moto(void)
{
if(Left_moto_stop)
{
if(PWM_val_left<=push_val_left)
{
Left_moto_PWM=1;
}
else
{
Left_moto_pwm=0;
}
f(pwm_val_left>=10)
pwm_val_left=0;
}
else   
{
Left_moto_pwm=0;
       }
}

/********************************************************/
/*  PWM調制電機轉速                                   */
/*******************************************************/
/*     右電機調速                                   */
/*調節push_val_right的值改變電機轉速,占空比            */
      void pwm_out_right_moto(void)
{  if(right_moto_stop)
  {
if(pwm_val_right<=push_val_right)
{
right_moto_pwm=1;
}
else
  {
right_moto_pwm=0;
}
if(pwm_val_right>=10)
pwm_val_right=0;

else   
   {
right_moto_pwm=0;
}


{
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 COMM( void ) //小車方向函數
{
push_val_duoji=4; //舵機向向左行駛90 度
timer=0;
while(timer<=2500); //延時2500MS 讓舵機轉到其位置
juli(); //計算距離
Delay Ms(20);
S2=S;
push_val_duoji=20; //舵機向向右行駛90 度
timer=0;
while(timer<=4500); /延時400MS 讓舵機轉到其位置
juli(); //計算距離
Delay Ms(20);
S4=S;
push_val_duoji=10; //舵機歸中
timer=0;
while(timer<=2500); //延時250MS 讓舵機轉到其位置
if((S2<25)||(S4<25)) //只要左右各有距離小于,25CM小車向后行駛
{
bjbackrun(); //向后行駛
timer=0;
while(timer<=4000);
}
if(S2>S4)
{
bjleftrun(); //車的左邊比車的右邊距離小向右行駛
timer=0;
while(timer<=2000);
}
else
{
bjrightrun(); //車的左邊比車的右邊距離大向左行駛
timer=0;
while(timer<=2000);
}
}
/***************************************************/
///*TIMER1 中斷服務子函數產生 PWM 信號*/
void time1()interrupt 3 using 2
{
TH1=(65536-100)/256; //100US
定時
TL1=(65536-100)%256;
timer++;
PWM_val_duoji++;
PWM_val_left++;
PWM_val_right++;
PWM_Servomoto();
PWM_out_left_moto();
PWM_out_right_moto();
}
/***************************************************************/
void sint() interrupt 4 //中斷接收 3 個字節
{
if(RI) //是否接收中斷
{
RI=0;
dat=SBUF;
}
else
{
Left_moto_PWM=0;
}
if(PWM_val_left>=10)
PWM_val_left=0;
}
else
{
Left_moto_PWM=0;
}
}
/********************************************************/
/* PWM 調制電機轉速 */
/********************************************************/
/* 右電機調速 */
/*調節 push_val_right 的值改變電機轉速,占空比 */
void PWM_out_right_moto(void)
{
if(right_moto_stop)
{
if(PWM_val_right<=push_val_right)
{
right_moto_PWM=1;
}
else
{
right_moto_PWM=0;
}
if(PWM_val_right>=10)
PWM_val_right=0;
}
else
{
right_moto_PWM=0;
}
}
/***************************************************************/
//字符串發送函數void send_str( )//
傳送字串
if(flag_REC==1)
{
push_val_duoji=10; //舵機歸中
stoprun();
break;
}
}
while(flag_xj) /*無限循環*/
{
if(Left_led==0&&Right_led==0) //有信號為0 沒有信號為 1
{
xjrun();
}
else
{
if(Right_led==1&&Left_led==0) //左邊檢測到黑線向左行駛
{
xjleftrun();
}
if(Left_led==1&&Right_led==0) //右邊檢測到黑線向右行駛
{
xjrightrun();
}
if(Left_led==1&&Right_led==1) //兩邊檢測到黑線停止
{
stoprun();
}
}
if(flag_REC==1)
{
push_val_duoji=10; //舵機歸中
stoprun();
break;
}
}
if(flag_REC==1)
{
flag_REC=0;
if(buff[0]=='O'&&buff[1]=='N') //第一個字節為O,第二個字節為 N,第三個字節為控制碼
switch(buff[2])
{
case up : // 向前行駛
send_str( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
run();
break;
case down: // 向后行駛
send_str1( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
backrun();
break;
case left: // 向左行駛
send_str2( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
leftrun();
break;
case right: // 向右行駛
send_str3( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
rightrun();
break;
case stop: // 停止
send_str4( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
{
while(flag_mss) //循線標志位
{
if(timer>=2000) //1000*100US 檢測一次
{
timer=0;
juli(); //計算距離
Delay Ms(20); //計算距離
if(S<20) //距離小于25CM
{
bjbackrun(); //小車向后行駛
}
else
if(S>20) //距離大于,25CM 往前走
bjrun();
}
if(flag_REC==1)
{
push_val_left=10; //舵機歸中
stoprun();
break;
}
}
while(flag_bj) /*無限循環*/
{
if(timer>=1000) //100MS
檢測啟動檢測一次
{
timer=0;
juli(); //計算距離
Delay Ms(20);
if((S<30)||Right_led1==0||Left_led1==0) //超聲波小于30CM 、紅外 1、紅外 2 其中一個有遇到障礙物都停車進行超聲波測距(紅外 1,2 是超聲波兩邊的)
{
stoprun(); //
小車停止
COMM(); //方向函數
}
else
if((S>30)&&Right_led1==1&&Left_led1==1) //超聲波大于30CM 紅外 1 和紅外 2 都沒有遇到障礙就向前行駛。
bjrun();
}
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=0x11;
TH1=(65536-100)/256; //100US
定時
TL1=(65536-100)%256;
TH0=0;
TL0=0;
T2CON=0x34;
T2MOD=0x00;
RCAP2H=0x FF;
RCAP2L=0x DC;
SCON=0x50;
PCON=0x00;
PS=1;
TR1=1;
ET1=1;
ES=1;
EA=1;
push_val_duoji=10; //舵機歸中
while(1) /*無限循環*/
{
while(flag_mss) //循線標志位
{
if(timer>=2000) //1000*100US 檢測一次
{
timer=0;
juli(); //計算距離
Delay Ms(20); //計算距離
if(S<20) //距離小于25CM
{
bjbackrun(); //小車向后行駛
}
else
if(S>20) //距離大于,25CM 往前走
bjrun();
}
if(flag_REC==1)
{
push_val_left=10; //舵機歸中
stoprun();
break;
}
}
while(flag_bj) /*無限循環
*/
{
if(timer>=1000) //100MS 檢測啟動檢測一次
{
timer=0;
juli(); //計算距離
Delay Ms(20);
if((S<30)||Right_led1==0||Left_led1==0) //超聲波小于30CM 、紅外 1、紅外 2 其中一個有遇到障礙物都停車進行超聲波測距(紅外 1,2 是超聲波兩邊的)
{
stoprun(); //小車停止
COMM(); //方向函數
}
else
if((S>30)&&Right_led1==1&&Left_led1==1) //超聲波大于30CM 紅外 1 和紅外2 都沒有遇到障礙就向前行駛。
bjrun();
}
if(flag_REC==1)
{
push_val_duoji=10; //舵機歸中
stoprun();
break;
}
}
while(flag_xj) /*無限循環*/
{
if(Left_led==0&&Right_led==0) //有信號為0 沒有信號為 1
{
xjrun();
}
else
{
if(Right_led==1&&Left_led==0) //左邊檢測到黑線向左行駛
{
xjleftrun();
}
if(Left_led==1&&Right_led==0) //右邊檢測到黑線向右行駛
{
xjrightrun();
}
if(Left_led==1&&Right_led==1) //兩邊檢測到黑線停止
{
stoprun();
}
}
if(flag_REC==1)
{
push_val_duoji=10; //舵機歸中
stoprun();
break;
}
}
if(flag_REC==1)
{
flag_REC=0;
if(buff[0]=='O'&&buff[1]=='N') //第一個字節為O,第二個字節為 N,第三個字節為控制碼
switch(buff[2])
{
case up : // 向前行駛
send_str( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
run();
break;
case down: // 向后行駛
send_str1( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
backrun();
break;
case left: // 向左行駛
send_str2( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
leftrun();
break;
case right: // 向右行駛
send_str3( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
rightrun();
break;
case stop: // 停止
send_str4( );
flag_mss=0;
flag_bj=0;
flag_xj=0;}
}
} stoprun();
break;
case Car : // 開啟魔術手
flag_mss=1;
break;
case Car1 : // 開啟超聲波避礙
flag_bj=1;
break;
case Car2 : // 開啟紅外循跡
flag_xj=1;
break;
}
}
}

附錄四 高清大圖
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩在线国产 | 国产欧美综合在线 | 九九九视频精品 | 精品国产乱码久久久久久影片 | 午夜电影网 | 日韩网站在线观看 | 日韩一级黄色毛片 | 岛国在线免费观看 | 7777久久| 国产成人99久久亚洲综合精品 | 国产日韩欧美在线 | 午夜寂寞影院在线观看 | 精品不卡 | 成人在线小视频 | 国产精品www | 91视频www.| 国产精品久久久久久久久久久久久久 | 99热免费在线 | 91av视频在线免费观看 | 欧美日韩国产一区二区 | 日韩日韩日韩日韩日韩日韩日韩 | 日本 欧美 国产 | 一区二区国产在线 | 日本在线免费 | 欧美区在线 | 日韩一区二区三区在线 | 美女日皮网站 | 国产精品一区久久久 | 国产色婷婷精品综合在线播放 | 人人干人人干人人 | 一二三四在线视频观看社区 | 色视频成人在线观看免 | 欧美成人aaa级毛片在线视频 | 亚洲欧美国产精品久久 | 国产高清视频 | 综合国产 | 成人av一区二区亚洲精 | 羞视频在线观看 | 欧美精品一区二区三区蜜桃视频 | 欧美精品网站 | 日韩精品视频在线播放 |