基于51的避障循跡重力感應(yīng)遙控的智能小車設(shè)計(c語言)畢業(yè)設(shè)計論文_第1頁
基于51的避障循跡重力感應(yīng)遙控的智能小車設(shè)計(c語言)畢業(yè)設(shè)計論文_第2頁
基于51的避障循跡重力感應(yīng)遙控的智能小車設(shè)計(c語言)畢業(yè)設(shè)計論文_第3頁
基于51的避障循跡重力感應(yīng)遙控的智能小車設(shè)計(c語言)畢業(yè)設(shè)計論文_第4頁
基于51的避障循跡重力感應(yīng)遙控的智能小車設(shè)計(c語言)畢業(yè)設(shè)計論文_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

基于51的避障/循跡/重力感應(yīng)遙控的智能小車設(shè)計1緒論1.1選題背景隨著汽車工業(yè)的迅速發(fā)展,關(guān)于汽車的研究也就越來越受人關(guān)注。全國電子大賽和省內(nèi)電子大賽幾乎每次都有智能小車這方面的題目,全國各高校也都很重視該題目的研究。可見其研究意義很大。本設(shè)計就是在這樣的背景下提出的,指導(dǎo)教師已經(jīng)有充分的準(zhǔn)備。本題目是結(jié)合科研項目而確定的設(shè)計類課題。設(shè)計的智能電動小車應(yīng)該能夠?qū)崿F(xiàn)適應(yīng)能力,能自動避障,可以智能規(guī)劃路徑。智能化作為現(xiàn)代社會的新產(chǎn)物,是以后的發(fā)展方向,他可以按照預(yù)先設(shè)定的模式在一個特定的環(huán)境里自動的運作,無需人為管理,便可以完成預(yù)期所要達到的或是更高的目標(biāo)。同遙控小車不同,遙控小車需要人為控制轉(zhuǎn)向、啟停和進退,比較先進的遙控車還能控制器速度。常見的模型小車,都屬于這類遙控車;智能小車,則可以通過計算機編程來實現(xiàn)其對行駛方向、啟停以及速度的控制,無需人工干預(yù)。操作員可以通過修改智能小車的計算機程序來改變它的行駛方向。因此,智能小車具有再編程的特性,是機器人的一種。中國自1978年把“智能模擬”作為國家科學(xué)技術(shù)發(fā)展規(guī)劃的主要研究課題,開始著力研究智能化。從概念的引進到實驗室研究的實現(xiàn),再到現(xiàn)在高端領(lǐng)域(航天航空、軍事、勘探等)的應(yīng)用,這一過程為智能化的全面發(fā)展奠定基石。智能化全面的發(fā)展是實現(xiàn)其對資源的合理充分利用,以盡可能少的投入得到最大的收益,大大提高工業(yè)生產(chǎn)的效率,實現(xiàn)現(xiàn)有工業(yè)生產(chǎn)水平從自動化向智能化升級,實現(xiàn)當(dāng)今智能化發(fā)展由高端向大眾普及。從先前的模擬電路設(shè)計,到數(shù)字電路設(shè)計,再到現(xiàn)在的集成芯片的應(yīng)用,各種能實現(xiàn)同樣功能的元件越來越小為智能化產(chǎn)物的生成奠定了良好的物質(zhì)基礎(chǔ)。智能小車,是一個集環(huán)境感知、規(guī)劃決策,自動行駛等功能于一體的綜合系統(tǒng),它集中地運用了計算機、傳感、信息、通信、導(dǎo)航、人工智能及自動控制等技術(shù),是典型的高新技術(shù)綜合體。1.2智能小車研究現(xiàn)狀智能車輛作為智能交通系統(tǒng)的關(guān)鍵技術(shù),是許多高新技術(shù)綜合集成的載體。智能車輛駕駛是一種通用性術(shù)語,指全部或部分完成一項或多項駕駛?cè)蝿?wù)的綜合車輛技術(shù)。智能車輛的一個基本特征是在一定道路條件下實現(xiàn)全部或者部分的自動駕駛功能,下面簡單介紹一下國內(nèi)外智能小車研究的發(fā)展情況。1.2.1國外智能車輛研究現(xiàn)狀國外智能車輛的研究歷史較長,始于上世紀50年代。它的發(fā)展歷程大體可以分成三個階段:第一階段20世紀50年代是智能車輛研究的初始階段。1954年美國BarrettElectronics公司研究開發(fā)了世界上第一臺自主引導(dǎo)車系統(tǒng)AGVS(AutomatedGuidedVehicleSystem)。該系統(tǒng)只是一個運行在固定線路上的拖車式運貨平臺,但它卻具有了智能車輛最基本得特征即無人駕駛。早期研制AGVS的目的是為了提高倉庫運輸?shù)淖詣踊?,?yīng)用領(lǐng)域僅局限于倉庫內(nèi)的物品運輸。隨著計算機的應(yīng)用和傳感技術(shù)的發(fā)展,智能車輛的研究不斷得到新的發(fā)展。第二階段從80年代中后期開始,世界主要發(fā)達國家對智能車輛開展了卓有成效的研究。在歐洲,普羅米修斯項目于1986年開始了在這個領(lǐng)域的探索。在美洲,美國于1995年成立了國家自動高速公路系統(tǒng)聯(lián)盟(NAHSC),其目標(biāo)之一就是研究發(fā)展智能車輛的可能性,并促進智能車輛技術(shù)進入實用化。在亞洲,日本于1996年成立了高速公路先進巡航/輔助駕駛研究會,主要目的是研究自動車輛導(dǎo)航的方法,促進日本智能車輛技術(shù)的整體進步。進入80年代中期,設(shè)計和制造智能車輛的浪潮席卷全世界,一大批世界著名的公司開始研制智能車輛平臺。第三階段從90年代開始,智能車輛進入了深入、系統(tǒng)、大規(guī)模研究階段。最為突出的是,美國卡內(nèi)基.梅隆大學(xué)(CarnegieMellonUniversity)機器人研究所一共完成了Navlab系列的10臺自主車(Navlab1—Navlab10)的研究,取得了顯著的成就。目前,智能車輛的發(fā)展正處于第三階段。這一階段的研究成果代表了當(dāng)前國外智能車輛的主要發(fā)展方向。在世界科學(xué)界和工業(yè)設(shè)計界中,眾多的研究機構(gòu)研發(fā)的智能車輛具有代表性的有:德意志聯(lián)邦大學(xué)的研究1985年,第一輛VaMoRs智能原型車輛在戶外高速公路上以100km/h的速度進行了測試,它使用了機器視覺來保證橫向和縱向的車輛控制。1988年,在都靈的PROMRTHEUS項目第一次委員會會議上,智能車輛維塔(VITA,7t)進行了展示,該車可以自動停車、行進,并可以向后車傳送相關(guān)駕駛信息。這兩種車輛都配備了UBM視覺系統(tǒng)。這是一個雙目視覺系統(tǒng),具有極高的穩(wěn)定性。荷蘭鹿特丹港口的研究智能車輛的研究主要體現(xiàn)在工廠貨物的運輸。荷蘭的Combiroad系統(tǒng),采用無人駕駛的車輛來往返運輸貨物,它行駛的路面上采用了磁性導(dǎo)航參照物,并利用一個光陣列傳感器去探測障礙。荷蘭南部目前正在討論工業(yè)上利用這種系統(tǒng)的問題,政府正考慮已有的高速公路新建一條專用的車道,采用這種系統(tǒng)將貨物從鹿特丹運往各地。日本大阪大學(xué)的研究大阪大學(xué)的Shirai實驗室所研制的智能小車,采用了航位推測系統(tǒng)(DeadReckoningSystem),分別利用旋轉(zhuǎn)編碼器和電位計來獲取智能小車的轉(zhuǎn)向角,從而完成了智能小車的定位。另外,斯特拉斯堡實驗中心、英國國防部門的研究、美國卡內(nèi)基梅隆大學(xué)、奔馳公司、美國麻省理工學(xué)院、韓國理工大學(xué)對智能車輛也有較多的研究。1.2.2國內(nèi)智能車輛研究現(xiàn)狀相比于國外,我國開展智能車輛技術(shù)方面的研究起步較晚,開始于20世紀80年代。而且大多數(shù)研究處在于針對某個單項技術(shù)研究的階段。雖然我國在智能車輛技術(shù)方面的研究總體上落后于發(fā)達國家,并且存在一定得技術(shù)差距,但是我們也取得了一系列的成果,主要有:(1)中國第一汽車集團公司和國防科技大學(xué)機電工程與自動化學(xué)院與2003年研制成功我國第一輛自主駕駛轎車。該自主駕駛轎車在正常交通情況下的高速公路上,行駛的最高穩(wěn)定速度為13km/h,最高峰值速度達170km/h,并且具有超車功能,其總體技術(shù)性能和指標(biāo)已經(jīng)達到世界先進水平。(2)南京理工大學(xué)、北京理工大學(xué)、浙江大學(xué)、國防科技大學(xué)、清華大學(xué)等多所院校聯(lián)合研制了7B.8軍用室外自主車,該車裝有彩色攝像機、激光雷達、陀螺慣導(dǎo)定位等傳感器。計算機系統(tǒng)采用兩臺Sun10完成信息融合、路徑規(guī)劃,兩臺PC486完成路邊抽取識別和激光信息處理,8098單片機完成定位計算和車輛自動駕駛。其體系結(jié)構(gòu)以水平式結(jié)構(gòu)為主,采用傳統(tǒng)的“感知-建模-規(guī)劃-執(zhí)行”算法,其直線跟蹤速度達到20km/h,避障速度達到5-10km/h。智能車輛研究也是智能交通系統(tǒng)ITS的關(guān)鍵技術(shù)。目前,國內(nèi)的許多高校和科研院所都在進行ITS關(guān)鍵技術(shù)、設(shè)備的研究。隨著ITS研究的興起,我國已形成一支ITS技術(shù)研究開發(fā)的技術(shù)專業(yè)隊伍。并且各交通、汽車企業(yè)越來越加大了對ITS及智能車輛技術(shù)研發(fā)的投入,整個社會的關(guān)注程度在不斷提高。交通部已將ITS研究列入“十五”科技發(fā)展計劃和2010年長期規(guī)劃。相信經(jīng)過相關(guān)領(lǐng)域的共同努力,我國ITS及智能車輛的技術(shù)水平一定會得到很大提高。可以預(yù)計,我國飛速發(fā)展的經(jīng)濟實力將為智能車輛的研究提供一個更加廣闊的前景。我們要結(jié)合我國國情,在某一方面或某些方面,對智能車進行深入細致的研究,為它今后的發(fā)展及實際應(yīng)用打下堅實的基礎(chǔ)。1.3主要內(nèi)容本課題要開發(fā)一個能自動循跡自動避障同時可以遙控的智能小車控制系統(tǒng),系統(tǒng)分小車和遙控器兩部分,主要以簡易智能機器人為開發(fā)平臺,選擇通用、價廉的51單片機為控制平臺,選擇常見的電機模型車為機械平臺,通過細化設(shè)計要求,結(jié)合傳感器技術(shù)和電機控制技術(shù)相關(guān)知識實現(xiàn)小車的各種功能。設(shè)計完成以由紅外線對管的自動尋跡、紅外線自動避障、重力遙控組成的硬件模塊結(jié)合軟件設(shè)計組成多功能智能小車,共同實現(xiàn)小車的前進倒退、轉(zhuǎn)向行駛,自動根據(jù)地面黑線尋跡導(dǎo)航,檢測障礙物后停止等功能,實現(xiàn)智能控制,達到設(shè)計目標(biāo)。2方案設(shè)計及論證2.1總體設(shè)計本課題設(shè)計主要是制作一款能進行智能判斷并能做出正確反應(yīng)的小車。小車具有以下幾個功能:自動避障功能;尋跡功能(按路面的黑色軌道行駛);基于重力感應(yīng)的遙控(通過傾斜方向和角度控制小車運動方向和速度)。小車端以兩直流電動機為主驅(qū)動,通過各類傳感器件來采集各類信息,送入主控單元89C52單片機處理數(shù)據(jù)后完成相應(yīng)動作,以達到自身控制。電機驅(qū)動電路采用H橋驅(qū)動模塊--雙L298步進/直流電機驅(qū)動板,能同時驅(qū)動4個直流電機和2個步進電機;避障采用漫反射式光電開關(guān)來完成,自動尋跡采用紅外發(fā)射管和接收管光電對管尋跡傳感器完成,最后由控制單元處理數(shù)據(jù)后通過編程有序合理的將各模塊信號整合在一起并完成相應(yīng)動作,實現(xiàn)了智能控制,相當(dāng)于簡易機器人。遙控端由MPU0605陀螺儀和無線模塊、按鍵模塊、LCD顯示模塊組成,通過檢測按鍵和陀螺儀數(shù)據(jù)送入89C52單片機處理后判斷用戶的指令,然后通過NRF24L01無線模塊把指令發(fā)送到小車端,同時在LCD12864顯示當(dāng)前工作模式和小車的狀態(tài).2.2主控單元方案比較與選擇按照題目要求,控制器主要用于控制電機,通過相關(guān)傳感器對路面的軌跡信息進行處理,并將處理信號傳輸給控制器,然后控制器做出相應(yīng)的處理,實現(xiàn)小車的自動循跡和自動避障。方案一:可以采用ARM為系統(tǒng)的控制器,優(yōu)點是該系統(tǒng)功能強大,片上外設(shè)集成度搞密度高,提高了穩(wěn)定性,系統(tǒng)的處理速度也很高,適合作為大規(guī)模實時系統(tǒng)的控制核心。方案二:采用AT89S52作為系統(tǒng)控制的方案。AT89S52單片機算術(shù)運算功能強,軟件編程靈活、自由度大,功耗低、體積小、技術(shù)成熟,成本也比ARM低。考慮到性價比問題,本設(shè)計選擇用AT89S52單片機做控制器。2.3電機單元方案比較與選擇方案一:采用直流電機,配合LM293驅(qū)動芯片組合。優(yōu)點在于硬件電路的設(shè)計簡單。當(dāng)外加額定直流電壓時,轉(zhuǎn)速幾乎相等。這類電機用于錄音機、錄相機、唱機或激光唱機等固定轉(zhuǎn)速的機器或設(shè)備中,也用于變速范圍很寬的驅(qū)動裝置,但容易受到外部因素干擾,影響穩(wěn)定的轉(zhuǎn)速和轉(zhuǎn)矩輸出。方案二:采用直流減速電機。直流減速電機轉(zhuǎn)動力矩大,體積小,重量輕,裝配簡單,使用方便,小車電機內(nèi)部裝有減速齒輪組,所以并不需要考慮調(diào)速功能,很方便的就可以實現(xiàn)通過單片機對直流減速電機前進、后退、停止等操作。綜合以上考慮我們選擇方案二的直流減速電機作為智能小車的驅(qū)動電機。2.4電源單元方案比較與選擇方案一:采用單電源供電,通過單電源同時對單片機和直流電機進行供電,此方案的優(yōu)點是,減少機身的重量,操作簡單,其缺點是,這樣會使單片機的波動變大,影響單片機的性能,穩(wěn)定性比較弱。方案二:采用雙電源供電,通過兩個獨立的電源分別對單片機和直流減速電機進行供電,此方案的優(yōu)點是,減少波動,穩(wěn)定性比較好,可以讓小車更好的運作起來,唯一的缺點就是會增加小車的重量。綜合以上的優(yōu)缺點,本設(shè)計決定采用第二種方案。2.5避障單元方案比較與選擇方案一:用超聲波傳感器進行避障。超聲波傳感器的原理是:超聲波由壓電陶瓷超聲波傳感器發(fā)出后,遇到障礙物便反射回來,再被超聲波傳感器接收。但使用超聲波模塊的成本比較高。因此我們考慮其它的方案,超聲波傳感器實物圖如下圖2所示:圖2超聲波傳感器方案二:用漫反射式光電開關(guān)進行避障。光電開關(guān)的工作原理是根據(jù)光線發(fā)射頭發(fā)出的光束,被物體反射,其接收電路據(jù)此做出判斷反應(yīng),物體對紅外光由同步回路選通而檢測物體的有無。當(dāng)有光線反射回來時,輸出低電平。當(dāng)沒有光線反射回來時,輸出高電平。光電開關(guān)的是物圖如下圖3所示:圖3光電開關(guān)考慮到超聲波測量的范圍寬,使用非常靈活,幫助智能小車順利繞過障礙,可以適應(yīng)十分復(fù)雜的環(huán)境,我們最終選擇了方案一。2.6尋跡單元方案比較與選擇方案一:利用尋跡來引導(dǎo)小車到達用戶所指定的地點。采用紅外發(fā)射管和接收管光電對管尋跡傳感器。紅外發(fā)射管發(fā)出紅外線,當(dāng)發(fā)出的紅外線照射到白色的平面后反射,若紅外接收管能接收到反射回的光線則檢測出白線繼而輸出低電平,若接收不到發(fā)射管發(fā)出的光線則檢測出黑線繼而輸出高電平。此方案存在的缺陷是對光線的亮度要求較高,在夜間難以正常工作。方案二:通過超聲波定位模塊來實時定位小車的位置。超聲波定位的基本原理是通過接收幾個固定位置的發(fā)射點的超聲波接收器,在小車上加入一個發(fā)射器,通過無線模塊計算各模塊接收到超聲波的時間差,通過集成模塊的內(nèi)部算法得出小車所在位置和原設(shè)定位置的偏差情況,從而得到主體到這幾個發(fā)射點的距離,實現(xiàn)了超聲波的定位,由于超聲波在空氣中的衰減較大,它只適用于較小的范圍,而且使用此方案還將面臨著在家中的超聲波各通訊線的布局,使用很不方便。經(jīng)實測發(fā)現(xiàn)方案一中的紅外對管型尋跡模塊只要給進行一定的改善,對環(huán)境的適應(yīng)能力還是比較強的例如可以在晚上行進,這樣就可以用低成本來實現(xiàn)我們你所需要的功能,所以就排除了方案二,以方案一作為小車在家庭中的行進方式。3硬件系統(tǒng)的設(shè)計3.1單片機控制模塊STC89C52是一種低功耗、高性能CMOS8位微控制器,具有8K在系統(tǒng)可編程Flash存儲器。在單芯片上,擁有靈巧的8位CPU和在線系統(tǒng)可編程Flash,使得STC89C52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。STC89C52具有以下標(biāo)準(zhǔn)功能:8k字節(jié)Flash,256字節(jié)RAM,32位I/O口線,看門狗定時器,2個數(shù)據(jù)指針,三個16位定時器/計數(shù)器,一個6向量2級中斷結(jié)構(gòu),全雙工串行口,片內(nèi)晶振及時鐘電路。另外,STC89C52可降至0Hz靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工作。掉電保護方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機一切工作停止,直到下一個中斷或硬件復(fù)位為止。如圖4是較為常見的單片機最小系統(tǒng)圖。圖4單片機最小系統(tǒng)3.1.1時鐘電路單片機的時鐘產(chǎn)生有兩種方法:內(nèi)部時鐘方式和外部時鐘方式。系統(tǒng)的時鐘電路設(shè)計是采用的內(nèi)部方式,即利用芯片內(nèi)部的振蕩電路。AT89單片機內(nèi)部有一個用于構(gòu)成振蕩器的高增益反相放大器。引腳XTAL1和XTAL2分別是此放大器的輸入端和輸出端。這個放大器與作為反饋元件的片外晶體諧振器一起構(gòu)成一個自激振蕩器。外接晶體諧振器以及電容C1和C2構(gòu)成并聯(lián)諧振電路,接在放大器的反饋回路中。對外接電容的值雖然沒有嚴格的要求,但電容的大小會影響震蕩器頻率的高低、震蕩器的穩(wěn)定性、起振的快速性和溫度的穩(wěn)定性。因此,此系統(tǒng)電路的晶體振蕩器的值為12MHz,電容應(yīng)盡可能的選擇陶瓷電容,電容值通常取30PF。在焊接刷電路板時,晶體振蕩器和電容應(yīng)盡可能安裝得與單片機芯片靠近,以減少寄生電容,更好地保證震蕩器穩(wěn)定和可靠地工作。3.1.2復(fù)位電路位是由外部的復(fù)位電路來實現(xiàn)的。片內(nèi)復(fù)位電路是復(fù)位引腳RST通過一個觸發(fā)器與復(fù)位電路相連,觸發(fā)器用來抑制噪聲,它的輸出在每個機器周期中由復(fù)位電路采樣一次。復(fù)位電路通常采用上電自動復(fù)位和按鈕復(fù)位兩種方式。所謂上電復(fù)位,是指計算機加電瞬間,要在RST引腳出現(xiàn)大于10MS的正脈沖,使單片機進入復(fù)位狀態(tài)。按鈕復(fù)位是指用戶按下“復(fù)位”按鈕,使單片機進入復(fù)位狀態(tài)。如上圖3是按鈕電平復(fù)位的一種實用電路。3.2電機驅(qū)動模塊的設(shè)計電機驅(qū)動模塊采用專用芯片L298N作為電機驅(qū)動芯片,L298N是一個具有高電壓大電流的全橋驅(qū)動芯片,其響應(yīng)頻率高,一片L298N可以分別控制兩個直流電機。圖5電機驅(qū)動原理簡圖3.2.1L298N芯片的介紹L298N是ST公司生產(chǎn)的一種高電壓、大電流電機驅(qū)動芯片。該芯片采用15腳封裝。主要特點是:工作電壓高,最高工作電壓可達46V;輸出電流大,瞬間峰值電流可達3A,持續(xù)工作電流為2A;額定功率25W。內(nèi)含兩個H橋的高電壓大電流全橋式驅(qū)動器,可以用來驅(qū)動直流電動機和步進電動機、繼電器線圈等感性負載;采用標(biāo)準(zhǔn)邏輯電平信號控制;具有兩個使能控制端,在不受輸入信號影響的情況下允許或禁止器件工作有一個邏輯電源輸入端,使內(nèi)部邏輯電路部分在低電壓下工作;可以外接檢測電阻,將變化量反饋給控制電路。使用L298N芯片驅(qū)動電機,該芯片可以驅(qū)動一臺兩相步進電機或四相步進電機,也可以驅(qū)動兩臺直流電機,實物圖及外圍電路如下圖6、7所示。圖6L298N芯片圖7L298N外圍電路接口說明如下示:+5V:芯片電壓5V。VCC:電機電壓,最大可接50V。GND:共地接法。A-~D-:輸出端,接電機。A~D+:為步進電機公共端,模塊上接了VCC。EN1、EN2:高電平有效,EN1、EN2分別為IN1和IN2、IN3和IN4的使能端。IN1~IN4:輸入端,輸入端電平和輸出端電平是對應(yīng)的。L298N的5、7、10、12四個引腳接到單片機上,通過對單片機的編程就可實現(xiàn)兩個直流電機的PWM調(diào)速控制,圖8是L298N功能邏輯圖。圖8L298N功能邏輯圖L298N可接受標(biāo)準(zhǔn)TTL邏輯電平信號VSS,VSS可接4.5~7V電壓。4腳VS接電源電壓,VS電壓范圍VIH為+2.5~46V。輸出電流可達2.5A,可驅(qū)動電感性負載。1腳和15腳下管的發(fā)射極分別單獨引出以便接入電流采樣電阻,形成電流傳感信號。L298可驅(qū)動2個電動機,OUT1,OUT2和OUT3,OUT4之間可分別接電動機,本實驗裝置我們選用驅(qū)動一臺電動機。5,7,10,12腳接輸入控制電平,控制電機的正反轉(zhuǎn)。EnA,EnB接控制使能端,控制電機的停轉(zhuǎn)。In3,In4的邏輯圖與上圖相同。由上圖可知EnA為低電平時,輸入電平對電機控制起作用,當(dāng)EnA為高電平,輸入電平為一高一低,電機正或反轉(zhuǎn)。同為低電平電機停止,同為高電平電機剎停。3.3紅外避障電路的原理與設(shè)計用漫反射式光電開關(guān)進行避障。光電開關(guān)實際發(fā)射頭與接收頭于一體的檢測開關(guān),其工作原理是根據(jù)發(fā)射頭發(fā)出的光束,被物體反射,接收頭據(jù)此做出判斷是否有障礙物。當(dāng)有光線反射回來時,輸出低電平。當(dāng)沒有光線反射回來時,輸出高電平。單片機根據(jù)接收頭電平的高低做出相應(yīng)控制,避免小車碰到障礙物。由于接收管輸出TTL電平,有利于單片機對信號的處理。小車采用漫反射式傳感器進行避障的電路原理圖如下圖9所示:圖9光電開關(guān)避障電路原理圖3.3.1光電傳感器簡介光電傳感器在機器人中有著廣泛的應(yīng)用,可以用來檢測地面明暗和顏色的變化,也可以探測有無接近的物體。光電傳感器是靠紅外發(fā)射管和紅外接收管組成的傳感器,對于小車循跡場地的黑白兩種顏色,發(fā)射管發(fā)出同樣的光強,接收管接收到的光強不同,因此輸出的電壓值也不同;給定一個基準(zhǔn)電壓,通過對不同輸出電壓值進行比較,則電路的輸出為高低電平。當(dāng)檢測到黑白線時分別輸出為高低電平,這樣不僅系統(tǒng)硬件電路簡單,而且信號處理速度快。原理如下圖10、圖11所示。圖10白色反射面下的紅外反射圖11黑色反射面下的紅外吸收紅外發(fā)射管發(fā)射的紅外線具有一定得方向性,當(dāng)紅外線照射到白色表面上時會有較大的反射,如果距離D1取值合適,紅外接收管可接收到反射回的紅外線,再利用紅外接收管的電氣特性,在電路中處理紅外線的接受信息;如果反射表面為黑色,紅外光會被表面將其大部分吸收,紅外接收管就難以收到紅外線。這樣,就可以利用紅外收發(fā)管組成的光電傳感器檢測賽道黑線,實現(xiàn)智能車的循跡方案。3.3.2比較器LM324簡介LM324為四運放集成電路,采用14腳雙列直插塑料封裝。內(nèi)部有四個運算放大器,有相位補償電路。電路功耗很小,工作電壓范圍寬,可用正電源3~30V,或正負雙電源±1.5V~±15V工作。在黑線檢測電路中用來確定紅外接收信號電平的高低,以電平高低判定黑線有無。在電路中,LM324的一個輸入端需接滑動變阻器,通過改變滑動變阻器的阻值來提供合適的比較電壓,圖12為LM324的管腳圖。圖12LM324的管教圖3.4尋跡模塊的硬件設(shè)計紅外對管循跡模塊,五路尋跡TCR5000的模塊,采用紅外發(fā)射管和接收管光電對管尋跡傳感器。紅外發(fā)射管發(fā)出紅外線,當(dāng)發(fā)出的紅外線照射到白色的平面后反射,若紅外接收管能接收到反射回的光線則檢測出白線繼而輸出低電平,若接收不到發(fā)射管發(fā)出的光線則檢測出黑線繼而輸出高電,圖13為紅外對管黑線檢測電路。 圖13紅外對管黑線檢測電路3.4.1紅外傳感器TCRT5000簡介TCRT5000光電傳感器模塊是基于TCRT5000紅外光電傳感器設(shè)計的一款紅外反射式光電開關(guān)。傳感器采用高發(fā)射功率紅外光電二極管和高靈敏度光電晶體管組成,輸出信號經(jīng)施密特電路整形,穩(wěn)定可靠。傳感器的紅外發(fā)射二極管不斷發(fā)射紅外線,當(dāng)發(fā)射出的紅外線沒有被反射回來或被反射回來但強度不夠大時,光敏三極管一直處于關(guān)斷狀態(tài),此時模塊的輸出端為低電平,指示二極管一直處于熄滅狀態(tài);被檢測物體出現(xiàn)在檢測范圍內(nèi)時,紅外線被反射回來且強度足夠大,光敏三極管飽和,此時模塊的輸出端為高電平,指示二極管被點亮。TCRT5000反射式光電傳感器是經(jīng)常使用的傳感器,這個系列的傳感器種類齊全、價格便宜、體積小、使用方便、質(zhì)量可靠、用途廣泛。此傳感器含一個反射模塊(發(fā)光二極管)和一個接收模塊(光敏三極管)。通過發(fā)射紅外信號,看接收信號變化判斷檢測物體狀態(tài)的變化,圖14為TCRT5000傳感器模塊電路原理圖,圖15為它的實物圖。圖14TCRT5000傳感器模塊電路原理圖圖15TCRT5000的實物圖基本參數(shù)如下:外形尺寸:長32mm~37mm;寬7.5mm;厚2mm工作電壓:DC3V~5.5V,推薦工作電壓為5V檢測距離:1mm~8mm適用,焦點距離為2.5mm3.5無線模塊的硬件設(shè)計 無線模塊的硬件設(shè)計采用兩塊NRF24L01模塊實時接收遙控發(fā)送的新指令.重力感應(yīng)模塊的硬件設(shè)計重力感應(yīng)模塊采用MPU-6050模塊(三軸陀螺儀

+三軸加速度)MPU-6000為全球首例整合性6軸運動處理組件,相較于多組件方案,免除了組合陀螺儀與加速器時之軸間差的問題,減少了大量的包裝空間。MPU-6000整合了3軸陀螺儀、3軸加速器,并含可藉由第二個I2C端口連接其他廠牌之加速器、磁力傳感器、或其他傳感器的數(shù)位運動處理(DMP:DigitalMotionProcessor)硬件加速引擎,由主要I2C端口以單一數(shù)據(jù)流的形式,向應(yīng)用端輸出完整的9軸融合演算技術(shù)InvenSense的運動處理資料庫,可處理運動感測的復(fù)雜數(shù)據(jù),降低了運動處理運算對操作系統(tǒng)的負荷,并為應(yīng)用開發(fā)提供架構(gòu)化的API。MPU-6000的角速度全格感測范圍為±250、±500、±1000與±2000°/sec(dps),可準(zhǔn)確追緃快速與慢速動作,并且,用戶可程式控制的加速器全格感測范圍為±2g、±4g±8g與±16g。產(chǎn)品傳輸可透過最高至400kHz的I2C或最高達20MHz的SPI。MPU-6000可在不同電壓下工作,VDD供電電壓介為2.5V±5%、3.0V±5%或3.3V±5%,邏輯接口VVDIO供電為1.8V±5%。MPU-6000的包裝尺寸4x4x0.9mm(QFN),在業(yè)界是革命性的尺寸。其他的特征包含內(nèi)建的溫度感測器、包含在運作環(huán)境中僅有±1%變動的振蕩器。應(yīng)用運動感測游戲現(xiàn)實增強電子穩(wěn)像(EIS:ElectronicImageStabilization)光學(xué)穩(wěn)像(OIS:OpticalImageStabilization)行人導(dǎo)航器“零觸控”手勢用戶接口姿勢快捷方式認證

市場智能型手機平板裝置設(shè)備手持型游戲產(chǎn)品?蝸坊?3D遙控器可攜式導(dǎo)航設(shè)備特征以數(shù)字輸出6軸或9軸的旋轉(zhuǎn)矩陣、四元數(shù)(quaternion)、歐拉角格式(EulerAngleforma)的融合演算數(shù)據(jù)。具有131LSBs/°/sec敏感度與全格感測范圍為±250、±500、±1000與±2000°/sec的3軸角速度感測器(陀螺儀)??沙淌娇刂?,且程式控制范圍為±2g、±4g、±8g和±16g的3軸加速器。移除加速器與陀螺儀軸間敏感度,降低設(shè)定給予的影響與感測器的飄移。數(shù)字運動處理(DMP:DigitalMotionProcessing)引擎可減少復(fù)雜的融合演算數(shù)據(jù)、感測器同步化、姿勢感應(yīng)等的負荷。運動處理數(shù)據(jù)庫支持Android、Linux與Windows內(nèi)建之運作時間偏差與磁力感測器校正演算技術(shù),免除了客戶須另外進行校正的需求。以數(shù)位輸出的溫度傳感器以數(shù)位輸入的同步引腳(Syncpin)支援視頻電子影相穩(wěn)定技術(shù)與GPS可程式控制的中斷(interrupt)支援姿勢識別、搖攝、畫面放大縮小、滾動、快速下降中斷、high-G中斷、零動作感應(yīng)、觸擊感應(yīng)、搖動感應(yīng)功能。VDD供電電壓為2.5V±5%、3.0V±5%、3.3V±5%;VDDIO為1.8V±5%陀螺儀運作電流:5mA,陀螺儀待命電流:5μA;加速器運作電流:350μA,加速器省電模式電流:20μA@10Hz高達400kHz快速模式的I2C,或最高至20MHz的SPI串行主機接口(serialhostinterface)內(nèi)建頻率產(chǎn)生器在所有溫度范圍(fulltemperaturerange)僅有±1%頻率變化。使用者親自測試10,000g碰撞容忍度為可攜式產(chǎn)品量身訂作的最小最薄包裝(4x4x0.9mmQFN)符合RoHS及環(huán)境標(biāo)準(zhǔn)6效果圖 6軟件設(shè)計4.1編譯語言的選取目前,STC89C52單片機的開發(fā)多為支持兩種語言,一種是匯編語言,另一種是C語言,而這兩種語言各有其優(yōu)缺點。匯編語言:效率高,對硬件的可操控性更強,體積小,但不易維護,可移植性很差。C語言:效率比較低,硬件可操控性比較差,目標(biāo)代碼體積大,但容易維護,可移植性很好。而在本設(shè)計里面,程序需要接近底層,但程序要解決的問題繁多,邏輯關(guān)系也比較復(fù)雜,代碼量也比較大,又考慮到產(chǎn)品以后需要升級,各方面綜合考慮,主要以C51語言來編寫本設(shè)計的程序是最佳選擇。4.2軟件調(diào)試平臺KeilforC51是美國KeilSoftware公司出品的C語言軟件開發(fā)系統(tǒng),與匯編相比,C語言在功能上、結(jié)構(gòu)性、可讀性、可維護性上有明顯的優(yōu)勢,因而易學(xué)易用。KeilC51軟件提供豐富的庫函數(shù)和功能強大的集成開發(fā)調(diào)試工具,全Windows界面。另外重要的一點,只要看一下編譯后生成的匯編代碼,就能體會到KeilforC51生成的目標(biāo)代碼效率非常之高,多數(shù)語句生成的匯編代碼很緊湊,容易理解。在開發(fā)大型軟件時更能體現(xiàn)高級語言的優(yōu)勢。下面詳細介紹KeilforC51開發(fā)系統(tǒng)各部分功能和使用。C51開發(fā)中除必要的硬件外,同樣離不開軟件,我們寫的源程序要變?yōu)镃51可以執(zhí)行的機器碼有兩種方法,一種是手工匯編,另一種是機器匯編,目前已極少使用手工匯編的方法了。隨著C51開發(fā)技術(shù)的不斷發(fā)展,從普遍使用匯編語言到逐漸使用高級語言開發(fā),單片機的開發(fā)軟件也在不斷發(fā)展,Keil軟件除了致力于單片機的編程開發(fā)平臺外,還針對目前最流行C51開發(fā)項目出品了Keilfor51軟件平臺以及支持在線調(diào)試的串口燒寫。從近年來各仿真機廠商紛紛宣布全面支持Keil即可看出。Keil提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個集成開發(fā)環(huán)境(uVision2)將這些部份組合在一起。小車端程序文件一main.c#include<reg52.h>#include<intrins.h>#include"..\header\init.h"#include"..\header\NRF24L01.h"voidR_S_Byte(ucharR_Byte){ SBUF=R_Byte;while(TI==0); //查詢法 TI=0;}/**********定時器初始化程序***************/voidT0T1_init(){ EA=1; ET1=1; ET0=1;TMOD=0x11;//定時器0負責(zé)小車速度控制定時器1負責(zé)超聲波測距和舵機控制 TH0=(65536-500)/256;TL0=(65536-500)%256; TH1=(65536-500)/256; TL1=(65536-500)%256; TL1=0; TH1=0; TR0=1; TR1=1; }voidStartModule(void)//超聲波測距子函數(shù){ TX=1; //啟動一次模塊 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TX=0; }voidConut(void)//通過超聲波測量的數(shù)據(jù)計算距離{ if(csflag==0) { time=TH1*256+TL1; TH1=0; TL1=0; S=(time*1.7)/10;//算出來是mm //if(S>499); } else { csflag=0; S=600;//如果定時器溢出則距離S=600 } if(jd==3){middleS=S;}//測量正前方 elseif(jd==2) {leftS=S;}//測量左前方 elseif(jd==4){rightS=S;}//測量右前方}/**********************接收遙控器的狀態(tài)標(biāo)志**********************/voidRX_STATE(void){ ucharRxBuf[4]; ucharSIGN=0;if(nRF24L01_RxPacket(RxBuf))//如果收到遙控器的數(shù)據(jù)則進入 { led2=~led2; R_S_Byte(RxBuf[0]); SIGN=RxBuf[2];//判斷傾斜的方向X_SIAN=0:前方X_SIAN=1:下方 STATE=RxBuf[3]; LED_FLAG=(SIGN&0x04)>>2;//判斷小車燈光控制位 CONTROL_MODE_FLAG=(STATE&0xf0)>>4;//讀取當(dāng)前狀態(tài)標(biāo)志 if(LED_FLAG)LED1=1; elseif(LED_FLAG==0)LED1=0; }}voiddelay_RX(uintz)//避障模式下當(dāng)出現(xiàn)while循環(huán)時用的延時函數(shù),{ uintx,y; for(x=110;x>0;x--) { for(y=z;y>0;y--); RX_STATE();//掃描無線模塊接收到的新指令 }}voidmeasured(unsignedcharfs)//測距函數(shù)jd=3測量正前方j(luò)d=2測量左前方j(luò)d=4測量右前方{ TH1=(65536-500)/256; TL1=(65536-500)%256;//12MZ晶振,0.5ms mode=0; jd=fs; count2=0; TR1=1; delay_RX(500); TR1=0; mode=1; TH1=0; TL1=0; StartModule(); while(!RX); //當(dāng)RX為零時等待 TR1=1; //開啟計數(shù) while(RX); //當(dāng)RX為1計數(shù)并等待 TR1=0; //關(guān)閉計數(shù) Conut();}/********************避障模式子函數(shù)***********************/voidcsbmode(void){ unsignedchartemp; TR1=0; mode=1; TH1=0; TL1=0; StartModule(); while(!RX); //當(dāng)RX為零時等待 TR1=1; //開啟計數(shù) while(RX); //當(dāng)RX為1計數(shù)并等待 TR1=0; //關(guān)閉計數(shù) Conut();//測量前方距離 delay_RX(80); speed1=16;speed2=16; while(middleS>500&&CONTROL_MODE_FLAG==3) //當(dāng)前方空間大于300mm時保持 { IN1_1=0;IN1_2=1;IN2_1=0;IN2_2=1;//小車前進 TR1=0; mode=1; TH1=0; TL1=0; StartModule(); while(!RX); //當(dāng)RX為零時等待 TR1=1; //開啟計數(shù) while(RX); //當(dāng)RX為1計數(shù)并等待 TR1=0; //關(guān)閉計數(shù) Conut(); delay_RX(2); } IN1_1=0;IN1_2=0;IN2_1=0;IN2_2=0;//小車停止 speed1=0;speed2=0; measured(2); measured(4); TH1=(65536-500)/256; //舵機復(fù)位 TL1=(65536-500)%256;//12MZ晶振,0.5ms mode=0; jd=3; count2=0; TR1=1; delay_RX(500); TR1=0; if(leftS<250||rightS<250) { temp=middleS; speed1=20;speed2=20; IN1_1=1;IN1_2=0;IN2_1=1;IN2_2=0;//小車后退 while((middleS-temp)<200&&CONTROL_MODE_FLAG==3) { speed1=20;speed2=20; delay_RX(2); TR1=0; mode=1; TH1=0; TL1=0; StartModule(); while(!RX); //當(dāng)RX為零時等待 TR1=1; //開啟計數(shù) while(RX); //當(dāng)RX為1計數(shù)并等待 TR1=0; //關(guān)閉計數(shù) Conut(); } speed1=20;speed2=20; if(leftS<rightS) { IN1_1=1;IN1_2=0;IN2_1=0;IN2_2=1;} else { IN1_1=0;IN1_2=1;IN2_1=1;IN2_2=0;} delay_RX(500); speed1=0;speed2=0; IN1_1=0;IN1_2=0;IN2_1=0;IN2_2=0;//小車停止 measured(2); measured(4); TH1=(65536-500)/256; //舵機復(fù)位 TL1=(65536-500)%256;//12MZ晶振,0.5ms mode=0; jd=3; count2=0; TR1=1; delay_RX(500); TR1=0; } if(leftS<rightS) { speed1=0;speed2=0; IN1_1=1;IN1_2=0;IN2_1=0;IN2_2=1; while(middleS<600&&CONTROL_MODE_FLAG==3) { speed1=17;speed2=17; delay_RX(5); TR1=0; mode=1; TH1=0; TL1=0; StartModule(); while(!RX); //當(dāng)RX為零時等待 TR1=1; //開啟計數(shù) while(RX); //當(dāng)RX為1計數(shù)并等待 TR1=0; //關(guān)閉計數(shù) Conut(); } } else { speed1=0;speed2=0; IN1_1=0;IN1_2=1;IN2_1=1;IN2_2=0;//小車左轉(zhuǎn) while(middleS<600&&CONTROL_MODE_FLAG==3) { speed1=17;speed2=17; delay_RX(5); TR1=0; mode=1; TH1=0; TL1=0; StartModule(); while(!RX); //當(dāng)RX為零時等待 TR1=1; //開啟計數(shù) while(RX); //當(dāng)RX為1計數(shù)并等待 TR1=0; //關(guān)閉計數(shù) Conut(); } }}/*****************循跡模式子函數(shù)*********************/voidxunji(void){ IN1_1=0;IN1_2=1;IN2_1=0;IN2_2=1;speed1=20;speed2=20; //小車前進 while(irL2==0&&irR2==0&&CONTROL_MODE_FLAG==2) RX_STATE(); if(irL2==1) { IN1_1=0;IN1_2=1;IN2_1=1;IN2_2=0;speed1=18;speed2=18; //小車右轉(zhuǎn) while(irL1==0&&CONTROL_MODE_FLAG==2) RX_STATE(); } elseif(irR2==1) { IN1_1=1;IN1_2=0;IN2_1=0;IN2_2=1;speed1=18;speed2=18; //小車左轉(zhuǎn) while(irR1==0&&CONTROL_MODE_FLAG==2) RX_STATE(); }}/******************************************/voidmain(void){ ucharRxBuf[4];// ucharbb=0; intX_ANGLE; intY_ANGLE;// ucharX_SIGN; ucharY_SIGN; ucharSIGN=0; bitFLAG_ANGLE=0;init_RX(); delay(100); T0T1_init(); jd=3; count2=0; mode=0; while(1) { switch(CONTROL_MODE_FLAG) { case0: //按鍵模式 IN1_1=0;IN1_2=0;IN2_1=0;IN2_2=0; //小車停止 while(CONTROL_MODE_FLAG==0) { RX_STATE(); KEY_VALUE=STATE&0x0f;//讀取鍵值 switch(KEY_VALUE) { case0x0e:IN1_1=1;IN1_2=0;IN2_1=1;IN2_2=0;speed1=20;speed2=20; break; case0x07:IN1_1=0;IN1_2=1;IN2_1=0;IN2_2=1;speed1=20;speed2=20; break; case0x0d:IN1_1=1;IN1_2=0;IN2_1=0;IN2_2=1;speed1=17;speed2=17; break; case0x0b:IN1_1=0;IN1_2=1;IN2_1=1;IN2_2=0;speed1=17;speed2=17; break; default:IN1_1=0;IN1_2=0;IN2_1=0;IN2_2=0;speed1=0;speed2=0; //小車停止 break; } } IN1_1=0;IN1_2=0;IN2_1=0;IN2_2=0; //小車停止 break; case1: //重力模式 jd=3; mode=0; delay(500); while(CONTROL_MODE_FLAG==1) { TR1=0; mode=1; TH1=0; TL1=0; StartModule(); while(!RX); //當(dāng)RX為零時等待 TR1=1; //開啟計數(shù) while(RX); //當(dāng)RX為1計數(shù)并等待 TR1=0; //關(guān)閉計數(shù) Conut(); if(nRF24L01_RxPacket(RxBuf))//如果收到遙控器的數(shù)據(jù)則進入 { led2=~led2; R_S_Byte(RxBuf[0]); X_ANGLE=RxBuf[0];//讀取縱向的傾斜度 Y_ANGLE=RxBuf[1];//讀取橫向的傾斜度 SIGN=RxBuf[2];//判斷傾斜的方向X_SIAN=0:前方X_SIAN=1:下方 STATE=RxBuf[3];//判斷傾斜的方向Y_SIAN=0:左方X_SIAN=1:右方 LED_FLAG=(SIGN&0x04)>>2;//判斷小車燈光控制位 CONTROL_MODE_FLAG=(STATE&0xf0)>>4;//讀取當(dāng)前狀態(tài)標(biāo)志 KEY_VALUE=STATE&0x0f;//讀取鍵值 if(LED_FLAG)LED1=1; elseif(LED_FLAG==0)LED1=0; X_SIGN=SIGN&0x01; Y_SIGN=(SIGN&0x02)>>1; if(X_ANGLE>110)X_ANGLE=105;//全速時:if(X_ANGLE>160)X_ANGLE=155; if(Y_ANGLE>110)Y_ANGLE=110;//全速時:if(X_ANGLE>160)X_ANGLE=160; if(Y_ANGLE-X_ANGLE<30)//如果主要是往縱向傾斜則進入 { FLAG_ANGLE=1; if(Y_SIGN)//同時也往左方傾斜 {speed1=40-X_ANGLE/4;speed2=40-(X_ANGLE/4-Y_ANGLE/4);}//左輪 elseif(Y_SIGN==0) {speed1=40-(X_ANGLE/4-Y_ANGLE/4);speed2=40-X_ANGLE/4;} } else { speed1=40-Y_ANGLE/4;speed2=40-Y_ANGLE/4; } if(X_SIGN)X_ANGLE=-X_ANGLE; if(Y_SIGN)Y_ANGLE=-Y_ANGLE; if(FLAG_ANGLE) { FLAG_ANGLE=0; if(X_ANGLE>20){IN1_1=1;IN1_2=0;IN2_1=1;IN2_2=0;} //小車前進 elseif(X_ANGLE<-20&&middleS>200){IN1_1=0;IN1_2=1;IN2_1=0;IN2_2=1;} //小車后退 else { IN1_1=0;IN1_2=0;IN2_1=0;IN2_2=0; //小車停止 } } else { if(Y_ANGLE>20){IN1_1=1;IN1_2=0;IN2_1=0;IN2_2=1;} //小車左轉(zhuǎn) elseif(Y_ANGLE<-20){IN1_1=0;IN1_2=1;IN2_1=1;IN2_2=0;} //小車右轉(zhuǎn) else { IN1_1=0;IN1_2=0;IN2_1=0;IN2_2=0;; //小車停止 } } } } break; case2: // speed1=15; // speed2=15; while(CONTROL_MODE_FLAG==2) { xunji(); } IN1_1=0;IN1_2=0;IN2_1=0;IN2_2=0; //小車停止 break; case3: // TR0=0; while(CONTROL_MODE_FLAG==3) { csbmode(); } // TR0=1; IN1_1=0;IN1_2=0;IN2_1=0;IN2_2=0; //小車停止 break; } } }//定時器中斷voidzhongduan(void)interrupt1{ TH0=(65536-500)/256; TL0=(65536-500)%256; aa++; if(aa==100) { led0=~led0; aa=0;t0++; }/******************************************///大于則輸出低電平/******************************************/ if(count<speed1)// EN1=0;//確實小于,PWM輸出高電平 else EN1=1;//大于則輸出低電平 if(count<speed2)// EN2=0;//確實小于,PWM輸出高電平 else EN2=1;//大于則輸出低電平/*******************************************/ count=(count+1);//0.5ms次數(shù)加1 count=count%40;//次數(shù)始終保持為40即保持周期為20ms }voidzhongduan_0(void)interrupt3//定時器工作在舵機控制模式{ if(mode==0) { TH1=(65536-500)/256; TL1=(65536-500)%256; if(count2<jd)//判斷0.5ms次數(shù)是否小于角度標(biāo)識 pwm=0;//確實小于,PWM輸出高電平 else pwm=1;//大于則輸出低電平 count2=(count2+1);//0.5ms次數(shù)加1 count2=count2%40;//次數(shù)始終保持為40即保持周期為20ms } elseif(mode==1)//定時器工作在超聲波測距模式 { //flag=1; //中斷溢出標(biāo)志 csflag=1; StartModule(); }}文件二<init.h>typedefunsignedcharuchar;typedefunsignedcharuint;uchart0;ucharaa;unsignedcharcount;//0.5ms次數(shù)標(biāo)識unsignedcharcount2;//0.5ms次數(shù)標(biāo)識unsignedcharspeed1;unsignedcharspeed2;unsignedintGS;//脈沖個數(shù)unsignedcharGS_H;//脈沖個數(shù)高8位unsignedcharGS_L;//脈沖個數(shù)低8位//#defineL15//#defineS20sbitled0=P2^6;sbitled2=P2^7;//sbitled3=P2^5;//sbitled4=P2^4;ucharSTATE=0;//小車狀態(tài)ucharKEY_VALUE=0;//鍵值sbitLED1=P1^0;//小車燈光控制位ucharLED_FLAG=0;//小車燈光標(biāo)志0:關(guān)閉1:開啟ucharCONTROL_MODE_FLAG=0;//控制模式標(biāo)志0:按鍵模式1:重力模式2:循跡模式3:避障模式 ucharSFLAG=1;bitmode=0;//定時器工作狀態(tài)標(biāo)志。0:舵機控制1:超聲波測距sbitIN1_1=P2^1;sbitIN1_2=P2^0;sbitEN1=P2^2;sbitIN2_1=P2^4;sbitIN2_2=P2^3;sbitEN2=P2^5;//sbitMP1=P2^6;//sbitMP2=P2^7;sbitirL1=P1^1;sbitirL2=P1^2;sbitirR1=P3^2;sbitirR2=P3^3;sbit CE =P3^6;sbit CSN =P1^7;sbit SCK =P1^6;sbit MOSI =P3^4;sbit MISO =P3^5;sbit IRQ =P3^7;sbitpwm=P1^5;//P舵機WM信號輸出sbitTX=P1^4;sbitRX=P1^3;unsignedcharjd; //角度標(biāo)識unsignedintS;unsignedinttime;unsignedintleftS,middleS,rightS;bitcsflag=0;//超聲波測距接收超時標(biāo)志1:表示沒有接收到超聲返回信號//*********************************************NRF24L01*************************************ucharTxBuf2[4]={0,0,0,0};//ucharRxBuf[5];#defineTX_ADR_WIDTH5 //5uintsTXaddresswidth#defineRX_ADR_WIDTH5 //5uintsRXaddresswidth#defineTX_PLOAD_WIDTH10 //20uintsTXpayload#defineRX_PLOAD_WIDTH10 //20uintsTXpayloaduintconstTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //本地地址uintconstRX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //接收地址//***************************************NRF24L01寄存器指令*******************************************************#defineREAD_REG0x00 //讀寄存器指令#defineWRITE_REG0x20 //寫寄存器指令#defineRD_RX_PLOAD0x61 //讀取接收數(shù)據(jù)指令#defineWR_TX_PLOAD0xA0 //寫待發(fā)數(shù)據(jù)指令#defineFLUSH_TX0xE1 //沖洗發(fā)送FIFO指令#defineFLUSH_RX0xE2 //沖洗接收FIFO指令#defineREUSE_TX_PL0xE3 //定義重復(fù)裝載數(shù)據(jù)指令#defineNOP0xFF //保留//*************************************SPI(nRF24L01)寄存器地址****************************************************#defineCONFIG0x00//配置收發(fā)狀態(tài),CRC校驗?zāi)J揭约笆瞻l(fā)狀態(tài)響應(yīng)方式#defineEN_AA0x01//自動應(yīng)答功能設(shè)置#defineEN_RXADDR0x02//可用信道設(shè)置#defineSETUP_AW0x03//收發(fā)地址寬度設(shè)置#defineSETUP_RETR0x04//自動重發(fā)功能設(shè)置#defineRF_CH0x05//工作頻率設(shè)置#defineRF_SETUP0x06//發(fā)射速率、功耗功能設(shè)置#defineSTATUS0x07//狀態(tài)寄存器#defineOBSERVE_TX0x08//發(fā)送監(jiān)測功能#defineCD0x09//地址檢測#defineRX_ADDR_P00x0A//頻道0接收數(shù)據(jù)地址#defineRX_ADDR_P10x0B//頻道1接收數(shù)據(jù)地址#defineRX_ADDR_P20x0C//頻道2接收數(shù)據(jù)地址#defineRX_ADDR_P30x0D//頻道3接收數(shù)據(jù)地址#defineRX_ADDR_P40x0E//頻道4接收數(shù)據(jù)地址#defineRX_ADDR_P50x0F//頻道5接收數(shù)據(jù)地址#defineTX_ADDR0x10//發(fā)送地址寄存器#defineRX_PW_P00x11//接收頻道0接收數(shù)據(jù)長度#defineRX_PW_P10x12//接收頻道0接收數(shù)據(jù)長度#defineRX_PW_P20x13//接收頻道0接收數(shù)據(jù)長度#defineRX_PW_P30x14//接收頻道0接收數(shù)據(jù)長度#defineRX_PW_P40x15//接收頻道0接收數(shù)據(jù)長度#defineRX_PW_P50x16//接收頻道0接收數(shù)據(jù)長度#defineFIFO_STATUS0x17//FIFO棧入棧出狀態(tài)寄存器設(shè)置//**************************************************************************************voidDelay(unsignedints);voidinerDelay_us(unsignedcharn);voidinit_NRF24L01(void);uintSPI_RW(uintuchar);ucharSPI_Read(ucharreg);uintSPI_RW_Reg(ucharreg,ucharvalue);uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars);uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars);unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf);voiddelay(uintz){ uintx,y; for(x=110;x>0;x--) for(y=z;y>0;y--);} uint bdatasta;//狀態(tài)標(biāo)志sbit RX_DR =sta^6;sbit TX_DS =sta^5;sbit MAX_RT =sta^4;voidinerDelay_us(unsignedcharn){ for(;n>0;n--) _nop_();}文件三<NRF24L01.h>voidinit_RX(void){inerDelay_us(100); CE=0;//chipenable CSN=1;//Spidisable SCK=0; SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);//SetPWR_UPbit,enableCRC(2bytes)& SPI_RW_Reg(WRITE_REG+EN_AA,0x01); SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);//EnablePipe0 SPI_RW_Reg(WRITE_REG+SETUP_AW,0x02);//Setupaddresswidth=5bytes SPI_RW_Reg(WRITE_REG+SETUP_RETR,0x1a);//500us+86us,10retrans... SPI_RW_Reg(WRITE_REG+RF_CH,0); SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);//TX_PWR:0dBm,Datarate:1Mbps, SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH); SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//CE=1;//}uintSPI_RW(uintuchar){ uintbit_ctr; for(bit_ctr=0;bit_ctr<8;bit_ctr++)//output8-bit { MOSI=(uchar&0x80);//output'uchar',MSBtoMOSI uchar=(uchar<<1);//shiftnextbitintoMSB.. SCK=1;//SetSCKhigh.. uchar|=MISO; //capturecurrentMISObit SCK=0; //..thensetSCKlowagain }return(uchar); //returnreaduchar}ucharSPI_Read(ucharreg){ ucharreg_val; CSN=0;//CSNlow,initializeSPIcommunication... SPI_RW(reg);//Selectregistertoreadfrom.. reg_val=SPI_RW(0);//..thenreadregistervalue CSN=1;//CSNhigh,terminateSPIcommunication return(reg_val);//returnregistervalue}uintSPI_RW_Reg(ucharreg,ucharvalue){ uintstatus; CSN=0;//CSNlow,initSPItransaction status=SPI_RW(reg);//selectregister SPI_RW(value);//..andwritevaluetoit.. CSN=1;//CSNhighagain return(status);//returnnRF24L01statusuchar}uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars){ uintstatus,uchar_ctr; CSN=0; //SetCSNlow,initSPItranaction status=SPI_RW(reg); //Selectregistertowritetoandreadstatusuchar for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++) pBuf[uchar_ctr]=SPI_RW(0);// CSN=1; return(status);//returnnRF24L01statusuchar}uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars){ uintstatus,uchar_ctr; CSN=0;//SPI使能 status=SPI_RW(reg); for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)// SPI_RW(*pBuf++); CSN=1;//關(guān)閉SPI return(status);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論