欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 52007|回復: 8
打印 上一主題 下一主題
收起左側

基于安卓手機藍牙控制的智能小車設計論文,帶源程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:310862 發表于 2018-4-18 14:48 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一個基于安卓手機藍牙控制的智能小車,帶源程序哦。喜歡的可以下載來看下。

設計(論文)題目:
基于安卓手機藍牙控制的智能小車設計

隨著物聯網的興起,Android手機以其獨有的開放性優勢正在為我們提供更多優質便捷的技術成果。本課題研究的是基于安卓手機藍牙控制的智能小車設計,基于手機平臺,借助于藍牙技術,設計和實現了一種無線遙控小車新的解決方案。設計以手機控制平臺、藍牙通訊模塊、電機驅動模塊等硬件模塊組成的遙控小車。實現小車的前進、后退、前左轉彎、前右轉彎、后左轉彎、后右轉彎等實時控制功能。為遙控玩具小車的設計提出了一種新的思路,同時可以為將來智能家居的遙控設計提供一定的參考意義。
闡述一種通過手機藍牙遙控小車行走的軟、硬件設計。手機藍牙作為客戶端,小車上的藍牙模塊HC-06作為服務端。客戶端采用Eclipse開發環境,JAVA編程,服務端采用單片機控制。雙方通過串口進行通信,單片機驅動直流電機控制小車行動。實驗結果表明,小車可以接收手機遙控信號并靈活地進行前行、倒退、左轉、右轉和停止等功能。
本文介紹了基于安卓手機的藍牙智能小車控制要實現的功能,接著闡述該系統電路的設計及原理的說明,包括了方案的設計、重要元器件的介紹、電路設計的說明(包括單片機控制電路、電機驅動電路)安卓手機軟件界面設計、軟件設計流程以及系統的調試。最后總結了基于安卓的藍牙智能小車控制設計完成的任務,分析系統出現的不足。

目  錄

前  言 1
第一章 緒論2
  第一節 國內外研究現狀2
  第二節 發展趨勢分析4
第三節 本章小結4
第二章 設計方案分析5
  第一節 設計方案分析確定5
第二節 本章小結8
第三章   安卓操作系統概述 9
第一節 安卓操作系統發展歷史及趨勢  9
第二節 Android開發環境搭建 9
一、 Android的基本介紹 9
二、 Android系統構架10
三、 Android開發包及其工具的安裝和配置11
第三節 本章小結13
第四章  系統硬件電路設計 14
第一節 單片機最小系統14
第二節 電機驅動模塊17
第三節 藍牙模塊21
第四節 本章小結22
第五章  系統軟件程序設計 23
  第一節 主程序設計23
第二節 手機端程序設計25
手機界面程序設計27
手機監聽程序設計28
第三節 本章小結29
第六章  系統整體的調試31
  第一節  調試的方案31
第二節  硬件電路調試31
    一、 獨立元件的檢測31
    二、 單片機最小系統的調試33
三、 電源電路的測試34
    四、 驅動電路的調試34
第三節  軟件調試37
  第四節  系統整體調試38
第五節  本章小結40
結    論 41
致    謝43
參考文獻 44
附    錄 46
  一、英文原文46
  二、英文翻譯54
三、源程序60

前  言


遙控小車是玩具市場一種很常見的玩具,但是每個小車都有自己特定的遙控器,原裝遙控器壞了很難與其它型號的進行匹配。現在手機使用十分普遍,如果利用手機這個平臺,通過軟件編程,可以很方便的在一個硬件平臺實現多種小車的遙控器。藍牙,是一種支持短距離通信的無線電技術。則可以通過手機藍牙來控制我們的玩具小車[1、2]。
隨著家用電器的越來越普及和人們生活節奏的加快,人們對電器的依賴性進一步提高,對電器的功能要求也進一步增大。現有每個普通家庭中的遙控器包括空調遙控器、電視遙控器、DVD遙控器、汽車遙控器、門窗遙控器等,門類繁多且不通用,而另一方面,手機已成為人人必備的工具,如果可以用我們必備的手機去遙控所有這些家用電器,可擺脫將來對專用紅外遙控面板的依賴,一機在手,萬物盡在掌握之中。因此,本論文先設計一種手機對智能遙控車的控制方案,利用本系統的控制模塊可擴展至對所有家電的控制[2]。
Andriod是一個完全開放的標準平臺,在2007年11月5日這天,谷歌公司正式向外界展示了這款名為Android的操作系統,并且在這天谷歌宣布建立一個全球性的聯盟組織,該組織由34家手機制造商、軟件開發商、電信運營商以及芯片制造商共同組成。這一聯盟將支持谷歌發布的手機操作系統以及應用軟件,將共同開發Android系統的開放源代碼。本程序是基于Android 2.1系統,所用開發工具為Eclipse集成開發環境,Eclipse是著名的跨平臺的自由集成開發環境(IDE)。最初主要用來Java語言開發,但是目前亦有人通過插件使其作為其他計算機語言比如C++、Python和Android的開發工具,在此開發環境下開發軟件非常的方便。

章  緒論

第一節  國內外研究現狀
一、國外研究現狀
1984年,世界上第一幢智能建筑在美國康涅迪格州落成,這棟意義非凡的建筑只是對一座舊式大樓的一定程度的改造而完成的。它只是采用計算機系統對大樓的空調、電梯、照明等設備進行監控,并提供語音通信、電子郵件、情報資料等方面的信息服務。2000年,新加坡有近30個社區的約5000戶家庭采用了這種家庭智能化系統,而美國的安裝住戶高達4萬戶。2003年,網絡化家居的建設帶來了高達4500億美元的市場價值,這其中有3700億美元是智能家電硬件產品的價值,剩余的部分則是軟件和技術支持服務的費用。現在,國外的智能家居系統技術己日趨成熟,預計今年,50%以上的新房將具有一定的“智能型家居”功能。于此同時,由于技術的日益標準化,這些新型智能家居系統將比比爾.蓋茨耗資6000萬美元的高端別墅便宜得多。
在智能家居系統研發方面,美國及一些歐洲國家一直處于領先地位。近年來,以美國微軟公司及摩托羅拉公司等為首的一批國外知名企業,先后擠身于智能家居的研發中。例如:微軟公司開發的“夢幻之家”、摩托羅拉公司開發的“居所之門”、IBM公司開發的“家庭主任”等均已日趨成穩得技術強占家居市場。此外,日韓新等國的龍頭企業紛紛致力于家居智能化的開發,對家居市場更是躍躍欲試。
目前市場上出現得智能家居控制系統主要有:
(1)X-10系統(美國),該系統是利用電力線作為網絡平臺,采用集中控制方式實現。這套系統的功能較為強大,與其它家居控制系統如ABB、C_BUS等比起來更容易接收,使用也相對簡單。因為實現同樣的功能,X-10家居控制系統是利用220v電力線將發射器發出的X-10信號傳送給接收器從而實現智能化的控制,因此采用這套系統不需要額外的布線,這也是這套系統的最大的一個優勢,因為其它系統基本上都需要布低壓線,在墻上或地面開槽、鉆孔,施工難度大、費用高、工期長。但由于缺乏在國內市場推廣的條件且價格昂貴,該系統在國內應用極少。
(2)EIB系統(德國),該系統采用預埋總線及中央控制方式實現控制功能。但由于其工程要求復雜嚴苛,并且價格較高,因此一直無法打開國內市場[3]。
(3)8X系統(新加坡),該系統采用預處理總線跟集中控制方式來實現功能。它的優點在于利用的產品對系統進行擴展,系統較為成熟,比較適合中國國情。但是由于系統架構、靈活性及產品價格等方面還難以達到要求,所以目前在國內還較少應用。
二、國內研究現狀
20世紀90年代后期,我國的智能小區日益興起。眾所周知,我國的智能化住宅建設最早起于上海、廣州和深圳等沿海城市,并逐漸向內陸發展。在97香港回歸之際,在建設部“97跨世紀住宅小區案競賽活動”中,上海中皇廣場被建設部科技委員會列為全國首家“智能住宅示范工程”,揭開了全國智能小區發展的序幕。1999年,建設部勘察設計司、建設部住宅產業化辦公室聯合組織實施全國住宅小區智能化技術示范工程,標志著我國住宅小區智能化進入了一個新階段。隨著信息化走進了千家萬戶,由國家經貿委牽頭成立了家庭信息網絡技術委員會,而信息網絡技術體系研究及產品開發已經被列為了國家技術創新的重點專項計劃。據建設部要求,截止今年,我國將有70%以上的家庭擁有Internet入網設備,大中城市中50%的住宅要實現智能化。
我國的智能家居相對于國外起步較晚, 尚未形成一定的國家標準。目前,主要采用國外的一些技術產品,但也有一些企業推出了自己的產品,主要有:
(1)e家庭(海爾),該系列產品以海爾電腦作為控制中心,各種網絡家電作為終端設備,海爾移動電話作為移動數字控制中心。海爾在技術上同微軟合作,利用微軟的Windows Me技術和海爾的網絡家電,使“e家庭”已具雛形,已推出了網絡洗衣機、網絡冰箱、網絡空調、網絡微波爐等一系列網絡家電。
(2)e-home數字家園(清華同方),該智能家居控制系統是專門針對中國家庭設計的,遵循國際技術標準,采用嵌入式軟、硬件技術,提供網絡、網絡節點及末端設備。產品以功能模塊開發為主,基于國外成熟的智能家居標準之上。其智能家居控制系統主要有以下三個部分:
A系列:遵循EIB協議的家庭控制產品,適用于中高檔住宅區。
B系列:遵循X-10協議的家庭控制產品,適用于中檔住宅區。
易家三代:配電箱集中安裝式家庭控制產品。
國內各大軟、硬件機構正在積極的研制、開發更為符合市場的智能化家居設備,以解決當前智能化產品實用性差、使用復雜及產品價格昂貴等缺點,而技術創新性也逐步向國際先進水平靠攏,這樣的未來值得期待[4]。


  • 發展趨勢
智能家居的發展分為三個階段:
首先是家庭電子化(Home Electronics)階段,這個時期主要是面向單個的電器,家庭電器之間并沒有形成網絡,亦沒有大的聯系。
其次是住宅自動化(Home Automation)階段,這個時期是面向功能的階段,一部分的家庭電器之間形成了簡單的網絡,主要是為了實現某個特定單一的功能,例如單一的自動抄表功能。
最后是家居智能化(歐洲稱為Smart Home,美國稱為 Wise House)階段,這個時期是面向系統設計的階段,系統通過家庭分布總線把住宅內各種與信息相關的通信設備、家用電器、報警裝置并到網絡節點中進行集中的監控、管理,保持家電與環境的協調,提供生活、工作、學習以及娛樂的各種優質服務,營造一種溫馨舒適的家庭氛圍。
智能家居控制系統提供高效、舒適的家居環境,確保住戶的生命財產安全;集中或遠程調節家居環境的溫度、濕度以及風的速度等,同時檢查空氣成分,提高空氣質量;調節音響,電視等娛樂設施,愉悅心情;合理利用太陽能活周遭環境的變化,盡可能的節約能耗,達到合理利用資源;提供現代化的通信、信息服務。
節  本章小結
Internet和移動通信的迅速發展,使人們對各種數據和移動服務的需求快速增長。藍牙技術作為一個全球開放性無線標準,通過把各種語言和數據設備用無線鏈路連接起來,使人們能夠隨時隨地實現個人區域內語言和數據的交換與傳輸,隨著技術的發展和完善,藍牙必將對人們的生活和工作產生重大的影響。
章  設計方案分析
節  設計方案分析
  • 設計要求
本次設計要求實現一個手機可以遠程通過藍牙控制小車的前進、后退、左轉和右轉。要求學生對單片機和安卓手機開發有一定程度的理解,熟悉單片機定時器/計數器以及中斷的使用,會基本的C語言和java,熟練掌握keil 51軟件的使用與程序下載以及安卓手機軟件開發環境。

  • 設計構思
通過查找資料進行方案論證和選擇,可以確定出該系統的整體構成。本設計是以AT89C52單片機為核心,以設置手機界面來設置前進、后退、左轉、右轉、停止等功能。單片機控制電機驅動來控制電機的正反轉以實現小車的前進、后退、左轉、右轉、停止。HC-06為藍牙接收模塊,通過與手機端的藍牙進行連接配對,從而接收從手機端發送過來的動作指令。接收到的指令再傳遞給單片機,單片機通過分析傳遞過來的指令不同,而跳轉到不同的子程序來控制電機驅動,從而實現小車的前進、后退、左轉、右轉、停止等不同的動作。電源提供給單片機5V直流電,L298需要從外部接兩個電壓,一個是給電機的,另一個給L298芯片的[5]。

、系統框圖
通過查找資料進行方案論證和選擇,可以確定出該系統的整體構成,本系統的系統框圖如圖2.1所示。
圖2.1 系統框圖

單片機的選擇

單片機芯片選型時,總的原則是:
(1)芯片含有功能或數量略大于設計需求,設計需求盡可能用芯片完成,少用外圍器件。
(2)技術性:要從單片機的技術指標角度,對單片機芯片進行選擇,以保證單片機應用系統在一定的技術指標下可靠運行;
(3)實用性:要從單片機的供貨渠道、信譽程序等角度,對單片機的生產廠家進行選擇以保證單片機應用系統在能長期、可靠運行;
(4)可開發性:選用的單片機要有可靠的可以開發手段,如程序開發工具、仿真調試手段等。
單片機僅用于控制電機驅動,用51結構的有Atmel的AT89CXX系列、AT89SXX系列、AT89C20系列(20引腳)或STC的所有單片機都可以實現。根據在學校比較流行的學習單片機是AT89CXX系列,而且AT89C52單片機便宜,購買方便,故單片機選用AT89C52單片機[6]。

電機驅動的選擇
底盤和最小系統確定好了后,小車還是跑不起來——缺少電機驅動。單片機的I/O是驅動不了電機的,因此我選用的是L298N電機專用驅動芯片。L298N通過單片機的I/O輸入改變芯片控制端的電平,即可以對電機進行正反轉,停止的操作,輸入引腳與輸出引腳的邏輯關系圖如表2.1所示。

表2.1 L298N模塊邏輯關系圖

EnA

Ln1

Ln2

運轉狀態

0

X

X

停止

1

1

0

正傳

1

0

1

反轉

1

1

1

立停

1

0

0

停止


L298N電機驅動模塊性能特點:
1、可實現電機正反轉及調速。
2、啟動性能好,啟動轉矩大。
3、工作電壓可達到36V,4A。
4、可同時驅動兩臺直流電機。
5、適合應用于機器人設計及智能小車的設計[7]。
藍牙模塊的選擇
本模塊分主機和從機,主機能和從機配對通信,從機與從機之間或主機與主機之間不能通信,從機能和電腦、手機等的藍牙配對通信,購買時默認為從機。我們在做智能小車控制時,藍牙模塊主要是實現接收從手機端發送過來的指令,所以我們需要的是從機模塊。藍牙串口在模塊功能上,偶數命名的互相兼容,從機命名的也互相兼容,也就是說,HC-04與HC-06,HC-03與HC-05在功能上是兼容的。HC-04與HC-06是比較早的版本,用戶不可以自己切換主機或者從機,AT指令集很少,包括修改藍牙名(限于從機),修改密碼,修改波特率,詢問版本號等幾個基本功能。在本次設計中我們只需實現簡單的通信,因此選用HC-06模塊。HC-06模塊只記憶最后一次配對過的從機,并只與該從機配對,直到KEY(26腳)高電平觸發時放棄記憶,26腳默認應該為低電平。
電源的選擇
電源給單片機及電機驅動等使用5V直流電的器件提供電源,供系統正常工作。
方案一:使用開關電源將220V交流電轉為5V直流電給系統供電。開關電源的體積小,重量輕。但由于需要耐壓不小于220V的電容等特殊的元器件,日常生活中較難找全器件,開關電源的散熱比較差,不適宜長時間工作。故此方案不適宜。
方案二:用變壓器降壓經整流橋整流和7805穩壓后給系統供電。變壓器相對比較重,但他的電路穩定,適宜長時間供電。能做到交流電供電正常時就能給系統正常供電。但在交流電失電時系統會停止工作,這時的時鐘也會停止走時。在重新供電時系統會重啟,從而造成原先設置的數據丟失。故此方案存在漏洞,不適宜使用。
方案三:使用交流電和干電池混合給系統供電。在交流電不失效的情況下由交流電轉5V直流電供電,在交流電失效情況下由干電池供電。這樣就能解決運行成本過高或者在交流電失效時丟失原先設置數據的問題。
方案四:使用干電池給系統供電。干電池供電能讓系統穩定的工作,時鐘的走時不受交流電的影響。干電池的價格相對交流電而言較貴,用干電池單獨供電會造成使用成本提高的問題。但綜合情況考慮到小車要前進、后退、左轉、右轉等問題,因此不可能采用交流電源來供電,最終決定兩個電源都采用干電池供電比較合理,因此采用方案四提供電源。


節  本章小結
通過查找相關資料,首先確定要完成該設計需要到的硬件有單片機最小系統、藍牙模塊(只需實現接收數據,不用發送數據的從機模塊HC-06)、電機驅動模塊。通過分析該設計需要實現的功能,而選擇適合的芯片型號及供電的方式。最后綜合分析后繪制了該系統的硬件接線圖。


章  安卓操作系統概述

第一節  安卓操作系統的發展歷史及趨勢
Android系統一開始并不是由谷歌研發出來的,Android系統原來的公司名字就叫做Android,谷歌公司在2005收購了這個僅成立22月的高科技企業。Android系統也開始由谷歌接手研發,Android系統的負責人以及Android公司的CEO安迪·魯賓成為谷歌公司的工程部副總裁,繼續負責Android項目的研發工作。在2007年11月5日這天,谷歌公司正式向外界展示了這款名為Android的操作系統,并且在這天谷歌宣布建立一個全球性的聯盟組織,該組織由34家手機制造商、軟件開發商、電信運營商以及芯片制造商共同組成。這一聯盟將支持谷歌發布的手機操作系統以及應用軟件,將共同開發Android系統的開放源代碼[8]。

第二節Android開發環境搭建

  • Android的基本介紹
Android是一種基于Linux的自由及開放源代碼的操作系統,主要使用于移動設備,如智能手機平板電腦,由Google公司和開放手機聯盟領導及開發。尚未有統一中文名稱,中國大陸地區較多人使用“安卓”或“安致”。Android操作系統最初由Andy Rubin開發,主要支持手機。2005年8月由Google收購注資。2007年11月,Google與84家硬件制造商、軟件開發商及電信營運商組建開放手機聯盟共同研發改良Android系統。隨后Google以Apache開源許可證的授權方式,發布了Android的源代碼。第一部Android智能手機發布于2008年10月。Android逐漸擴展到平板電腦及其他領域上,如電視數碼相機游戲機等。2011年第一季度,Android在全球的市場份額首次超過塞班系統,躍居全球第一。 2012年11月數據顯示,Android占據全球智能手機操作系統市場76%的份額,中國市場占有率為90%。其具有以下特點:
①開放性:在優勢方面,Android平臺首先就是其開發性,開發的平臺允許任何移動終端廠商加入到Android聯盟中來。顯著的開放性可以使其擁有更多的開發者,隨著用戶和應用的日益豐富,一個嶄新的平臺也將很快走向成熟。開發性對于Android的發展而言,有利于積累人氣,這里的人氣包括消費者和廠商,而對于消費者來講,最大的受益正是豐富的軟件資源。開放的平臺也會帶來更大競爭,如此一來,消費者將可以用更低的價位購得心儀的手機。
②不受束縛:在過去很長的一段時間,特別是在歐美地區,手機應用往往受到運營商制約,使用什么功能接入什么網絡,幾乎都受到運營商的控制。自從2007年iPhone上市后,用戶可以更加方便地連接網絡,運營商的制約減少。隨著EDGE、HSDPA這些2G至3G移動網絡的逐步過渡和提升,手機隨意接入網絡已不是運營商口中的笑談。
③豐富的硬件這一點還是與Android平臺的開放性相關,由于Android的開放性,眾多的廠商會推出千奇百怪,功能特色各具的多種產品。功能上的差異和特色,卻不會影響到數據同步、甚至軟件的兼容,如同從諾基亞Symbian風格手機一下改用蘋果iPhone,同時還可將Symbian中優秀的軟件帶到iPhone上使用、聯系人等資料更是可以方便地轉移。
④方便開發:Android平臺提供給第三方開發商一個十分寬泛、自由的環境,不會受到各種條條框框的阻擾,可想而知,會有多少新穎別致的軟件會誕生。
⑤Google應用:在互聯網的Google已經走過10年度歷史,從搜索巨人到全面的互聯網滲透,Google服務如地圖、郵件、搜索等已經成為連接用戶和互聯網的重要紐帶,而Android平臺手機將無縫結合這些優秀的Google服務。

二、Android系統構架
Android的系統架構和其操作系統一樣,采用了分層的架構。從架構圖3.1看,Androi d分為四個層,從高層到低層分別是應用程序層、應用程序框架層、系統運行庫層和Linux內核層[9]。
圖3.1 Android結構圖

1、應用程序
Android會同一系列核心應用程序包一起發布,該應用程序包包括客戶端,SMS短消息程序,日歷,地圖,瀏覽器,聯系人管理程序等。所有的應用程序都是使用JAVA語言編寫的。
2應用程序框架
開發人員也可以完全訪問核心應用程序所使用的API框架。該應用程序的架構設計簡化了組件的重用,任何一個應用程序都可以發布它的功能塊并且任何其它的應用程序都可以使用其所發布的功能塊(不過得遵循框架的安全性)。同樣,該應用程序重用機制也使用戶可以方便的替換程序組件。
3系統運行庫
Android 包含一些C/C++庫,這些庫能被Android系統中不同的組件使用。它們通過 Android 應用程序框架為開發者提供服務。
4系統內核
Android 是運行于Linux kernel之上,但并不是GNU/Linux。因為在一般GNU/Linux 里支持的功能,Android 大都沒有支持,包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。Android又以Bionic 取代Glibc、以Skia 取代Cairo、再以opencore取代FFmpeg等等。
Android開發包及其工具的安裝和配置
Android的開發是可以在windows XP及其以版本、MACOS、Linux等系統上進行開發的;首先呢,我們要進入Google的官方網站下載windows XP版本的java開發包JDK,我們選擇的版本是JDK1.6.0以上的版本。在應用開發平臺方面,我們采用的是eclipse,因為google提供了基于eclipse的android開發插件ADT,在隨時更新的插件幫助下,可以很快幫助我們完成android手機終端的相關應用開發。
1安裝JDK和配置java開發環境
首先,安裝JDK時,安裝包中有JDK和JRE兩部分,點擊安裝程序,指定安裝目錄,然后點擊下一步,等待安裝完成即可。安裝完成之后,點擊“我的電腦”,選擇“屬性”里面的“高級”選項,選擇環境變量,找到path變量,如果沒有,就自己添加一個,按后命名path就行,完成之后,點擊編輯,添加JDK安裝目錄的“lib”文件路徑;之后點擊確定,然后再找到CLASSPATH變量,在路徑輸入“.”,然后點擊確定。
2檢測安裝
安裝配置完成之后,需要測試是否安裝成功。點擊開始——運行輸入“cmd”,打開命令模式。輸入“java—version”,檢測JDK安裝是否成功,如果現實結果,則安裝成功。
3安裝eclipse
打開安裝包,點擊安裝,彈出workspace對話框,確定創建項目的保存路徑。
4SDK和ADT的安裝和配置
首先,解壓安裝包,運行“SDK Setup.exe”。其次,在“Android SDK and Avd manager”的窗口左側選擇“setting”,選中“Force https://......”然后返回“Installed packges”,點擊“Update all”。點擊“Available Packges”,選擇要安裝的API版本以及USB驅動和SDK文檔,我們都選擇了。
這個過程很漫長,一定要保證網速快的情況下來安裝,要不會出現安裝不了的情況,最少安裝這個也要一天的時間,所以要耐心等待。下載完成之后,選擇所有選項,然后全部安裝,安裝完成之后,配置SDK,SDK的配置更JDK是一樣的。
5ADT的安裝和配置
啟動eclipse,點擊“Help”菜單,選擇“Install New Software”之后,點擊“Add”按鈕,點擊Archive指向下載的ADT壓縮包,然后點擊“ok”,選中所需要安裝的插件即可。
6Android虛擬機的搭建
打開菜單“windows”,一次選擇“Android SDK and AVD Manager”,打開界面;然后點擊NEW新建模擬機,彈出選項卡,根據選項卡填寫自己所需要的內容,即可創建。
7建立好項目名后,即可啟動虛擬機


  本章小結

本章主要介紹了安卓系統的概述和安卓開發環境的一個搭建過程。Androi d分為四個層,從高層到低層分別是應用程序層、應用程序框架層、系統運行庫層和Linux內核層。Android系統的主要優點有:開放性、不受束縛、豐富的硬件、方便開發、Google應用。在搭建安卓開發環境的時候,耗時相對比較漫長[10、11]。

  • 系統硬件電路設計

整個系統的硬件設計可以分為四個模塊:電源電路、單片機最小系統、電機驅動模塊、藍牙模塊、。電源電路為整個系統供電,包括單片機AT89C52、電機驅動、藍牙模塊、及其他外圍電路。電源電路分兩個部分:(1)接外部電源給電機供電;(2)由4節干電池作為電源,給系統供電,以確保單片機、電機驅動、藍牙模塊的正常運行。在電源電路給系統供電時,綠色指示燈點亮,只是當前供電正常。單片機最小系統部分是整個系統的智能控制部分,也是整個系統的核心部分。電機驅動模塊L298需要從外部接兩個電壓,一個是給電機的,另一個給L298芯片的[12]。
節  單片機最小系統

單片機的最小系統就是讓單片機能正常工作并發揮其功能時所必須的組成部分,也可理解為是用最少的元件組成的單片機可以工作的系統。對51 系列單片機來說, 最小系統一般應該包括: 單片機、時鐘電路、復位電路、輸入/ 輸出設備等[13、14]。

圖4.1 單片機最小系統框圖

圖4.2 單片機最小系統原理圖

、單片機AT89C52
AT89S52單片機片內集成256字節程序運行空間、8K字節Flash存儲空間,支持最大64K外部存儲擴展。根據不同的運行速度和功耗的要求,時鐘頻率可以設置在0~33M之間。片內資源有4組I/O控制端口、3個定時器、8個中斷、軟件設置低能耗模式、看門狗和斷電保護。可以在4V到5.5V寬電壓范圍內正常工作。不斷發展的半導體工藝也讓該單片機的功耗不斷降低。同時,該單片機支持計算機并口下載,簡單的數字芯片就可以制成下載線。根據不同場合的要求,這款單片機提供了多種封裝,本次設計根據最小系統有時需要更換單片機的具體情況,使用雙列直插DIP-40的封裝。下面對定時開關系統中使用到的管腳進行簡單說明.
P0口:P0口是一個8位漏極開路的雙向I/O口。作為輸出口,每位能驅動8個TTL邏輯電平。對P0端口寫“1”時,引腳用作高阻抗輸入。當訪問外部程序和數據存儲器時,P0口也被作為低8位地址/數據復用。在這種模式下,P0不具有內部上拉電阻。
P1口:P1口是一個具有內部上拉電阻的8位雙向I/O口,P1輸出緩沖器能驅動4個TTL邏輯電平。對P1 端口寫“1”時,內部上拉電阻把端口拉高,此時可以作為輸入口使用。作為輸入使用時,被外部拉低的引腳由于內部電阻的原因,將輸出電流(IIL)。
P2口:P2口是一個具有內部上拉電阻的8位雙向I/O口,P2輸出緩沖器能驅動4個TTL 邏輯電平。對P2 端口寫“1”時,內部上拉電阻把端口拉高,此時可以作為輸入口使用。作為輸入使用時,被外部拉低的引腳由于內部電阻的原因,將輸出電流(IIL)。
P3 口:P3口是一個具有內部上拉電阻的8位雙向I/O口,P3輸出緩沖器能驅動4個TTL邏輯電平。對P3端口寫“1”時,內部上拉電阻把端口拉高,此時可以作為輸入口使用。作為輸入使用時,被外部拉低的引腳由于內部電阻的原因,將輸出電流(IIL)。
RST——復位輸入。當振蕩器工作時,RST引腳出現兩個機器周期以上高電平將是單片機復位。
. 時鐘電路
在設計時鐘電路之前,讓我們先了解下51 單片機上的時鐘管腳:
XTAL1(19 腳) :芯片內部振蕩電路輸入端。
XTAL2(18 腳) :芯片內部振蕩電路輸出端。
XTAL1 和XTAL2 是獨立的輸入和輸出反相放大器,它們可以被配置為使用石英晶振的片內振蕩器,或者是器件直接由外部時鐘驅動。在XTAL1、XTAL2 的引腳上外接定時元件(一個石英晶體和兩個電容),內部振蕩器便能產生自激振蕩。一般來說晶振可以在1.2 ~ 12MHz之間任選,甚至可以達到24MHz 或者更高,但是頻率越高功耗也就越大。在本實驗套件中采用的11.0592M 的石英晶振。和晶振并聯的兩個電容的大小對振蕩頻率有微小影響,可以起到頻率微調作用。當采用石英晶振時,電容可以在20 ~ 40pF 之間選擇(本實驗套件使用30pF);當采用陶瓷諧振器件時,電容要適當地增大一些,在30 ~ 50pF 之間。通常選取33pF 的陶瓷電容就可以了。

. 復位電路
在單片機系統中,復位電路是非常關鍵的,當程序跑飛(運行不正常)或死機(停止運行)時,就需要進行復位。
MCS-5l 系列單片機的復位引腳RST( 第9 管腳) 出現2個機器周期以上的高電平時,單片機就執行復位操作。如果RST 持續為高電平,單片機就處于循環復位狀態。
復位操作通常有兩種基本形式:上電自動復位和開關復位。上電瞬間,電容兩端電壓不能突變,此時電容的負極和RESET 相連,電壓全部加在了電阻上,RESET 的輸入為高,芯片被復位。隨之+5V電源給電容充電,電阻上的電壓逐漸減小,最后約等于0,芯片正常工作。并聯在電容的兩端為復位按鍵,當復位按鍵沒有被按下的時候電路實現上電復位,在芯片正常工作后,通過按下按鍵使RST管腳出現高電平達到手動復位的效果。一般來說,只要RST 管腳上保持10ms 以上的高電平,就能使單片機有效的復位。圖中所示的復位電阻和電容為經典值,實際制作是可以用同一數量級的電阻和電容代替,讀者也可自行計算RC 充電時間或在工作環境實際測量,以確保單片機的復位電路可靠。
. EA/VPP(31 腳) 的功能和接法
51 單片機的EA/VPP(31 腳) 是內部和外部程序存儲器的選擇管腳。當EA 保持高電平時,單片機訪問內部程序存儲器;當EA 保持低電平時,則不管是否有內部程序存儲器,只訪問外部存儲器。對于現今的絕大部分單片機來說,其內部的程序存儲器(一般為flash)容量都很大,因此基本上不需要外接程序存儲器,而是直接使用內部的存儲器。在本實驗套件中,EA 管腳接到了VCC 上,只使用內部的程序存儲器。這一點一定要注意,很多初學者常常將EA 管腳懸空,從而導致程序執行不正常[15]。


  • 電機驅動模塊
  • L298N型驅動器的原理及應用
L298是SGS公司的產品,比較常見的是15腳Multiwatt封裝的L298N,內部同樣包含4通道邏輯驅動電路。可以方便的驅動兩個直流電機,或一個兩相步進電機。L298N芯片可以驅動兩個二相電機,也可以驅動一個四相電機,輸出電壓最高可達50V,可以直接通過電源來調節輸出電壓;可以直接用單片機的IO口提供信號;而且電路簡單,使用比較方便。L298N可接受標準TTL邏輯電平信號VSS,VSS可接4.5~7 V電壓。4腳VS接電源電壓,VS電壓范圍VIH為+2.5~46 V。輸出電流可達2.5 A,可驅動電感性負載。1腳和15腳下管的發射極分別單獨引出以便接入電流采樣電阻,形成電流傳感信號。L298可驅動2個電動機,OUT1,OUT2和OUT3,OUT4之間可分別接電動機,本實驗裝置我們選用驅動一臺電動機。5,7,10,12腳接輸入控制電平,控制電機的正反轉。EnA,EnB接控制使能端,控制電機的停轉。其引腳圖如圖4.3所示。

圖4.3 L298N引腳圖
1、引腳說明
1、1和15和8引腳直接接。,
2、4管腳VS接2.5到46的電壓,它是用來驅動電機的。
3、9引腳是用來接4.5到7V的電壓的,它是用來驅動L298芯片的,L298需要從外部接兩個電壓,一個是給電機的,另一個給L298芯片的。
4、6和11引腳是它的使能端,一個使能端控制一個電機,至于那個控制那個你自己焊接,你可以把它理解為總開關,只有當它們都是高電平的時候兩個電機才有可能工作。
5、5,7,10,12是298的信號輸入端和單片機的IO口相連,2,3,13,14是輸出端,輸入5和7控制輸出2和3,  輸入的10,12控制輸出的13,14。
2、驅動原理圖

L298N是SGS公司的產品,內部包含4個通道邏輯驅動電路,是一種二相和四相電機的專用驅動器,即內含二個H橋的高電壓大電流雙全橋式驅動器,接收標準TTL邏輯電平信號,可以驅動4V、2V以下的電機。

圖4.4 L298驅動原理圖

OUT1、OUT2和OUT3、OUT4之間分別接兩個電機。IN1、IN2、IN3、IN4引腳從單片機輸入控制電平,控制電機的正反轉,ENA、ENB接控制使能端,控制電機的停轉。L298N的邏輯功能如表4.1所示。

表4.1 L298邏輯功能表

IN1

IN2

IN3

IN4

左電機

右電機

電動車運動狀態

1

0

1

0

正轉

正轉

前行

1

0

0

1

正轉

反轉

左轉

1

0

1

1

正轉

以電機為中心左轉

0

1

1

0

反轉

正轉

右轉

1

1

1

0

正轉

以電機為中心右轉

0

1

0

1

反轉

反轉

后退


3直流電機實物接線圖

圖4.5 直流電機實物接線圖

4、直流電機原理圖

圖4.6 L298驅動直流電機原理圖

  • 藍牙模塊
一、藍牙模塊HC-06介紹
1、 采用CSR主流藍牙芯片,藍牙V2.0協議標準
2、 核心串口模塊工作電壓3.3V。帶底板的可以為3.1-6.5V之間
3、 波特率為1200,2400,4800,9600, 19200,38400,57600,115200用戶可設置
4、 核心模塊尺寸大小為:28mm x 15 mm x 2.35mm。底板尺寸27mm*47mm
5、 工作電流:配對中為50MA,配對完畢通信中為28MA
6、 休眠電流:不休眠
7、 用于GPS導航系統,水電煤氣抄表系統,工業現場采控系統。
8、 可以與藍牙筆記本電腦、電腦加藍牙適配器、PDA等設備進行無縫連接
9、 出廠默認參數:從機,波特率:9600,N,8,1。配對密碼:1234
二、AT命令集如下
1、測試通訊
發送:AT(返回OK,一秒左右發一次) 返回:OK
2、改藍牙串口通訊波特率
發送:AT+BAUD1   返回:OK1200   發送:AT+BAUD2  返回:OK2400
1---------1200
2---------2400
3---------4800
4---------9600
5---------19200
6---------38400
7---------57600
8---------115200
9---------230400
A---------460800
B---------921600
C---------1382400
不建議用在超過115200的波特率,信號的干擾會使系統不穩定。
設置超過115200后用電腦無法使用,要用單片機編程于高于115200才能使用此波特率和重新發AT命令設低波特率
用AT命令設好波特率后,下次上電使用不需再設,可以掉電保存波特率。
3、改藍牙名稱
發送:AT+NAMEname
返回:OKname
參數name:所要設置的當前名稱,即藍牙被搜索到的名稱。20個字符以內。例:發送AT+NAMEbill_gates
返回OKname
這時藍牙名稱改為bill_gates,參數可以掉電保存,只需修改一次。PDA端刷新服務可以看到更改后的藍牙名稱。
4、改藍牙配對密碼
發送:AT+PINxxxx
返回:OKsetpin
參數xxxx:所要設置的配對密碼,4個字節,此命令可用于從機或主機。從機則是適配器或手機彈出要求輸入配對密碼窗口時,則手工輸入此參數就可以連接從機。主機則是在用主藍牙模塊連數碼相機時,數碼相機是從機,找到相機的配對密碼,再設入主藍牙模塊,則主藍牙模塊就可以自動連接相機。
例:發送AT+PIN8888
返回OKsetpin
這時藍牙配對密碼改為8888,模塊在出廠時的默認配對密碼是1234。參數可以掉電保存,只需修改一次。
第四節 本章小結
本章的任務主要介紹了各個模塊的核心芯片,并完成了電路設計工作,本設計由51單片機最小系統、HC-06藍牙模塊、L298電機驅動模塊、電源電路、小車底板等組成。然后確定設計硬件模塊之間的電路連接圖,為實物硬件制作做足準備。

章  系統軟件程序設計


這次設計可以用C語言編程序,也可以用匯編語言編程序,由于本次設計中程序系統用C語言編寫程序。此次設計所選用的單片機是AT89C52單片機,其C語言語法和結構和標準C語言基本相同,只是有了相應的擴充,用到的編譯軟件是Keil C。下面結合我的程序編譯簡要介紹以下Keil C的編譯環境的特點。
Keil C51軟件提供豐富的庫函數和功能強大的集成開發調試工具,全Windows界面。另外重要的一點,只要看一下編譯后生成的匯編代碼,就能體會到Keil C51生成的目標代碼效率非常之高,多數語句生成的匯編代碼很緊湊,容易理解。在開發大型軟件時更能體現高級語言的優勢。Keil C51在使用前一定要先進行注冊,否則程序過大會造成編譯時出現地址使用錯誤。程序在編譯時就遇到過這種問題。在單個程序運行時沒有錯誤,但是一整合編譯后出現地址沖突現象。這個問題困擾了很長一段時間,通過查資料發現若是Keil C51軟件沒有注冊的話使用時當程序過大就會出現地址沖突現象。在注冊完成后,程序編譯能順利通過[15]。

節  主程序的設計

在本次設計中,主程序主要是在單片機的控制下,對藍牙模塊輸入的信息進行存儲分析,來控制電機驅動,以達到控制小車的前進、后退、左轉、右轉。在這個過程中,單片機首先進行初始化,包括設置單片機各個端口的方向,各個變量的初始化,以及單片機振蕩頻率的校準等。單片機定時對藍牙模塊串口讀數據,如果串口的數據讀出,則對讀出的數據進行分析,讀出的數據如果為A、B、C、D則分別對應小車的前進、后退、左轉、右轉。小車硬件系統軟件設計的流程圖如圖5.1所示。





圖5.1 小車動作流程圖

  • 手機程序的設計
本程序是基于Android 2.1系統,所用開發工具為Eclipse集成開發環境,Eclipse是著名的跨平臺的自由集成開發環境(IDE)。最初主要用來Java語言開發,但是目前亦有人通過插件使其作為其他計算機語言比如C++、Python和Android的開發工具,在此開發環境下開發軟件非常的方便。首先設計本系統手機端軟件的程序界面,為了盡快實現程序的功能,本程序沒有對軟件界面設計做特別美化的設計,僅包含我們所用到的幾個按鈕和圖形顯示,以實現我們的功能為最大目標。
下面介紹Android相關資源文件的作用[16、17]:
1、assets 文件夾:此文件夾也可以存放資源文件,而且/assets目錄下的資源文件不會在R.java自動生成ID,所以讀取/assets目錄下的文件必須指定文件的路徑(url的路徑為:)。除此之外,我們還可以通過AssetManager類來訪問這些文件。打開文件時,會把apk文件當做zip文件進行解壓讀取。但是有文件大小有限制:不能超過1M(android2.2好像放寬(或者取消)了這個限制(至少可以存放>10M,具體沒有測試。))。
2、res 文件夾:主要用來存放資源。此文件夾下可以創建子文件,常見的有:動畫anim,圖片drawable,顏色color,菜單menu, 布局layout,常量值values,詳細如下:
(1)anim文件夾:后綴名為.xml。動畫文件都放在這里。
(2)drawable文件夾: 用于存放圖片資源,圖片或者xml。圖片格式,有png,9.png,jpg,gif都行。xml文件通常為自定義的形狀shape或圖片選擇器類selector似的東西,就是不同狀態下不同的圖片,用于設置background的。 對分辨率籠統的分,可以分為高中低三種分辨率。
(3)color文件夾:用于存放color列表,和drawable的xml一樣,表示不同狀態下的不同顏色
(4)menu文件夾:菜單資源文件夾。
(5) layout文件夾:布局文件夾。此文件夾的名字也是可以起到屏幕適配的功能的。①橫豎屏:layout-land|port;②分辨率:layout-1280x720
(6) values文件夾:存放常量值的文件夾。里面常見的xml文件為:
arrays.xml : 資源數組;colors.xml :  顏色值;dimens.xml : 像素值;
strings.xml :字符串值;tyles.xml : 樣式值。此文件夾,也有屏幕適配作用。比如:dimens在不同分辨率下的值。同樣的是加-1280x720這樣的后綴。對于strings,有各種語言的版本對應。默認為英文。中文的文件夾名字應該是:values-zh-rCN,values-zh-rTW。
(7) raw文件夾:存放不需要系統編譯成二進制的文件,例如字體文件等同assets文件夾類似。
(8) xml文件夾存放xml文件。
以下是手機端實現功能的程序流程圖如圖5.2所示。
圖5.2 藍牙通信流程圖

  • 手機界面程序設計
在設置手機界面的時候,在Eclipse集成開發環境下,首先新建一個android項目工程,興建路徑是File—New—android project—project name  選擇android 1.6版本,工程名命名為Bluetooth-car,選擇Create Activity,則自動創建了一個Activity.在創建Activity時,需要注意一下四個要點:
1、一個Activity就是一個類,并且這個類要繼承Activity。
2、需要復寫Oncreate方法(當一個Activity第一次運行顯示在手機上或者虛擬機上的時就會調用Oncreate方法)。
3、每一個Activity都需要在Androidmanifast.xml文件當中配置。
4、為Activity添加必要的控件。如圖5.3所示,在制作藍牙小車手機界面的時候,我用到了Textview 文本控件和 Butten按鈕控件,并且在添加控件時采用相對布局形式[18、19]。
圖5.3 手機界面圖
兩個Textview文本控件分別命名為:重慶郵電大學自動化學院和藍牙控制系統,在layout布局文件下可以任意改變控件的位置、字體的大小、背景圖片。改變背景圖片的方法為:首先將需要用到的背景圖片,分別拖入到drawable下,高中低分辨率都拖入一張,以便不同分辨率的手機識別,然后在layout布局文件下,打開Activity buletooth-car文件,調用添加安卓手機界面背景的語句為android:background="@drawable/background1" >,就能得到我們所修改的背景圖片。
二、手機監聽程序設計
在Eclipes開發平臺上,首先在Layout文件中采用相對布局的形式設計完成手機界面以后,就要考慮為我們的每個Butten按鍵綁定監聽程序,以實現在每個按鍵按下時,就能通過手機藍牙發送相應的數據到小車藍牙接收模塊。首先在Layout文件中,每添加一個控件,都會為這個控件設置一個ID,(如android:id="@+id/button1"),然后在R.JAVA文件就會自動生成一個ID地址。然后在主程序里面編寫監聽程序,當按鍵按下的時候,通過監聽按鍵的ID地址的不同,采用switch結構,跳轉到不同的case里,向小車藍牙模塊發送不同的數據。在程序里直接寫進小車藍牙模塊的藍牙地址(00:12:10:31:01:70),當程序開始運行時,將會自動搜索該地址的藍牙芯片,當進行過一次配對連接以后,將會記憶該地址,以后每次只要打開手機界面,開始運行時就會自動進行搜索配對連接好[20、21]。
* 按鈕點擊事件.
              * @param v
              */
              public void onClick(View v) {
                            switch (v.getId()) {
                            //轉寫按鈕
                            case R.id.button1:
                                          message[0] = (byte) 0x41;                                         
                                          vibrator();
                                          Toast.makeText(this, "前進", Toast.LENGTH_LONG).show();
                                          bluesend(message);
                                          break;
                            //設置按鈕
                            case R.id.button2:
                                          message[0] = (byte) 0x44;
                                          vibrator();
                                          Toast.makeText(this, "后退", Toast.LENGTH_LONG).show();
                                          bluesend(message);
                                          break;
                            case R.id.button3:
                                          message[0] = (byte) 0x43;
                                          vibrator();
                                          Toast.makeText(this, "左轉", Toast.LENGTH_LONG).show();
                                          bluesend(message);
                                          break;
                            case R.id.button4:
                                          message[0] = (byte) 0x42;
                                          vibrator();
                                          Toast.makeText(this, "右轉", Toast.LENGTH_LONG).show();
                                          bluesend(message);
                                          break;
                            case R.id.button5:
                                          message[0] = (byte) 0x61;
                                          vibrator();                                         
                                          Toast.makeText(this, "停止", Toast.LENGTH_LONG).show();
                                          bluesend(message);
                                          break;
                                         
                            default:
                                          break;
                            }
              }


第三節  本章小結

本章主要介紹本系統的軟件設計,其中就包括單片機端的C語言程序設計和Android手機端的JAVA程序設計。由于我們在本科階段都只接觸過C語言,對JAVA語言從未涉及過,所以在做起來的時候遇到了很多的困難。首先對JAVA語言的開發環境Eclipes的使用不熟悉,對新接觸語言的語法不熟悉。后來通過查找資料和對一些做好的工程例子的學習以后,有了對JAVA語言的大致的了解,就開始先學習著做簡單的手機界面的程序。然后通過網上找到一些相關的程序進行修改以及在指導老師的指導和修改下,完成了手機端的軟件設計。



章  系統整體調試


節  調試方案

根據電路原理圖、實物 圖把電路板實物做出來后,下一步就是電路板調試。電路板調試是最關鍵的一步,前面所做的電路設計的成功與否就是在調試步驟里體現的。本系統的調試主要分為硬件調試、軟件調試和系統整體調試等三大部分。
經過初步對定時器的分析設計后,在制作硬件電路的同時,調試也在穿插進行。這樣有利于問題的分析和解決,不會造成問題的積累,而且不會因為一個小問題而影響整體電路的檢查,從而可以節約大量的調試時間。例如當單片機控制模塊硬件部分制作好后,就可以先調試電機轉動程序,通過電機驅動控制電機轉動了,則結果正確了,說明電機驅動電路與單片機的連接電路是正確的,單片機能正常工作。軟件編程中,首先完成單元功能模塊的調試,然后進行系統的調試,調試的整體思想和步驟和硬件大同小異。系統的整體調試是最重要的一部分,雖然軟硬件調試都通過了,但是通過藍牙傳輸數據過程中可能會出現新的問題。


節  硬件電路調試

硬件單元電路制作好后,在上電之前,應該先用萬用表對各個獨立元件進行檢查,在排除了虛焊、短路、斷路等問題后再通電進行電路功能的調試。具體調試過程如下所述:
一、獨立元件的檢測
任何組裝好的電子電路,在通電調試之前,必須認真檢查電路連線是否有誤。檢查的方法是對照電路圖,按一定的順序逐級對應檢查,例如:對電路板的電阻阻值進行確定,可以通過讀取電阻上的色環進行確認。特別是注意電源是否接錯,電源與地是否有短接,集成電路和晶體管的引腳是否接錯,輕輕撥一撥元器件,觀察焊點是否牢固等。用萬用表檢測是不是有短路和斷路現象。
給系統上電后,看下電源(綠色)燈亮不亮。假如不亮,就要檢查電源指示燈發光二極管的好壞。還要用萬用表測一下單片機等芯片的電壓是不是符合要求。假如不是,就要進行各個芯片的檢查,看一下各個芯片的引腳有沒有焊好,芯片是否損壞。

圖6.1 驅動模塊反面圖


圖6.2 藍牙模塊正反面圖


圖6.3 藍牙模塊調試圖

二、單片機最小系統的調試
單片機AT89C52最小系統的檢測分為硬件調試及軟件調試。量電源電壓有沒有到位,量復位RSL腳電平對不對,如果是高電平復位那么平時應該是低電平,量外部晶振有沒有起振,最小系統電路參考芯片PDF文檔,確認正確。
硬件調試時用萬用表測量單片機的工作電壓及各個管腳的電壓是否達到正常工作電壓。在此檢測中還要燒入程序對各個I/O口的輸出進行測試,查看I/O口所輸出的電壓是否與程序所控制值一致。例如:編寫一個調試程序,使的所有I/O口從P1.0口開始依次賦予低電平,用萬用表測量其輸出電壓,確定是否與程序所付值一致,一致則證明正確;然后又對其依次賦予高電平,確定是否與程序所付值一致,一致則證明正確。兩次測試都正確,證明單片機最小系統是正常工作的。



圖6.4 單片機調試圖
電源電路的調試
電源電路作為整個系統的供電電路,其輸出電壓必須在單片機的正常工作電壓范圍(4V到5.5V之間)內。在電源通電之前,一定要檢查電路是否接錯,特別是極性電容是否有接反,防止出現極性電容接反而造成爆電容的現象。在確保器件接法無誤的情況下,接通電源,并用萬用表測量輸出電壓,得到其電壓為5.3V,符合系統的正常工作電壓要求。然后再在電機驅動輸出端接上干電池, 實現兩個電源供電。
四、驅動模塊的調試

驅動模塊為驅動電機的芯片,L298需要從外部接兩個電壓,一個是給電機的,另一個給L298芯片的。首先檢查驅動芯片與單片機的各個連線是否都正確以后,給芯片通上電源,單片機指示燈點亮以后。運行單片機上的程序,通過單片機P2口的數據變化來控制L298的IN1、IN2、IN3、IN4的電平的高低。L298輸入端的高低電平的變化,通過輸入端的LED燈的亮滅來顯示。當運行前進程序的時候,IN1、IN2、IN3、IN4的值為1、0、1、0,分別點亮LED1和LED3,左右電機都正轉,實現小車前進;運行左轉程序的時候,IN1、IN2、IN3、IN4分別為1、0、0、1,分別點亮LED1、LED4,左電機正轉,右電機反轉,實現小車左轉;運行右轉程序的時候,IN1、IN2、IN3、IN4的值為0、1、1、0,點亮LED2,LED3,左電機反轉,右電機正轉,實現小車右轉;運行后退程序的時候,IN1、IN2、IN3、IN4的值分別為0、1、0、1,分別點亮LED2、LED4,左右電機都反轉,實現小車后退。通過調試電機驅動模塊能實現基本的功能。其調試圖如圖6.5,圖6.6,圖6.7,圖6.8所示。



圖6.5 小車前進指示圖



圖6.6 小車后退指示圖

圖6.7 小車左轉指示圖




圖6.8 小車右轉指示圖


節  軟件調試
C語言的調試
軟件的調試包括程序本身語法的調試和在電路板上功能的調試兩種。在編程過程中,為了得到滿足要求的用戶程序,一般都需要有一個對程序的調試過程,甚至需要經過多次反復的調試才能完成。在調試程序前為了調試方便,避免程序出錯時將單片機拆來拆去的麻煩,在電路板上做了一個下載口,可以將下載線直接插到電路板上進行調試,這樣就可以一邊進行調試,一邊修改程序。程序用Keil C軟件寫好后,先用該軟件的編譯功能編譯一下所寫的程序,檢查程序是有語法錯誤或其他的錯誤。如果有錯誤則根據提示進行分析將錯誤改過來直至編譯成功為止。當完成了語法調試后,再根據定時開關插座設計的功能要求修改程序完成系統的各個功能。在編寫程序的時候一定要根據系統實現的功能和連接方式,認真分析,畫出系統主程序、時鐘程序、設置程序的流程圖,并根據畫出的流程圖一步一步的去寫出程序。
根據系統的特點,軟件系統應該按模塊進行調試,當各個模塊調試通過后再將各個模塊整合起來,進行綜合調試,直到得到預期結果。
與純粹的C語言編程不同的是,單片機編程要考慮到硬件的設計,所有程序的編寫都是根據硬件資源進行。

二.JAVA語言的調試

將做好的工程添加進入Eclipes開發環境中,檢查各個文件夾下面的程序有沒有出現打紅色X的問題以及警告,點開下方的problem的文件,檢查該工程有沒有出現問題,當排除了所有的問題以后。配置一個2.2版本的模擬器,然后啟動模擬器,在模擬器上運行該工程,在模擬器上將會出現已經做好的手機界面,運行完成,調試成功。然后將手機連接到電腦上,打開安卓手機的USB接口。接下來點擊運行整個工程項目,在手機上出現前面那個做好的藍牙小車控制界面。點擊各個按鈕,都無問題,證明該JAVA程序沒有問題[22]。

圖6.9 手機端程序運行圖


節  系統整體的調試

藍牙控制小車的硬件模塊和軟件模塊分別調試通過后,接下來就可以進行系統的整體測試。首先檢查各個模塊之間,以及電機驅動與電機的連接都沒有出錯的情況下,打開給各個模塊提供的5V電源以及打開給電機提供的另一個6V電源。此時最小系統模塊指示燈點亮,表示單片機供電正常,藍牙模塊指示燈開始閃爍,表示藍牙模塊也供電正常。此時打開安卓手機的藍牙,搜索該藍牙芯片,進行配對。然后打開我們做好的手機界面,當界面打開之后,開始自動搜索藍牙芯片的地址進行連接,當藍牙芯片的指示燈有閃爍轉變為常亮以后,表示藍牙配對連接成功。在剛開始的時候調試的時候遇到了一些問題,在電機驅動方面,當在手機端的界面上點擊前進、后退、左轉、右轉按鈕的時候,藍牙模塊能接受手機端發送的字符A、B、C、D的ASCII碼值,并且能夠通過串口相應的傳遞給單片機,單片機通過分析串口傳過來的數據,改變P2口的值分別為65、66、67、68,來控制電機驅動的輸入端IN1、IN2、IN3、IN4。相應的電機驅動端的四個指示LED燈都能根據數據的變化采取不同的量滅組合情況,來相應控制小車的前進、后退、左轉、右轉[23、24、25]。

圖6.10 小車底板正面圖




圖6.11 小車底板反面圖



圖6.12 小車實體圖


節  本章小結

在調試的過程中也遇到一些問題,就是最開始電機驅動輸出端控制的電機卻不會轉動。通過分析,可能有兩個原因導致電機不會轉動,其一,電機驅動的輸出端的接線出現了錯誤,導致電機轉動出現問題;其二,電機驅動端接的給電機供電的電壓達不到驅動電機的最低電壓,最后通過查詢資料和用萬用表測驅動模塊的輸出端的各個引腳的高低電平,發現輸出端的電平也能隨輸入端的改變而變化,當最后測試VCC和GND兩端,發現無明顯的壓降,再用萬用表的測電阻值測兩端的阻值,發現問題是電機驅動模塊輸出端的供電端VCC與GND端短路,導致外接電源不能給電機供電。最后我通過直接從芯片的引腳接線到電源端,則電機能夠正常轉動。





結  論


本次畢業設計是一個基于單片機AT89C52的智能小車控制,包括方案選擇、軟硬件設計、單片機最小系統、電機驅動電路和藍牙電路、硬件測試結果及解決在電路調試時遇到的問題。在此期間主要完成的工作包括以下幾個方面:
(1)設計初期收集電機驅動、單片機等相關資料,對智能小車的實現原理有比較清晰的了解。
(2)確定系統框圖,對電源模塊、單片機最小系統模塊、藍牙電路模塊和電機及其驅動電路模塊等的實施方案進行比較,確定最終的智能小車控制的設計方案。
(3)根據智能小車控制的原理圖制作出電路連接圖。
(4)根據系統要實現前進、后退、左轉、右轉等功能編寫出小車端的軟件程序。
(5)在eclipes開發環境下,應用JAVA程序編寫手機界面程序,并且通過模擬器來檢測手機界面程序。
(6)軟硬件調試通過后進行整體調試,并查找該系統存在的缺陷,進行完善。
(7)最終小車能夠實現前進、后退、左轉、右轉等功能,達到老師給出的基本要求。
本次設計完成了基于安卓手機的智能小車控制系統。該系統采用51單片機AT89C52編程控制電機的正反轉來實現小車前進、后退、左轉、右轉,而電機的正反轉則由電機驅動L298N輸出端的邏輯電平來控制。
從整個設計的過程來看前期的充分的準備顯得非常的重要,經過前期充分的準備,和對嵌入式系統開發的學習,避免了很多在后續的設計中可能出現的問題。
MCU端的軟硬件設計因為與所學知識相關性較大,所以出現的問題較少,MCU底板設計時鑒于電路簡單,且易于焊接,故未采用PCB制版也相應的節約了成本。特別值得一提的是為了提高系統在硬件上的安全性和穩定性,我特別添加了硬件保護裝置,以提高系統的硬件防碰撞的能力。
主要的問題出現在android端的軟件設計上,由于對android開發環境的不熟悉,缺乏一些在編寫JAVA程序時的一些技巧性問題,所以剛剛開始時總是出現很多問題,并且出現的問題都需要查找相關資料才能解決。通過學習一些android相關的學習視頻,最后對android環境有了一個系統的了解在開發的過程中也得心應手些。
Android端圖形界面的設計也是一大難點,基于Java的圖形界面設計不論是從設計平臺還是Java語言的掌握都是一想挑戰,但幸于Java軟件的開發技術已經成熟,且可查閱的資料多且詳盡,所以圖形界面的設計達到設計時的五項按鍵要求,功能實現良好,除界面的友好程度可以更加優化外,其余完成任務。
總體來看,我進行了比較充分的準備,在實踐過程中通過查閱相關資料和咨詢有關人員,克服了系統設計過程中的絕大多數困難,基本都以達到設計要求,并通過了軟件測試。

致  謝


畢業設計完成了,在這個過程中我學到了很多東西。首先我要感謝我的導師羅萍老師,他在我完成論文的過程中,給予了我很大的幫助。在論文開始的初期,我對于論文的結構以及文獻選取等方面都有很多問題,是在老師的幫助下進行修改和完善的。本畢業設計是在羅萍老師悉心的關懷與指導下完成,在此對老師獻上最衷心地感謝。羅萍老師從畢業設計一開始就對我們嚴格要求,每周的周一都會和我們開見面會,詢問我們的畢設進度并了解我們遇到的困難,積極協助我們解決設計過程中的各種難題,并要求我們每天記錄在畢業設計中所作的工作進度及遇到的問題,讓我們去發現問題,解決問題。在我遇到難已解決的問題心中急躁時,羅萍老師總是及時的給予鼓勵,使我能夠有勇敢的克服困難,把畢設繼續進行下去。羅萍老師對學生的高度關注和對工作高度負責的精神值得我們尊敬,也是我今后走向工作崗位的榜樣。通過本次畢業設計,我不僅是對我們所學知識的一個匯總,同時也是考驗我們學習能力和動手能力的一個平臺;讓我們能學到更多的相關知識,更重要的是學到了面對困難的不放棄、不氣餒的態度,不驕不躁的辦事風格,奮發向上的精神,這些在我今后的生活和學習中都是一筆寶貴的財富。
最后,我要再次感謝在畢業設計過程中對我提供過制作電路板等工具的同學和老師,以及在畢業設計中對我進行過指導的所有老師和同學。

附  


一、英文原文
Application Fundamentals
Android applications are written in the Java programming language. The compiled Java code — along with any data and resource files required by the application — is bundled by the aapt tool into an Android package, an archive file marked by an .apk suffix. This file is the vehicle for distributing the application and installing it on mobile devices; it's the file users download to their devices. All the code in a single .apk file is considered to be one application.
In many ways, each Android application lives in its own world:
1. By default, every application runs in its own Linux process. Android starts the process when any of the application's code needs to be executed, and shuts down the process when it's no longer needed and system resources are required by other applications.
2. Each process has its own virtual machine (VM), so application code runs in isolation from the code of all other applications.
3. By default, each application is assigned a unique Linux user ID. Permissions are set so that the application's files are visible only to that user and only to the application itself — although there are ways to export them to other applications as well.
It's possible to arrange for two applications to share the same user ID, in which case they will be able to see each other's files. To conserve system resources, applications with the same ID can also arrange to run in the same Linux process, sharing the same VM.
Application Components
A central feature of Android is that one application can make use of elements of other applications (provided those applications permit it). For example, if your application needs to display a scrolling list of images and another application has developed a suitable scroller and made it available to others, you can call upon that scroller to do the work, rather than develop your own. Your application doesn't incorporate the code of the other application or link to it. Rather, it simply starts up that piece of the other application when the need arises.
For this to work, the system must be able to start an application process when any part of it is needed, and instantiate the Java objects for that part. Therefore, unlike applications on most other systems, Android applications don't have a single entry point for everything in the application (no main() function, for example). Rather, they have essential components that the system can instantiate and run as needed. There are four types of components:
Activities
An activity presents a visual user interface for one focused endeavor the user can undertake. For example, an activity might present a list of menu items users can choose from or it might display photographs along with their captions. A text messaging application might have one activity that shows a list of contacts to send messages to, a second activity to write the message to the chosen contact, and other activities to review old messages or change settings. Though they work together to form a cohesive user interface, each activity is independent of the others. Each one is implemented as a subclass of the Activity base class.
An application might consist of just one activity or, like the text messaging application just mentioned, it may contain several. What the activities are, and how many there are depends, of course, on the application and its design. Typically, one of the activities is marked as the first one that should be presented to the user when the application is launched. Moving from one activity to another is accomplished by having the current activity start the next one.
Each activity is given a default window to draw in. Typically, the window fills the screen, but it might be smaller than the screen and float on top of other windows. An activity can also make use of additional windows — for example, a pop-up dialog that calls for a user response in the midst of the activity, or a window that presents users with vital information when they select a particular item on-screen.
The visual content of the window is provided by a hierarchy of views — objects derived from the base View class. Each view controls a particular rectangular space within the window. Parent views contain and organize the layout of their children. Leaf views (those at the bottom of the hierarchy) draw in the rectangles they control and respond to user actions directed at that space. Thus, views are where the activity's interaction with the user takes place.
For example, a view might display a small image and initiate an action when the user taps that image. Android has a number of ready-made views that you can use — including buttons, text fields, scroll bars, menu items, check boxes, and more.
A view hierarchy is placed within an activity's window by the Activity.setContentView() method. The content view is the View object at the root of the hierarchy. (See the separate User Interface document for more information on views and the hierarchy.)
Services
A service doesn't have a visual user interface, but rather runs in the background for an indefinite period of time. For example, a service might play background music as the user attends to other matters, or it might fetch data over the network or calculate something and provide the result to activities that need it. Each service extends the Service base class.
A prime example is a media player playing songs from a play list. The player application would probably have one or more activities that allow the user to choose songs and start playing them. However, the music playback itself would not be handled by an activity because users will expect the music to keep playing even after they leave the player and begin something different. To keep the music going, the media player activity could start a service to run in the background. The system would then keep the music playback service running even after the activity that started it leaves the screen.
It's possible to connect to (bind to) an ongoing service (and start the service if it's not already running). While connected, you can communicate with the service through an interface that the service exposes. For the music service, this interface might allow users to pause, rewind, stop, and restart the playback.
Like activities and the other components, services run in the main thread of the application process. So that they won't block other components or the user interface, they often spawn another thread for time-consuming tasks (like music playback). See Processes and Threads, later.
Broadcast receivers
A broadcast receiver is a component that does nothing but receive and react to broadcast announcements. Many broadcasts originate in system code — for example, announcements that the timezone has changed, that the battery is low, that a picture has been taken, or that the user changed a language preference. Applications can also initiate broadcasts — for example, to let other applications know that some data has been downloaded to the device and is available for them to use.
An application can have any number of broadcast receivers to respond to any announcements it considers important. All receivers extend the BroadcastReceiver base class.
Broadcast receivers do not display a user interface. However, they may start an activity in response to the information they receive, or they may use the Notification Manager to alert the user. Notifications can get the user's attention in various ways — flashing the backlight, vibrating the device, playing a sound, and so on. They typically place a persistent icon in the status bar, which users can open to get the message.
Content providers
A content provider makes a specific set of the application's data available to other applications. The data can be stored in the file system, in an SQLite database, or in any other manner that makes sense. The content provider extends the Content Provider base class to implement a standard set of methods that enable other applications to retrieve and store data of the type it controls. However, applications do not call these methods directly. Rather they use a Content Resolver object and call its methods instead. A Content Resolver can talk to any content provider; it cooperates with the provider to manage any interprocess communication that's involved.
See the separate Content Providers document for more information on using content providers.
Whenever there's a request that should be handled by a particular component, Android makes sure that the application process of the component is running, starting it if necessary, and that an appropriate instance of the component is available, creating the instance if necessary.
Activating components: intents
Content providers are activated when they're targeted by a request from a Content Resolver. The other three components — activities, services, and broadcast receivers — are activated by asynchronous messages called intents. An intent is an Intent object that holds the content of the message. For activities and services, it names the action being requested and specifies the URI of the data to act on, among other things. For example, it might convey a request for an activity to present an image to the user or let the user edit some text. For broadcast receivers, the
Intent object names the action being announced. For example, it might announce to interested parties that the camera button has been pressed.
There are separate methods for activating each type of component:
1. An activity is launched (or given something new to do) by passing an Intent object to
Context.start Activity() or Activity .start Activity For Result(). The responding activity can look at the initial intent that caused it to be launched by calling its getIntent() method. Android calls the activity's  on New Intent() method to pass it any subsequent intents. One activity often starts the next one. If it expects a result back from the activity it's starting, it calls  start Activity For Result() instead of  start Activity(). For example, if it starts an activity that lets the user pick a photo, it might expect to be returned the chosen photo. The result is returned in an Intent object that's passed to the calling activity's on Activity Result() method.
2. A service is started (or new instructions are given to an ongoing service) by passing an Intent object to Context. Start Service(). Android calls the service's onStart() method and passes it the Intent object. Similarly, an intent can be passed to Context. Bind Service() to establish an ongoing connection between the calling component and a target service. The service receives the Intent object in an on Bind() call. (If the service is not already running, bind Service() can optionally start it.) For example, an activity might establish a connection with the music playback service mentioned earlier so that it can provide the user with the means (a user interface) for controlling the playback. The activity would call bind Service() to set up that connection, and then call methods defined by the service to affect the playback.
A later section, Remote procedure calls, has more details about binding to a service.
3. An application can initiate a broadcast by passing an Intent object to methods like Context. Send Broadcast(), Context. Send Ordered Broadcast(), and Context. Send Sticky Broadcast() in any of their variations.
Android delivers the intent to all interested broadcast receivers by calling their on Receive() methods. For more on intent messages, see the separate article, Intents and Intent Filters.
Shutting down components
A content provider is active only while it's responding to a request from a Content Resolver. And a broadcast receiver is active only while it's responding to a broadcast message. So there's no need to explicitly shut down these components.
Activities, on the other hand, provide the user interface. They're in a long-running conversation with the user and may remain active, even when idle, as long as the conversation continues. Similarly, services may also remain running for a long time. So Android has methods to shut down activities and services in an orderly way:
1. An activity can be shut down by calling its finish() method. One activity can shut down another activity (one it started with start Activity For Result()) by calling finish Activity().
2. A service can be stopped by calling its stop Self() method, or by calling Context .stop Service().
Components might also be shut down by the system when they are no longer being used or when Android must reclaim memory for more active components. A later section, Component Lifecycles, discusses this possibility and its ramifications in more detail.
The manifest file
Before Android can start an application component, it must learn that the component exists. Therefore, applications declare their components in a manifest file that's bundled into the Android package, the .apk file that also holds the application's code, files, and resources.
The manifest is a structured XML file and is always named AndroidManifest.xml for all applications. It does a number of things in addition to declaring the application's components, such as naming any libraries the application needs to be linked against (besides the default Android library) and identifying any permissions the application expects to be granted.
But the principal task of the manifest is to inform Android about the application's components. For example, an activity might be declared as follows:
The name attribute of the <activity> element names the Activity subclass that implements the activity. The icon and label attributes point to resource files containing an icon and label that can be displayed to users to represent the activity.
The other components are declared in a similar way — <service> elements for services, <receiver> elements for broadcast receivers, and <provider> elements for content providers. Activities, services, and content providers that are not declared in the manifest are not visible to the system and are consequently never run. However, broadcast receivers can either be declared in the manifest, or they can be created dynamically in code (as BroadcastReceiver objects) and registered with the system by calling Context.registerReceiver().
For more on how to structure a manifest file for your application, see The Android Manifest.xml File.
Intent filters
An Intent object can explicitly name a target component. If it does, Android finds that component (based on the declarations in the manifest file) and activates it. But if a target is not explicitly named, Android must locate the best component to respond to the intent. It does so by comparing the Intent object to the intent filtersof potential targets. A component's intent filters inform Android of the kinds of intents the component is able to handle. Like other essential information about the component, they're declared in the manifest file. Here's an extension of the previous example that adds two intent filters to the activity:
The first filter in the example — the combination of the action "android.intent.action.MAIN" and the category
"android.intent.category.LAUNCHER" — is a common one. It marks the activity as one that should be represented in the application launcher, the screen listing applications users can launch on the device. In other words, the activity is the entry point for the application, the initial one users would see when they choose the application in the launcher.
The second filter declares an action that the activity can perform on a particular type of data.
A component can have any number of intent filters, each one declaring a different set of capabilities. If it doesn't have any filters, it can be activated only by intents that explicitly name the component as the target.
For a broadcast receiver that's created and registered in code, the intent filter is instantiated directly as an IntentFilter object. All other filters are set up in the manifest.
For more on intent filters, see a separate document, Intents and Intent Filters.


  • 英文翻譯
應用程序基礎Android Developers
Android應用程序使用Java編程語言開發。aapt工具把編譯后的Java代碼連同應用程序所需的其他數據和資源文件一起打包到一個Android包文件中,這個文件使用.apk作為擴展名。此文件是分發并安裝應用程序到移動設備的載體;是用戶下載到他們的設備的文件。單一.apk文件中的所有代碼被認為是一個應用程序。
從多個角度來看,每個Android應用程序都存在于它自己的世界之中:
   1 默認情況下,每個應用程序均運行于它自己的Linux進程中。當應用程序中的任何代碼需要被執行時,Android啟動此進程,而當不再需要此進程并且其它應用程序又請求系統資源時,則關閉這個進程。
 2 每個進程都有其獨有的虛擬機(VM),所以應用程序代碼與所有其它應用程序代碼是隔離運行的。
   3 默認情況下,每個應用程序均被賦予一個唯一的Linux用戶ID,并加以權限設置,使得應用程序的文件僅對此用戶及此應用程序可見——盡管也有其它的方法使得這些文件同樣能為其他應用程序所訪問。
1 應用程序組件
Android的一個核心特性就是一個應用程序可以使用其它應用程序的元素(如果那個應用程序允許的話)。例如,如果你的應用程序需要顯示一個圖片卷動列表,而另一個應用程序已經開發了一個合用的而又允許別的應用程序使用的話,你可以直接調用那個卷動列表來完成工作,而不用自己再開發一個。你的應用程序并沒有吸納或鏈接其它應用程序的代碼。它只是在有需求的時候啟動了其它應用程序的那個功能部分。
為達到這個目的,系統必須能夠在一個應用程序的任何一部分被需要時啟動一個此應用程序的進程,并將那個部分的Java對象實例化。因此,不像其它大多數系統上的應用程序,Android應用程序并沒有為應用程序提供一個單獨的入口點(比如說,沒有main()函數),而是為系統提供了可以實例化和運行所需的必備組件。一共有四種組件類型:
1 Activity
activity是為用戶操作而展示的可視化用戶界面。例如,一個activity可以展示一個菜單項列表供用戶選擇,戒者顯示一些包含說明文字的照片。一個短消息應用程序可以包括一個用于顯示要發送消息到的聯系人列表的activity,一個給選定的聯系人寫短信的activity以及翻閱以前的短信或改變設置的其他activity。盡管它們一起組成了一個內聚的用戶界面,但其中每個activity都不其它的保持獨立。每一個都實現為以Activity類為基類的子類。
一個應用程序可以只有一個activity,戒者,如剛才提到的短信應用程序那樣,包含很多個。每個activity的作用,以及有多少個activity,當然是取決于應用程序及其設計的。一般情況下,總有一個應用程序被標記為用戶在應用程序啟動的時候第一個看到的。從一個activity轉向另一個靠的是用當前的activity啟動下一個。
每個activity都被給予一個默認的窗口以進行繪制。一般情況下,這個窗口是滿屏的,但它也可以是一個小的位于其它窗口之上的浮動窗口。一個activity也可以使用附加窗口——例如,一個在activity運行過程中彈出的供用戶響應的對話框,戒是一個當用戶選擇了屏幕上特定項目后顯示的必要信息的窗口。
窗口顯示的可視內容是由一系列層次化view構成的,這些view均繼承自 View 基類。每個view均控制著窗口中一塊特定的矩形區域。父級view包含并組織其子view的布局。葉節點view(位于層次結構最底端)在它們控制的矩形區域中進行繪制,并對用戶直達其區域的操作做出響應。因此,view是activity與用戶進行交互的界面。例如,view可以顯示一個小圖片,并在用戶指點它的時候產生動作。Android有一些預置的view供開發者使用——包括按鈕、文本域、滾動條、菜單項、復選框等等。
view層次結構是由Activity.setContentView() 方法放入activity的窗口之中的。content view是位于層次結構根位置的View對象。(參見獨立的用戶界面文檔以獲取關于view及層次結構的更多信息。)
2 Service
service沒有可視化的用戶界面,而是在一段時間內在后臺運行。例如,一個service可以在用戶做其它事情的時候在后臺播放背景音樂、從網絡上獲取數據或者計算一些東西并提供給需要這個運算結果的activity使用。每個service都繼承自Service基類。
一個媒體播放器播放播放列表中的曲目是一個不錯的例子。播放器應用程序可能有一個或多個activity來給用戶選擇歌曲并進行播放。然而,音樂播放這個任務本身丌應該由任何activity來處理,因為用戶期望即使在他們離開播放器應用程序而開始做別的事情時,音樂仍在繼續播放。為達到這個目的,媒體播放器activity可以啟動一個運行于后臺的service。系統將在這個activity不再顯示于屏幕乀后,仍維持音樂播放service的運行。
連接至(綁定到)一個正在運行的service(如果service沒有運行,則啟動之)是可能的。連接之后,你可以通過那個service暴露出來的接口不service進行通訊。對于音樂service來說,這個接口可以允許用戶暫停、回退、停止以及重新開始播放。
如同activity和其它組件一樣,service運行于應用程序進程的主線程內。所以它不會對其它組件或用戶界面有任何妨礙,它們一般會派生一個新線程來執行一些時間消耗型任務(比如音樂回放)。參見稍后的進程和線程。
3 Broadcast receiver
broadcast receiver是一個與注于接收廣播通知信息,并做出相應處理的組件。許多廣播是由系統代碼產生的——例如,通知時區改變、電池電量低、拍攝了一張照片或者用戶改變了語言選項。應用程序也可以發起廣播——例如,通知其它應用程序一些數據已經下載到設備上并處于可用狀態。
一個應用程序可以擁有任意數量的broadcast receiver,以對所有它認為重要的通知信息予以響應。所有的receiver均繼承自BroadcastReceiver基類。
broadcast receiver沒有用戶界面。然而,它們可以啟動一個activity來響應它們收到的信息,或者也可以使用NotificationManager來通知用戶。通知可以用多種方式來吸引用戶的注意力──閃動背光燈、震動設備、播放聲音等等。通知一般是在狀態欄上放一個持麗的圖標,用戶可以打開它并獲取消息。
4 Content provider
content provider將一些特定的應用程序數據供給其它應用程序使用。數據可以存儲于文件系統、SQLite數據庫或其它有意丿的方式。content provider繼承于ContentProvider 基類,實現了一套使得其他應用程序能夠檢索和存儲它所管理的類型數據的標準方法。然而,應用程序并不直接調用返些方法,而是使用一個 ContentResolver 對象,調用它的方法作為替代。ContentResolver可以與任何content provider進行會話;與其合作對任何相關的進程間通訊進行管理。
參閱獨立的Content Providers文檔以獲得更多關于使用content provider的信息。
每當出現一個需要被特定組件處理的請求時,Android會確保那個組件的應用程序進程處于運行狀態,必要時會啟動它,并確保那個組件的一個合適的實例可用,必要時會創建那個實例。
1.1激活組件:intent
當接收到ContentResolver發出的請求后,content provider被激活。而其它三種組件——activity、service和broadcast receiver,被一種叫做intent的異步消息所激活。intent是一個保存著消息內容的Intent對象。對于activity和service來說,它指明了所請求的操作名稱,并指定了用來操作的數據的URI和其它一些信息。例如,它可以承載一個對一個activity的請求,讓它為用戶顯示一張圖片,或者讓用戶編輯一些文本。而對于broadcast receiver來說,Intent對象指明了所通報的操作。例如,它可以對所有感興趣的對象通報照相按鈕被按下。
對于每種組件來說,激活的方法是不同的: 通過傳遞一IntentContext.startActivity()Activity.startActivityForResult(以啟動(或指定新工作給)一個activity。相應的activity可以通過調用自身的 getIntent() 方法來查看最刜激活它的intent。Android通過調用activity的onNewIntent()方法來傳遞給它隨后的任何intent。
  一個activity經常啟動另一個activity。如果它期望它所啟動的那個activity迒回一個結果,它會調用startActivityForResult()而不是startActivity()。例如,如果它啟動了另外一個activity以使用戶挑選一張照片,它也許想知道哪張照片被選中了。其結果將會被封裝在一個Intent對象中,并傳遞給發出調用的activity的onActivityResult() 方法。
2 通過傳遞一個Intent對象至Context.startService()以啟動一個service(或向正在運行的service給出一個新的指令)。Android調用此service的onStart()方法并將Intent對象傳遞給它。
與此類似,一個intent可以被傳遞給 Context.bindService()以建立一個處于調用組件和目標service乀間的活動連接。此service會通過onBind() 方法的調用來獲取此Intent對象(如果此service尚未運行,bindService()會先啟動它)。例如,一個activity可以建立一個不前述的音樂回放service的連接,這樣它就可以提供給用戶一些途徑(用戶界面)來控制回放。這個activity可以調用 bindService()來建立此連接,然后調用service中定之的方法來控制回放。
稍后的遠程方法調用一節有關于如何綁定至一個service的更多細節。
3 應用程序可以通過傳遞一個Intent對象至 Context.sendBroadcast() ,Context. sendOrderedBroadcast(), 以及Context.sendStickyBroadcast()和其它類似方法來發起一個廣播。Android會調用所有對此廣播有興趣的broadcast receiver的 onReceive()方法,將此intent傳遞給它們。
1.2 關閉組件
content provider僅在響應來自ContentResolver的請求時處于活動狀態。而broadcast receiver僅在響應一條廣播信息的時候處于活動狀態。所以沒有必要去顯式地關閉返些組件。
而activity則不同,它提供了用戶界面。只要會話依然持續,無論會話過程有無空閑,activity同用戶進行長時間會話且可能一直處于活動狀態。與此相似,service也會在很長一段時間內保持運行。所以Android為關閉activity和service提供了一系列有序的方法。
activity可以通過調用自身的finish()方法來關閉。一個activity可以通過調用finishActivity()方法來關閉另外一個activity(它用startActivityForResult()啟動的)。
service可以通過調用自身的stopSelf()方法,或調用 Context.stopService()來停止。
系統也會在組件不再被使用的時候戒者當Android必須為更多的活動組件回收內存時關閉它。稍后的組件的生命周期一節,將對返種可能性及結果進行更詳細的認論。
1.3 manifest文件
當Android啟動一個應用程序組件之前,它必須知道那個組件是存在的。因此,應用程序會在一個被打包到Android包中的manifest文件中聲明它的組件,.apk文件還將涵括應用程序的代碼、文件以及其它資源。
manifest文件是一個結構化的XML文件,而且對于所有應用程序,文件名總是AndroidManifest.xml。除了聲明此應用程序各個組件,它會做很多其他工作,比如指明應用程序所需鏈接到的庫的名稱(除了默認的Android庫乀外)以及標出應用程序期望獲得的各種權限。
但manifest文件最重要的任務是向Android報告此應用程序的各個組件。丼例說明,一個activity可能聲明如下:
<activity>元素的name屬性指定了實現此activity的 Activity子類。icon和label屬性指向包含展示給用戶的此activity的圖標和標簽的資源文件。
其它組件也以類似的方法聲明——<service> 元素用于聲明service, <receiver> 元素用于聲明broadcast receiver,而 <provider> 元素用于聲明content provider。未在manifest文件中進行聲明的activity、service以及content provider將不為系統所見,從而也就永不會被運行。然而,broadcast receiver既可以在manifest文件中聲明,也可以在代碼中動態創建(為BroadcastReceiver對象),并以調用Context.registerReceiver()的方式注冊至系統。
1.4 Intent過濾器
一個Intent對象可以顯式地指定一個目標組件。如果進行了返種指定,Android會找到這個組件(基于manifest文件中的聲明)并激活它。但如果intent沒有顯式地指定一個目標,Android就必須找到最合適的組件來響應此intent。這個過程是通過比較Intent對象和所有潛在目標的intent過濾器完成的。組件的intent過濾器會通知Android它所能處理的intent類型。如同組件的其它必要信息一樣,這些intent過濾器是在manifest文件中進行聲明的。返里有一個對先前例子的擴展,其中加入了針對activity的兩個intent過濾器:
示例中的第一個過濾器——action“android.intent.action.MAIN”和category“android.intent.category.LAUNCHER”的組合——是常見的一個。它標明了此activity應該在應用程序啟動器中顯示,就是用戶在屏幕上看到的此設備上可供啟動的應用程序的列表。換句話說,這個activity是應用程序的入口點,是用戶在啟動器中選擇運行這個應用程序后所見到的第一個activity。
第二個過濾器聲明了此activity在一種特定類型的數據上可以執行的操作。
一個組件可以擁有任意數量的intent過濾器,每個都聲明了一套不同的功能。如果組件沒有包含任何過濾器,它只能被顯式地指明作為目標組件的intent激活。
對于在代碼中創建并注冊的broadcast receiver來說,intent過濾器將被直接實例化IntentFilter為對象。其它所有的過濾器都在manifest文件中設置。

四、源程序

(一)單片機程序

單片機源程序如下:


  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar a;

  5. void init()
  6.    {
  7.      TMOD=0X20;   //設置定時器1為方式2
  8.      TH1=0xfd ;   
  9.      TL1=0xfd ;   //裝初值
  10.      TR1=1;       //啟動定時器1
  11.      REN=1;       // 使能接收

  12.      SM0=0;
  13.      SM1=1;       //設置串口為工作方式1

  14.      EA=1;       // 打開總中斷開關
  15.      ES=1;       // 打開串口中斷開關
  16.    }
  17.             
  18.     void main()
  19.     {
  20.         init();
  21.               while(1);
  22.      }

  23.    void ser() interrupt 4
  24.                  {
  25.                  ES=0;
  26.            RI=0;   //將接受中斷標志位清0;
  27.                                     
  28.                  a=SBUF; //將接受到的數據賦值給a
  29.                                    
  30.         switch(a)
  31.     {
  32.       case 65:  P2=0X17;  break;   //  發送的是A  前進指令
  33.       case 66:  P2=0X1B;  break;   //  發送的是B  右轉指令
  34.       case 67:  P2=0X27;  break;   //  發送的是C  左轉指令
  35. ……………………

  36. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:

基于安卓手機藍牙控制的智能小車設計.doc (5.65 MB, 下載次數: 139)





分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:404522 發表于 2019-1-23 23:12 | 只看該作者
寫的太好了,謝謝分享
回復

使用道具 舉報

板凳
ID:250717 發表于 2019-3-28 16:38 | 只看該作者
寫的太好了,謝謝分享
回復

使用道具 舉報

地板
ID:531672 發表于 2019-5-9 16:03 | 只看該作者
寫的太好了,謝謝分享
回復

使用道具 舉報

5#
ID:465853 發表于 2019-5-11 22:13 | 只看該作者

寫的太好了,謝謝分享
回復

使用道具 舉報

6#
ID:372154 發表于 2019-5-31 14:53 | 只看該作者


寫的太好了,謝謝分享
回復

使用道具 舉報

7#
ID:663813 發表于 2019-12-14 15:49 | 只看該作者
您好,請問有源代碼嗎?  能發一份嗎?1539733963@qq.com  謝謝!
回復

使用道具 舉報

8#
ID:683229 發表于 2020-1-7 21:26 | 只看該作者
寫的太好了,謝謝分享
回復

使用道具 舉報

9#
ID:1144421 發表于 2025-2-25 23:26 | 只看該作者
您好,這個寫的太棒了 請問有源代碼嗎?  能發一份嗎? 謝謝!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表