WIFI遙控小車論文報(bào)告_第1頁
WIFI遙控小車論文報(bào)告_第2頁
WIFI遙控小車論文報(bào)告_第3頁
WIFI遙控小車論文報(bào)告_第4頁
WIFI遙控小車論文報(bào)告_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、中國地質(zhì)大學(xué)(武漢)大學(xué)生 科研立項(xiàng)報(bào)告項(xiàng)目名稱 基于手機(jī)WIFI技術(shù)的遙控小車 項(xiàng)目負(fù)責(zé)人 所在學(xué)院 機(jī)械與電子信息學(xué)院 參加人員 聯(lián)系 指導(dǎo)老師 中國地質(zhì)大學(xué)(武漢)機(jī)電學(xué)院 二一二年十月目 錄引言21設(shè)計(jì)任務(wù)及要求3 1.1 設(shè)計(jì)任務(wù)與要求3 HYPERLINK l _Toc30791 1.2 設(shè)計(jì)時(shí)要考慮的問題 PAGEREF _Toc30791 3 2系統(tǒng)總體設(shè)計(jì)4 HYPERLINK l _Toc20267 2.1 方案論證 PAGEREF _Toc20267 42. 2總體框圖53 系統(tǒng)硬件設(shè)計(jì)63.1 手機(jī)端設(shè)計(jì)6手機(jī)選擇6手機(jī)端軟件開發(fā)環(huán)境7小型路由器選擇73.3 單片機(jī)電路

2、7單片機(jī)選擇8晶振選擇10軟件設(shè)計(jì)123.4 顯示系統(tǒng)13電機(jī)驅(qū)動(dòng)模塊153.6 電機(jī)153.7電源設(shè)計(jì)154 結(jié)束語20附錄附錄1 部分電路原理圖22附錄2 液晶驅(qū)動(dòng)程序23附錄3 電機(jī)驅(qū)動(dòng)程序25附錄4 單片機(jī)主函數(shù)27附錄5 手機(jī)端軟件源代碼27 引言: 智能手機(jī)現(xiàn)在已經(jīng)全方位的進(jìn)入了我們的生活,說到智能手機(jī)不得不提及他們操作系統(tǒng)的龍頭的Android。由于安卓操作系統(tǒng)的實(shí)際性和可操作性使得安卓迅速成為現(xiàn)在主流操作系統(tǒng)的原因,此外安卓的最大優(yōu)點(diǎn)是開源,這樣對于安卓軟件的開發(fā)就沒有了限制,使得用戶可以用到廣泛的免費(fèi)軟件,這樣安卓軟件的開發(fā)就有了空前的市場,安卓開發(fā)迎來了一輪熱潮。因?yàn)橄到y(tǒng)的

3、開源性與可操作性,同時(shí)系統(tǒng)的流暢性以及大量的親民化的可選擇的設(shè)備,使得安卓系統(tǒng)在智能手機(jī)市場上占了頭把交椅。根據(jù)市場研究機(jī)構(gòu)ComScore發(fā)布的最新調(diào)查顯示,Android智能手機(jī)在美國的優(yōu)勢進(jìn)一步擴(kuò)大,市場份額達(dá)到43.7%,因此我們小組的基于安卓手機(jī)wifi技術(shù)的遙控小車有著廣大的潛在用戶,2011年11月數(shù)據(jù),Android占據(jù)中國智能手機(jī)操作系統(tǒng)市場58%,其應(yīng)用領(lǐng)域和市場份額也在急速向平板電腦、消費(fèi)電子、智能家電領(lǐng)域擴(kuò)張。目前基于Android手機(jī)和WIFI技術(shù)開發(fā)的娛樂軟件較多,而控制機(jī)電產(chǎn)品的軟件和專利相對較少。我們小組設(shè)計(jì)的“基于手機(jī)WIFI技術(shù)的遙控小車”將是以手機(jī)作為手持

4、終端,通過WIFI傳輸指令的新型玩具小車,由于遙控器是手機(jī),因此攜帶極其方便?;赪IFI的控制系統(tǒng)不僅可以控制小車,稍做改動(dòng)就可用來控制電腦、家用電器甚至探測、排爆機(jī)器人等,同時(shí)也可用于地質(zhì)檢測設(shè)備的手持終端。因此,該項(xiàng)目的成果將不僅僅局限于一個(gè)遙控小車,更具有價(jià)值的是手機(jī)遠(yuǎn)程控制系統(tǒng)。1 設(shè)計(jì)任務(wù)及要求1.1 設(shè)計(jì)任務(wù)與設(shè)計(jì)要求 本課題要求利用基于Android(安卓)手機(jī)系統(tǒng)開發(fā)一個(gè)控制軟件,該軟件將實(shí)現(xiàn)用WIFI技術(shù)對玩具小車進(jìn)行遙控控制,包括小車前進(jìn)、后退、轉(zhuǎn)彎等功能。(1)實(shí)現(xiàn)手機(jī)與小車WIFI連接;(2)能夠通過手機(jī)對小車進(jìn)行實(shí)時(shí)控制。 設(shè)計(jì)時(shí)要考慮的問題a、由于該課題的小車端是

5、通過單片機(jī)串口通信接收收手機(jī)是控制指令,因此需要對單片機(jī)定時(shí)器初值進(jìn)行設(shè)置,若采用常用12M晶振,初值不一定是整數(shù),通信時(shí)便會(huì)產(chǎn)生積累誤差,進(jìn)而產(chǎn)生波特率誤差,影響通信的同步性。采用11.0592M晶振可以得到非常準(zhǔn)確的數(shù)值,因此在制作過程中最好采用11.0592M或其整數(shù)倍的晶振。 我們采用的波特率為4800。b、小車電機(jī)啟動(dòng)時(shí)電流較大,可能會(huì)將電源的電壓瞬間拉低,導(dǎo)致單片機(jī)和路由器不能正常工作,因此必須設(shè)計(jì)一個(gè)可靠的供電系統(tǒng)。c、由于Android系統(tǒng)所有源代碼都已公開并且可以免費(fèi)使用,各手機(jī)公司在開發(fā)自己產(chǎn)品時(shí)可以隨意改動(dòng)代碼,進(jìn)而在市場上出現(xiàn)了所謂的“基于Android的改良系統(tǒng)”手機(jī)

6、,這些手機(jī)對安卓手機(jī)軟件兼容性有所差異,因此必須選擇“安卓原版”的手機(jī)開發(fā)軟件,我們采用了“”版本的操作系統(tǒng)。d、由于單片機(jī)IO口電流為mA級,無法直接驅(qū)動(dòng)電機(jī),必須設(shè)計(jì)專門的電機(jī)驅(qū)動(dòng)模塊。2 系統(tǒng)總體設(shè)計(jì)2.1 方案論證要實(shí)現(xiàn)手機(jī)通過WIFI控制小車,有兩種方案可以實(shí)現(xiàn):方案一:通過SIM卡來實(shí)現(xiàn)。系統(tǒng)框圖如下圖所示:手機(jī)端發(fā)送控制指令 手機(jī)用戶WIFI服務(wù)器小車端SIM卡接收指令 轉(zhuǎn)化為串口指令小車響應(yīng)控制小車端單片機(jī)接收指令方案二:通過小型路由器來實(shí)現(xiàn)。該方案是在小車端安裝一個(gè)小型路由器,是小車周圍一定范圍具有WIFI覆蓋,然后將手機(jī)連接到路由器IP地址,對其發(fā)送指令,路由器接收指令后對

7、單片機(jī)串口發(fā)送數(shù)據(jù)指令,實(shí)現(xiàn)控制。系統(tǒng)框圖如下:小車端路由器收指令手機(jī)端發(fā)送控制指令 小車響應(yīng)控制小車端路由器收指令 轉(zhuǎn)化為串口指令通過比較以上兩種方案。方案一雖然可以實(shí)現(xiàn)小車超遠(yuǎn)程控制,但開發(fā)成本較高,相對于大一學(xué)生來說技術(shù)難度較大,而且控制過程要消耗上網(wǎng)流量。而方案二則相對簡單,開發(fā)難度較低,適合制作玩具小車,因此我們選擇了方案二。2.2 總體設(shè)計(jì)框圖電機(jī)電機(jī)驅(qū)動(dòng)模塊1602顯示單片機(jī)手機(jī)小型路由器 遙控小車系統(tǒng)總框圖如下所示 串口通信3 系統(tǒng)硬件設(shè)計(jì)系統(tǒng)的硬件框圖如圖所示,包括六個(gè)部分組成。下面將分別介紹該六個(gè)單元。3.1 手機(jī)端設(shè)計(jì)手機(jī)選擇由于安卓系統(tǒng)的極速發(fā)展,現(xiàn)在安卓智能機(jī)的價(jià)格已

8、經(jīng)能降到600元以下,基于安卓的應(yīng)用軟件層出不窮。由于安卓系統(tǒng)所有源代碼都已公開并且可以免費(fèi)使用,各手機(jī)公司在開發(fā)自己產(chǎn)品時(shí)可以隨意改動(dòng)代碼,進(jìn)而在市場上出現(xiàn)了所謂的“基于Android的改良系統(tǒng)”手機(jī),源代碼的改動(dòng)會(huì)影響手機(jī)對安卓軟件的兼容性,增大開發(fā)難度,因此必須選擇“安卓原版”的手機(jī)開發(fā)軟件,我們采用了“”版本的操作系統(tǒng)。手機(jī)端軟件開發(fā)環(huán)境Google公司提供的Android SDK中包括模擬硬件設(shè)備的Emulator,資源打包工具,調(diào)試監(jiān)視服務(wù),DX工具等。Android應(yīng)用程序使用Java語言編寫,而使用Java必須有JDK,需要下載和安裝JDK,如IBM公司的Eclipse平臺???/p>

9、以使用AVD在電腦上模擬一個(gè)虛擬的真實(shí)設(shè)備,可以由用戶自己配置硬件配置,版本的選擇,設(shè)備的屏幕尺寸大小等。通過Eclipse插件ADT便可以方便的創(chuàng)建一個(gè)Android應(yīng)用。小型路由器選擇目前,專門用于制作WIFI小車的小型無線路由器可以再淘寶網(wǎng)上買到,已經(jīng)刷有OP系統(tǒng),安裝好攝像頭的驅(qū)動(dòng)程序,安裝路由與單片機(jī)通信的數(shù)據(jù)包,同時(shí)還帶有上位機(jī)調(diào)試軟件。此外還帶有相應(yīng)的開發(fā)例程,方便用戶使用,使用時(shí)只要參考他的例程編寫單片機(jī)程序即可。 3.3 單片機(jī)電路單片機(jī)選擇在這里,單片機(jī)要實(shí)現(xiàn)對電機(jī)驅(qū)動(dòng)模塊的控制,同時(shí)還要有路由器進(jìn)行串口通信,為了能夠控制電機(jī)轉(zhuǎn)速,可以使用單片機(jī)的定時(shí)器來實(shí)現(xiàn),利用單片機(jī)定

10、時(shí)器功能控制IO口產(chǎn)生PWM波,通過調(diào)節(jié)占空比里調(diào)節(jié)電機(jī)轉(zhuǎn)速。考慮到單片機(jī)要實(shí)現(xiàn)以上功能,選擇使用STC89C52來構(gòu)成電路。STC89C52是一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統(tǒng)可編程Flash HYPERLINK :/baike.baidu /view/87697.htm存儲器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得STC89C52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。 具有以下標(biāo)準(zhǔn)功能: 8k字節(jié)Flash,512字節(jié)RAM, 32 位I/O 口線,HYPERLINK :/baike.baidu /view/1313309

11、.htm看門狗定時(shí)器,內(nèi)置4KB EEPROM,MAX810復(fù)位電路,三個(gè)16 位 HYPERLINK :/baike.baidu /view/281961.htm定時(shí)器/計(jì)數(shù)器,一個(gè)6向量2級中斷結(jié)構(gòu),全雙工HYPERLINK :/baike.baidu /view/1060187.htm串行口。另外 STC89X52 可降至0Hz 靜態(tài)邏輯操作,支持2種HYPERLINK :/baike.baidu /view/37.htm軟件可選擇節(jié)電模式??臻e模式下,CPU 停止工作,允許RAM、定時(shí)器/計(jì)數(shù)器、串口、中斷繼續(xù)工作。掉電保護(hù)方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),HYPERLINK :

12、/baike.baidu /view/1012.htm單片機(jī)一切工作停止,直到下一個(gè)中斷或硬件復(fù)位為止。最高運(yùn)作頻率35MHz,6T/12T可選。 此外,STC89C52設(shè)計(jì)和配置了振蕩頻率可為0Hz并可通過軟件設(shè)置省電模式??臻e模式下,CPU暫停工作,而RAM定時(shí)計(jì)數(shù)器,串行口,外中斷系統(tǒng)可繼續(xù)工作,掉電模式凍結(jié)振蕩器而保存RAM的數(shù)據(jù),停止芯片其它功能直至外中斷激活或硬件復(fù)位。同時(shí)該芯片還具有PDIP、TQFP和PLCC等三種封裝形式,以適應(yīng)不同產(chǎn)品的需求。該單片機(jī)主要特性: 8031 CPU與MCS-51 兼容 8K字節(jié)可編程FLASH存儲器(壽命:1000寫/擦循環(huán)) 全靜態(tài)工作:0H

13、z-24KHz 三級程序存儲器保密鎖定 128*8位內(nèi)部RAM 32條可編程I/O線 兩個(gè)16位定時(shí)器/計(jì)數(shù)器 6個(gè)中斷源 可編程串行通道 低功耗的閑置和掉電模式 片內(nèi)振蕩器和時(shí)鐘電路單片機(jī)TXRX與路由器相連,P1.0P1.5與電機(jī)驅(qū)動(dòng)模塊相連。單片機(jī)的P3.4,P口接到液晶屏的控制端,P1口接到液晶屏數(shù)據(jù)口。設(shè)置定時(shí)/計(jì)數(shù)器0工作方式為16位計(jì)數(shù)器,并對中斷做出定義。其電路如下所示:晶振選擇由于該課題的小車端是通過單片機(jī)串口通信接收收手機(jī)是控制指令,因此需要對單片機(jī)定時(shí)器初值進(jìn)行設(shè)置,若采用常用12M晶振,初值不一定是整數(shù),通信時(shí)便會(huì)產(chǎn)生積累誤差,進(jìn)而產(chǎn)生波特率誤差,影響通信的同步性。采用

14、11.0592M晶振可以得到非常準(zhǔn)確的數(shù)值,因此在制作過程中最好采用11.0592M或其整數(shù)倍的晶振。軟件設(shè)計(jì) 單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)與一般電子系統(tǒng)設(shè)計(jì)的差別在于,它既要構(gòu)成硬件邏輯電路,也要設(shè)計(jì)相應(yīng)的支持軟件。Keil C51是美國Keil Software 公司出品的51系列兼容單片機(jī)C語言軟件開發(fā)系統(tǒng),該系統(tǒng)全WINDOWS界面且?guī)旌瘮?shù)豐富,調(diào)試功能強(qiáng)大、生成代碼率很高。 本程序的主要思路是,利用單片機(jī)的計(jì)數(shù)器計(jì)時(shí),控制IO口產(chǎn)生PWM波用于控制電機(jī)轉(zhuǎn)速。利用P0口控制1602液晶顯示。其控制流程大致如下如所示: 開始是否連接到 上位機(jī)系統(tǒng)初 始 化否 是是否接受到 串口指令 進(jìn)入控 制模式

15、 否 結(jié)束 響應(yīng) 控制 是3.4 顯示系統(tǒng)顯示系統(tǒng)既可以選擇使用LED,也可以選擇使用LCD。就本系統(tǒng)的功能來說,使用LED已經(jīng)可以實(shí)現(xiàn)功能,不過考慮到使用LCD,可以輸出英文字符,從而使得顯示系統(tǒng)能夠更加美觀,同時(shí)也能更好的達(dá)到提高自己的目的,所以最后選擇使用液晶屏LCD。由于本次設(shè)計(jì)所要顯示的內(nèi)容不多,并不需要太大的液晶屏來顯示。所以選擇使用1602來進(jìn)行顯示。1602液晶每次可以顯示2行16個(gè)字符,總共32個(gè)字符,而且可以顯示所有的ASCII碼,包括標(biāo)點(diǎn),數(shù)字,英文大小寫等,因此,使用該液晶屏可以很好的實(shí)現(xiàn)顯示功能。1602顯示屏的主要技術(shù)指標(biāo)如表3.4所示。表3.4 1602液晶顯示屏

16、的主要技術(shù)指標(biāo)LCD1620顯示容量:16X2個(gè)字符芯片工作電壓:工作電流:2.0mA(5V)最佳工作電壓:5V字符尺寸:2.95X4.35(WXH)mm1602液晶顯示屏共有16個(gè)引腳,其各個(gè)引腳的功能如下表,表3.5中所示。表3.5 1602液晶顯示屏的各個(gè)引腳功能編號符號引腳說明編號符號引腳說明1VSS電源地9D2DATAI/O2VDD電源正極10D3DATAI/O3VL液晶顯示偏壓信號11D4DATAI/O4RS數(shù)據(jù)命令選擇端(H/L)12D5DATAI/O5R/W讀寫數(shù)據(jù)端(H/L)13D6DATAI/O6E使能信號14D7DATAI/O7D0DATAI/O15BLA背光源正極8D1

17、DATAI/O16BLK背光源負(fù)極使用1602,所設(shè)計(jì)的顯示電路部分如下圖所示:電機(jī)驅(qū)動(dòng)模塊 由于小車底盤電機(jī)額定電壓為12V,度電機(jī)驅(qū)動(dòng)模塊選擇了常用12V電機(jī)驅(qū)動(dòng)芯片L298N。L298N恒壓恒流橋式2A驅(qū)動(dòng)芯片,L298N可接受標(biāo)準(zhǔn)TTL邏輯電平信號VSS,VSS可接457 V電壓。4腳VS接電源電壓,VS電壓范圍VIH為2546 V。輸出電流可達(dá)25 A,可驅(qū)動(dòng)電感性負(fù)載。1腳和15腳下管的發(fā)射極分別單獨(dú)引出以便接入電流采樣電阻,形成電流傳感信號。L298可驅(qū)動(dòng)2個(gè)電動(dòng)機(jī),OUT1,OUT2和OUT3,OUT4之間可分別接電動(dòng)。3.6 電機(jī)12V 138rpm直流電機(jī)3.7電源設(shè)計(jì) 小

18、車電機(jī)啟動(dòng)時(shí)電流較大,可能會(huì)將電源的電壓瞬間拉低,導(dǎo)致單片機(jī)和路由器不能正常工作,因此必須設(shè)計(jì)一個(gè)可靠的供電系統(tǒng)。解決該問題常用以下三種方法:、選用性能更好的的電源:、采用獨(dú)立電源供電,即使用兩個(gè)電源分別給單片機(jī)和電機(jī)供電;、在電源附近并聯(lián)一個(gè)較大值的電容,當(dāng)電機(jī)啟動(dòng)時(shí),電流較大,電容中的電可以補(bǔ)償一部分電流,保證電壓不至于太低。以上三種方案中,方案1)成本過高,方案2)電路繁瑣,均不適合小型設(shè)備的應(yīng)用,所以我們選擇了方案3)。 4 結(jié)束語該項(xiàng)目的獨(dú)特創(chuàng)新之處在于小車的控制是通過手機(jī)來實(shí)現(xiàn),而不是遙控手柄或電腦,從而使用更加方便,實(shí)現(xiàn)用WIFI技術(shù)對玩具小車進(jìn)行遙控控制,包括小車前進(jìn)、后退、轉(zhuǎn)

19、彎等功能。該項(xiàng)目開發(fā)的Android軟件和基于WIFI的控制系統(tǒng)不僅可以控制小車,稍做改動(dòng)就可用來控制電腦、家用電器甚至探測、排爆機(jī)器人等,同時(shí)也可用于地質(zhì)檢測設(shè)備的手持終端。因此,該項(xiàng)目的成果將不僅僅局限于一個(gè)遙控小車,更具有價(jià)值的是手機(jī)遠(yuǎn)程控制系統(tǒng)。如今國外的幾家公司推出了基于蘋果手機(jī)控制航模和玩具賽車的產(chǎn)品。目前基于Android手機(jī)和WIFI技術(shù)開發(fā)的娛樂軟件較多,而控制機(jī)電產(chǎn)品的軟件和專利相對較少。 2011年11月數(shù)據(jù),Android占據(jù)中國智能手機(jī)操作系統(tǒng)市場58%,其應(yīng)用領(lǐng)域和市場份額也在急速向平板電腦、消費(fèi)電子、智能家電領(lǐng)域擴(kuò)張。WIFI具有較強(qiáng)的數(shù)據(jù)傳輸能力,普通智能手機(jī)完

20、全能達(dá)到1M/S以上的速度。因此,今后在此方面的的研究一定會(huì)大大增加,具有很好的實(shí)用價(jià)值。參考文獻(xiàn)4(美)昊斯特曼 著,葉乃文,鄺勁筠,杜永萍譯 java核心技術(shù)卷1-基礎(chǔ)知識 附 錄附錄1 部分電路原理圖 1602液晶顯示 單片機(jī)最想系統(tǒng) 電機(jī)驅(qū)動(dòng)模塊 電源模塊附錄2 液晶驅(qū)動(dòng)程序#define uchar unsigned char#define uint unsigned intsbit lcden=P34;sbit lcdrs=P35;sbit wela=P27;sbit dula=P26;uint num;uchar code table1=I AM WIFI CAR;uchar c

21、ode table2=RX 00 00 0;void init();void delay(z);void write_com(com);void write_date(date);void write_com(uchar com)lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;void lcd_init()char num;wela=0;dula=0;lcden=0;write_com(0 x38);write_com(0 x0e);write_com(0 x06);write_com(0 x01);write_com(0 x80);for(n

22、um=0;num13;num+)write_date(table1num);delay(5);write_com(0 x80+0 x40);for(num=0;num0;x-)for(y=110;y0;y-);void print(uchar add,uchar date)write_com(0 x80+0 x40+add);write_date(date); 附錄3 電機(jī)驅(qū)動(dòng)程序#defineuchar unsigned char#defineuint unsigned int/* L298N */sbit LEFT_IN1 =P13; /左邊電機(jī)sbitLEFT_EN =P14;sbitL

23、EFT_IN2 =P15; sbit RIGHT_IN1 =P10; /右邊電機(jī)sbitRIGHT_EN =P11;sbitRIGHT_IN2 =P12;/*PWM定義產(chǎn)生*/#define PWM_PERIOD 100uchar PWM_COUNTER = 0; /pwm產(chǎn)生周期 100*100usuchar LEFT_PWM_DUTY = 50; /左邊電機(jī)占空比uchar RIGHT_PWM_DUTY = 50; /右邊電機(jī)占空比/*延時(shí) 10us 級*/void Delay_10Us(uint us)while( us- );/*延時(shí) ms 級*/void DelayMs(uint m

24、s)unsigned int i,j;for( i = 0; i 0; j -);/* 內(nèi)部資源初始化*/void motor_init()TMOD = 0 x22; /設(shè)定T1的工作模式為1:16bit計(jì)數(shù)模式,設(shè)定T0的工作模式為2:8bit重裝初值模式TH0 = 0 x9c; /100us定時(shí) 28-100=156=9cHTL0 = 0 x9c;IP = 0 x03;/ 中斷優(yōu)先級:定時(shí)器0,外部中斷0優(yōu)先EA = 1; / 開總中斷 EX1 = 1;/ 打開外部中斷1ET0 = 1; / 定時(shí)器0允許中斷 TR0 = 1; / 啟動(dòng)定時(shí)器0 /*定時(shí)器0中斷服務(wù)函數(shù)*函數(shù)功能: 輸出P

25、WM波*/void Timer0(void) interrupt1 PWM_COUNTER +;if(PWM_COUNTER LEFT_PWM_DUTY) LEFT_EN = 0;if(PWM_COUNTER RIGHT_PWM_DUTY) RIGHT_EN = 0;else PWM_COUNTER = 0;LEFT_EN = 1;RIGHT_EN = 1;/*前進(jìn)*/void GoHead(uchar speed_left,uchar speed_right)LEFT_IN1 = 1;LEFT_IN2 = 0;RIGHT_IN1 =1;RIGHT_IN2 =0;LEFT_PWM_DUTY =

26、 speed_left;RIGHT_PWM_DUTY = speed_right;/走直線占空比校正/*后退*/void GoBack(uchar speed_left,uchar speed_right)LEFT_IN1 = 0;LEFT_IN2 =1;RIGHT_IN1 =0;RIGHT_IN2 =1;LEFT_PWM_DUTY = speed_left;RIGHT_PWM_DUTY = speed_right;/走直線占空比校正/*左正右反-右轉(zhuǎn)*/void GoLeft(uchar speed_left,uchar speed_right)LEFT_IN1 = 0;LEFT_IN2 =

27、1;RIGHT_IN1 =1;RIGHT_IN2 =0;LEFT_PWM_DUTY = speed_left;RIGHT_PWM_DUTY = speed_right;/走直線占空比校正/*右正左反-左轉(zhuǎn)*/void GoRight(uchar speed_left,uchar speed_right)LEFT_IN1 = 1;LEFT_IN2 =0;RIGHT_IN1 =0;RIGHT_IN2 =1;LEFT_PWM_DUTY = speed_left;RIGHT_PWM_DUTY = speed_right;/走直線占空比校正附錄4 單片機(jī)主函數(shù)/Wifi 智能小車 第二版#include

28、 /包含STC52系列單片機(jī)的頭文件#includemotor.h#includeLCD_1602.hsbit KEY1=P36;sbit KEY2=P37;#define sensor_IROA P3/跟上面定義一樣,取P33-P35unsigned int PWM_G1=33;/初始化中心值unsigned int PWM_G2=33;/unsigned char R_date3=0;unsigned char RBuff_date4=0;unsigned char pattern=0;/0:stop 1:startunsigned char flag_phone=0;/用于手機(jī)控制標(biāo)記u

29、nsigned char check_phone=0;unsigned char flag_PC=0;unsigned char sen_inp_IROA()unsigned IROA_date;IROA_date=sensor_IROA;IROA_date=IROA_date;IROA_date &=0 x38;IROA_date=3;return(IROA_date);void init_system()unsigned int i;GoHead(0,0);for(i=0;i3;i+)R_datei=0;RBuff_datei=0;void init_uart()/4800 波特率TH1=

30、0XFA;TL1=0XFA;TR1=1;REN=1; SM0=0;SM1=1;EA=1;ES=1;void SCI_TX(unsigned char date)SBUF=date;while(!TI);TI=0;void uart(void) interrupt 4if(RI)RI=0;/add your code here.if(flag_phone=0)check_phone= RBuff_date0;RBuff_date0= RBuff_date1;RBuff_date1= RBuff_date2;RBuff_date2=SBUF;/判斷是否是手機(jī)連接if(check_phone=0 x

31、44 & RBuff_date0=0 x44 & RBuff_date1=0 x31 & RBuff_date2=0 x0a)flag_phone=1;pattern=1;/print(0 x03,A); /PC控制if(RBuff_date0=0 x3C & RBuff_date1=0 x31 & RBuff_date2=0 x3E)pattern=2;/print(0 x4f,2);/beed_ctrl(500,4);if(RBuff_date0=0 x3C & RBuff_date1=0 x30 & RBuff_date2=0 x3E)pattern=1;/print(0 x4f,1);

32、if(RBuff_date0=0 x7B & RBuff_date1=0 x31 & RBuff_date2=0 x7D)pattern=1;/print(0 x4f,1);/print(0 xe3, );else if(RBuff_date0=0 x7B & RBuff_date1=0 x30 & RBuff_date2=0 x7D)pattern=0;/print(0 x4f,0);init_system();else if( RBuff_date0=0 x50 & RBuff_date2=0 x00 )GoBack(10,10); elseR_date0=RBuff_date0;R_da

33、te1=RBuff_date1;R_date2=RBuff_date2;elseRBuff_date0= RBuff_date1;RBuff_date1= RBuff_date2;RBuff_date2= RBuff_date3;RBuff_date3=SBUF;R_date0=RBuff_date0;R_date1=RBuff_date1;R_date2=RBuff_date2;elseTI=0;main(void)init_uart();init_system();while(1)lcd_init(); SCI_TX(0 x55);/發(fā)送“0 x55“SCI_TX(0 xf0); /發(fā)送“

34、0 xf0“if(pattern=1) switch(R_date0)case 0 x44:switch(R_date1)case 0 x4c:switch(R_date2)case 0 x31: GoHead(20,20); break;case 0 x32: GoHead(20,90); break;case 0 x33: GoHead(90,20); break;default:break;break;case 0 x44:switch(R_date2)case 0 x31: GoLeft(30,30); break;case 0 x32: GoLeft(30,0); break;cas

35、e 0 x33: GoLeft(0,30); break;default:break; break;case 0 x52:switch(R_date2)case 0 x31: GoRight(30,30); break;case 0 x32: GoRight(30,0); break;case 0 x33: GoRight(0,30); break;default:break; break;default:break;break;case 0 x46:switch(R_date1)case 0 x4c:switch(R_date2)case 0 x31: break;/控制前車燈case 0

36、x32: break;case 0 x33: break;/控制車前燈case 0 x34: break;default:break;break;default:break;break;default:break;else;附錄5 手機(jī)端軟件源代碼Java源碼import . URLConnection; /引用java中net包中的所有類import .MalformedURLException;import .URL;import java.io.*; /引用java中io包中所有的類import android.app.Activity; /創(chuàng)建Android應(yīng)用的Activity類im

37、port android.graphics.Bitmap; /導(dǎo)入Android中的資源文件 import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget

38、.TextView;import java.io.InputStream; public class wificar extends Activity /創(chuàng)建wificar應(yīng)用Activity類 /* Called when the activity is first created. */ EditText edAlias,edIP,edPort,edUser,edPW; TextView t; Button button1; URL videoUrl; private URLConnection conn; Bitmap bmp; public static String CameraIp

39、; private Handler mHandler ; private ImageView iv; MySurfaceView r; Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); edIP=(EditText)findViewById(R.id.editIP); edPort=(EditText)findViewById(R.id.editPort); button1=(Button)find

40、ViewById(R.id.button1); edIP.setText( :/:8080/?action=snapshot); CameraIp =edIP.getText().toString(); button1.setOnClickListener(new Button.OnClickListener() public void onClick(View v) r=new MySurfaceView(wificar .this); setContentView(r); r.GetCameraIP(CameraIp); /通過路由得到圖片,然后不斷刷新從而得到視頻

41、); Mysurface 類代碼import java.io.InputStream; /引用java包中的所有類import . URLConnection;import .MalformedURLException;import .URL;import android.view.SurfaceHolder.Callback;import android.content.Context; import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas; im

42、port android.graphics.Color;import android.graphics.Paint; import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.animation.Animation;public class MySurfaceView extends SurfaceView implements Callback, Runnable private SurfaceHolder sfh; private Thread th; private Canv

43、as canvas; private Paint paint; private int ScreenW, ScreenH; URL videoUrl; private String url; URLConnection conn; Bitmap bmp; public MySurfaceView(Context context) /窗口程序的顯示 super(context); th = new Thread(this); sfh = this.getHolder(); sfh.addCallback(this); paint = new Paint(); paint.setAntiAlias

44、(true); paint.setColor(Color.RED); this.setKeepScreenOn(true); /保持屏幕常亮 Override public void startAnimation(Animation animation) super.startAnimation(animation); public void surfaceCreated(SurfaceHolder holder) /獲取窗口程序的長寬 ScreenW = this.getWidth(); ScreenH = this.getHeight(); th.start(); private void

45、 draw() /獲得圖片或者顏色資源 try InputStream inputstream; inputstream = null; videoUrl=new URL(url); conn = ( URLConnection)videoUrl.openConnection(); conn.setDoInput(true); conn.connect(); inputstream = conn.getInputStream(); bmp = BitmapFactory.decodeStream(inputstream); canvas = sfh.lockCanvas(); canvas.d

46、rawColor(Color.WHITE); canvas.drawBitmap(bmp, 0, 0, paint); sfh.unlockCanvasAndPost(canvas); conn.disconnect(); catch (Exception ex) finally /if (canvas != null) /sfh.unlockCanvasAndPost(canvas); public void run() while (true) draw(); public void surfaceChanged(SurfaceHolder holder, int format, int

47、width, int height) public void surfaceDestroyed(SurfaceHolder holder) public void GetCameraIP(String p)url=p; /用于在窗口上面顯示視頻布局代碼: /窗口各個(gè)組件的布局顯示 Xml 資源使用 /版本與編碼的聲明 /manifest指定命名空間,包名稱,版本信息 /獲得用戶許可,以獲得連接網(wǎng)絡(luò),使用網(wǎng)絡(luò)的權(quán)限 /屬性表明名字引用,action表明該Activity是程序的入口 手機(jī)端控制命令java代碼import java.io.BufferedReader;import java.io

48、.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import .InetAddress;import .NetworkInterface;import .ServerSocket;import .Socket;import .SocketAddress;import .SocketException;import java.util.Enumeration;import android.app.Activity; import android.content.Context;import andr

49、oid.content.Intent;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.os.StrictMode;import android.text.method.ScrollingMovementMethod;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;impor

50、t android.widget.EditText;import android.widget.TextView;import android.widget.Toast;public class wificar extends Activity /創(chuàng)建wificar Activity 類 private Button startButton;private EditText IPText;private Button ForWard;private Button BackWard;private Button Stop;private Button TurnLeft;private Butto

51、n TurnRight;private TextView recvText;private Context mContext;private boolean isConnecting = false;private Thread mThreadClient = null;private Socket mSocketClient = null;static BufferedReader mBufferedReaderServer= null;static PrintWriter mPrintWriterServer = null;static BufferedReader mBufferedRe

52、aderClient= null;static PrintWriter mPrintWriterClient = null;private String recvMessageClient = ;private String recvMessageServer = ; Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); mContext = this; StrictMode.setThreadPoli

53、cy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() .penaltyLog() .build(); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .penaltyLog() .penaltyDeath() .build(); IPText= (EditText)findViewById(R.id.IPText); /IPText

54、.setText(5:); IPText.setText(00); startButton= (Button)findViewById(R.id.StartConnect); startButton.setOnClickListener(StartClickListener); ForWard= (Button)findViewById(R.id.ForWard); ForWard.setOnClickListener(ForWardClickListener); Stop= (Button)findViewById(R.id.Stop); Stop.se

55、tOnClickListener(StopClickListener); TurnLeft= (Button)findViewById(R.id.TurnLeft); TurnLeft.setOnClickListener(TurnLeftClickListener); TurnRight= (Button)findViewById(R.id.TurnRight); TurnRight.setOnClickListener(TurnRightClickListener); BackWard= (Button)findViewById(R.id.BackWard); BackWard.setOn

56、ClickListener(BackWardClickListener); recvText= (TextView)findViewById(R.id.RecvText); recvText.setMovementMethod(ScrollingMovementMethod.getInstance(); private OnClickListener StartClickListener = new OnClickListener() Overridepublic void onClick(View arg0) if (isConnecting) isConnecting = false;tr

57、y if(mSocketClient!=null)mSocketClient.close();mSocketClient = null;mPrintWriterClient.close();mPrintWriterClient = null; catch (IOException e) e.printStackTrace();mThreadCerrupt();startButton.setText(開始連接);IPText.setEnabled(true);recvText.setText(ok:n);elseisConnecting = true;startButton.s

58、etText(停止連接);IPText.setEnabled(false);mThreadClient = new Thread(mRunnable);mThreadClient.start();private OnClickListener ForWardClickListener = new OnClickListener() Overridepublic void onClick(View arg0) / TODO Auto-generated method stubif ( isConnecting & mSocketClient!=null) String PWM1 =PWM 1 1

59、00 50;String PWM2 =PWM 2 100 50;String OUTPUT =OUTPUT 0;try mPrintWriterClient.print(PWM1);/發(fā)送PWM1信息給路由 mPrintWriterClient.flush(); mPrintWriterClient.print(PWM2);/發(fā)送PWM2信息給路由 mPrintWriterClient.flush(); Thread.sleep(600); mPrintWriterClient.print(OUTPUT);/發(fā)送方向給路由 mPrintWriterClient.flush();catch (E

60、xception e) / TODO: handle exceptionToast.makeText(mContext, 發(fā)送異常: + e.getMessage(), Toast.LENGTH_SHORT).show();elseToast.makeText(mContext, 沒有連接, Toast.LENGTH_SHORT).show();private OnClickListener StopClickListener = new OnClickListener() Overridepublic void onClick(View arg0) / TODO Auto-generated

溫馨提示

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

評論

0/150

提交評論