智能小車畢業(yè)設(shè)計(jì)正文_第1頁(yè)
智能小車畢業(yè)設(shè)計(jì)正文_第2頁(yè)
智能小車畢業(yè)設(shè)計(jì)正文_第3頁(yè)
智能小車畢業(yè)設(shè)計(jì)正文_第4頁(yè)
智能小車畢業(yè)設(shè)計(jì)正文_第5頁(yè)
已閱讀5頁(yè),還剩47頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

word文檔可自由復(fù)制編輯目錄1前言 12總體方案設(shè)計(jì) 33安卓操作系統(tǒng)簡(jiǎn)介 53.1安卓操作系統(tǒng)發(fā)展 53.2安卓開(kāi)發(fā)與建立 53.3安卓的應(yīng)用程序分析 63.4安卓的藍(lán)牙開(kāi)發(fā)技術(shù) 73.5安卓平臺(tái)的藍(lán)牙編程 74系統(tǒng)軟件程序設(shè)計(jì) 124.1C語(yǔ)言編程環(huán)境介紹: 124.2各模塊的編程 135系統(tǒng)調(diào)試 205.1C語(yǔ)言的調(diào)試 205.2JAVA語(yǔ)言的調(diào)試 236總結(jié)與體會(huì) 257謝辭 268參考文獻(xiàn) 27附錄:程序: 27word文檔可自由復(fù)制編輯第1章前言(緒論)1.1智能小車的意義和作用隨著科學(xué)技術(shù)的發(fā)展,機(jī)器人開(kāi)始出現(xiàn)在人們的視野中,機(jī)器人的研究一直是科學(xué)家們熱衷的事,并努力把機(jī)器人運(yùn)用到生活的方方面面。目前機(jī)器人的發(fā)展已經(jīng)遍及機(jī)械、電子、冶金、交通、宇航、國(guó)防等領(lǐng)域。近年來(lái)機(jī)器人的智能水平不斷提高,并且迅速地改變著人們的生活方式。人們?cè)诓粩嗵接憽⒏脑臁⒄J(rèn)識(shí)自然的過(guò)程中,制造能替代人勞動(dòng)的機(jī)器一直是人類的夢(mèng)想。隨著科學(xué)技術(shù)的發(fā)展,機(jī)器人的感覺(jué)傳感器種類越來(lái)越多,其中視覺(jué)傳感器成為自動(dòng)行走和駕駛的重要部件。視覺(jué)的典型應(yīng)用領(lǐng)域?yàn)樽灾魇街悄軐?dǎo)航系統(tǒng),對(duì)于視覺(jué)的各種技術(shù)而言圖像處理技術(shù)已相當(dāng)發(fā)達(dá),而基于圖像的理解技術(shù)還很落后,機(jī)器視覺(jué)需要通過(guò)大量的運(yùn)算也只能識(shí)別一些結(jié)構(gòu)化環(huán)境簡(jiǎn)單的目標(biāo)。視覺(jué)傳感器的核心器件是攝像管或CCD,目前的CCD已能做到自動(dòng)聚焦。但CCD傳感器的價(jià)格、體積和使用方式上并不占優(yōu)勢(shì),因此在不要求清晰圖像只需要粗略感覺(jué)的系統(tǒng)中考慮使用接近覺(jué)傳感器是一種實(shí)用有效的方法。機(jī)器人要實(shí)現(xiàn)自動(dòng)導(dǎo)引功能和避障功能就必須要感知導(dǎo)引線和障礙物,感知導(dǎo)引線相當(dāng)給機(jī)器人一個(gè)視覺(jué)功能。避障控制系統(tǒng)是基于自動(dòng)導(dǎo)引小車(AVG—auto-guidevehicle)系統(tǒng),基于它的智能小車實(shí)現(xiàn)自動(dòng)識(shí)別路線,判斷并自動(dòng)避開(kāi)障礙,選擇正確的行進(jìn)路線。使用傳感器感知路線和障礙并作出判斷和相應(yīng)的執(zhí)行動(dòng)作。該智能小車可以作為機(jī)器人的典型代表。它可以分為三大組成部分:傳感器檢測(cè)部分、執(zhí)行部分、CPU。機(jī)器人要實(shí)現(xiàn)自動(dòng)避障功能,還可以擴(kuò)展循跡等功能,感知導(dǎo)引線和障礙物。可以實(shí)現(xiàn)小車自動(dòng)識(shí)別路線,選擇正確的行進(jìn)路線,并檢測(cè)到障礙物自動(dòng)躲避。基于上述要求,傳感檢測(cè)部分考慮到小車一般不需要感知清晰的圖像,只要求粗略感知即可,所以可以舍棄昂貴的CCD傳感器而考慮使用價(jià)廉物美的紅外反射式傳感器來(lái)充當(dāng)。智能小車的執(zhí)行部分,是由直流電機(jī)來(lái)充當(dāng)?shù)模饕刂菩≤嚨男羞M(jìn)方向和速度。單片機(jī)驅(qū)動(dòng)直流電機(jī)一般不占用單片機(jī)資源,直接選擇有PWM功能的單片機(jī),這可以由軟件模擬PWM輸出調(diào)制,需要占用單片機(jī)資源,難以精確調(diào)速,但單片機(jī)型號(hào)的選擇余地較大。考慮到實(shí)際情況,CPU使用STC89C52單片機(jī),配合軟件編程實(shí)現(xiàn)。1.2智能小車的現(xiàn)狀隨著計(jì)算機(jī)和控制技術(shù)的發(fā)展,智能移動(dòng)小車在很多行業(yè)都有實(shí)質(zhì)成果。工作的環(huán)境也從很單純的室內(nèi)環(huán)境發(fā)展成了各種復(fù)雜環(huán)境,如地面,水下,太空等等。在小車的功能發(fā)面,越來(lái)越多的新功能被小車所運(yùn)用,如實(shí)現(xiàn)循跡、避障、檢測(cè)貼片、尋光入庫(kù)、避崖,拍攝,遠(yuǎn)程傳輸信號(hào)等等。國(guó)內(nèi)智能車輛研究現(xiàn)狀相比于國(guó)外,我國(guó)開(kāi)展智能車輛技術(shù)方面的研究起步較晚,開(kāi)始于20世紀(jì)80年代。而且大多數(shù)研究處在于針對(duì)某個(gè)單項(xiàng)技術(shù)研究的階段。雖然我國(guó)在智能車輛技術(shù)方面的研究總體上落后于發(fā)達(dá)國(guó)家,并且存在一定得技術(shù)差距,但是我們也取得了一系列的成果,主要有:(1)中國(guó)第一汽車集團(tuán)公司和國(guó)防科技大學(xué)機(jī)電工程與自動(dòng)化學(xué)院與2003年研制成功我國(guó)第一輛自主駕駛轎車。該自主駕駛轎車在正常交通情況下的高速公路上,行駛的最高穩(wěn)定速度為13km/h,最高峰值速度達(dá)170km/h,并且具有超車功能,其總體技術(shù)性能和指標(biāo)已經(jīng)達(dá)到世界先進(jìn)水平。(2)南京理工大學(xué)、北京理工大學(xué)、浙江大學(xué)、國(guó)防科技大學(xué)、清華大學(xué)等多所院校聯(lián)合研制了7B.8軍用室外自主車,該車裝有彩色攝像機(jī)、激光雷達(dá)、陀螺慣導(dǎo)定位等傳感器。計(jì)算機(jī)系統(tǒng)采用兩臺(tái)Sun10完成信息融合、路徑規(guī)劃,兩臺(tái)PC486完成路邊抽取識(shí)別和激光信息處理,8098單片機(jī)完成定位計(jì)算和車輛自動(dòng)駕駛。其體系結(jié)構(gòu)以水平式結(jié)構(gòu)為主,采用傳統(tǒng)的“感知-建模-規(guī)劃-執(zhí)行”算法,其直線跟蹤速度達(dá)到20km/h,避障速度達(dá)到5-10km/h。智能車輛研究也是智能交通系統(tǒng)ITS的關(guān)鍵技術(shù)。目前,國(guó)內(nèi)的許多高校和科研院所都在進(jìn)行ITS關(guān)鍵技術(shù)、設(shè)備的研究。隨著ITS研究的興起,我國(guó)已形成一支ITS技術(shù)研究開(kāi)發(fā)的技術(shù)專業(yè)隊(duì)伍。并且各交通、汽車企業(yè)越來(lái)越加大了對(duì)ITS及智能車輛技術(shù)研發(fā)的投入,整個(gè)社會(huì)的關(guān)注程度在不斷提高。交通部已將ITS研究列入“十五”科技發(fā)展計(jì)劃和2010年長(zhǎng)期規(guī)劃。相信經(jīng)過(guò)相關(guān)領(lǐng)域的共同努力,我國(guó)ITS及智能車輛的技術(shù)水平一定會(huì)得到很大提高。可以預(yù)計(jì),我國(guó)飛速發(fā)展的經(jīng)濟(jì)實(shí)力將為智能車輛的研究提供一個(gè)更加廣闊的前景。我們要結(jié)合我國(guó)國(guó)情,在某一方面或某些方面,對(duì)智能車進(jìn)行深入細(xì)致的研究,為它今后的發(fā)展及實(shí)際應(yīng)用打下堅(jiān)實(shí)的基礎(chǔ)。第2章總體方案設(shè)計(jì)根據(jù)要求,確定如下方案:在現(xiàn)有玩具電動(dòng)車的基礎(chǔ)上,加裝紅外對(duì)光管,超聲波收發(fā)傳感器,實(shí)現(xiàn)對(duì)電動(dòng)車的速度、位置、運(yùn)行狀況的實(shí)時(shí)測(cè)量,并將測(cè)量數(shù)據(jù)傳送至單片機(jī)進(jìn)行處理,然后由單片機(jī)根據(jù)所檢測(cè)的各種數(shù)據(jù)實(shí)現(xiàn)對(duì)電動(dòng)車的智能控制。同時(shí)。加裝的藍(lán)牙模塊,可以輔助控制小車,當(dāng)小車的循跡出現(xiàn)故障,或者需要手動(dòng)控制小車實(shí)現(xiàn)某種功能時(shí),可以使用手機(jī)上的安卓軟件,發(fā)出控制信號(hào)給藍(lán)牙,藍(lán)牙接收后傳給小車,實(shí)現(xiàn)對(duì)小車的控制。這種方案能實(shí)現(xiàn)對(duì)電動(dòng)車的運(yùn)動(dòng)狀態(tài)進(jìn)行實(shí)時(shí)控制,控制靈活、可靠,精度高,可滿足對(duì)系統(tǒng)的各項(xiàng)要求總體方案框圖SStc89c52循跡紅外對(duì)管時(shí)鐘電路復(fù)位電路藍(lán)牙模塊電機(jī)驅(qū)動(dòng)超聲波紅外避障循跡模塊;用兩只紅外對(duì)管,分別置于小車車身前軌道的兩側(cè),根據(jù)兩只光電開(kāi)關(guān)接受到白線與黑線的情況來(lái)控制小車轉(zhuǎn)向來(lái)調(diào)整車向,測(cè)試表明,只要合理安裝好兩只光電開(kāi)關(guān)的位置就可以很好的實(shí)現(xiàn)循跡的功能避障模塊;用超聲波避障,聲波測(cè)距是通過(guò)不斷檢測(cè)超聲波發(fā)射后遇到障礙物所反射的回波,從而測(cè)出發(fā)射和接收回波的時(shí)間差T,然后求出距離L=CT。超聲波發(fā)射器向某一方向發(fā)射超聲波,在發(fā)射時(shí)刻的同時(shí)開(kāi)始計(jì)時(shí),超聲波在空氣中傳播,途中碰到障礙物就立即返回來(lái),超聲波接收器收到反射波就立即停止計(jì)時(shí)。然后通過(guò)一定的電路把數(shù)據(jù)傳給單片機(jī),單片機(jī)通過(guò)和障礙物間的距離來(lái)決定小車是否需要調(diào)整前進(jìn)方向。電源模塊;采用2支18650鋰電池電源供電,電源電壓足夠小車和單片機(jī)的運(yùn)行,可以很好的實(shí)現(xiàn)功能,鋰電池還可以充電,可以多次使用。無(wú)線模塊;用的無(wú)線模塊是當(dāng)今社會(huì)上便攜式設(shè)備中普遍具有的藍(lán)牙無(wú)線模塊,該模塊性能穩(wěn)定,傳輸速率快,穩(wěn)定可靠,傳輸距離可觀。該芯片使用簡(jiǎn)單,具有通用的串行通信端口,在市場(chǎng)中具有較高的知名度,且藍(lán)牙技術(shù)發(fā)展前景良好,廣受客戶的好評(píng)。該設(shè)備最大的優(yōu)點(diǎn)是無(wú)需制作專門的遙控器,可直接通過(guò)手機(jī)上的藍(lán)牙設(shè)備發(fā)送相關(guān)的指令,操作方便快捷,界面人性化設(shè)計(jì),具有良好的人機(jī)對(duì)話界面第3章安卓操作系統(tǒng)的簡(jiǎn)介3.1安卓操作系統(tǒng)的發(fā)展在20007年11月12日,開(kāi)放手機(jī)聯(lián)盟發(fā)布googleandroidsdk,android作為一個(gè)系統(tǒng),是一個(gè)運(yùn)行在LINUX2.6核心上的Java基礎(chǔ)的操作系統(tǒng)。系統(tǒng)是非常輕量。Android應(yīng)用程序用Java開(kāi)發(fā)而且很容易被放置到新的平臺(tái)上。在此同時(shí),谷歌也宣布建立一個(gè)全球性質(zhì)的聯(lián)盟,這個(gè)組織由許多家手機(jī)的制造,軟件的開(kāi)發(fā)商,芯片制造商,運(yùn)營(yíng)這些產(chǎn)品的銷售商組成。這一聯(lián)盟將致力于谷歌發(fā)布手機(jī)操作系統(tǒng)的開(kāi)發(fā)以及它所涉及的應(yīng)用軟件的開(kāi)發(fā),3.2安卓開(kāi)發(fā)建立一、Android平臺(tái)所具有的特點(diǎn)1開(kāi)放性,Android從底層被構(gòu)建,使開(kāi)發(fā)者可以創(chuàng)造隱忍注意的手機(jī)應(yīng)用程序并且能夠充分利用所有的付費(fèi)的手機(jī),它是真正的被構(gòu)建成開(kāi)放的。例如,一個(gè)應(yīng)用程序可以調(diào)用任一手機(jī)的核心功能,打短信,打電話等等。它允許開(kāi)發(fā)者為使用者創(chuàng)造平臺(tái)使其有身臨其境的體驗(yàn)。2所有的平臺(tái)都是平等建立的,打破了應(yīng)用程序局限,Android打破創(chuàng)建新的,創(chuàng)新的應(yīng)用程序的局限,例如,開(kāi)發(fā)者可以讓個(gè)人手機(jī)上的數(shù)據(jù)和網(wǎng)站上的數(shù)據(jù)連接在一起,如用戶的聯(lián)系人,日歷,位置提供了一個(gè)很有意義的用戶體驗(yàn),開(kāi)發(fā)者可以創(chuàng)建一個(gè)應(yīng)用程序,這個(gè)程序可以使用戶看到他們朋友的位置和改變后的位置,如果發(fā)現(xiàn)他們就在附近,就可以馬上和他們聯(lián)系了。3,快速并且簡(jiǎn)單的應(yīng)用程序的開(kāi)發(fā)。Android提供了寬范圍的有用類庫(kù)和工具,用這些可以創(chuàng)建豐富的應(yīng)用程序,例如Android使開(kāi)發(fā)者可以獲得設(shè)備的地理位置,并允許設(shè)備通過(guò)同類對(duì)同類的方式和其他設(shè)備通信,另外Android包括一套完整的工具,這些工具提供開(kāi)發(fā)者高度的生產(chǎn)力和深度探究他們的應(yīng)用程序4。Google應(yīng)用;互聯(lián)網(wǎng)上的谷歌已經(jīng)有多年的歷史了,從開(kāi)始的只是搜索島現(xiàn)在各個(gè)方面的滲透,如谷歌地圖,郵件等等,谷歌的這些服務(wù)已經(jīng)成為聯(lián)系用戶和互聯(lián)網(wǎng)的重要關(guān)系紐帶,安卓平臺(tái)的手機(jī)都可以完美的結(jié)合這些優(yōu)秀的服務(wù)。3.3Android應(yīng)用程序的分析對(duì)于一個(gè)Android應(yīng)用程序有四種部分構(gòu)成;1activity2intentreceiver3service4contentprovider不是每一個(gè)的應(yīng)用程序都需要這四個(gè)部分,但是應(yīng)用程序?qū)?huì)用這些來(lái)組合編寫(xiě)。一但決定了應(yīng)用程序所需要的組件,就需要在一個(gè)叫Androidmanifest.xml文件中列出他們,這是一個(gè)XML文件,在里面需要聲明應(yīng)用程序的組件和他們的功能需求。Activity是Android最普通的構(gòu)建模塊,它通常在應(yīng)用程序中是一個(gè)單獨(dú)的屏幕。每一個(gè)activity是被實(shí)現(xiàn)作為一個(gè)繼承于activity基類的單獨(dú)的類。例如;一個(gè)文本消息發(fā)送程序可能有一個(gè)顯示要發(fā)送信息的屏幕,有一個(gè)顯示給選中要發(fā)送的聯(lián)系人的屏幕。每一個(gè)這些屏幕都會(huì)被一個(gè)activity實(shí)現(xiàn)。Android使用一個(gè)叫做intent的特殊類來(lái)讓?xiě)?yīng)用程序從一個(gè)屏動(dòng)到另外一個(gè)屏幕。Intent描述了一個(gè)應(yīng)用程序想要干什么。Intent數(shù)據(jù)結(jié)構(gòu)的兩個(gè)最重要的部分是;要響應(yīng)的action和data。典型的action值是MAIN,VIEW,PICK,EDIT,等等,data表示成一個(gè)統(tǒng)一資源定界符。Intentreceiver當(dāng)你想要在你的應(yīng)用程序中編碼來(lái)執(zhí)行對(duì)外部事件的響應(yīng),你可以使用一個(gè)intentreceiver.例如當(dāng)電話響鈴,或當(dāng)數(shù)據(jù)網(wǎng)絡(luò)可用時(shí),或當(dāng)午夜時(shí),雖然intentreceiver不·顯示一個(gè)UI,但它們也許會(huì)顯示一個(gè)來(lái)通知和提醒用戶是否有令人感興趣的事件發(fā)生。intentreceiver也是在Androidmanifest.XML中被注冊(cè),但你也可以在代碼中使用context.registerreceiver()來(lái)注冊(cè)它們,它的intentreceiver被調(diào)用時(shí),你的程序不是非得運(yùn)行;假如必要時(shí),當(dāng)一個(gè)intentreceiver被觸發(fā)時(shí),系統(tǒng)將會(huì)調(diào)用你的應(yīng)用程序。Service;一個(gè)service是長(zhǎng)期存活并且運(yùn)行時(shí)不帶UI的編碼,例如,當(dāng)在音樂(lè)播放器中播放歌曲時(shí),可能在這個(gè)播放器中能有一個(gè)或者更多的activity,這些activity允許用戶選擇歌曲和開(kāi)始播放歌曲。然而,音樂(lè)回放本身不應(yīng)該被一個(gè)activity處理,因?yàn)橛脩魧⑵谕趯?dǎo)航到一個(gè)新的屏幕后音樂(lè)保持播放。Contentprovider應(yīng)用程序可以把他們的數(shù)據(jù)存儲(chǔ)到文件中,一個(gè)SQLite數(shù)據(jù)庫(kù)中,設(shè)置中,或者是任何其他的有意義結(jié)構(gòu)中。如果你想要你的應(yīng)用程序的數(shù)據(jù)和其他應(yīng)用程序共享,一個(gè)contentprovider是有用的。一個(gè)contentprovider是一個(gè)類,它實(shí)現(xiàn)了方法的一個(gè)標(biāo)準(zhǔn)設(shè)置來(lái)讓其他應(yīng)用程序存儲(chǔ)和恢復(fù)被contentprovider處理的數(shù)據(jù)類型。3.4Android接連接請(qǐng)求的時(shí)候,并且已經(jīng)連接到了的時(shí)候,Blueboothserversocket類將會(huì)返回一個(gè)

第4章系統(tǒng)軟件程序設(shè)計(jì)4.1c語(yǔ)言編程環(huán)境介紹由于本次設(shè)計(jì)中程序系統(tǒng)用C語(yǔ)言編寫(xiě)程序。此次設(shè)計(jì)所選用的單片機(jī)是AT89C52單片機(jī),其C語(yǔ)言語(yǔ)法和結(jié)構(gòu)和標(biāo)準(zhǔn)C語(yǔ)言基本相同,只是有了相應(yīng)的擴(kuò)充,用到的編譯軟件是KeilC。下面結(jié)合我的程序編譯簡(jiǎn)要介紹以下KeilC的編譯環(huán)境的特點(diǎn)。KeilC51軟件提供豐富的庫(kù)函數(shù)和功能強(qiáng)大的集成開(kāi)發(fā)調(diào)試工具,全Windows界面。另外重要的一點(diǎn),只要看一下編譯后生成的匯編代碼,就能體會(huì)到KeilC51生成的目標(biāo)代碼效率非常之高,多數(shù)語(yǔ)句生成的匯編代碼很緊湊,容易理解。KeilC51是美國(guó)KeilSoftware公司出品的51系列兼容單片機(jī)C語(yǔ)言軟件開(kāi)發(fā)系統(tǒng),與匯編相比,C語(yǔ)言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢(shì),因而易學(xué)易用。Keil提供了包括C編譯器、宏匯編、連接器、庫(kù)管理和一個(gè)功能強(qiáng)大的仿真調(diào)試器等在內(nèi)的完整開(kāi)發(fā)方案,通過(guò)一個(gè)集成開(kāi)發(fā)環(huán)境(uVision)將這些部分組合在一起。KeilC51軟件提供豐富的庫(kù)函數(shù)和功能強(qiáng)大的集成開(kāi)發(fā)調(diào)試工具,全Windows界面。另外重要的一點(diǎn),只要看一下編譯后生成的匯編代碼,就能體會(huì)到KeilC51生成的目標(biāo)代碼效率非常之高,多數(shù)語(yǔ)句生成的匯編代碼很緊湊,容易理解。在開(kāi)發(fā)大型軟件時(shí)更能體現(xiàn)高級(jí)語(yǔ)言的優(yōu)勢(shì)。C51工具包的整體結(jié)構(gòu),uVision與Ishell分別是C51forWindows和forDos的集成開(kāi)發(fā)環(huán)境(IDE),可以完成編輯、編譯、連接、調(diào)試、仿真等整個(gè)開(kāi)發(fā)流程。開(kāi)發(fā)人員可用IDE本身或其它編輯器編輯C或匯編源文件。然后分別由C51及C51編譯器編譯生成目標(biāo)文件(.OBJ)。目標(biāo)文件可由LIB51創(chuàng)建生成庫(kù)文件,也可以與庫(kù)文件一起經(jīng)L51連接定位生成絕對(duì)目標(biāo)文件(.ABS)。ABS文件由OH51轉(zhuǎn)換成標(biāo)準(zhǔn)的Hex文件,以供調(diào)試器dScope51或tScope51使用進(jìn)行源代碼級(jí)調(diào)試,也可由仿真器使用直接對(duì)目標(biāo)板進(jìn)行調(diào)試,也可以直接寫(xiě)入程序存貯器如EPROM中。4.2各部分模塊編程1循跡部分循跡部分使用紅外線檢測(cè)黑線,將信號(hào)傳給單片機(jī),通過(guò)單片機(jī)來(lái)控制小車實(shí)現(xiàn)循跡功能,流程圖如下。開(kāi)始開(kāi)始前進(jìn)掃描I/O口,是否檢測(cè)到黑線Y左邊右邊左轉(zhuǎn)右轉(zhuǎn)N2避障部分主程序完成初始化工作、各路超聲波發(fā)射和接收順序的控制。定時(shí)中斷服務(wù)子程序完成三個(gè)方向超聲波的輪流發(fā)射,外部中斷服務(wù)子程序主要完成時(shí)間值的讀取、距離計(jì)算、結(jié)果的輸出等工作。3藍(lán)牙部分藍(lán)牙模塊輸入的信息進(jìn)行存儲(chǔ)分析,來(lái)控制電機(jī)驅(qū)動(dòng),以達(dá)到控制小車的前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)。在這個(gè)過(guò)程中,單片機(jī)首先進(jìn)行初始化,包括設(shè)置單片機(jī)各個(gè)端口的方向,各個(gè)變量的初始化,以及單片機(jī)振蕩頻率的校準(zhǔn)等。單片機(jī)定時(shí)對(duì)藍(lán)牙模塊串口讀數(shù)據(jù),如果串口的數(shù)據(jù)讀出,則對(duì)讀出的數(shù)據(jù)進(jìn)行分析,讀出的數(shù)據(jù)如果為A、B、C、D則分別對(duì)應(yīng)小車的前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)。小車硬件系統(tǒng)軟件設(shè)計(jì)的流程圖開(kāi)始開(kāi)始初始化初始化30秒內(nèi)連接串口是否連接30秒內(nèi)連接串口是否連接串口數(shù)據(jù)是否發(fā)送 是串口數(shù)據(jù)是否發(fā)送等待30秒內(nèi)發(fā)送等待30秒內(nèi)發(fā)送判斷數(shù)據(jù)判斷數(shù)據(jù)驅(qū)動(dòng)電機(jī)控制小車前進(jìn),后退,左轉(zhuǎn),右轉(zhuǎn)。驅(qū)動(dòng)電機(jī)控制小車前進(jìn),后退,左轉(zhuǎn),右轉(zhuǎn)。手機(jī)端程序的設(shè)計(jì)本程序是基于Android2.1系統(tǒng),所用開(kāi)發(fā)工具為Eclipse集成開(kāi)發(fā)環(huán)境,Eclipse是著名的跨平臺(tái)的自由集成開(kāi)發(fā)環(huán)境(IDE)。最初主要用來(lái)Java語(yǔ)言開(kāi)發(fā),但是目前亦有人通過(guò)插件使其作為其他計(jì)算機(jī)語(yǔ)言比如C++、Python和Android的開(kāi)發(fā)工具,在此開(kāi)發(fā)環(huán)境下開(kāi)發(fā)軟件非常的方便。首先設(shè)計(jì)本系統(tǒng)手機(jī)端軟件的程序界面,為了盡快實(shí)現(xiàn)程序的功能,本程序沒(méi)有對(duì)軟件界面設(shè)計(jì)做特別美化的設(shè)計(jì),僅包含我們所用到的幾個(gè)按鈕和圖形顯示,以實(shí)現(xiàn)我們的功能為最大目標(biāo)。下面介紹Android相關(guān)資源文件的作用[16、17]:1、assets文件夾:此文件夾也可以存放資源文件,而且/assets目錄下的資源文件不會(huì)在R.java自動(dòng)生成ID,所以讀取/assets目錄下的文件必須指定文件的路徑(url的路徑為:)。除此之外,我們還可以通過(guò)AssetManager類來(lái)訪問(wèn)這些文件。打開(kāi)文件時(shí),會(huì)把a(bǔ)pk文件當(dāng)做zip文件進(jìn)行解壓讀取。但是有文件大小有限制:不能超過(guò)1M(android2.2好像放寬(或者取消)了這個(gè)限制(至少可以存放>10M,具體沒(méi)有測(cè)試。))。2、res文件夾:主要用來(lái)存放資源。此文件夾下可以創(chuàng)建子文件,常見(jiàn)的有:動(dòng)畫(huà)anim,圖片drawable,顏色color,菜單menu,布局layout,常量值values,詳細(xì)如下:(1)anim文件夾:后綴名為.xml。動(dòng)畫(huà)文件都放在這里。(2)drawable文件夾:用于存放圖片資源,圖片或者xml。圖片格式,有png,9.png,jpg,gif都行。xml文件通常為自定義的形狀shape或圖片選擇器類selector似的東西,就是不同狀態(tài)下不同的圖片,用于設(shè)置background的。對(duì)分辨率籠統(tǒng)的分,可以分為高中低三種分辨率。(3)color文件夾:用于存放color列表,和drawable的xml一樣,表示不同狀態(tài)下的不同顏色(4)menu文件夾:菜單資源文件夾layout文件夾:布局文件夾。此文件夾的名字也是可以起到屏幕適配的功能的。①橫豎屏:layout-land|port;②分辨率:layout-1280x720(6)values文件夾:存放常量值的文件夾。里面常見(jiàn)的xml文件為arrays.xml:資源數(shù)組;colors.xml:顏色值;dimens.xml:像素值;strings.xml:字符串值;tyles.xml:樣式值。此文件夾,也有屏幕適配作用。比如:dimens在不同分辨率下的值。同樣的是加-1280x720這樣的后綴。對(duì)于strings,有各種語(yǔ)言的版本對(duì)應(yīng)。默認(rèn)為英文。中文的文件夾名字應(yīng)該是:values-zh-rCN,values-zh-rTW。(7)raw文件夾:存放不需要系統(tǒng)編譯成二進(jìn)制的文件,例如字體文件等同assets文件夾類似。(8)xml文件夾存放xml文件。開(kāi)始開(kāi)始初始化初始化藍(lán)牙是否打開(kāi)藍(lán)牙是否打開(kāi)30秒等待30秒等待 否 是藍(lán)牙是否配對(duì)藍(lán)牙是否配對(duì)搜索藍(lán)牙地址搜索藍(lán)牙地址 否 是等待藍(lán)牙連接藍(lán)牙是否連接 否等待藍(lán)牙連接藍(lán)牙是否連接 是等待監(jiān)聽(tīng)器按下監(jiān)聽(tīng)器是否按下等待監(jiān)聽(tīng)器按下監(jiān)聽(tīng)器是否按下 是發(fā)送藍(lán)牙API發(fā)送藍(lán)牙API藍(lán)牙通信流程圖以下是手機(jī)端實(shí)現(xiàn)功能的程序流程圖如圖5.2所示手機(jī)界面程序設(shè)計(jì)在設(shè)置手機(jī)界面的時(shí)候,在Eclipse集成開(kāi)發(fā)環(huán)境下,首先新建一個(gè)android項(xiàng)目工程,興建路徑是File—New—androidproject—projectname選擇android1.6版本,工程名命名為Bluetooth-car,選擇CreateActivity,則自動(dòng)創(chuàng)建了一個(gè)Activity.在創(chuàng)建Activity時(shí),需要注意一下四個(gè)要點(diǎn):1、一個(gè)Activity就是一個(gè)類,并且這個(gè)類要繼承Activity。2、需要復(fù)寫(xiě)Oncreate方法(當(dāng)一個(gè)Activity第一次運(yùn)行顯示在手機(jī)上或者虛擬機(jī)上的時(shí)就會(huì)調(diào)用Oncreate方法)。3、每一個(gè)Activity都需要在Androidmanifast.xml文件當(dāng)中配置。4、為Activity添加必要的控件。如圖5.3所示,在制作藍(lán)牙小車手機(jī)界面的時(shí)候,我用到了Textview文本控件和Butten按鈕控件,并且在添加控件時(shí)采用相對(duì)布局形式[18、19]。兩個(gè)Textview文本控件分別命名為:后備軍官學(xué)院和藍(lán)牙控制系統(tǒng),在layout布局文件下可以任意改變控件的位置、字體的大小、背景圖片。改變背景圖片的方法為:首先將需要用到的背景圖片,分別拖入到drawable下,高中低分辨率都拖入一張,以便不同分辨率的手機(jī)識(shí)別,然后在layout布局文兩個(gè)Textview文本控件分別命名為:后備軍官學(xué)院學(xué)院和藍(lán)牙控制系統(tǒng),在layout布局文件下可以任意改變控件的位置、字體的大小、背景圖片。改變背景圖片的方法為:首先將需要用到的背景圖片,分別拖入到drawable下,高中低分辨率都拖入一張,以便不同分辨率的手機(jī)識(shí)別,然后在layout布局。二、手機(jī)監(jiān)聽(tīng)程序設(shè)計(jì)在Eclipes開(kāi)發(fā)平臺(tái)上,首先在Layout文件中采用相對(duì)布局的形式設(shè)計(jì)完成手機(jī)界面以后,就要考慮為我們的每個(gè)Butten按鍵綁定監(jiān)聽(tīng)程序,以實(shí)現(xiàn)在每個(gè)按鍵按下時(shí),就能通過(guò)手機(jī)藍(lán)牙發(fā)送相應(yīng)的數(shù)據(jù)到小車藍(lán)牙接收模塊。首先在Layout文件中,每添加一個(gè)控件,都會(huì)為這個(gè)控件設(shè)置一個(gè)ID,(如android:id="@+id/button1"),然后在R.JAVA文件就會(huì)自動(dòng)生成一個(gè)ID地址。然后在主程序里面編寫(xiě)監(jiān)聽(tīng)程序,當(dāng)按鍵按下的時(shí)候,通過(guò)監(jiān)聽(tīng)按鍵的ID地址的不同,采用switch結(jié)構(gòu),跳轉(zhuǎn)到不同的case里,向小車藍(lán)牙模塊發(fā)送不同的數(shù)據(jù)。在程序里直接寫(xiě)進(jìn)小車藍(lán)牙模塊的藍(lán)牙地址(00:12:10:31:01:70),當(dāng)程序開(kāi)始運(yùn)行時(shí),將會(huì)自動(dòng)搜索該地址的藍(lán)牙芯片,當(dāng)進(jìn)行過(guò)一次配對(duì)連接以后,將會(huì)記憶該地址,以后每次只要打開(kāi)手機(jī)界面,開(kāi)始運(yùn)行時(shí)就會(huì)自動(dòng)進(jìn)行搜索配對(duì)連接好[20、21]。*按鈕點(diǎn)擊事件.*@paramv*/publicvoidonClick(Viewv){switch(v.getId()){//轉(zhuǎn)寫(xiě)按鈕caseR.id.button1:message[0]=(byte)0x41;vibrator();Toast.makeText(this,"前進(jìn)",Toast.LENGTH_LONG).show();bluesend(message);break;//設(shè)置按鈕caseR.id.button2:message[0]=(byte)0x44vibrator();Toast.makeText(this,"后退",Toast.LENGTH_LONG).show();bluesend(message);break;caseR.id.button3:message[0]=(byte)0x43;vibrator();Toast.makeText(this,"左轉(zhuǎn)",Toast.LENGTH_LONG).show();bluesend(message);break;caseR.id.button4:message[0]=(byte)0x42;vibrator();Toast.makeText(this,"右轉(zhuǎn)",Toast.LENGTH_LONG).show();bluesend(message);break;caseR.id.button5:message[0]=(byte)0x61;vibrator();Toast.makeText(this,"停止",Toast.LENGTH_LONG).show();bluesend(message);break;default:break;第5章系統(tǒng)調(diào)試5.1·C語(yǔ)言的調(diào)試軟件的調(diào)試包括程序本身語(yǔ)法的調(diào)試和在電路板上功能的調(diào)試兩種。在編程過(guò)程中,為了得到滿足要求的用戶程序,一般都需要有一個(gè)對(duì)程序的調(diào)試過(guò)程,甚至需要經(jīng)過(guò)多次反復(fù)的調(diào)試才能完成。在調(diào)試程序前為了調(diào)試方便,避免程序出錯(cuò)時(shí)將單片機(jī)拆來(lái)拆去的麻煩,在電路板上做了一個(gè)下載口,可以將下載線直接插到電路板上進(jìn)行調(diào)試,這樣就可以一邊進(jìn)行調(diào)試,一邊修改程序。程序用KeilC軟件寫(xiě)好后,先用該軟件的編譯功能編譯一下所寫(xiě)的程序,檢查程序是有語(yǔ)法錯(cuò)誤或其他的錯(cuò)誤。如果有錯(cuò)誤則根據(jù)提示進(jìn)行分析將錯(cuò)誤改過(guò)來(lái)直至編譯成功為止。當(dāng)完成了語(yǔ)法調(diào)試后,再根據(jù)定時(shí)開(kāi)關(guān)插座設(shè)計(jì)的功能要求修改程序完成系統(tǒng)的各個(gè)功能。在編寫(xiě)程序的時(shí)候一定要根據(jù)系統(tǒng)實(shí)現(xiàn)的功能和連接方式,認(rèn)真分析,畫(huà)出系統(tǒng)主程序、時(shí)鐘程序、設(shè)置程序的流程圖,并根據(jù)畫(huà)出的流程圖一步一步的去寫(xiě)出程序。根據(jù)系統(tǒng)的特點(diǎn),軟件系統(tǒng)應(yīng)該按模塊進(jìn)行調(diào)試,當(dāng)各個(gè)模塊調(diào)試通過(guò)后再將各個(gè)模塊整合起來(lái),進(jìn)行綜合調(diào)試,直到得到預(yù)期結(jié)果。與純粹的C語(yǔ)言編程不同的是,單片機(jī)編程要考慮到硬件的設(shè)計(jì),所有程序的編寫(xiě)都是根據(jù)硬件資源進(jìn)行。本次設(shè)計(jì)的智能小車,有三個(gè)主要的模塊,由于三個(gè)程序一起調(diào)試有苦難,所以我分別調(diào)試每一個(gè)模塊的,然后在將它們綜合。1;循跡部分的調(diào)試進(jìn)入程序后,根據(jù)紅外傳感器檢測(cè)的值,讓程序做出判斷,然后判斷轉(zhuǎn)向,完成沿著黑線行走,直到走完整個(gè)賽道,根據(jù)檢測(cè)情況調(diào)用相應(yīng)的函數(shù),控制小車的行進(jìn)、停止、左轉(zhuǎn)及右轉(zhuǎn)。它的調(diào)試成功圖如下。2;避障部分這個(gè)部分的主程序完成初始化工作和超聲波發(fā)射和接收順序的控制以及根據(jù)數(shù)據(jù)控制小車運(yùn)動(dòng),其中定時(shí)中斷服務(wù)子程序完成超聲波的輪流發(fā)射,外部中斷服務(wù)子程序主要完成時(shí)間值的讀取、距離計(jì)算、結(jié)果的輸出等工作。它的調(diào)試成功圖如下。3,藍(lán)牙部分;藍(lán)牙部分分為兩部分的調(diào)試,一部分手機(jī)上的安卓程序和小車連接收發(fā)信號(hào)的調(diào)試,另一部分為藍(lán)牙接收到信號(hào)和單片機(jī)之間的傳輸?shù)恼{(diào)試,藍(lán)牙主要根據(jù)手機(jī)上發(fā)送的命令傳給單片機(jī),單片機(jī)在根據(jù)這些命令控制小車的運(yùn)動(dòng)。藍(lán)牙和單片機(jī)調(diào)試成功圖如下。5.2.JAVA語(yǔ)言的調(diào)試將做好的工程添加進(jìn)入Eclipes開(kāi)發(fā)環(huán)境中,檢查各個(gè)文件夾下面的程序有沒(méi)有出現(xiàn)打紅色X的問(wèn)題以及警告,點(diǎn)開(kāi)下方的problem的文件,檢查該工程有沒(méi)有出現(xiàn)問(wèn)題,當(dāng)排除了所有的問(wèn)題以后。配置一個(gè)2.2版本的模擬器,然后啟動(dòng)模擬器,在模擬器上運(yùn)行該工程,在模擬器上將會(huì)出現(xiàn)已經(jīng)做好的手機(jī)界面,運(yùn)行完成,調(diào)試成功。然后將手機(jī)連接到電腦上,打開(kāi)安卓手機(jī)的USB接口。接下來(lái)點(diǎn)擊運(yùn)行整個(gè)工程項(xiàng)目,在手機(jī)上出現(xiàn)前面那個(gè)做好的藍(lán)牙小車控制界面。點(diǎn)擊各個(gè)按鈕,都無(wú)問(wèn)題,證明該JAVA程序沒(méi)有問(wèn)題。系統(tǒng)整體的調(diào)試,藍(lán)牙控制小車的硬件模塊和軟件模塊分別調(diào)試通過(guò)后,接下來(lái)就可以進(jìn)行系統(tǒng)的整體測(cè)試。首先檢查各個(gè)模塊之間,以及電機(jī)驅(qū)動(dòng)與電機(jī)的連接都沒(méi)有出錯(cuò)的情況下,打開(kāi)給各個(gè)模塊提供的5V電源以及打開(kāi)給電機(jī)提供的另一個(gè)6V電源。此時(shí)最小系統(tǒng)模塊指示燈點(diǎn)亮,表示單片機(jī)供電正常,藍(lán)牙模塊指示燈開(kāi)始閃爍,表示藍(lán)牙模塊也供電正常。此時(shí)打開(kāi)安卓手機(jī)的藍(lán)牙,搜索該藍(lán)牙芯片,進(jìn)行配對(duì)。然后打開(kāi)我們做好的手機(jī)界面,當(dāng)界面打開(kāi)之后,開(kāi)始自動(dòng)搜索藍(lán)牙芯片的地址進(jìn)行連接,當(dāng)藍(lán)牙芯片的指示燈有閃爍轉(zhuǎn)變?yōu)槌A烈院螅硎舅{(lán)牙配對(duì)連接成功。在剛開(kāi)始的時(shí)候調(diào)試的時(shí)候遇到了一些問(wèn)題,在電機(jī)驅(qū)動(dòng)方面,當(dāng)在手機(jī)端的界面上點(diǎn)擊前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)按鈕的時(shí)候,藍(lán)牙模塊能接受手機(jī)端發(fā)送的字符A、B、C、D的ASCII碼值,并且能夠通過(guò)串口相應(yīng)的傳遞給單片機(jī),單片機(jī)通過(guò)分析串口傳過(guò)來(lái)的數(shù)據(jù),改變P2口的值分別為65、66、67、68,來(lái)控制電機(jī)驅(qū)動(dòng)的輸入端IN1、IN2、IN3、IN4。相應(yīng)的電機(jī)驅(qū)動(dòng)端的四個(gè)指示LED燈都能根據(jù)數(shù)據(jù)的變化采取不同的量滅組合情況,來(lái)相應(yīng)控制小車的前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)。以下是在手機(jī)上設(shè)置的安卓程序啟動(dòng)和小車的藍(lán)牙成功配對(duì)圖。在調(diào)試的過(guò)程中也遇到一些問(wèn)題,就是最開(kāi)始電機(jī)驅(qū)動(dòng)輸出端控制的電機(jī)卻不會(huì)轉(zhuǎn)動(dòng)。通過(guò)分析,可能有兩個(gè)原因?qū)е码姍C(jī)不會(huì)轉(zhuǎn)動(dòng),其一,電機(jī)驅(qū)動(dòng)的輸出端的接線出現(xiàn)了錯(cuò)誤,導(dǎo)致電機(jī)轉(zhuǎn)動(dòng)出現(xiàn)問(wèn)題;其二,電機(jī)驅(qū)動(dòng)端接的給電機(jī)供電的電壓達(dá)不到驅(qū)動(dòng)電機(jī)的最低電壓,最后通過(guò)查詢資料和用萬(wàn)用表測(cè)驅(qū)動(dòng)模塊的輸出端的各個(gè)引腳的高低電平,發(fā)現(xiàn)輸出端的電平也能隨輸入端的改變而變化,當(dāng)最后測(cè)試VCC和GND兩端,發(fā)現(xiàn)無(wú)明顯的壓降,再用萬(wàn)用表的測(cè)電阻值測(cè)兩端的阻值,發(fā)現(xiàn)問(wèn)題是電機(jī)驅(qū)動(dòng)模塊輸出端的供電端VCC與GND端短路,導(dǎo)致外接電源不能給電機(jī)供電。最后我通過(guò)直接從芯片的引腳接線到電源端,則電機(jī)能夠正常轉(zhuǎn)動(dòng)。第6章總結(jié)與體會(huì)本次畢業(yè)設(shè)計(jì)是一個(gè)基于單片機(jī)AT89C52的智能小車控制,包括方案選擇、軟硬件設(shè)計(jì)、單片機(jī)最小系統(tǒng)、電機(jī)驅(qū)動(dòng)電路和藍(lán)牙電路、硬件測(cè)試結(jié)果及解決在電路調(diào)試時(shí)遇到的問(wèn)題。在此期間主要完成的工作包括以下幾個(gè)方面:(1)設(shè)計(jì)初期收集電機(jī)驅(qū)動(dòng)、單片機(jī)等相關(guān)資料,對(duì)智能小車的實(shí)現(xiàn)原理有比較清晰的了解。(2)確定系統(tǒng)框圖,對(duì)電源模塊、單片機(jī)最小系統(tǒng)模塊、藍(lán)牙電路模塊和電機(jī)及其驅(qū)動(dòng)電路模塊等的實(shí)施方案進(jìn)行比較,確定最終的智能小車控制的設(shè)計(jì)方案。(3)根據(jù)智能小車控制的原理圖制作出電路連接圖。(4)根據(jù)系統(tǒng)要實(shí)現(xiàn)前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)等功能編寫(xiě)出小車端的軟件程序。(5)在eclipes開(kāi)發(fā)環(huán)境下,應(yīng)用JAVA程序編寫(xiě)手機(jī)界面程序,并且通過(guò)模擬器來(lái)檢測(cè)手機(jī)界面程序。(6)軟硬件調(diào)試通過(guò)后進(jìn)行整體調(diào)試,并查找該系統(tǒng)存在的缺陷,進(jìn)行完善。(7)最終小車能夠?qū)崿F(xiàn)前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)等功能,達(dá)到老師給出的基本要求。本次設(shè)計(jì)完成了基于安卓手機(jī)的智能小車控制系統(tǒng)。該系統(tǒng)采用51單片機(jī)AT89C52編程控制電機(jī)的正反轉(zhuǎn)來(lái)實(shí)現(xiàn)小車前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn),而電機(jī)的正反轉(zhuǎn)則由電機(jī)驅(qū)動(dòng)L298N輸出端的邏輯電平來(lái)控制。從整個(gè)設(shè)計(jì)的過(guò)程來(lái)看前期的充分的準(zhǔn)備顯得非常的重要,經(jīng)過(guò)前期充分的準(zhǔn)備,和對(duì)嵌入式系統(tǒng)開(kāi)發(fā)的學(xué)習(xí),避免了很多在后續(xù)的設(shè)計(jì)中可能出現(xiàn)的問(wèn)題。MCU端的軟硬件設(shè)計(jì)因?yàn)榕c所學(xué)知識(shí)相關(guān)性較大,所以出現(xiàn)的問(wèn)題較少,MCU底板設(shè)計(jì)時(shí)鑒于電路簡(jiǎn)單,且易于焊接,故未采用PCB制版也相應(yīng)的節(jié)約了成本。特別值得一提的是為了提高系統(tǒng)在硬件上的安全性和穩(wěn)定性,我特別添加了硬件保護(hù)裝置,以提高系統(tǒng)的硬件防碰撞的能力。主要的問(wèn)題出現(xiàn)在android端的軟件設(shè)計(jì)上,由于對(duì)android開(kāi)發(fā)環(huán)境的不熟悉,缺乏一些在編寫(xiě)JAVA程序時(shí)的一些技巧性問(wèn)題,所以剛剛開(kāi)始時(shí)總是出現(xiàn)很多問(wèn)題,并且出現(xiàn)的問(wèn)題都需要查找相關(guān)資料才能解決。通過(guò)學(xué)習(xí)一些android相關(guān)的學(xué)習(xí)視頻,最后對(duì)android環(huán)境有了一個(gè)系統(tǒng)的了解在開(kāi)發(fā)的過(guò)程中也得心應(yīng)手些。Android端圖形界面的設(shè)計(jì)也是一大難點(diǎn),基于Java的圖形界面設(shè)計(jì)不論是從設(shè)計(jì)平臺(tái)還是Java語(yǔ)言的掌握都是一想挑戰(zhàn),但幸于Java軟件的開(kāi)發(fā)技術(shù)已經(jīng)成熟,且可查閱的資料多且詳盡,所以圖形界面的設(shè)計(jì)達(dá)到設(shè)計(jì)時(shí)的五項(xiàng)按鍵要求,功能實(shí)現(xiàn)良好,除界面的友好程度可以更加優(yōu)化外,其余完成任務(wù)。總體來(lái)看,我進(jìn)行了比較充分的準(zhǔn)備,在實(shí)踐過(guò)程中通過(guò)查閱相關(guān)資料和咨詢有關(guān)人員,克服了系統(tǒng)設(shè)計(jì)過(guò)程中的絕大多數(shù)困難,基本都以達(dá)到設(shè)計(jì)要求,并通過(guò)了軟件測(cè)試。第7章謝辭(致謝)畢業(yè)設(shè)計(jì)完成了,在這個(gè)過(guò)程中我學(xué)到了很多東西。首先我要感謝我的導(dǎo)師張岷濤老師,他在我完成論文的過(guò)程中,給予了我很大的幫助。在論文開(kāi)始的初期,我對(duì)于論文的結(jié)構(gòu)以及文獻(xiàn)選取等方面都有很多問(wèn)題,是在老師的幫助下進(jìn)行修改和完善的。本畢業(yè)設(shè)計(jì)是在張岷濤老師悉心的關(guān)懷與指導(dǎo)下完成,在此對(duì)老師獻(xiàn)上最衷心地感謝。張岷濤老師從畢業(yè)設(shè)計(jì)一開(kāi)始就對(duì)我們嚴(yán)格要求,每周的周一都會(huì)和我們開(kāi)見(jiàn)面會(huì),詢問(wèn)我們的畢設(shè)進(jìn)度并了解我們遇到的困難,積極協(xié)助我們解決設(shè)計(jì)過(guò)程中的各種難題,并要求我們每天記錄在畢業(yè)設(shè)計(jì)中所作的工作進(jìn)度及遇到的問(wèn)題,讓我們?nèi)グl(fā)現(xiàn)問(wèn)題,解決問(wèn)題。在我遇到難已解決的問(wèn)題心中急躁時(shí),張岷濤老師總是及時(shí)的給予鼓勵(lì),使我能夠有勇敢的克服困難,把畢設(shè)繼續(xù)進(jìn)行下去。張岷濤老師對(duì)學(xué)生的高度關(guān)注和對(duì)工作高度負(fù)責(zé)的精神值得我們尊敬,也是我今后走向工作崗位的榜樣。通過(guò)本次畢業(yè)設(shè)計(jì),我不僅是對(duì)我們所學(xué)知識(shí)的一個(gè)匯總,同時(shí)也是考驗(yàn)我們學(xué)習(xí)能力和動(dòng)手能力的一個(gè)平臺(tái);讓我們能學(xué)到更多的相關(guān)知識(shí),更重要的是學(xué)到了面對(duì)困難的不放棄、不氣餒的態(tài)度,不驕不躁的辦事風(fēng)格,奮發(fā)向上的精神,這些在我今后的生活和學(xué)習(xí)中都是一筆寶貴的財(cái)富。第8章參考文獻(xiàn)[1]郭惠,吳迅.單片機(jī)C語(yǔ)言程序設(shè)計(jì)完全自學(xué)手冊(cè)[M].電子工業(yè)出版社,2008.10:1-200.[2]王東鋒,王會(huì)良,董冠強(qiáng).單片機(jī)C語(yǔ)言應(yīng)用100例[M].電子工業(yè)出版社,2009.3:145-300.[3]韓毅,楊天.基于HCS12單片機(jī)的智能尋跡模型車的設(shè)計(jì)與實(shí)現(xiàn)[J].學(xué)術(shù)期刊,2008,29(18):1535-1955.[4]王曉明.電動(dòng)機(jī)的單片機(jī)控制[J].學(xué)術(shù)期刊,2002,13(15):1322-1755.[5]胡萍.超聲波測(cè)距儀的研制.計(jì)算機(jī)與現(xiàn)代化,2003.10[6]華兵.MCS-51單片機(jī)原理應(yīng)用.武漢:武漢華中科技大學(xué)出版社,2002.5[7]李華.MCU-51系列單片機(jī)實(shí)用接口技術(shù).北京:北京航空航天大學(xué)出版社,1993.6[8]《STC12C5A系列單片機(jī)中文資料》STC宏晶單片機(jī)官方網(wǎng)站附錄:(換頁(yè)。之前空一行,空行為小四)安卓手機(jī)上藍(lán)牙程序設(shè)計(jì)主界面布局在res\layout下新建fragment_main.xml。其中添加4個(gè)Button,分別控制小車的前后左右;1個(gè)ToggleButton來(lái)控制重力感應(yīng)的開(kāi)啟。兩個(gè)TextView做裝飾。源碼如下:[html]viewplaincopy<RelativeLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.android.bluetoothcar.MainActivity$PlaceholderFragment"><ToggleButtonandroid:id="@+id/toggleButton1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:layout_marginBottom="94dp"android:textOff="@string/gravity_off"android:textOn="@string/gravity_on"/><Buttonandroid:id="@+id/btnf"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_above="@+id/toggleButton1"android:layout_centerHorizontal="true"android:layout_marginBottom="24dp"android:text="@string/forward"/><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/title"/><Buttonandroid:id="@+id/btnl"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_centerVertical="true"android:layout_marginRight="28dp"android:layout_toLeftOf="@+id/toggleButton1"android:text="@string/left"/><Buttonandroid:id="@+id/btnr"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginLeft="25dp"android:layout_toRightOf="@+id/toggleButton1"android:text="@string/right"/><Buttonandroid:id="@+id/btnb"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/btnf"android:layout_below="@+id/btnr"android:layout_marginTop="25dp"android:text="@string/backward"/><TextViewandroid:id="@+id/textView2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/toggleButton1"android:layout_centerHorizontal="true"android:layout_marginTop="34dp"android:text="@string/beta"android:textAppearance="?android:attr/textAppearanceLarge"android:textColor="#FF0000"/></RelativeLayout>2.在res\layout下新建search_bt.xml。用來(lái)設(shè)置搜索藍(lán)牙的界面。[html]viewplaincopy<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"><TextViewandroid:id="@+id/title_paired_devices"android:layout_width="fill_parent"android:layout_height="wrap_content"android:background="#666"android:paddingLeft="5dp"android:text="@string/paired_devices"android:textColor="#fff"android:visibility="gone"/><ListViewandroid:id="@+id/paired_devices"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="1"android:stackFromBottom="true"/><TextViewandroid:id="@+id/title_new_devices"android:layout_width="fill_parent"android:layout_height="wrap_content"android:background="#666"android:paddingLeft="5dp"android:text="@string/other_devices"android:textColor="#fff"android:visibility="gone"/><ListViewandroid:id="@+id/new_devices"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="2"android:stackFromBottom="true"/><Buttonandroid:id="@+id/button_scan"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/scan_button"/></LinearLayout>3.在res\layout下新建device_name.xml。用來(lái)設(shè)置搜索到的藍(lán)牙設(shè)備的字體大小。[html]viewplaincopy<?xmlversion="1.0"encoding="utf-8"?><TextViewxmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:padding="5dp"android:textSize="18sp"/>4.res\value下string.xml。[html]viewplaincopy<?xmlversion="1.0"encoding="utf-8"?><resources><stringname="app_name">藍(lán)牙小車</string><stringname="title">2014屆理工畢業(yè)設(shè)計(jì)</string><stringname="gravity_on">重力感應(yīng)開(kāi)啟</string><stringname="gravity_off">重力感應(yīng)關(guān)閉</string><stringname="left">向左</string><stringname="right">向右</string><stringname="forward">向前</string><stringname="backward">向后</string><stringname="beta">藍(lán)牙小車測(cè)試版</string><stringname="action_searchbt">連接藍(lán)牙設(shè)備</string><stringname="action_exit">退出</string><stringname="none_paired">無(wú)配對(duì)設(shè)備</string><stringname="select_device">選擇以連接</string><stringname="none_found">無(wú)其他可用設(shè)備</string><stringname="scan_button">搜索其他設(shè)備</string><stringname="paired_devices">已配對(duì)的設(shè)備</string><stringname="other_devices">可用設(shè)備</string><stringname="title_connecting">正在連接...</string>界面設(shè)計(jì)完了,下面開(kāi)始著重于藍(lán)牙搜索與連接功能。本文主要參考了SDK中的sample。源碼可在查看,附上鏈接:/code/explore/android-2.2-froyo/com/example/android/BluetoothChat下面介紹一下有關(guān)藍(lán)牙的使用。1.獲取藍(lán)牙權(quán)限要使用藍(lán)牙先得獲取藍(lán)牙權(quán)限,在AndroidManifest.xml中添加BLUETOOTH和BLUETOOTH_ADMIN[java]viewplaincopy<uses-permissionandroid:name="android.permission.BLUETOOTH"/><uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"/>2.獲取BluetoothAdapter類可以通過(guò)getBluetoothAdapter()的方法來(lái)獲取BluetoothAdapter[java]viewplaincopyprivateBluetoothAdaptermBluetoothAdapter=null;mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();if(mBluetoothAdapter==null){Toast.makeText(this,"藍(lán)牙不可用",Toast.LENGTH_LONG).show();finish();return;}3.打開(kāi)藍(lán)牙使用isEnabled()來(lái)檢測(cè)藍(lán)牙是否打開(kāi)。調(diào)用startActivtyForResult()Intent來(lái)打開(kāi)藍(lán)牙,其中REQUEST_ENABLE_BT定義為一個(gè)大于0的整數(shù)。執(zhí)行該語(yǔ)句會(huì)彈出一個(gè)對(duì)話框,點(diǎn)擊“允許”會(huì)返回RESULT_OK,即打開(kāi)藍(lán)牙;而點(diǎn)擊“拒絕”則會(huì)返回RESULT_CANCLE,也就是不同意打開(kāi)藍(lán)牙。[java]viewplaincopyprivatestaticfinalintREQUEST_ENABLE_BT=1;[java]viewplaincopyif(!mBluetoothAdapter.isEnabled()){IntentOpenBTIntent=newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(OpenBTIntent,REQUEST_ENABLE_BT);}4.查找已配對(duì)設(shè)備[java]viewplaincopyprivateBluetoothAdaptermBtAdapter;[java]viewplaincopymBtAdapter=BluetoothAdapter.getDefaultAdapter();Set<BluetoothDevice>pairedDevices=mBtAdapter.getBondedDevices();if(pairedDevices.size()>0){findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE);for(BluetoothDevicedevice:pairedDevices){mPairedDevicesArrayAdapter.add(device.getName()+"\n"+device.getAddress());}5.查詢藍(lán)牙設(shè)備然后通過(guò)startDiscovery()方法啟動(dòng)藍(lán)牙設(shè)備的搜尋。這是個(gè)異步方法,調(diào)用的時(shí)候立刻就會(huì)返回,大約會(huì)持續(xù)12秒。為了獲得搜尋的結(jié)果,必須在用戶自己的Activity中注冊(cè)一個(gè)BroadcastReceiver[java]viewplaincopyprivatefinalBroadcastReceivermReceiver=newBroadcastReceiver(){@OverridepublicvoidonReceive(Contextcontext,Intentintent){Stringaction=intent.getAction();if(BluetoothDevice.ACTION_FOUND.equals(action)){BluetoothDevicedevice=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);if(device.getBondState()!=BluetoothDevice.BOND_BONDED){mNewDevicesArrayAdapter.add(device.getName()+"\n"+device.getAddress());}}elseif(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){setProgressBarIndeterminateVisibility(false);setTitle(R.string.select_device);if(mNewDevicesArrayAdapter.getCount()==0){StringnoDevices=getResources().getText(R.string.none_found).toString();mNewDevicesArrayAdapter.add(noDevices);}}}};}為ACTION_FOUND設(shè)置監(jiān)聽(tīng)過(guò)濾,注冊(cè)BroadcastReciver[java]viewplaincopyIntentFilterfilter=newIntentFilter(BluetoothDevice.ACTION_FOUND);this.registerReceiver(mReceiver,filter);Activity結(jié)束后調(diào)用cancelDiscovery()可停止搜索,并注銷廣播。[java]viewplaincopyprotectedvoidonDestroy(){super.onDestroy();if(mBtAdapter!=null){mBtAdapter.cancelDiscovery();}this.unregisterReceiver(mReceiver);}6.建立連接客戶端(Client)作為發(fā)起連接的一方,我們可以調(diào)用createRfcommSocketToServiceRecord(UUID)來(lái)獲得藍(lán)牙套接字。藍(lán)牙串口通信,有一個(gè)固定的UUID,為00001101-0000-1000-8000-00805F9B34FB。通過(guò)調(diào)用connect()來(lái)發(fā)起一個(gè)連接,這是一個(gè)阻塞調(diào)用,所以必須新建一個(gè)線程。[java]viewplaincopyprivatestaticfinalUUIDMY_UUID=UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");[java]viewplaincopyprivateclassConnectThreadextendsThread{privatefinalBluetoothSocketmmSocket;privatefinalBluetoothDevicemmDevice;publicConnectThread(BluetoothDevicedevice){mmDevice=device;BluetoothSockettmp=null;try{tmp=device.createRfcommSocketToServiceRecord(MY_UUID);}catch(IOExceptione){}mmSocket=tmp;}publicvoidrun(){setName("ConnectThread");mAdapter.cancelDiscovery();try{mmSocket.connect();}catch(IOExceptione){connectionFailed();try{mmSocket.close();}catch(IOExceptione2){}BluetoothCarService.this.start();return;}synchronized(BluetoothCarService.this){mConnectThread=null;}connected(mmSocket,mmDevice);}publicvoidcancel(){try{mmSocket.close();}catch(IOExceptione){}}}建立點(diǎn)擊藍(lán)牙列表的監(jiān)聽(tīng)。搜索藍(lán)牙會(huì)消耗大量的資源,所以在準(zhǔn)備建立連接之前需要取消搜索。[java]viewplaincopyprivateOnItemClickListenermDeviceClickListener=newOnItemClickListener(){publicvoidonItemClick(AdapterView<?>av,Viewv,intarg2,longarg3){mBtAdapter.cancelDiscovery();Stringinfo=((TextView)v).getText().toString();Stringaddress=info.substring(info.length()-17);Intentintent=newIntent();intent.putExtra(EXTRA_DEVICE_ADDRESS,address);setResult(Activity.RESULT_OK,intent);finish();}};7.管理連接連接建立之后,就可以在客戶端和藍(lán)牙模塊之間進(jìn)行通訊。通過(guò)調(diào)用getOutPutStream()來(lái)獲取OutputStream,通過(guò)write(byte[])寫(xiě)入數(shù)據(jù)。因?yàn)閣rite(byte[])也為阻塞調(diào)用,所以也必須建立一個(gè)新的線程。[java]viewplaincopyprivateclassConnectedThreadextendsThread{privatefinalBluetoothSocketmmSocket;privatefinalOutputStreammmOutStream;publicConnectedThread(BluetoothSocketsocket){mmSocket=socket;OutputStreamtmpOut=null;try{tmpOut=socket.getOutputStream();}catch(IOExceptione){}mmOutStream=tmpOut;}publicvoidwrite(byte[]buffer){try{mmOutStream.write(buffer);mHandler.obtainMessage(M

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論