版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第42頁(yè)共43頁(yè)P(yáng)AGEPAGE42摘要STC89C52單片機(jī)是一款八位單片機(jī),他的易用性和多功能性受到了廣大使用者的好評(píng)。本文提出一種智能避障,循跡小車的設(shè)計(jì)方法,利用紅外技術(shù)檢測(cè)障礙物,軌跡信息,采用STC89C52單片機(jī)進(jìn)行實(shí)時(shí)控制,實(shí)現(xiàn)智能避障,循跡。再利用無線通信實(shí)現(xiàn)上位機(jī)與下位機(jī)的通信,智能小車采用前輪驅(qū)動(dòng),兩輪各用一個(gè)直流電機(jī)控制,避障,循跡用的傳感器采用紅外反射式傳感器。整個(gè)系統(tǒng)的電路結(jié)構(gòu)簡(jiǎn)單,可靠性能較高。實(shí)驗(yàn)測(cè)試結(jié)果滿足要求,本文著重介紹了該系統(tǒng)的硬件設(shè)計(jì)方法及程序設(shè)計(jì)。采用的技術(shù)主要有:PWM調(diào)速;紅外傳感器;無線通信及串口通信;上位機(jī).LCD超聲波傳感器關(guān)鍵詞:紅外;PWM;上位機(jī);循跡;避障;無線通信;串口通信;MCUAbstractThesingle-chipmicrocontrollerSTC89C52isaneight-bitmicrocontroller,itseaseofusingandversatilityreceivepraisesfromthemajorityofusers.Thispaperpresentsadesigningmethodofatrackingcarthatcanbeintelligentobstacleavoidance,withinfraredtechnologytodetectobstaclesandtheinformationoftrack.Real-timecontrolofthemicrocontrollerofSTC89C52performsintelligentobstacleavoidanceandtracking.Reusewireless.keywords:infrared;PWM;thehostcomputer;tracking;obstacleavoidance;radiocommunication;serialcommunication;MCU目錄摘要0前言2功能概述3硬件設(shè)計(jì)3避障電路3循跡電路5單片機(jī)電路7電機(jī)轉(zhuǎn)速控制電路8電源電路8電機(jī)驅(qū)動(dòng)電路9通信系統(tǒng)11測(cè)速模塊兒15上位機(jī)設(shè)計(jì)16附錄一17附錄二20小結(jié)42參考文獻(xiàn)42前言隨著生產(chǎn)自動(dòng)化的發(fā)展需要,機(jī)器人已經(jīng)越來越廣泛地應(yīng)用到生產(chǎn)自動(dòng)化上,隨著科學(xué)技術(shù)的發(fā)展,機(jī)器人的傳感器種類也越來越多,其中紅外傳感器已經(jīng)成為自動(dòng)行走和駕駛的重要部件。紅外的典型應(yīng)用領(lǐng)域?yàn)樽灾魇街悄軐?dǎo)航系統(tǒng),機(jī)器人要實(shí)現(xiàn)自動(dòng)避障功能就必須要感知障礙物,感知障礙物相當(dāng)給機(jī)器人一個(gè)視覺功能。智能避障是基于紅外傳感系統(tǒng),采用紅外傳感器實(shí)現(xiàn)前方障礙物檢測(cè),并判斷障礙物遠(yuǎn)近。而利用紅外對(duì)不同顏色物體反射強(qiáng)弱差別可以檢測(cè)到不同顏色的物體,從而實(shí)現(xiàn)循跡功能。由于時(shí)間和水平有限,我們暫選最基本的避障,循跡功能作為此次設(shè)計(jì)的目標(biāo)。目前,在自動(dòng)控制領(lǐng)域中,經(jīng)常要實(shí)現(xiàn)上位機(jī)和下位機(jī)的通信。有時(shí)甚至要求上位機(jī)和多臺(tái)下位機(jī)建立通信。因此人們常常將工控機(jī)和PC機(jī)結(jié)合起來構(gòu)成主從式控制系統(tǒng)。在這過程中,上位機(jī)主要負(fù)責(zé)人機(jī)接口管理和系統(tǒng)資源的高層控制。下位機(jī)主要完成數(shù)據(jù)采集、處理、接收,本次我們基于串口通信和VB通過NRF24L01設(shè)計(jì)了一個(gè)上位機(jī)下位機(jī)無線通信的系統(tǒng)。本設(shè)計(jì)通過小車這個(gè)載體再結(jié)合由STC89C52為核心的控制板可以達(dá)到其基本功能,再輔加由反射式光電開關(guān)E18-D80NK組成的避障電路,由TCRT5000光電對(duì)管和LM324設(shè)計(jì)的循跡電路,基于PWM技術(shù)的轉(zhuǎn)速控制、基于LM2940電源電路、基于L298N的電機(jī)驅(qū)動(dòng)電路以及基于NRF24L01的無線通信系統(tǒng)就可以完成整個(gè)硬件一.功能概述智能小車采用前輪驅(qū)動(dòng),前輪左右兩邊各用一個(gè)電機(jī)驅(qū)動(dòng),分別控制兩個(gè)輪子的轉(zhuǎn)動(dòng)從而達(dá)到轉(zhuǎn)向的目的,后輪是萬向輪,起支撐的作用。避障部分,將3個(gè)紅外線光電傳感器分別裝在車體的左中右,當(dāng)車的左邊的傳感器檢測(cè)到障礙物時(shí),主控芯片控制右輪電機(jī)停止左輪轉(zhuǎn)動(dòng),車向右方轉(zhuǎn)向,當(dāng)車的右邊傳感器檢測(cè)到障礙物時(shí),主控芯片控制左輪電機(jī)停止轉(zhuǎn)動(dòng),車向左方轉(zhuǎn)向,當(dāng)前面有障礙物時(shí)規(guī)定車右轉(zhuǎn)。而當(dāng)小車同時(shí)有兩個(gè)傳感器接收到信號(hào)時(shí),采用倒退方式轉(zhuǎn)彎以避免碰到障礙物,于此同時(shí)測(cè)定速度并顯示,在避障小車前進(jìn)的同時(shí),通過無線通信系統(tǒng),把小車的速度和路程傳到上位機(jī)顯示。循跡部分,采用七個(gè)紅外傳感器置于車身前下方,中間五個(gè)主要用于循跡普通道路,外邊兩個(gè)略比中間的靠前,主要用來檢測(cè)直角彎道。車向左偏時(shí)右拐,右偏時(shí)左拐,左右拐又分為校正和轉(zhuǎn)彎兩檔。遇到直角時(shí)極易沖出跑道,故給車施加一個(gè)反向脈沖。行駛過程中上位機(jī)顯示車速及路程。二.硬件設(shè)計(jì)如下圖所示,是本次設(shè)計(jì)智能小車的電路框圖。以STC89C52為電路的中央處理器,來處理傳感器采集來的數(shù)據(jù),處理完畢之后以便去控制電機(jī)驅(qū)動(dòng)電路來驅(qū)動(dòng)電機(jī),并通過無線傳輸?shù)缴衔粰C(jī)三.避障電路1.
障礙物探測(cè)方案的選擇
方案一:脈沖調(diào)制的反射式紅外線發(fā)射接受器。由于采用該有交流分量的調(diào)制信號(hào),則可大幅度減少外界干擾;另外紅外線接受官的最大工作電流取決于平均電流。如果采用占空比小的調(diào)制信號(hào),再品均電流不變的情況下,順勢(shì)電流很大(50—100mA),則大大提高了信噪比。并且其反應(yīng)靈敏,外圍電路也很簡(jiǎn)單。它的優(yōu)點(diǎn)是消除了外界光線的干擾提高了靈敏度。方案二:采用超聲波傳感器,如果傳感器接收到反射的超聲波,則通知單片機(jī)前方有障礙物,如則通知單片機(jī)可以向前行駛。市場(chǎng)上很多紅外光電探頭也都是基于這個(gè)原理。這樣不但能準(zhǔn)確完成測(cè)量,而且能避免電路的復(fù)雜性
由以上兩種方案比較可知。方案一要比方案二優(yōu)勢(shì)大,市場(chǎng)上很多紅外觀點(diǎn)探頭也都基于這個(gè)原理。其電路簡(jiǎn)單,工作可靠,性能比較穩(wěn)定。從而避免了電路的復(fù)雜性,因此我先用方案二作為小車的監(jiān)測(cè)系統(tǒng)。避障電路采用漫反射式光電開關(guān)進(jìn)行避障。光電開關(guān)是集發(fā)射頭和接收頭于一體的檢測(cè)開關(guān),其工作原理是根據(jù)發(fā)射頭發(fā)出的光束,被障礙物反射,接收頭據(jù)此做出判斷是否有障礙物。當(dāng)有光線反射回來時(shí),輸出低電平;當(dāng)沒有光線反射回來時(shí),輸出高電平。單片機(jī)根據(jù)接收頭電平的高低做出相應(yīng)控制,避免小車碰到障礙物,由于接收管輸出TTL電平,有利于單片機(jī)對(duì)信號(hào)的處理。2.光電開關(guān)工作原理:光電開關(guān)是通過把光強(qiáng)度的變化轉(zhuǎn)換成電信號(hào)的變化來實(shí)現(xiàn)控制的。光電開關(guān)在一般情況下,有三部分構(gòu)成,它們分為:發(fā)送器、接收器和檢測(cè)電路。避障電路功能表:傳感器避障電路輸出(上升沿動(dòng)作)待執(zhí)行命令左中右左轉(zhuǎn)信號(hào)(P2.1)右轉(zhuǎn)信號(hào)(P2.0)000√后右轉(zhuǎn)001√右轉(zhuǎn)010√右轉(zhuǎn)011√右轉(zhuǎn)100√左轉(zhuǎn)101√右轉(zhuǎn)110√左轉(zhuǎn)111前進(jìn)注解(“0”表示有障礙物;“1”表示無障礙物)四.循跡模塊 TCRT5000傳感器小車循跡原理是小車在畫有黑線的白紙“路面”上行駛,由于黑線和白紙對(duì)光線的反射系數(shù)不同,可根據(jù)接收到的反射光的強(qiáng)弱來判斷“道路”—黑線。筆者在該模塊中利用了簡(jiǎn)單、應(yīng)用也比較普遍的檢測(cè)方法——紅外探測(cè)法。
紅外探測(cè)法,即利用紅外線在不同顏色的物理表面具有不同的反射性質(zhì)的特點(diǎn)。在小車行駛過程中不斷地向地面發(fā)射紅外光,當(dāng)紅外光遇到白色地面時(shí)發(fā)生漫發(fā)射,反射光被裝在小車上的接收管接收;如果遇到黑線則紅外光被吸收,則小車上的接收管接收不到信號(hào),再通過LM324作比較器來采集高低電平,從而實(shí)現(xiàn)信號(hào)的檢測(cè)。避障亦是此原理。電路圖如圖3.4。市面上有很多紅外傳感器,在這里我選用TCRT5000型光電對(duì)管。圖3.4循跡原理圖循跡模塊兒功能表1234567左拐100000011000000100000ZZ00000小左011000000100000Z10000直走00110000001000000110000Z1Z00小右0000100000011000001Z0右拐00000100000011000000100000ZZ特殊001110000001110001111右直角001111101111110ZZZ111左直角1110000111100011111001111110111ZZZ0全白0000000全黑1111111五.單片機(jī)電路本設(shè)計(jì)的主控芯片選擇STC89C52,負(fù)責(zé)檢測(cè)傳感器的狀態(tài)并向電機(jī)驅(qū)動(dòng)電路發(fā)出動(dòng)作命令。復(fù)位電路采用手動(dòng)復(fù)位。單片機(jī)電路如下:六.電機(jī)轉(zhuǎn)速控制電路轉(zhuǎn)速控制采用基于PWM技術(shù)的脈沖調(diào)制技術(shù),通過單片機(jī)輸出兩列PWM信號(hào),經(jīng)過l298N對(duì)電機(jī)進(jìn)行速度調(diào)控。
PWM(脈沖寬度調(diào)制)控制,通常配合橋式驅(qū)動(dòng)電路實(shí)現(xiàn)直流電機(jī)調(diào)速,非常簡(jiǎn)單,且調(diào)速范圍大,它的原理就是直流斬波原理。如圖1所示,若S3、S4關(guān)斷,S1、S2受PWM控制,假設(shè)高電平導(dǎo)通,忽略開關(guān)管損耗,則在一個(gè)周期內(nèi)的導(dǎo)通時(shí)間為t,周期為T,波形如圖6,則電機(jī)兩端的平均電壓為:U=Vcct/T=αVcc,其中,α=t/T稱為占空比,Vcc為電源電壓(電源電壓減去兩個(gè)開關(guān)管的飽和壓降)。
電機(jī)的轉(zhuǎn)速與電機(jī)兩端的電壓成比例,而電機(jī)兩端的電壓與控制波形的占空比成正比,因此電機(jī)的速度與占空比成比例,占空比越大,電機(jī)轉(zhuǎn)得越快,當(dāng)占空比α=1時(shí),電機(jī)轉(zhuǎn)速最大。PWM控制波形的實(shí)現(xiàn)可以通過模擬電路或數(shù)字電路實(shí)現(xiàn),例如用555搭成的觸發(fā)電路,但是,這種電路的占空比不能自動(dòng)調(diào)節(jié),不能用于自動(dòng)控制小車的調(diào)速。而目前使用的大多數(shù)單片機(jī)都可以直接輸出這種PWM波形,或通過時(shí)序模擬輸出,最適合小車的調(diào)速。我們使用的是STC89C52單片機(jī),它是8位單片機(jī),內(nèi)部設(shè)有3個(gè)獨(dú)立的計(jì)數(shù)器,完全可以模擬任意頻率、占空比隨意調(diào)節(jié)的PWM信號(hào)輸出,用以控制電機(jī)調(diào)速。在小車行進(jìn)的過程中,占空比不應(yīng)該太高,在直線前進(jìn)和轉(zhuǎn)彎的時(shí)候應(yīng)該區(qū)別對(duì)待。若車速太快,則在轉(zhuǎn)彎的時(shí)候,方向不易控制;而車速太慢,則很浪費(fèi)時(shí)間。這時(shí)可以根據(jù)具體情況慢慢調(diào)節(jié)七.電源電路本系統(tǒng)所有芯片都需要+5V的工作電壓,而干電池只能提供的電壓為1.5V的倍數(shù)的電壓,并且隨著使用時(shí)間的延長(zhǎng),其電壓會(huì)逐漸下降,故采用了一個(gè)12v蓄電池,再用LM2940穩(wěn)壓芯片。LM2940具有紋波小、電路結(jié)構(gòu)簡(jiǎn)單的優(yōu)點(diǎn),對(duì)于單片機(jī),需要提供穩(wěn)定的5V電源,由于LM2940的穩(wěn)壓的線性度非常好,所以選用LM2940-5對(duì)其進(jìn)行供電;能提供最大1A的電流,足以滿足芯片供電的要求。雖然微處理器和微控制器不需要支持電路,功耗也很低,但必須要加以考慮。電源電路擬定為:八.電機(jī)驅(qū)動(dòng)電路
市場(chǎng)上用很多種類的小電壓直流電動(dòng)機(jī),很方便的選擇到。主要有普通電動(dòng)機(jī)、和步進(jìn)電動(dòng)機(jī)。
方案一:采用步進(jìn)電機(jī),步進(jìn)電動(dòng)機(jī)的一個(gè)顯著的特點(diǎn)就是具有快速啟動(dòng)和停止能力,能夠達(dá)到我們所要求的標(biāo)準(zhǔn)。如果負(fù)荷不超過步進(jìn)電機(jī)所能提供的動(dòng)態(tài)轉(zhuǎn)矩值,就能夠立即是步進(jìn)電機(jī)啟動(dòng)或反轉(zhuǎn)。其轉(zhuǎn)換靈敏度比較高。正轉(zhuǎn)、反轉(zhuǎn)控制靈活。但是步進(jìn)電機(jī)的價(jià)格比較昂貴,對(duì)于我們的現(xiàn)狀相差太遠(yuǎn)。
方案二:采用普通的直流電機(jī)。直流電機(jī)具有優(yōu)良的調(diào)速特性,調(diào)速平滑、方便。調(diào)整范圍廣;過載能力強(qiáng),能承受頻繁的沖擊負(fù)載,可實(shí)現(xiàn)頻繁的無極快速啟動(dòng)、制動(dòng)和反轉(zhuǎn)。能滿足各種不容的特殊運(yùn)行要求。由于普通直流電機(jī)價(jià)格適宜,更易于購(gòu)買,并且電路相對(duì)簡(jiǎn)單,因此采用直流電機(jī)作為動(dòng)力源本設(shè)計(jì)采用L298N驅(qū)動(dòng)使電機(jī)正反轉(zhuǎn)從而做到前進(jìn),左轉(zhuǎn)驅(qū)動(dòng)電路(參考文獻(xiàn)[4])電機(jī)驅(qū)動(dòng)一般采用H橋式驅(qū)動(dòng)電路,L298N內(nèi)部集成了H橋式驅(qū)動(dòng)電路,從而可以采用L298N電路來驅(qū)動(dòng)電機(jī)。通過單片機(jī)給予L298N電路PWM信號(hào)來控制小車的速度,起停。其引腳圖如3.2,驅(qū)動(dòng)原理圖如圖3.3。圖3.2L298N引腳圖圖3.3電機(jī)驅(qū)動(dòng)電路九.通信系統(tǒng)1.NRF24L01工作原理簡(jiǎn)介:發(fā)射數(shù)據(jù)時(shí),首先將nRF24L01配置為發(fā)射模式,接著把地址TX_ADDR和數(shù)據(jù)TX_PLD按照時(shí)序由SPI口寫入nRF24L01緩存區(qū),TX_PLD必須在CSN為低時(shí)連續(xù)寫入,而TX_ADDR在發(fā)射時(shí)寫入一次即可,然后CE置為高電平并保持至少10μs,延遲130μs后發(fā)射數(shù)據(jù);若自動(dòng)應(yīng)答開啟,那么nRF24L01在發(fā)射數(shù)據(jù)后立即進(jìn)入接收模式,接收應(yīng)答信號(hào)。如果收到應(yīng)答,則認(rèn)為此次通信成功,TX_DS置高,同時(shí)TX_PLD從發(fā)送堆棧中清除;若未收到應(yīng)答,則自動(dòng)重新發(fā)射該數(shù)據(jù)(自動(dòng)重發(fā)已開啟),若重發(fā)次數(shù)(ARC_CNT)達(dá)到上限,MAX_RT置高,TX_PLD不會(huì)被清除;MAX_RT或TX_DS置高時(shí),使IRQ變低,以便通知MCU。最后發(fā)射成功時(shí),若CE為低,則nRF24L01進(jìn)入待機(jī)模式1;若發(fā)送堆棧中有數(shù)據(jù)且CE為高,則進(jìn)入下一次發(fā)射;若發(fā)送堆棧中無數(shù)據(jù)且CE為高,則進(jìn)入待機(jī)模式2。接收數(shù)據(jù)時(shí),首先將nRF24L01配置為接收模式,接著延遲130μs進(jìn)入接收狀態(tài)等待數(shù)據(jù)的到來。當(dāng)接收方檢測(cè)到有效的地址和CRC時(shí),就將數(shù)據(jù)包存儲(chǔ)在接收堆棧中,同時(shí)中斷標(biāo)志位RX_DR置高,IRQ變低,以便通知MCU去取數(shù)據(jù)。若此時(shí)自動(dòng)應(yīng)答開啟,接收方則同時(shí)進(jìn)入發(fā)射狀態(tài)回傳應(yīng)答信號(hào)。最后接收成功時(shí),若CE變低,則nRF24L01進(jìn)入空閑模式1。模式PWR_UPPRIM_RXCEFIFO寄存器狀態(tài)接收模式111-發(fā)射模式1011數(shù)據(jù)存儲(chǔ)在FIFO寄存器中,發(fā)射所有數(shù)據(jù)發(fā)射模式100→12數(shù)據(jù)存儲(chǔ)在FIFO寄存器中,發(fā)射一個(gè)數(shù)據(jù)待機(jī)模式II101TXFIFO為空待機(jī)模式I1-0無正在傳輸?shù)臄?shù)據(jù)掉電模式02.SPI介紹同步串行外設(shè)接口(SPI)是由摩托羅拉公司開發(fā)的全雙工同步串行總線,該總線大量用在與EEPROM、ADC、FRAM和顯示驅(qū)動(dòng)器之類的慢速外設(shè)器件通信。SPI(SerialPeripheralInterface)是一種串行串行同步通訊協(xié)議,由一個(gè)主設(shè)備和一個(gè)或多個(gè)從設(shè)備組成,主設(shè)備啟動(dòng)一個(gè)與從設(shè)備的同步通訊,從而完成數(shù)據(jù)的交換。SPI接口由SDI(串行數(shù)據(jù)輸入),SDO(串行數(shù)據(jù)輸出),SCK(串行移位時(shí)鐘),CS(從使能信號(hào))四種信號(hào)構(gòu)成,CS決定了唯一的與主設(shè)備通信的從設(shè)備,如沒有CS信號(hào),則只能存在一個(gè)從設(shè)備,主設(shè)備通過產(chǎn)生移位時(shí)鐘來發(fā)起通訊。通訊時(shí),數(shù)據(jù)由SDO輸出,SDI輸入,數(shù)據(jù)在時(shí)鐘的上升或下降沿由SDO輸出,在緊接著的下降或上升沿由SDI讀入,這樣經(jīng)過8/16次時(shí)鐘的改變,完成8/16位數(shù)據(jù)的傳輸??偩€協(xié)議該總線通信基于主-從(所有的串行的總線均是這樣,USB,IIC,SPI等)配置,而且下面提到的方向性的操作合指代全部從主設(shè)備的角度說得。它有以下4個(gè)信號(hào):MOSI:主出/從入MISO:主入/從出SCK:串行時(shí)鐘SS:從屬選擇;芯片上“從屬選擇”(slave-select)的引腳數(shù)決定了可連到總線上的器件數(shù)量。在SPI傳輸中,數(shù)據(jù)是同步進(jìn)行發(fā)送和接收的。數(shù)據(jù)傳輸?shù)臅r(shí)鐘基于來自主處理器的時(shí)鐘脈沖(也可以是IO上的電平的模擬時(shí)鐘),摩托羅拉沒有定義任何通用SPI的時(shí)鐘規(guī)范。然而,最常用的時(shí)鐘設(shè)置基于時(shí)鐘極性(CPOL)和時(shí)鐘相位(CPHA)兩個(gè)參數(shù),CPOL定義SPI串行時(shí)鐘的活動(dòng)狀態(tài),而CPHA定義相對(duì)于SO-數(shù)據(jù)位的時(shí)鐘相位。CPOL和CPHA的設(shè)置決定了數(shù)據(jù)取樣的時(shí)鐘沿。數(shù)據(jù)方向和通信速度SPI傳輸串行數(shù)據(jù)時(shí)首先傳輸最高位。波特率可以高達(dá)5Mbps,具體速度大小取決于SPI硬件。例如,Xicor公司的SPI串行器件傳輸速度能達(dá)到5MHz。SPI總線接口及時(shí)序SPI總線包括1根串行同步時(shí)鐘信號(hào)線以及2根數(shù)據(jù)線。SPI模塊為了和外設(shè)進(jìn)行數(shù)據(jù)交換,根據(jù)外設(shè)工作要求,其輸出串行同步時(shí)鐘極性和相位可以進(jìn)行配置,時(shí)鐘極性(CPOL)對(duì)傳輸協(xié)議沒有重大的影響。如果CPOL=0,串行同步時(shí)鐘的空閑狀態(tài)為低電平;如果CPOL=1,串行同步時(shí)鐘的空閑狀態(tài)為高電平。時(shí)鐘相位(CPHA)能夠配置用于選擇兩種不同的傳輸協(xié)議之一進(jìn)行數(shù)據(jù)傳輸。如果CPHA=0,在串行同步時(shí)鐘的第一個(gè)跳變沿(上升或下降)數(shù)據(jù)被采樣;如果CPHA=1,在串行同步時(shí)鐘的第二個(gè)跳變沿(上升或下降)數(shù)據(jù)被采樣。SPI主模塊和與之通信的外設(shè)音時(shí)鐘相位和極性應(yīng)該一致。 SPI讀寫時(shí)序見下面兩圖。在寫寄存器之前,一定要進(jìn)入待機(jī)模式或掉電模式。其中,Cn——SPI指令位;Sn——狀態(tài)寄存器位;Dn——數(shù)據(jù)位(低字節(jié)在前,高字節(jié)在后;每個(gè)字節(jié)中高位在前)SPI讀時(shí)序SPI寫時(shí)序3.串口通信串口是計(jì)算機(jī)上一種非常通用的設(shè)備通信協(xié)議(不要與通用串行總線UniversalSerialBus或者USB混淆)。大多數(shù)計(jì)算機(jī)包含兩個(gè)基于RS232的串口。串口同時(shí)也是儀器儀表設(shè)備通用的通信接口;很多GPIB兼容的設(shè)備也帶有RS-232口。同時(shí),串口通信協(xié)議也可以用于獲取遠(yuǎn)程采集設(shè)備的數(shù)據(jù)。串口通信的概念非常簡(jiǎn)單,串口按位(bit)發(fā)送和接收字節(jié)。盡管比按字節(jié)(byte)的并行通信慢,但是串口可以在使用一根線發(fā)送數(shù)據(jù)的同時(shí)用另一根線接收數(shù)據(jù)。它很簡(jiǎn)單并且能夠?qū)崿F(xiàn)遠(yuǎn)距離通信。比如IEEE488定義并行通行狀態(tài)時(shí),規(guī)定設(shè)備線總長(zhǎng)不得超過20米,并且任意兩個(gè)設(shè)備間的長(zhǎng)度不得超過2米;而對(duì)于串口而言,長(zhǎng)度可達(dá)1200米。典型地,串口用于ASCII碼字符的傳輸。通信使用3根線完成:(1)地線,(2)發(fā)送,(3)接收。由于串口通信是異步的,端口能夠在一根線上發(fā)送數(shù)據(jù)同時(shí)在另一根線上接收數(shù)據(jù)。其他線用于握手,但是不是必須的。串口通信最重要的參數(shù)是比特率、數(shù)據(jù)位、停止位和奇偶校驗(yàn)。對(duì)于兩個(gè)進(jìn)行通信的端口,這些參數(shù)必須匹配:a,比特率:這是一個(gè)衡量通信速度的參數(shù)。它表示每秒鐘傳送的bit的個(gè)數(shù)。例如300波特表示每秒鐘發(fā)送300個(gè)bit。當(dāng)我們提到時(shí)鐘周期時(shí),就是指比特率,例如如果協(xié)議需要4800波特率,那么時(shí)鐘是4800Hz。這意味著串口通信在數(shù)據(jù)線上的采樣率為4800Hz。通常電話線的比特率為14400,28800和36600。比特率可以遠(yuǎn)遠(yuǎn)大于這些值,但是波特率和距離成反比。高比特率常常用于放置的很近的儀器間的通信,典型的例子就是GPIB設(shè)備的通信。b,數(shù)據(jù)位:這是衡量通信中實(shí)際數(shù)據(jù)位的參數(shù)。當(dāng)計(jì)算機(jī)發(fā)送一個(gè)信息包,實(shí)際的數(shù)據(jù)不會(huì)是8位的,標(biāo)準(zhǔn)的值是5、7和8位。如何設(shè)置取決于你想傳送的信息。比如,標(biāo)準(zhǔn)的ASCII碼是0~127(7位)。擴(kuò)展的ASCII碼是0~255(8位)。如果數(shù)據(jù)使用簡(jiǎn)單的文本(標(biāo)準(zhǔn)ASCII碼),那么每個(gè)數(shù)據(jù)包使用7位數(shù)據(jù)。每個(gè)包是指一個(gè)字節(jié),包括開始/停止位,數(shù)據(jù)位和奇偶校驗(yàn)位。由于實(shí)際數(shù)據(jù)位取決于通信協(xié)議的選取,術(shù)語(yǔ)“包”指任何通信的情況。c,停止位:用于表示單個(gè)包的最后一位。典型的值為1,1.5和2位。由于數(shù)據(jù)是在傳輸線上定時(shí)的,并且每一個(gè)設(shè)備有其自己的時(shí)鐘,很可能在通信中兩臺(tái)設(shè)備間出現(xiàn)了小小的不同步。因此停止位不僅僅是表示傳輸?shù)慕Y(jié)束,并且提供計(jì)算機(jī)校正時(shí)鐘同步的機(jī)會(huì)。適用于停止位的位數(shù)越多,不同時(shí)鐘同步的容忍程度越大,但是數(shù)據(jù)傳輸率同時(shí)也越慢。d,奇偶校驗(yàn)位:在串口通信中一種簡(jiǎn)單的檢錯(cuò)方式。有四種檢錯(cuò)方式:偶、奇、高和低。當(dāng)然沒有校驗(yàn)位也是可以的。對(duì)于偶和奇校驗(yàn)的情況,串口會(huì)設(shè)置校驗(yàn)位(數(shù)據(jù)位后面的一位),用一個(gè)值確保傳輸?shù)臄?shù)據(jù)有偶個(gè)或者奇?zhèn)€邏輯高位。例如,如果數(shù)據(jù)是011,那么對(duì)于偶校驗(yàn),校驗(yàn)位為0,保證邏輯高的位數(shù)是偶數(shù)個(gè)。如果是奇校驗(yàn),校驗(yàn)位為1,這樣就有3個(gè)邏輯高位。高位和低位不真正的檢查數(shù)據(jù),簡(jiǎn)單置位邏輯高或者邏輯低校驗(yàn)。這樣使得接收設(shè)備能夠知道一個(gè)位的狀態(tài),有機(jī)會(huì)判斷是否有噪聲干擾了通信或者是否傳輸和接收數(shù)據(jù)是否不同步。十.測(cè)速模塊兒測(cè)速原理與循跡原理類似,當(dāng)有遮擋時(shí)紅外接收管接收不到紅外光,輸出低電平,無遮擋時(shí)輸出高電平。利用此原理實(shí)現(xiàn)轉(zhuǎn)速的測(cè)量,再通過單片機(jī)處理轉(zhuǎn)換為小車的速度與路程。有遮擋,輸出高電平;無遮擋,輸出低電平。有遮擋,輸出高電平;無遮擋,輸出低電平。十一.上位機(jī)(基于VB)VisualBasic是一種由微軟公司開發(fā)的包含協(xié)助開發(fā)環(huán)境的事件驅(qū)動(dòng)編程語(yǔ)言。從任何標(biāo)準(zhǔn)來說,VB都是世界上使用人數(shù)最多的語(yǔ)言——不僅是盛贊VB的開發(fā)者還是抱怨VB的開發(fā)者的數(shù)量。它源自于BASIC編程語(yǔ)言。VB擁有圖形用戶界面(GUI)和快速應(yīng)用程序開發(fā)(RAD)系統(tǒng),可以輕易的使用DAO、RDO、ADO連接數(shù)據(jù)庫(kù),或者輕松的創(chuàng)建ActiveX控件。程序員可以輕松的使用VB提供的組件快速建立一個(gè)應(yīng)用程序。該設(shè)計(jì)通過調(diào)用VB的mscomm控件timer控件以及其它基本控件,實(shí)現(xiàn)了基于查詢方式的串口通信??蓪南挛粰C(jī)采集的小車速度,路程等信息實(shí)時(shí)顯示附一:上位機(jī)程序:DimcomAsIntegerDimaAsIntegerPrivateSubCombo1_Click()IfCombo1.Text="com1"ThenMSComm1.CommPort=1IfCombo1.Text="com2"ThenMSComm1.CommPort=2IfCombo1.Text="com3"ThenMSComm1.CommPort=3IfCombo1.Text="com4"ThenMSComm1.CommPort=4IfCombo1.Text="com5"ThenMSComm1.CommPort=5IfCombo1.Text="com6"ThenMSComm1.CommPort=6IfCombo1.Text="com7"ThenMSComm1.CommPort=7IfCombo1.Text="com8"ThenMSComm1.CommPort=8IfCombo1.Text="com9"ThenMSComm1.CommPort=9EndSubPrivateSubCommand1_Click()IfMSComm1.PortOpen=TrueThenMsgBox"串口已經(jīng)打開??!"ElseMSComm1.PortOpen=TrueEndIfEndSubPrivateSubCommand10_Click()MsgBox"這是由李根制作的"EndSubPrivateSubCommand11_Click()MSComm1.Output=Text1.TextEndSubPrivateSubCommand12_Click()a=0Text1.Text=""Text2.Text=""Text3.Text=""EndSubPrivateSubCommand2_Click()IfMSComm1.PortOpen=FalseThenMsgBox"串口還未打開!!"ElseMSComm1.PortOpen=FalseEndIfEndSubPrivateSubCommand3_Click()MSComm1.InputMode=comInputModeTextEndSubPrivateSubCommand4_Click()MSComm1.InputMode=comInputModeBinaryEndSubPrivateSubCommand5_Click()Text1.Text=""Text2.Text=""Text3.Text=""EndSubPrivateSubCommand6_Click()DimIntRAsIntegerIntR=MsgBox("確認(rèn)要退出程序嗎?",vbYesNo,"退出確認(rèn)")IfIntR=vbYesThenEndEndSubPrivateSubCommand7_Click()MsgBox"正在開發(fā)中??!"EndSubPrivateSubCommand8_Click()MsgBox"正在開發(fā)中??!"EndSubPrivateSubCommand9_Click()MsgBox"這是李根的軟件"EndSubPrivateSubForm_Load()Combo1.AddItem"com1"Combo1.AddItem"com2"Combo1.AddItem"com3"Combo1.AddItem"com4"Combo1.AddItem"com5"Combo1.AddItem"com6"Combo1.AddItem"com7"Combo1.AddItem"com8"Combo1.AddItem"com9"Timer1.Enabled=Timer1.Enableda=0MSComm1.CommPort=3Picture1.Picture=LoadPicture("C:\Users\Administrator\Desktop\4.jpg")EndSubPrivateSubForm_Unload(CancelAsInteger)DimIntRAsIntegerIntR=MsgBox("確認(rèn)要退出程序嗎?",vbYesNo,"確認(rèn)退出")IfIntR=vbNoThenCancel=-1EndSubPrivateSubTimer1_Timer()DimindataAsStringDimbte(0)AsIntegerDimkongAsStringa=0IfMSComm1.InBufferCount>0Thenkong=MSComm1.Input:bte(0)=AscB(kong)Ifbte(0)=97ThenIfMSComm1.InputMode=comInputModeBinaryThenIfa=0Thenindata=MSComm1.Input:bte(0)=AscB(indata):Text2.Text=bte(0)&6:a=1ElseIfa=1Thenindata=MSComm1.Input:bte(0)=AscB(indata):Text3.Text=bte(0):a=2ElseIfa=2Thenindata=MSComm1.Input:bte(0)=AscB(indata):Text2.Text=50+bte(0):a=3ElseIfa=3Thenindata=MSComm1.Input:bte(0)=AscB(indata):Text3.Text=bte(0):a=0EndIfElseIfMSComm1.InputMode=comInputModeTextThenFora=0To4Step1Ifa=0ThenText3.Text=MSComm1.Input':a=1ElseIfa=1ThenText3.Text=Text3.Text+MSComm1.Input&"."':a=2ElseIfa=2ThenText3.Text=Text3.Text+MSComm1.Input':a=3ElseIfa=3ThenText2.Text=MSComm1.Input':a=4ElseIfa=4ThenText2.Text=Text2.Text+MSComm1.Input':a=0EndIfNextaEndIfEndIfEndIfEndSub附二:小車部分源程序:#include<reg52.h>#include<intrins.h>#include<string.h>//****************************************NRF24L01IO端口定義*********************************//sbit CE =P0^0;sbit CSN =P0^1;sbit SCK =P0^2;sbit MOSI =P0^3;sbit MISO =P0^4;sbit IRQ =P0^5;sbitLLT=P0^6;//避障口sbitRLT=P3^4;sbitMLT=P2^7;sbitS1=P1^0; //傳感器信號(hào)輸入端口sbitS2=P1^1;sbitS3=P1^3;//INTsbitS4=P1^5;//LLTsbitS5=P1^6;//RLTsbitS6=P1^2;sbitS7=P1^4;//OUTsbitLH=P2^3; //電機(jī)1 左輪sbitLL=P2^4;sbitRH=P2^5; //電機(jī)2 右輪sbitRL=P2^6;sbitENA=P3^6;//電機(jī)左輪使能sbitENB=P3^7;//電機(jī)右輪使能sbitkey1=P3^0;sbitkey2=P3^1; sbitkey3=P3^2;sbitkey4=P3^3;#defineucharunsignedchar#defineTX_ADR_WIDTH5//5個(gè)字節(jié)的TX地址長(zhǎng)度#defineRX_ADR_WIDTH5//5個(gè)字節(jié)的TX地址長(zhǎng)度#defineTX_PLOAD_WIDTH5 //20個(gè)字節(jié)的TX數(shù)據(jù)長(zhǎng)度#defineRX_PLOAD_WIDTH5 //20個(gè)字節(jié)的TX數(shù)據(jù)長(zhǎng)度//***************************************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校驗(yàn)?zāi)J揭约笆瞻l(fā)狀態(tài)響應(yīng)方式#defineEN_AA0x01//自動(dòng)應(yīng)答功能設(shè)置#defineEN_RXADDR0x02//可用信道設(shè)置#defineSETUP_AW0x03//收發(fā)地址寬度設(shè)置#defineSETUP_RETR0x04//自動(dòng)重發(fā)功能設(shè)置#defineRF_CH0x05//工作頻率設(shè)置#defineRF_SETUP0x06//發(fā)射速率、功耗功能設(shè)置#defineSTATUS0x07//狀態(tài)寄存器#defineOBSERVE_TX0x08//發(fā)送監(jiān)測(cè)功能#defineCD0x09//地址檢測(cè)#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ù)長(zhǎng)度#defineRX_PW_P10x12//接收頻道0接收數(shù)據(jù)長(zhǎng)度#defineRX_PW_P20x13//接收頻道0接收數(shù)據(jù)長(zhǎng)度#defineRX_PW_P30x14//接收頻道0接收數(shù)據(jù)長(zhǎng)度#defineRX_PW_P40x15//接收頻道0接收數(shù)據(jù)長(zhǎng)度#defineRX_PW_P50x16//接收頻道0接收數(shù)據(jù)長(zhǎng)度#defineFIFO_STATUS0x17//FIFO棧入棧出狀態(tài)寄存器設(shè)置//****************************************狀態(tài)標(biāo)志****************************************//uchar bdatasta;sbit RX_DR =sta^6;sbit TX_DS =sta^5;sbit MAX_RT =sta^4;//***********************************發(fā)送緩沖區(qū)***********************************************//ucharTxBuf[5]={51,52,53,54,55};ucharrx_buf[3]={0};//發(fā)送的數(shù)據(jù)用數(shù)字存儲(chǔ)ucharconstTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //本地地址ucharconstRX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //接收地址//*****************************NRF24L01的接收和發(fā)送地址***************************************////////////////////////////////////////////////////////////////*******************************************************名稱:引腳定義*功能:引腳定義*入口參數(shù):無*出口參數(shù):無*******************************************************/intC1=0,C2=0,C3;//計(jì)數(shù)單位staticintSU0=0,SU1=0,SU2=0,SU=0;staticintSU3=0,V=0,V0=0,V1=0;inttmp1=0,tmp2=0;//左右占空比調(diào)整tmp/TintSPEED1,SPEED2;ucharcount=0; //初始化計(jì)數(shù)變量ucharT=90; //pwm信號(hào)周期T*100us//*******************************函數(shù)聲明**************************************************///*voidDelay24(unsignedints);voidinerDelay_us(unsignedcharn);voidinit_NRF24L01(void);ucharSPI_RW(ucharnum);ucharSPI_Read(ucharreg);voidSetRX_Mode(void);ucharSPI_RW_Reg(ucharreg,ucharvalue);ucharSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars);ucharSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars);unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf);voidnRF24L01_TxPacket(unsignedchar*tx_buf);*//***********************************************************************測(cè)距模塊兒***********************************************************************/voiddelay10us() //延時(shí),>10us { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); }intmainceju(){ charT; intSTART,END,longth; S3=0;S4=0;//初始化接口值 S4=1; //開始發(fā)射脈沖 delay10us(); //延時(shí) while(!S3); //等待返回信號(hào) START=(TH2*256+TL2);//開始計(jì)時(shí) while(S3); //等待返回信號(hào)結(jié)束 END=(TH2*256+TL2);//關(guān)閉計(jì)時(shí)器 T=(TH0*256+TL0); //計(jì)算返回脈沖時(shí)間 longth=340*T/20000;//計(jì)算測(cè)距結(jié)果厘米 return(longth); }/*****************************************************************************************************循跡模塊兒****************************************************************************************************//*******************************************************名稱elay(longintDelay_time)*功能:延時(shí)*入口參數(shù):Delay_time*出口參數(shù):無、*說明:延時(shí)******************************************************/voiddelay(longintDelay_time)//延時(shí)函數(shù){ inti; while(Delay_time) { for(i=0;i<250;i++) { _nop_(); _nop_(); _nop_(); _nop_(); } Delay_time--; }}//voidcorrect_left()//向左校正,賦值{tmp1=T-30;tmp2=T-15;LH=1;LL=0;RH=1;RL=0;}//voidcorrect_right()//向右校正,賦值{tmp1=T-15;tmp2=T-30;LH=1;LL=0;RH=1;RL=0;}//voidturn_left()//左轉(zhuǎn),賦值{tmp1=0;tmp2=T-25;LH=0; //轉(zhuǎn)彎時(shí)一個(gè)正轉(zhuǎn),一個(gè)反轉(zhuǎn),LL=0;RH=1;RL=0; }//voidturnleft()//左轉(zhuǎn),賦值{tmp1=0;tmp2=T-30;LH=0; //轉(zhuǎn)彎時(shí)一個(gè)正轉(zhuǎn),一個(gè)反轉(zhuǎn),LL=0;RH=1;RL=0; }//voidturn_right()//右轉(zhuǎn),賦值{tmp1=T-25;tmp2=0;LH=1; LL=0; RH=0; RL=0;}//voidturnright()//右轉(zhuǎn),賦值{tmp1=T-30;tmp2=0;LH=1; LL=0; RH=0; RL=0;}//voidstraightL() //慢直走,賦值{tmp1=T-30; //左右電機(jī)占空比初始化,調(diào)節(jié)直線運(yùn)動(dòng)速度tmp2=T-30; LH=1;LL=0;RH=1;RL=0;}//voidstraight() //直走,賦值{tmp1=T-10; //左右電機(jī)占空比初始化,調(diào)節(jié)直線運(yùn)動(dòng)速度tmp2=T-10; LH=1;LL=0;RH=1;RL=0;}//voidback() //后退{(lán)tmp1=T-20; //左右電機(jī)占空比初始化,調(diào)節(jié)直線運(yùn)動(dòng)速度tmp2=T-20; //鑒于左右輪電機(jī)內(nèi)部阻力不同,故占空比取不同值,這組值需要單獨(dú)寫程序取值LH=0;LL=1;RH=0;RL=1;}//voidstop() //停車{ tmp1=0; tmp2=0;LH=0;LL=0;RH=0;RL=0;ENA=0; ENB=0;}/****************************************************** *名稱:voidturn() *功能:路徑控制 *入口參數(shù):intPosition *出口參數(shù):無 ******************************************************/voidturn(){ _nop_(); if(!(S1|S2|S3|S4|S5|S6|S7)) { _nop_(); _nop_(); back(); delay(2); if((!S1)&(!S2)&S4&(!S6)&(!S7)) { if(S4&S5&S6) _nop_(); else back(); delay(5); } } _nop_();//后退尋線 //全白后退尋線 if(S1&S2&S3&S4&S5&S6&S7) { delay(5); stop(); back(); delay(5); }//全黑,停止 _nop_(); if((S1&S3&(!S7))||(S1&S4&(!S7))||(S2&S4&(!S7)))//遇到左直角 { delay10us(); back(); delay(10); turn_left(); delay(1); while((S1&S3&(!S7))||(S1&S4&(!S7))||(S2&S4&(!S7))) { turn_left(); delay(10); } } _nop_(); if((S5&S7&(!S1))||(S4&S7&(!S1))||(S4&S6&(!S1)))//遇到右直角 { delay(1); back(); delay(10); turn_right(); delay(1); while((S5&S7&(!S1))||(S4&S7&(!S1))||(S4&S6&(!S1))) {turn_right(); delay(10);} } _nop_(); if((!S1)&(!S2)&S4&(!S6)&(!S7)) { delay10us(); _nop_(); if(S3&S4&S5)//避免死循環(huán) { back(); delay(2); if(S3&S4) { turn_left(); delay(12); } if(S4&S5) { turn_right(); delay(12); } } else straight(); delay(2); }//全速速前行 _nop_(); if(!(S4|S5|S6|S7)) { delay10us(); _nop_(); if((!S1)&S3) correct_left(); _nop_(); //校正 if(((!S3)&S2)||(S1&(!S3))) turn_left(); _nop_(); //左拐 if(S1&S2&S3)//遇到左直角 { back(); delay(10); while(S1&S2&S3) {turn_left(); delay(20);} } } _nop_(); if(!(S1|S2|S3|S4)) { delay10us(); _nop_(); if(S5&(!S7)) correct_right();//校正 _nop_(); _nop_(); if(((!S5)&S6)||((!S5)&S7)) turn_right(); //右拐 _nop_(); _nop_(); if(S5&S6&S7)//遇到右直角 { back(); delay(10); while(S5&S6&S7) { turn_right(); delay(20); } } } _nop_(); }/****************************************************************************************************避障模塊兒*****************************************************************************************************/voidRback(){ tmp1=0; tmp2=T-30; RH=0; RL=1; LH=0; LL=0;}voidLback(){ RH=0; RL=0; LH=0; LL=1;}voidmainbizhang(){ _nop_(); _nop_(); _nop_(); if((!LLT)&&(MLT)&&(!RLT))//010 { delay10us(); back(); delay10us(); Rback(); delay(10); } elseif((LLT)&&(!MLT)&&(!RLT))//100 { _nop_(); _nop_(); back(); delay(2); turn_left(); delay(10); } elseif((!LLT)&(!MLT)&(RLT))//001 { _nop_(); _nop_(); _nop_(); back(); delay(2); turn_right(); delay(10); } elseif((!LLT)&(!MLT)&(!RLT))//000 { _nop_(); _nop_(); _nop_(); back(); delay(5); Rback(); delay(20); } elseif((!LLT)&(MLT)&(RLT))//011 { _nop_(); back(); delay10us(); turn_right(); delay(2); } elseif((LLT)&(!MLT)&(RLT))//101 { _nop_(); _nop_(); _nop_(); back(); delay(2); turn_left(); delay(20); } elseif((LLT)&(MLT)&(!RLT))//110 { _nop_(); back(); delay10us(); turn_left(); delay(2); } elseif((LLT)&(MLT)&(RLT))//111 { delay10us(); straightL(); delay(2); }}/*****************************************************************************************************測(cè)速顯示子程序*****************************************************************************************************///*****************************************延時(shí)函數(shù)***************************************//voidinerDelay_us(unsignedcharn){ for(;n>0;n--) _nop_();}//*****************************************長(zhǎng)延時(shí)*****************************************//voidDelay24(unsignedints){ unsignedinti; for(i=0;i<s;i++); for(i=0;i<s;i++);}/****************************************************************************************************/*函數(shù):uintSPI_RW(uintuchar)/*功能:NRF24L01的SPI寫時(shí)序/****************************************************************************************************/ucharSPI_RW(ucharnum){ ucharbit_ctr; for(bit_ctr=0;bit_ctr<8;bit_ctr++)//output8-bit { MOSI=(num&0x80);//output'uchar',MSBtoMOSI num=(num<<1);//shiftnextbitintoMSB.. SCK=1;//SetSCKhigh.. num|=MISO; //capturecurrentMISObit SCK=0; //..thensetSCKlowagain }return(num); //returnreaduchar}/****************************************************************************************************函數(shù):ucharSPI_Read(ucharreg)功能:NRF24L01的SPI時(shí)序****************************************************************************************************/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}/****************************************************************************************************//*功能:NRF24L01讀寫寄存器函數(shù)/****************************************************************************************************/ucharSPI_RW_Reg(ucharreg,ucharvalue){ ucharstatus; CSN=0;//CSNlow,initSPItransaction status=SPI_RW(reg);//selectregister SPI_RW(value);//..andwritevaluetoit.. CSN=1;//CSNhighagain return(status);//returnnRF24L01statusuchar}/*********************************************************************************************************/*函數(shù):uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars)/*功能:用于寫數(shù)據(jù):為寄存器地址,pBuf:為待寫入數(shù)據(jù)地址,uchars:寫入數(shù)據(jù)的個(gè)數(shù)/*********************************************************************************************************/ucharSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars){ ucharstatus,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);//}ucharSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars)//從寄存器reg讀出數(shù)據(jù),典型應(yīng)用是讀RX數(shù)據(jù)或RX/TXF地址{ ucharstatus,uchar_ctr; CSN=0; //CSN為0時(shí),才能進(jìn)行SPI讀寫 status=SPI_RW(reg); //選擇寄存器reg并返回其狀態(tài)字 for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++) pBuf[uchar_ctr]=SPI_RW(0); //從寄存器讀數(shù)據(jù) CSN=1;//終止SPI讀寫 return(status);//返回狀態(tài)值}/***********************************************************************************************************/*函數(shù):voidnRF24L01_TxPacket(unsignedchar*tx_buf)/*功能:發(fā)送tx_buf中數(shù)據(jù)/**********************************************************************************************************/voidnRF24L01_TxPacket(unsignedchar*tx_buf){ CE=0; //StandByI模式 SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//裝載接收端地址 SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH); //裝載數(shù)據(jù) CE=1; //置高CE激發(fā)數(shù)據(jù)發(fā)送 inerDelay_us(10);}//********************************NRF24L01初始化******************************************//voidinit_NRF24L01(void){inerDelay_us(100); CE=0;//片選使能 CSN=1;//SPI使能 SCK=0;//SPI時(shí)鐘拉低 SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);//寫本地地址 SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//寫接收端地址 SPI_RW_Reg(WRITE_REG+EN_AA,0x00);//頻道0自動(dòng)ACK應(yīng)答允許(此處禁止用于測(cè)試) SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 超重型汽車列車掛車工安全生產(chǎn)規(guī)范評(píng)優(yōu)考核試卷含答案
- 液晶顯示器件彩膜制造工操作管理考核試卷含答案
- 選礦脫水工創(chuàng)新意識(shí)評(píng)優(yōu)考核試卷含答案
- 電梯機(jī)械裝配工崗前工作能力考核試卷含答案
- 顏料化操作工風(fēng)險(xiǎn)評(píng)估強(qiáng)化考核試卷含答案
- 醫(yī)用供氣工操作安全水平考核試卷含答案
- 吸油煙機(jī)制作工操作強(qiáng)化考核試卷含答案
- 2024年河池學(xué)院輔導(dǎo)員考試筆試題庫(kù)附答案
- 2024年白銀市特崗教師筆試真題匯編附答案
- 2025寧夏回族自治區(qū)公務(wù)員考試《行測(cè)》題庫(kù)及參考答案
- 2026年中考?xì)v史一輪復(fù)習(xí):七八九年級(jí)必背考點(diǎn)知識(shí)提綱填空版
- 天然氣供氣工程安全交底
- 《工業(yè)機(jī)器人系統(tǒng)操作員三級(jí)(高級(jí))理論知識(shí)考核要素細(xì)目表》
- 航天器多功能散熱結(jié)構(gòu)設(shè)計(jì)-洞察及研究
- 政治●天津卷丨2024年天津市普通高中學(xué)業(yè)水平選擇性考試政治試卷及答案
- 福州戶外顯示屏管理制度
- 檢察案卡填錄規(guī)范課件
- 2025江漢藝術(shù)職業(yè)學(xué)院輔導(dǎo)員考試題庫(kù)
- 醫(yī)院內(nèi)控制度
- 非煤地下礦山機(jī)電知識(shí)
- 《高危作業(yè)培訓(xùn)》課件
評(píng)論
0/150
提交評(píng)論