基于avr單片機做的gps定位儀
效果圖如下:

下面是電路圖工程文件大家可以自己修改
0.png (37.77 KB, 下載次數(shù): 214)
下載附件
2016-4-11 20:36 上傳
下面是所有的制作資料下載:
電路圖文件
多用途定位儀(電路).zip
(973.64 KB, 下載次數(shù): 90)
2016-4-11 20:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
描述:多用途定位儀電路原理圖、PCB源文件
源代碼
多用途定位儀(程序).zip
(442.56 KB, 下載次數(shù): 87)
2016-4-11 20:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
描述:多用途定位儀源代碼
文檔:
手冊與文檔.7z
(5.17 MB, 下載次數(shù): 99)
2022-4-11 20:22 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
以下是部分預覽(完整版請下載本帖附件):
通過GPS模塊實現(xiàn)對當前時間、位置、速度、航向、海拔等數(shù)據(jù)的測量;采用HMC5883L三軸地磁傳感器和ADXL345三軸加速度傳感器實現(xiàn)電子羅盤功能,并能對磁偏角和傾角帶來的誤差進行補償;采用12864顯示屏對測量的數(shù)據(jù)進行顯示;利用單片機和相關電路進行控制,完成對“基于GPS的多用途定位儀”的設計與制作。
1.可精確顯示當前的日期、時間;
2.可測量并顯示當前狀態(tài)經(jīng)緯度坐標值、海拔、地面高度、速度及航向;
3.可實現(xiàn)羅盤的功能對方向進行測量,并能對磁偏角和傾角進行帶來的誤差進行補償,同時還可以測量并顯示當前的傾角;
4.可做出實驗樣品進行展示;
摘要 摘要GPS是英文Global Positioning System(全球定位系統(tǒng))的簡稱。由于GPS技術具有全天候、高精度和自動檢測的特點,作為先進的測量手段和新的生產(chǎn)力在通信、通訊、氣象、勘探、導航、遙感、大地測量、地球動力等眾多領域得到極其廣泛的應用,F(xiàn)在GPS的外形設計已經(jīng)轉向便攜式發(fā)展,逐步踏入尋常百姓的生活中。 本次設計采用以GPS和電子羅盤相結合的方式,用電子羅盤來彌補GPS在靜態(tài)和一些特殊自然環(huán)境下無法使用的缺陷,從而實現(xiàn)真正地多用途。設計以ATmega16單片機為控制核心,12864液晶顯示屏為顯示方式,采用了GPS模塊(M-87)、HMC5883L三軸地磁傳感器、ADXL345三軸加速度傳感器從而實現(xiàn)了對時間、經(jīng)緯度坐標、高度、海拔、速度、航向、方向、和傾角等數(shù)據(jù)的測量。本設計主要應用于航海、野外測量以及車輛的定位與導航等諸多方面。 目錄 摘要 Abstract 第1章緒論 1.1 研究的背景及意義 1.2研究現(xiàn)狀 1.2.2發(fā)展現(xiàn)狀 1.3研究技術的發(fā)展方向及研究成果 1.3.1 GPS技術應用發(fā)展方向 1.3.2研究的主要方向 1.4本文的結構安排 第2章總體方案及硬件電路設計 2.1 系統(tǒng)框架 2.2總體設計思想 2.3單片機最小系統(tǒng)介紹 2.3.1 ATmega16單片機概述 2.3.2 ATmega16引腳介紹 2.4電源模塊介紹 2.4.1 LM7805主要性能 2.5 12864顯示模塊介紹 2.5.1 12864概述 2.5.2 12864接口描述 2.6 GPS模塊通信接口介紹 2.6.1 GPS模塊簡介 2.6.2串口通訊協(xié)議介紹 2.6.3單片機串口簡介 2.7電子羅盤模塊通信接口介紹 2.7.1 HMC5883L三軸地磁傳感器介紹 2.7.2 ADXL345三軸加速度傳感器介紹 2.7.3 I2C通信協(xié)議介紹 2.7.4單片機I2C通信介紹 2.8本章小結 第3章軟件系統(tǒng)設計與編程 3.1 GPS部分軟件設計 3.1.1 NMEA 0183協(xié)議介紹 3.1.2單片機數(shù)據(jù)接收與處理 3.2 電子羅盤部分軟件設計 3.2.1 電子羅盤簡介 3.2.2單片機數(shù)據(jù)接收與處理 3.2.3磁偏角補償 3.2.4傾角補償 3.2.5外部磁場干擾補償補償 3.3 主程序設計 3.4本章小結 第4章調(diào)試 4.1軟件調(diào)試 4.1.1 單片機程序開發(fā)環(huán)境介紹 4.1.2單片機程序燒錄環(huán)境介紹 4.1.3串口調(diào)試助手介紹 4.1.4 GPS模塊輔助調(diào)試工具調(diào)試 4.2 硬件調(diào)試 4.2.1 PCB設計軟件介紹 4.2.2實際電路調(diào)試 4.3本章小結 結論 參考文獻 致謝 附錄1 附錄2 附錄3 附錄4 附錄5
第1章緒論
1.1 研究的背景及意義GPS是英文Global Positioning System(全球定位系統(tǒng))的簡稱。它的含義是利用衛(wèi)星的測時和測距進行導航,以構成全球衛(wèi)星定位系統(tǒng),F(xiàn)在國際上公認將這一系統(tǒng)簡稱:GPS。 自古以來,人類從沒有停止過對空間定位和導航的研究,從最簡單的星歷法,到指南針、航海表,一直到1978年2月22日第一顆GPS試驗衛(wèi)星的入軌運行,開創(chuàng)了以導航衛(wèi)星為動態(tài)已知點的無線電導航定位的新時代。GPS衛(wèi)星所發(fā)送的導航定位信號,是一種可供無數(shù)用戶共享的空間信息資源。陸地、海洋和空間的廣大用戶,只要持有一種能夠接收、跟蹤、變換和測量GPS信號的接收機,就可以全天時、全天候和全球性地測量運動載體的七維狀態(tài)參數(shù)和三維狀態(tài)參數(shù)。其用途之廣,影響之大,是任何其他無線電接收設備望塵莫及的。不僅如此,GPS衛(wèi)星的入軌運行,還為大地測量學、地球動力學、地球物理學、天體力學、載人航天學、全球海洋學和全球氣象學提供了一種高精度、全天時、全天候的測量新技術。
1.2.1 研究發(fā)展現(xiàn)狀
(1)衛(wèi)星系統(tǒng)的更新與多個衛(wèi)星定位系統(tǒng)共存將明顯改善衛(wèi)星導航定位的精度和可靠性,廣泛性更為明顯。
(2)雙頻高精度測地型接收機將繼續(xù)高度壟斷在幾個技術領先的GPS廠家手中,在一定時期內(nèi)繼續(xù)保持其絕對優(yōu)勢
(3)單頻測地型接收機和導航接收機OEM板產(chǎn)業(yè)將擴散到世界各地生產(chǎn),雖是低檔次的GPS產(chǎn)品,但用途廣、用戶多、市場大。把GPS單頻OEM板的生產(chǎn)技術也轉讓出口,因而推動了世界各地企業(yè)投資GPS-OEM的生產(chǎn)事業(yè)。
(4)陸地導航定位產(chǎn)品將成為發(fā)展最快的GPS產(chǎn)業(yè)。 1.3.2研究的主要方向由前文可見GPS技術已經(jīng)延伸到各個領域的方方面面,它給我的生活帶來相當多的便利。但當設備處于靜止狀態(tài)下或者比較偏僻的山區(qū)無法接收到GPS信號時就無法準確及時的測量出當前的方向。所以本設計在基于GPS強大優(yōu)點的前提下,融合的電子羅盤的功能進而解決的GPS的一些弊端。本研究的主要方向是設計一個基于單片機的便攜式GPS設備,能夠測量常用的多種數(shù)據(jù),且能適應諸多不同的環(huán)境和用途。 1.4本文的結構安排本文共分為4章,對項目的敘述結構安排如下: 第1章中結合項目背景與國內(nèi)外GPS定位系統(tǒng)研究現(xiàn)狀分析項目的選題依據(jù),以研究意義等,同時對GPS系統(tǒng)做簡單的介紹。 第2章主要介紹整個系統(tǒng)的硬件電路設計,包括單片機最小系統(tǒng),電源模塊,12864顯示部分,GPS模塊通信,電子羅盤模塊通信等部分。 第3章主要介紹了軟件系統(tǒng)的設計及程序的編寫思想,包括GPS通信數(shù)據(jù)的解析,和電子羅盤數(shù)據(jù)的采集。 第4章主要介紹了整個調(diào)試過程中軟件調(diào)試部分和硬件調(diào)試部分。
第2章總體方案及硬件電路設計
2.1 系統(tǒng)框架系統(tǒng)框架如圖2-1所示:
1.002.jpg (12.18 KB, 下載次數(shù): 199)
下載附件
2016-4-11 20:37 上傳
1.003.jpg (2 KB, 下載次數(shù): 215)
下載附件
2016-4-11 20:37 上傳
1.004.jpg (36.37 KB, 下載次數(shù): 218)
下載附件
2016-4-11 20:37 上傳
1.005.jpg (2.04 KB, 下載次數(shù): 223)
下載附件
2016-4-11 20:37 上傳
系統(tǒng)整體電路如圖2-2所示
1.006.jpg (2.39 KB, 下載次數(shù): 234)
下載附件
2016-4-11 20:37 上傳
1.007.jpg (2 KB, 下載次數(shù): 262)
下載附件
2016-4-11 20:37 上傳
2.2總體設計思想本項目所設計這款基于GPS的多用途定位儀主要包括六個部分:電源部分、12864顯示部分、GPS模塊部分、ATmega16單片機部分、HMC5883L三軸地磁傳感器部分和ADXL345三軸加速度傳感器部分,通過GPS模塊實現(xiàn)對當前時間、位置、速度、航向、海拔等數(shù)據(jù)的測量;采用HMC5883L三軸地磁傳感器和ADXL345三軸加速度傳感器實現(xiàn)電子羅盤功能,即對方向的測量,并能對磁偏角和傾角帶來的誤差進行補償;采用12864顯示屏對測量的數(shù)據(jù)進行分屏顯示;利用ATmega16單片機和相關電路對整個系統(tǒng)進行控制,從而完成對“基于GPS的多用途定位儀”的設計與制作。 2.3單片機最小系統(tǒng)介紹
1.008.jpg (34.4 KB, 下載次數(shù): 204)
下載附件
2016-4-11 20:37 上傳
1.009.jpg (3.18 KB, 下載次數(shù): 218)
下載附件
2016-4-11 20:37 上傳
本電路設計采用ATmega16單片機作為核心控制器,它的最小系統(tǒng)如圖2-3所示,包括芯片、復位電路、時鐘電路。該芯片為低電平復位,故復位電路設計為如圖方式。芯片自帶內(nèi)部時鐘,可以設置為1MHz、2MHz、4MHz、8MHz,單其內(nèi)部時鐘精度不高,故我們外接了外部時鐘電路,采用8MHz頻率石英晶振。 2.3.1 ATmega16單片機概述ATmega16是基于增強的AVR RISC結構的低功耗8 位CMOS微控制器。由于其先進的指令集以及單時鐘周期指令執(zhí)行時間,ATmega16 的數(shù)據(jù)吞吐率高達1 MIPS/MHz,從而可以減緩系統(tǒng)在功耗和處理速度之間的矛盾。它的AVR內(nèi)核具有豐富的指令集和32個通用工作寄存器。所有的寄存器都直接與運算邏單元(ALU)相連接,使得一條指令可以在一個時鐘周期內(nèi)同時訪問兩個獨立的寄存器。這種結構大大提高了代碼效率,并且具有比普通的CISC微控制器最高至10倍的數(shù)據(jù)吞吐率。 ATmega16有如下特點:16K字節(jié)的系統(tǒng)內(nèi)可編程Flash(具有同時讀寫的能力,即RWW),512字節(jié)EEPROM,1K字節(jié)SRAM,32個通用I/O 口線,32 個通用工作寄存器,用于邊界掃描的JTAG接口,支持片內(nèi)調(diào)試與編程,三個具有比較模式的靈活的定時器/ 計數(shù)器(T/C),片內(nèi)/外中斷,可編程串行USART,有起始條件檢測器的通用串行接口,8路10位具有可選差分輸入級可編程增益(TQFP 封裝)的ADC ,具有片內(nèi)振蕩器的可編程看門狗定時器,一個SPI串行端口,以及六個可以通過軟件進行選擇的省電模式。 本芯片是以Atmel 高密度非易失性存儲器技術生產(chǎn)的。片內(nèi)ISP Flash 允許程序存儲器通過ISP串行接口,或者通用編程器進行編程,也可以通過運行于AVR內(nèi)核之中的引導程序進行編程。引導程序可以使用任意接口將應用程序下載到應用Flash存儲區(qū)(ApplicationFlash Memory)。在更新應用Flash存儲區(qū)時引導Flash區(qū)(Boot Flash Memory)的程序繼續(xù)運行,實現(xiàn)了RWW 操作。通過將8位RISC CPU 與系統(tǒng)內(nèi)可編程的Flash集成在一個芯片內(nèi), ATmega16成為一個功能強大的單片機,為許多嵌入式控制應用提供了靈活而低成本的解決方案。ATmega16具有一整套的編程與系統(tǒng)開發(fā)工具,包括:C語言編譯器、宏匯編、程序調(diào)試器/ 軟件仿真器、仿真器及評估板。
2.3.2 ATmega16引腳介紹
1.010.jpg (30.55 KB, 下載次數(shù): 216)
下載附件
2016-4-11 20:37 上傳
圖2-4 ATmega16單片機引腳圖 圖2-4為ATmega16單片機引腳圖: (1)VCC 電源正 (2)GND 電源地 (3)端口A(PA7..PA0) 端口A 做為A/D轉換器的模擬輸入端。端口A 為8位雙向I/O 口,具有可編程的內(nèi)部上拉電阻。其輸出緩沖器具有對稱的驅動特性,可以輸出和吸收大電流。作為輸入使用時,若內(nèi)部上拉電阻使能,端口被外部電路拉低時將輸出電流。在復位過程中,即使系統(tǒng)時鐘還未起振,端口A處于高阻狀態(tài)。 (4)端口B(PB7..PB0) 端口B為8位雙向I/O口,具有可編程的內(nèi)部上拉電阻。其輸出緩沖器具有對稱的驅動特性,可以輸出和吸收大電流。作為輸入使用時,若內(nèi)部上拉電阻使能,端口被外部電路拉低時將輸出電流。在復位過程中,即使系統(tǒng)時鐘還未起振,端口B處于高阻狀態(tài)。端口B 也可以用做其他不同的特殊功能. (5)端口C(PC7..PC0)端口C為8位雙向I/O口,具有可編程的內(nèi)部上拉電阻。其輸出緩沖器具有對稱的驅動特性,可以輸出和吸收大電流。作為輸入使用時,若內(nèi)部上拉電阻使能,端口被外部電路拉低時將輸出電流。在復位過程中,即使系統(tǒng)時鐘還未起振,端口C處于高阻狀態(tài)。如果JTAG接口使能,即使復位出現(xiàn)引腳 PC5(TDI)、PC3(TMS)與PC2(TCK)的上拉電阻被激活。端口C也可以用做其他不同的特殊功能. (6)端口D(PD7..PD0)端口D為8位雙向I/O口,具有可編程的內(nèi)部上拉電阻。其輸出緩沖器具有對稱的驅動特性,可以輸出和吸收大電流。作為輸入使用時,若內(nèi)部上拉電阻使能,則端口被外部電路拉低時將輸出電流。在復位過程中,即使系統(tǒng)時鐘還未起振,端口D處于高阻狀態(tài)。端口D也可以用做其他不同的特殊功能. (7)RESET 復位輸入引腳。持續(xù)時間超過最小門限時間的低電平將引起系統(tǒng)復位。持續(xù)時間小于門限間的脈沖不能保證可靠復位。 (8)XTAL1 反向振蕩放大器與片內(nèi)時鐘操作電路的輸入端。 (9)XTAL2 反向振蕩放大器的輸出端。 (10)AVCC AVCC是端口A與A/D轉換器的電源。不使用ADC時,該引腳應直接與VCC連接。使用ADC時應通過一個低通濾波器與VCC連接。 (11)AREF A/D 的模擬基準輸入引腳。 2.4電源模塊介紹整個電路系統(tǒng)中,各個模塊均可由5V供電正常工作,故統(tǒng)一采用5V供電以簡化電路。設計采用穩(wěn)壓芯片LM7805作為電源穩(wěn)壓核心。電路如圖2-5所示,輸入可為6V~18V的直流電源,其中C1、C2為輸入輸出端的濾波電容,C3、C4為高頻信號的耦合電容,可以改善負載的瞬態(tài)響應。
1.011.jpg (9.67 KB, 下載次數(shù): 230)
下載附件
2016-4-11 20:37 上傳
1.012.jpg (2.16 KB, 下載次數(shù): 226)
下載附件
2016-4-11 20:37 上傳
2.4.1 LM7805主要性能
1.013.jpg (5.44 KB, 下載次數(shù): 223)
下載附件
2016-4-11 20:37 上傳
LM7805是三端正電源穩(wěn)壓電路,它的封裝形式為TO-220,如圖2-6所示。它的應用非常廣泛,內(nèi)部有電流限制以及過熱保護和安全工作區(qū)保護,使它基本上不會損壞。如果能提供足夠的散熱片,它就能偶提供大于1.5A的輸出電流。
1.014.jpg (2.45 KB, 下載次數(shù): 243)
下載附件
2016-4-11 20:37 上傳
2.512864顯示模塊介紹本設計中顯示部分采用12864顯示模塊,它與單片機采用并行連接方式,其電路接口如圖2-7所示:
1.015.jpg (14.06 KB, 下載次數(shù): 208)
下載附件
2016-4-11 20:37 上傳
1.016.jpg (2.19 KB, 下載次數(shù): 229)
下載附件
2016-4-11 20:37 上傳
2.5.1 12864概述帶中文字庫的128X64是一種具有4位/8位并行、2線或3線串行多種接口方式,內(nèi)部含有國標一級、二級簡體中文字庫的點陣圖形液晶顯示模塊;其顯示分辨率為128×64, 內(nèi)置8192個16*16點漢字,和128個16*8點ASCII字符集.利用該模塊靈活的接口方式和簡單、方便的操作指令,可構成全中文人機交互圖形界面?梢燥@示8×4行16×16點陣的漢字. 也可完成圖形顯示.低電壓低功耗是其又一顯著特點。由該模塊構成的液晶顯示方案與同類型的圖形點陣液晶顯示模塊相比,不論硬件電路結構或顯示程序都要簡潔得多,且該模塊的價格也略低于相同點陣的圖形液晶模塊。其基本特性: (1)低電源電壓(VDD:+3.0--+5.5V) (2)顯示分辨率:128×64點 (3)內(nèi)置漢字字庫,提供8192個16×16點陣漢字(簡繁體可選) (4)內(nèi)置128個16×8點陣字符 (5)2MHZ時鐘頻率 (6)顯示方式:STN、半透、正顯 (7)驅動方式:1/32DUTY,1/5BIAS (8)視角方向:6點 (9)背光方式:側部高亮白色LED,功耗僅為普通LED的1/5—1/10 (10)通訊方式:串行、并口可選 (11)內(nèi)置DC-DC轉換電路,無需外加負壓 (12)無需片選信號,簡化軟件設計 (13)工作溫度: 0℃ - +55℃ ,存儲溫度: -20℃ - +60℃ 2.5.2 12864接口描述12864顯示屏引腳數(shù)為20個,其引腳功能描述如圖2-8所示:
1.017.jpg (44 KB, 下載次數(shù): 221)
下載附件
2016-4-11 20:37 上傳
圖2-8 12864顯示屏引腳介紹 2.6GPS模塊通信接口介紹本設計采用的是集成的GPS接收模塊HOLUX M-87,它采用串口通訊,每隔1秒鐘更新一次數(shù)據(jù),其電路連接方式如圖2-9所示:
1.018.jpg (6.81 KB, 下載次數(shù): 235)
下載附件
2016-4-11 20:37 上傳
1.019.jpg (2.56 KB, 下載次數(shù): 207)
下載附件
2016-4-11 20:37 上傳
2.6.1 GPS模塊簡介本設計采用的GPS模塊為HOLUX M-87如圖2-10所示,它是一種根據(jù)低耗電Mediatek GPS 解決方案設計的超小型25.4 x 25.4 x 7mm GPS引擎機板。它對于導航應用提供高達 -159dBm的絕佳靈敏度與快速的第一次定位時間。M-89是內(nèi)嵌在使用于GPS服務的PDA、PND、行動電話、可攜式裝置設計中的最佳選擇。使用與汽車導航、船只導航、艦隊管理、AVL和定位服務、自動導航、個人導航或旅游裝置、追蹤裝置/系統(tǒng)和地圖裝置應用。它具有如下特點: - 采用MTK主芯片,可同時接收32個衛(wèi)星,感度-158D。
- 更新速率: 1HZ
- 接收碼: L1,C/A 碼
- 時間標示: 1脈波/秒, GPS時間 +/-0.1秒誤差
- 支持通訊協(xié)議:NMEA-0183 v2.2版本規(guī)格輸出
- 芯片內(nèi)建1920 次/頻率硬件,提高接收傳送搜尋衛(wèi)星訊號
- 運算程序:ARM7/TDMI
- 處理速度:49 MHZ
- 內(nèi)建閃存 4Mb
- 最低追蹤信號感度:-142dBm
1.020.jpg (4.25 KB, 下載次數(shù): 218)
下載附件
2016-4-11 20:37 上傳
1.021.jpg (2.09 KB, 下載次數(shù): 221)
下載附件
2016-4-11 20:37 上傳
2.6.2串口通訊協(xié)議介紹串口是計算機上一種非常通用設備通信的協(xié)議。大多數(shù)計算機包含兩個基于RS232的串口。串口同時也是儀器儀表設備通用的通信接口;很多GPIB兼容的設備也帶有RS-232口。同時,串口通信協(xié)議也可以用于獲取遠程采集設備的數(shù)據(jù)。 串口通信的概念非常簡單,串口按位(bit)發(fā)送和接收字節(jié)。盡管比按字節(jié)(byte)的并行通信慢,但是串口可以在使用一根線發(fā)送數(shù)據(jù)的同時用另一根線接收數(shù)據(jù)。它很簡單并且能夠實現(xiàn)遠距離通信。比如IEEE488定義并行通行狀態(tài)時,規(guī)定設備線總長不得超過20米,并且任意兩個設備間的長度不得超過2米;而對于串口而言,長度可達1200米。 典型地,串口用于ASCII碼字符的傳輸。通信使用3根線完成:地線,發(fā)送,接收。由于串口通信是異步的,端口能夠在一根線上發(fā)送數(shù)據(jù)同時在另一根線上接收數(shù)據(jù)。其他線用于握手,但是不是必須的。串口通信最重要的參數(shù)是波特率、數(shù)據(jù)位、停止位和奇偶校驗。對于兩個進行通行的端口,這些參數(shù)必須匹配: a,波特率:這是一個衡量通信速度的參數(shù)。它表示每秒鐘傳送的bit的個數(shù)。例如300波特表示每秒鐘發(fā)送300個bit。當我們提到時鐘周期時,我們就是指波特率例如如果協(xié)議需要4800波特率,那么時鐘是4800Hz。這意味著串口通信在數(shù)據(jù)線上的采樣率為4800Hz。通常電話線的波特率為14400,28800和36600。波特率可以遠遠大于這些值,但是波特率和距離成反比。高波特率常常用于放置的很近的儀器間的通信,典型的例子就是GPIB設備的通信。 b,數(shù)據(jù)位:這是衡量通信中實際數(shù)據(jù)位的參數(shù)。當計算機發(fā)送一個信息包,實際的數(shù)據(jù)不會是8位的,標準的值是5、7和8位。如何設置取決于你想傳送的信息。比如,標準的ASCII碼是0~127(7位)。擴展的ASCII碼是0~255(8位)。如果數(shù)據(jù)使用簡單的文本(標準ASCII碼),那么每個數(shù)據(jù)包使用7位數(shù)據(jù)。每個包是指一個字節(jié),包括開始/停止位,數(shù)據(jù)位和奇偶校驗位。由于實際數(shù)據(jù)位取決于通信協(xié)議的選取,術語“包”指任何通信的情況。 c,停止位:用于表示單個包的最后一位。典型的值為1,1.5和2位。由于數(shù)據(jù)是在傳輸線上定時的,并且每一個設備有其自己的時鐘,很可能在通信中兩臺設備間出現(xiàn)了小小的不同步。因此停止位不僅僅是表示傳輸?shù)慕Y束,并且提供計算機校正時鐘同步的機會。適用于停止位的位數(shù)越多,不同時鐘同步的容忍程度越大,但是數(shù)據(jù)傳輸率同時也越慢。 d,奇偶校驗位:在串口通信中一種簡單的檢錯方式。有四種檢錯方式:偶、奇、高和低。當然沒有校驗位也是可以的。對于偶和奇校驗的情況,串口會設置校驗位(數(shù)據(jù)位后面的一位),用一個值確保傳輸?shù)臄?shù)據(jù)有偶個或者奇?zhèn)邏輯高位。例如,如果數(shù)據(jù)是011,那么對于偶校驗,校驗位為0,保證邏輯高的位數(shù)是偶數(shù)個。如果是奇校驗,校驗位為1,這樣就有3個邏輯高位。高位和低位不真正的檢查數(shù)據(jù),簡單置位邏輯高或者邏輯低校驗。這樣使得接收設備能夠知道一個位的狀態(tài),有機會判斷是否有噪聲干擾了通信或者是否傳輸和接收數(shù)據(jù)是否不同步。 2.6.3單片機串口簡介ATmega16 單片機帶有一個全雙工的通用同步/異步串行收發(fā)模塊USART,該接口是一個高度靈活的串行通訊設備。其主要特點如下: (1)全雙工操作,可同時進行收發(fā)操作 (2)支持同步或異步操作 (3)支持5、6、7、8 和9 位數(shù)據(jù)位,1 位或者2 位停止位的串行數(shù)據(jù)幀結構 (4)三個完全獨立的中斷,TX 發(fā)送完成,TX 發(fā)送數(shù)據(jù)寄存器空,RX 接收完成 (5)支持多機通訊模式 ATmega16 單片機控制串口的相關寄存器有六個,分別是:數(shù)據(jù)寄存器(UDR)、控制和狀態(tài)寄存器(UCSRA,UCSRB,UCSRC)、波特率寄存器(UBRRL 和UBRRH)。在進行通信之前首先要對USART 進行初始化。初始化過程通常包括波特率的設定,幀結構的設定,以及根據(jù)需要使能接收器或發(fā)送器。對于中斷驅動的USART 操作,在初始化時首先要清零全局中斷標志位( 全局中斷被屏蔽)。 串口初始化流程:使用串口->使能接收 ->使能發(fā)送->波特率->奇偶校驗->數(shù)據(jù)位數(shù)->中斷。 2.7電子羅盤模塊通信接口介紹本設計電子羅盤功能的實現(xiàn)是通過兩個傳感器,即HMC5883L三軸地磁傳感器和ADXL345三軸加速度傳感器。HMC5883L三軸地磁傳感器負責對地球的磁場的測量以檢測方向,ADXL345三軸加速度傳感器則負責對地球重力的測量的檢測用于實現(xiàn)對設備傾角的檢測,進而對電子羅盤的參數(shù)做出傾角補償來減小誤差。HMC5883L和ADXL345均采用I2C通信方式,其在系統(tǒng)中的電路連接如圖2-11所示:
1.022.jpg (11.83 KB, 下載次數(shù): 231)
下載附件
2016-4-11 20:37 上傳
1.023.jpg (3.08 KB, 下載次數(shù): 227)
下載附件
2016-4-11 20:37 上傳
2.7.1HMC5883L三軸地磁傳感器介紹
1.024.jpg (7.04 KB, 下載次數(shù): 201)
下載附件
2016-4-11 20:37 上傳
霍尼韋爾 HMC5883L是一種表面貼裝的高集成模塊如圖2-12所示,并帶有數(shù)字接口的弱磁傳感器芯片,應用于低成本羅盤和磁場檢測領域。HMC5883L包括最先進的高分辨率HMC118X 系列磁阻傳感器,并附帶霍尼韋爾專利的集成電路包括放大器、自動消磁驅動器、偏差校準、能使羅盤精度控制在1~2°的12位模數(shù)轉換器.簡易的I2C 系列總線接口。HMC5883L是采用無鉛表面封裝技術,帶有16 引腳,尺寸為3.0X3.0X0.9mm。HMC5883L的所應用領域有手機、筆記本電腦、消費類電子、汽車導航系統(tǒng)和個人導航系統(tǒng)。
HMC5883L采用霍尼韋爾各向異性磁阻(AMR)技術,該技術的優(yōu)點是其他磁傳感器技術所無法企及。這些各向異性傳感器具有在軸向高靈敏度和線性高精度的特點.傳感器帶有的對于正交軸低敏感行的固相結構能用于測量地球磁場的方向和大小,其測量范圍從毫高斯到8高斯(gauss)。霍尼韋爾的磁傳感器在低磁場傳感器行業(yè)中是靈敏度最高和可靠性最好的傳感器。 它具有以下特點: (1)三軸磁阻傳感器和ASIC 都被封裝在3.0×3.0×0.9mm LCC 表面裝配中 (2)12-bit ADC 與低干擾AMR 傳感器,能在±8 高斯的磁場中實現(xiàn)5 毫高斯分辨率 (3)內(nèi)置自檢功能 (4)低電壓工作(2.16-3.6V) 和超低功耗(100uA) (5)內(nèi)置驅動電路,I2C 數(shù)字接口,無引線封裝結構 (6)磁場范圍廣(+/-8Oe),最大輸出頻率可達160Hz (7)是體積小高集成產(chǎn)品。只需添加一個微處理器接口,外加兩個外部SMT 電容。專為大批量、成本敏感的OEM 生產(chǎn)而設計,易于裝配并與高速SMT 裝配件兼容 (8)適用于電池供電的應用場合,帶置位/復位和偏置驅動器用于消磁、自測和偏移補償 (9)適用于消費類電子設備應用中通用雙線串行數(shù)據(jù)接口,能應用于個人導航系統(tǒng)和LBS 2.7.2 ADXL345三軸加速度傳感器介紹ADXL345是一款小而薄的超低功耗3軸加速度計,分辨率高(13位),測量范圍達± 16g。數(shù)字輸出數(shù)據(jù)為16位二進制補碼格式,可通過SPI(3線或4線)或I2C數(shù)字接口訪問。ADXL345非常適合移動設備應用。它可以在傾斜檢測應用中測量靜態(tài)重力加速度,還可以測量運動或沖擊導致的動態(tài)加速度。其高分辨率(3.9mg/LSB),能夠測量不到1度的傾斜角度變化。 該器件提供多種特殊檢測功能;顒雍头腔顒訖z測功能通過比較任意軸上的加速度與用戶設置的閾值來檢測有無運動發(fā)生。敲擊檢測功能可以檢測任意方向的單振和雙振動作。自由落體檢測功能可以檢測器件是否正在掉落。這些功能可以獨立映射到兩個中斷輸出引腳中的一個。正在申請專利的集成式存儲器管理系統(tǒng)采用一個32級先進先出(FIFO)緩沖器,可用于存儲數(shù)據(jù),從而將主機處理器負荷降至最低,并降低整體系統(tǒng)功耗。 低功耗模式支持基于運動的智能電源管理,從而以極低的功耗進行閾值感測和運動加速度測量。ADXL345采用3 mm × 5 mm × 1 mm,14引腳小型超薄塑料封裝。如圖2-13所示:
1.025.jpg (3.72 KB, 下載次數(shù): 215)
下載附件
2016-4-11 20:37 上傳
1.026.jpg (2.76 KB, 下載次數(shù): 211)
下載附件
2016-4-11 20:37 上傳
它具有以下特性: - 超低功耗:VS = 2.5 V時(典型值),測量模式下低至23ìA,待機模式下為0.1_A
- 用戶可選的分辨率:10位固定分辨率,全分辨率,分辨率隨g范圍提高而提高,±16g時高達13位
- SPI(3線和4線)和I2C數(shù)字接口
- 寬溫度范圍(-40°C至+85℃)
- 抗沖擊能力:10,000 g
- 小而。3 mm× 5 mm× 1 mm,LGA封裝
- 應用范圍廣:手機,醫(yī)療器械,游戲和定點設備,工業(yè)儀器儀表,個人導航設備
2.7.3 I2C通信協(xié)議介紹I2C(Inter -Integrated Circuit)總線是一種由Philips公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設備。I2C總線產(chǎn)生于在80年代,最初為音頻和視頻設備開發(fā)。由于其簡單性,如今方泛用于微控制器與各種功能模塊的連接,可以說是學單片機的人,入門之后,必定要涉及到的。 I2C 總線實際上已經(jīng)成為一個國際標準在超過100 種不同的IC 上實現(xiàn),而且得到超過50 家公司的許可,正因為其簡單和應用廣泛,因此其功能也越來不滿足人們的要求,其速度也從原來的100Kbit/S,增加了快速模式,其速度達 400Kbit/S,再后來也增加了高速模式,其速度更達3.4Mbit/S。 I2C 總線是一種用于IC器件之間連接的雙向二線制總線,所謂總線它上面可以掛多少器件,并且通個兩根線連接,占用空間非常的小,總線的長度可高達25英尺,并且能夠以10Kbps的最大傳輸速率支持4個組件。它的另一優(yōu)點是多主控,只要能夠進行接收和發(fā)送的設備都可以成為主控制器,當然多個主控不能同一時間工作。 I2C總線有兩根信號線,一根為SDA(數(shù)據(jù)線),一根為SCL(時鐘線)。任何時候時鐘信號都是由主控器件產(chǎn)生。I2C總線在傳送數(shù)據(jù)的過程中,主要有三種控制信號:起始信號,結不信號,應答信號: (1)起始信號:當SCL為高電平時,SDA由高電平轉為低電平時,開始傳送數(shù)據(jù) (2)結束信號:當SCL為高電平時,SDA由低電平轉為高電平時,結束數(shù)據(jù)傳送 (3)應答信號:接收數(shù)據(jù)的器件在接收到8bit數(shù)據(jù)后,向發(fā)送數(shù)據(jù)的器件發(fā)出低電平信號,表示已收到數(shù)據(jù)。這個信號可以是主控器件發(fā)出,也可以是從動器件發(fā)出?傊山邮諗(shù)據(jù)的器件發(fā)出。 2.7.4單片機I2C通信介紹ATmega16 單片機帶有一個半雙工的通用同步串行收發(fā)模塊TWI(I2C),該接口是一個高度靈活的串行通訊設備。其主要特點如下: - 簡單,但是強大而靈活的通訊接口,只需要兩根線
- 支持主機和從機操作
- 器件可以工作于發(fā)送器模式或接收器模式
- 7 位地址空間允許有128 個從機
- 支持多主機仲裁
- 高達400 kHz 的數(shù)據(jù)傳輸率
- 可以抑制總線尖峰的噪聲抑制器
- 完全可編程的從機地址以及公共地址
ATmega16 單片機控制I2C通信的相關寄存器有五個,分別是:比特率寄存器(TWBR)、控制寄存器(TWCR)、狀態(tài)寄存器(TWSR)、數(shù)據(jù)寄存器(TWDR)、地址寄存器(TWAR)。在進行通信之前首先要對TWI(I2C)進行初始化。初始化過程通常包括波特率的設定,幀結構的設定,以及根據(jù)需要主機、從機模式的設置。對于中斷驅動的I2C操作,在初始化時首先要清零全局中斷標志位( 全局中斷被屏蔽)。 TWI(I2C)通信發(fā)送流程如下: (1)設定數(shù)據(jù)傳輸波特率 ==》 《== 應答信號 (2)發(fā)送START信號,等待應答 ==》 《==應答信號 (3)發(fā)送芯片地址,等待應答 ==》 《==應答信號 (4)發(fā)送數(shù)據(jù)的絕對地址,等待應答 ==》 《==應答信號 (5)發(fā)送要寫入的數(shù)據(jù),等待應答 ==》 《==應答信號 (6)發(fā)送STOP信號,釋放總線 ==》 數(shù)據(jù)寫入成功 TWI(I2C)通信接收流程如下: (1)設定數(shù)據(jù)傳輸波特率 ==》 《== 應答信號 (2)發(fā)送START信號,等待應答 ==》 《==應答信號 (3)發(fā)送芯片地址,等待應答 ==》 《==應答信號 (4)發(fā)送數(shù)據(jù)的絕對地址,等待應答 ==》 《==應答信號 (5)發(fā)送RESTART信號,等待應答 ==》 《==應答信號 (6)發(fā)送芯片地址并注明讀操作,等待應答 ==》 《==應答信號 (7)讀取數(shù)據(jù),等待應答 ==》 《==應答信號 (8)發(fā)送STOP信號,釋放總線 ==》 數(shù)據(jù)讀操作成功 2.8本章小結本章講述了整體硬件電路的設計方案,先介紹了整個電路的整體框架,然后依次介紹了電路的單片機最小系統(tǒng)模塊、電源模塊、顯示模塊、GPS模塊和電子羅盤模塊,同時對相關的電子元件進行了簡要介紹。
第3章軟件系統(tǒng)設計與編程3.1 GPS部分軟件設計GPS部分的軟件設計主要是針對GPS模塊發(fā)出的數(shù)據(jù)進行解析,提取出我們需要的數(shù)據(jù)。GPS模塊的數(shù)據(jù)是以NEMA0183協(xié)議發(fā)出,故要想完成對數(shù)據(jù)的采集,必須掌握NEMA0183通信協(xié)議,同時將數(shù)據(jù)的格式進行轉化,最終在12864顯示屏上顯示出來。 3.1.1 NMEA 0183協(xié)議介紹NMEA-0183是(National Marine Electronics Association)為海用電子設備制定的標準格式。它是在過去海用電子設備的標準格式0180和0182的基礎上,增加了GPS接收機輸出的內(nèi)容而完成的。目前廣泛采用的是Ver 2.00版本。現(xiàn)在除少數(shù)早期的GPS接收機外,幾乎所有的GPS接收機均采用了這一格式。此協(xié)議是為了在不同的GPS導航設備中建立統(tǒng)一的RTCM標準。這種格式的廣泛使用使得GPS接收模塊的通用化和互換性大大提高。 這種格式所輸出的語句采用的是ASCⅡ字符碼,包含了緯度、經(jīng)度、速度、日期、時間、航向、以及衛(wèi)星信號情況等信息。語句多達10余種,由于在此次設計中只運用到了$GPRMC和$GPGGA定位數(shù)據(jù)語句,其結構為: $GPRMC,<1>,<2>,<2>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>*hh $GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh 其中“GP”為交談識別符;“RMC”為語句識別符;“GGA”為語句識別符;“hh”為校驗和,其代表了“$”與“*”之間所有字符的按位異或值(不包括這兩個字符)。 $GPRMC語句數(shù)據(jù)區(qū)的內(nèi)容為: <1>定位點的協(xié)調(diào)世界時間(UTC),hhmmss(時分秒)格式; <2>定位狀態(tài),A=有效定位,V=無效定位; <3>定位點緯度,ddmm.mmmm(度分)格式; <4>緯度半球,N(北半球)或S(南半球); <5>定位點經(jīng)度,dddmm.mmmm(度分)格式; <6>經(jīng)度半球,E(東經(jīng))或W(西經(jīng)); <7>地面速率,000.0節(jié)~999.9節(jié); <8>地面航向,000.0度~359.9度; <9>UTC日期,ddmmyy(日月年)格式; <10>磁偏角,000.0度~180度; <11>磁偏角方向,E(東)或W(西)。 $GPGGA語句數(shù)據(jù)區(qū)的內(nèi)容為: <1> UTC時間,hhmmss(時分秒)格式 <2>緯度ddmm.mmmm(度分)格式(前面的0也將被傳輸) <3>緯度半球N(北半球)或S(南半球) <4>經(jīng)度dddmm.mmmm(度分)格式(前面的0也將被傳輸) <5>經(jīng)度半球E(東經(jīng))或W(西經(jīng)) <6> GPS狀態(tài):0=未定位,1=非差分定位,2=差分定位,6=正在估算 <7>正在使用解算位置的衛(wèi)星數(shù)量(00~12)(前面的0也將被傳輸) <8> HDOP水平精度因子(0.5~99.9) <9>海拔高度(-9999.9~99999.9) <10>地球橢球面相對大地水準面的高度 <11>差分時間(從最近一次接收到差分信號開始的秒數(shù),如果不是差分定位將為空 <12>差分站ID號0000~1023(前面的0也將被傳輸,如果不是差分定位將為空) 3.1.2單片機數(shù)據(jù)接收與處理經(jīng)分析NMEA通訊協(xié)議所規(guī)定的通訊語句都已是以ASCII碼為基礎的,NMEA-0183協(xié)議語句的數(shù)據(jù)格式如下:“$”為語句起始標志;“,”為域分隔符;“ *”為校驗和識別符,其后面的兩位數(shù)為校驗和,代表了“$”和“*”之間所有字符的按位異或值(不包括這兩個字符);“/”為終止符,所有的語句必須以來結束,也就是ASCII 字符的“回車”(十六進制的0D)和“換行”(十六進制的0A)。 在單片機串口接收到數(shù)據(jù)后,先判別是否為語句引導頭“$”,然后接收信息內(nèi)容,在收到換行符后代表這一行的數(shù)據(jù)接收結束。然后再根據(jù)語句標識區(qū)分出信息類別以對收到的ASCII碼進行處理顯示。處理的內(nèi)容有一些方面: 1.時間,這個是格林威治時間,是世界時間(UTC),我們需要把它轉換成北京時間(BTC),BTC 和UTC 差了8 個小時,要在這個時間基礎上加8 個小時。 2.定位狀態(tài),在接收到有效數(shù)據(jù)前,這個位是‘V’,后面的數(shù)據(jù)都為空,接到有效數(shù)據(jù)后,這個位是‘A’,后面才開始有數(shù)據(jù)。 3.緯度,我們需要把它轉換成度分秒的格式,計算方法: 如接收到的緯度是:4546.40891 4546.40891 / 100 = 45.4640891 可以直接讀出45 度 4546.40891–45 * 100 = 46.40891 可以直接讀出46 分 46.40891–46 = 0.40891 * 60 = 24.5346 讀出24 秒 所以緯度是:45 度46 分24 秒。 4.南北緯,這個位有兩種值‘N’(北緯)和‘S’(南緯) 5.經(jīng)度的計算方法和緯度的計算方法一樣 6.東西經(jīng),這個位有兩種值‘E’(東經(jīng))和‘W’(西經(jīng)) 7.速率,這個速率值是海里/時,單位是節(jié),要把它轉換成千米/時,根據(jù):1 海里=1.85 公里,把得到的速率乘以1.85。 8.航向,指的是偏離正北的角度 9.日期,這個日期是準確的,不需要轉換 相關程序代碼見附錄5。 3.2 電子羅盤部分軟件設計3.2.1 電子羅盤簡介本設計采用HMC5883L三軸地磁傳感器和ADXL345三軸加速度傳感器共同實現(xiàn)電子羅盤的功能,如圖3-1所示。三軸地磁傳感器用來實現(xiàn)對地球磁場的測量,進而檢測出當前的方向。三軸加速度傳感器用來實現(xiàn)對當前設備傾角的測量,進而對電子羅盤進行傾角誤差補償。
1.027.jpg (18.17 KB, 下載次數(shù): 232)
下載附件
2016-4-11 20:37 上傳
1.028.jpg (2.56 KB, 下載次數(shù): 216)
下載附件
2016-4-11 20:37 上傳
3.2.2單片機數(shù)據(jù)接收與處理HMC5883L三軸地磁傳感器和ADXL345三軸加速度感器均采用I2C通信。其中HMC5883L的寫操作地址為0X3C,讀操作地址為0X3D。ADXL345的寫操作地址為0XA6,讀操作地址為0XA7。 HMC5883L采用連續(xù)測量模式,在連續(xù)測量模式下,裝置不斷進行測量,并將數(shù)據(jù)更新至數(shù)據(jù)寄存器。RDY升高,此時新數(shù)據(jù)放置在所有三個寄存器。在上電或寫入模式或配置寄存器后,第一次測量可以在三個數(shù)據(jù)輸出寄存器經(jīng)過一個2/fDO后設置,隨后的測量可用一個頻率fDO進行, fDO為數(shù)據(jù)輸出的頻率。該傳感器一共有六個數(shù)據(jù)寄存器,地址從0X03到0X08,分別為X軸,Z軸,Y軸數(shù)據(jù)的高八位和低八位數(shù)據(jù)寄存器。ADXL345也采用連續(xù)測量模式,在該模式下,其內(nèi)部數(shù)據(jù)數(shù)據(jù)不斷更新,共有6個數(shù)據(jù)寄存器,地址從0X32到0X37,分別為X軸、Y軸、Z軸數(shù)據(jù)的低八位和高位。
1.029.jpg (9.43 KB, 下載次數(shù): 223)
下載附件
2016-4-11 20:37 上傳
1.030.jpg (2.88 KB, 下載次數(shù): 207)
下載附件
2016-4-11 20:37 上傳
地球的磁場強度大約為0.5至0.6高斯并且具有一個平行于地球表面的成份它始終指向磁北這是所有磁羅盤的制作基礎此處的關鍵詞是“平行于地球表面”和“磁北”地球磁場可用圖3-2中所示的雙極模型模擬表示該圖圖示了北半球中地球磁場向下指向北方在赤道處它水平指向北方并且在南半球中向上指向北方在任何情況下地球磁場的方向始終指向磁北被用來確定羅盤方向的正是這磁場中平行于地球表面的分量磁場與地球表面的夾角被稱為磁傾角或傾角(如圖3-3) 在北半球中磁傾角大約為朝北70°在確定方位角或羅盤指向時只使用地球磁場的X 和Y 分量地球磁場的垂直部分忽略不計,故方位角的計算公式為: 方位角=arcTan(y/x)(方位角為當前方向和正北方向的順時針夾角)。
1.031.jpg (4.28 KB, 下載次數(shù): 218)
下載附件
2016-4-11 20:37 上傳
1.032.jpg (2.87 KB, 下載次數(shù): 229)
下載附件
2016-4-11 20:37 上傳
3.2.3磁偏角補償磁偏角,即磁北線與真北線之間的夾角。根據(jù)規(guī)定,磁針指北極N向東偏則磁偏角為正,向西偏則磁偏角為負。經(jīng)查表秦皇島當?shù)氐拇牌羌s為7.5度,故當方位角大于0小于352.5度時需加上7.5度,當方位角大于352.5度小于360度時需減去7.5度。程序如下所示: angle= atan2(Y_h,X_h) * 57.3 + 180; // angle in degrees
if(angle>=0&&angle<352.5)
angle=angle+7.5;
elseif(angle>=352.5&&angle<360)
angle=angle-352.5; 3.2.4傾角補償大多數(shù)情況下不總是將羅盤限制在平面和水平面上它們通常用手安裝在飛機或不平整地面上的汽車上由于羅盤并不總是水平于地球表面這使得確定方位角或行進方向變得更加困難由傾斜角產(chǎn)生的誤差很大程度上取決于傾斜角的大小糾正羅盤傾斜的典型方法是使用傾角儀或傾斜傳感器確定橫滾角和俯仰角術語橫滾和俯仰通常用在航空學上: 橫滾是指圍繞X 或前進方向的旋轉俯仰是指圍繞Y 或左-右方向的旋轉。如圖3-4所示:
1.033.jpg (6.21 KB, 下載次數(shù): 205)
下載附件
2016-4-11 20:37 上傳
1.034.jpg (3.39 KB, 下載次數(shù): 227)
下載附件
2016-4-11 20:37 上傳
為對羅盤的傾斜作補償了解橫滾和俯仰狀況只是成功的一半此時磁力計必須依賴于所有的三條磁軸線(XYZ) 這樣地球磁場可以完全轉回到水平方向下圖展示了以觀察者或汽車的朝右或朝前水平方向為基準的羅盤的橫滾角(θ)和俯仰角(φ) 運用下列旋轉方程式可以將X Y 和Z 磁場強度讀數(shù)換算回到水平面(XH, YH): XH=X*cos(φ)+Y*sin(θ)*sin(φ)-Z*cos(θ)*sin(φ) YH=Y*cos(θ)+Z*sin(θ) 方位角=arcTan(YH/XH) 3.2.5外部磁場干擾補償補償
1.035.jpg (15.74 KB, 下載次數(shù): 208)
下載附件
2016-4-11 20:37 上傳
當羅盤在沒有任何鐵質金屬的空曠區(qū)域內(nèi)工作時不會對地球磁場產(chǎn)生任何干擾然而事實上羅盤都被安裝在附近很可能存在鐵質材料的汽車飛機和平臺里鐵質金屬效應將會干擾或彎曲地球磁場這會改變羅盤方向這種效應可看作是地球磁場中增加的一個磁場如果把羅盤牢固地裝在汽車里就可算出鐵效應并把它從磁場強度讀數(shù)中減去。
1.036.jpg (5.42 KB, 下載次數(shù): 229)
下載附件
2016-4-11 20:37 上傳
圖3-5顯示了羅盤在水平面里作圓形旋轉時的X和Y磁場強度讀數(shù)在本示例中地球磁場沒有受到鐵的干擾讀數(shù)取自霍尼韋爾HMR2300智能型數(shù)字磁力計其中每個計數(shù)代表67微高斯在X和Y平面中的地球磁場強度值讀到2800個計數(shù)約為190毫高斯當用X 和Y 讀數(shù)作圖時就形成一個圓其中心在0,0點處對每個讀數(shù)確定一個方位角此圖顯示了在旋轉過程中根據(jù)X和Y方向的sine和cose輸出值。
1.037.jpg (14.77 KB, 下載次數(shù): 209)
下載附件
2016-4-11 20:37 上傳
1.038.jpg (5.41 KB, 下載次數(shù): 242)
下載附件
2016-4-11 20:37 上傳
如果將磁力計安裝在汽車上發(fā)動機和車體的影響將會干擾地球磁場駕駛汽車作環(huán)形運動就會產(chǎn)生如圖3-6所示的曲線,請注意這里的XY圖形不是一個圓(有點橢圓) 而它偏移0,0點為-480和-795個計數(shù)這偏移和橢圓效應是汽車對地球磁場固定干擾的結果這干擾可系統(tǒng)地確定并可將它們應用于隨后的XY讀數(shù)中以消除汽車的影響。 為補償汽車的干擾可確定兩個定標因數(shù)Xsf 和Ysf 來將橢圓改為圓,于是可計算偏移值Xoff 和Yoff 將圓中心定在0,0 原點在對汽車干擾作補償時用來計算方位角的X Y 值如下: X 值=Xsf*X 讀數(shù)+Xoff Y 值=Ysf*Y 讀數(shù)+Yoff 可使用簡單的標定(校準)方法來確定偏移和定標因數(shù)值: 1.把羅盤安裝在汽車里并在水平面上駕車作環(huán)形運動 2.找出X和Y磁力讀數(shù)的最大和最小值 3.用這四個數(shù)值確定X 和Y 定標因數(shù)(Xsf Ysf) 以及零偏移值(Xoff Yoff) Xsf=1 或(Y 最大-Y 最小)/(X 最大-X 最小) 以較大的數(shù)值為準 Ysf=1 或(X 最大-Y 最小)/(Y 最大-Y 最小) 以較大的數(shù)值為準 Xoff=[(X 最大-X 最小)/2-X 最大]*Xsf Yoff=[(Y 最大-Y 最小)/2-Y 最大]*Ysf 補償?shù)那闆r如圖3-7所示:
1.039.jpg (4.88 KB, 下載次數(shù): 229)
下載附件
2016-4-11 20:37 上傳
1.040.jpg (17.67 KB, 下載次數(shù): 219)
下載附件
2016-4-11 20:37 上傳
3.3 主程序設計
1.041.jpg (28.11 KB, 下載次數(shù): 232)
下載附件
2016-4-11 20:37 上傳
主程序設計流程圖如圖3-8所示,具體程序見附錄:
1.042.jpg (2.91 KB, 下載次數(shù): 224)
下載附件
2016-4-11 20:37 上傳
1.043.jpg (2.16 KB, 下載次數(shù): 228)
下載附件
2016-4-11 20:37 上傳
3.4本章小結本章講述了整體軟件設計方案,首先介紹了GPS模塊通信程序的編寫、相關測量數(shù)據(jù)的提取以及數(shù)據(jù)格式的轉換,然后介紹了電子羅盤部分通信和數(shù)據(jù)處理程序的編寫,并且對電子羅盤的磁偏角補償、傾角補償和外部磁場干擾補償?shù)姆椒ㄟM行的闡述,最后介紹了整體程序的設計思路。
第4章調(diào)試4.1軟件調(diào)試在軟件調(diào)試過程中,先后用到了ICCAVR開發(fā)環(huán)境,PROGISP燒程環(huán)境,在調(diào)試GPS模塊時用到了串口調(diào)試助手和J-Nav GPSAnalyzer。 4.1.1 單片機程序開發(fā)環(huán)境介紹自ATMEL公司的AT90系列單片機誕生以來有很多第三方廠商為AT90系列開發(fā)了用于程序開發(fā)的C語言工具,ICCAVR就是ATMEL公司推薦的第三方C編譯器之一。ICCAVR是一種符合ANSI標準的C語言來開發(fā)MCU(單片機)程序的一個工具,功能合適、使用方便、技術支持好,它主要有以下幾個特點: 1.ICCAVR是一個綜合了編輯器和工程管理器的集成工作環(huán)境(IDE); 2.源文件全部被組織到工程之中,文件的編輯和工程的構筑也在這個環(huán)境中完成,錯誤顯示在狀態(tài)窗口中,并且當你點擊編譯錯誤時,光標自動跳轉到錯誤的那一行; 3.該工程管理器還能直接產(chǎn)生 INTEL HEX格式文件的燒寫文件(該格式的文件可被大多數(shù)編程器所支持,可以直接下載到芯片中使用)和符合 AVRStudio的調(diào)試文件(COFF格式)。 4.ICCAVR是一個綜合了編輯器和工程管理器的集成開發(fā)環(huán)境(IDE),可在Win XP和Win 7等環(huán)境下運行。開發(fā)界面如圖4-1所示:
1.044.jpg (19.04 KB, 下載次數(shù): 216)
下載附件
2016-4-11 20:37 上傳
1.045.jpg (2.43 KB, 下載次數(shù): 221)
下載附件
2016-4-11 20:37 上傳
4.1.2單片機程序燒錄環(huán)境介紹本設計采用ASP下載方式,使用的是超級下載工具PROGISP。該工具具有以下特性: 1.支持所有的AVR芯片的編程,支持AT89S51,AT89S52 2.支持自定義并口下載編程器 3.支持自定義串口的下載編程器 4.支持STK500編程器 5.支持USBASP編程器 6.支持并口的并行編程器 7.支持USBProg編程器 8.支持自定義編程芯片 9.支持自定義編程熔絲信息提示信息 10.支持USBProg的在線升級(通過USB口) 11.支持USBProg-C實現(xiàn)脫機下載 12.支持命令行方式,可以直接嵌入其他IDE中使用 13.綠色軟件,無需安裝,占用資源少 14.支持自定義漢化信息提示 其工作界面如圖4-2所示:
1.046.jpg (39.22 KB, 下載次數(shù): 223)
下載附件
2016-4-11 20:37 上傳
1.047.jpg (2.58 KB, 下載次數(shù): 247)
下載附件
2016-4-11 20:37 上傳
4.1.3串口調(diào)試助手該軟件一個很好而小巧的串口調(diào)試助手,支持常用的300-115200bps波特率,能設置校驗、數(shù)據(jù)位和停止位,能以ASCII碼或十六進制接收或發(fā)送任何數(shù)據(jù)或字符(包括中文),可以任意設定自動發(fā)送周期,并能將接收數(shù)據(jù)保存成文本文件,能發(fā)送任意大小的文本文件。
1.048.jpg (31.49 KB, 下載次數(shù): 220)
下載附件
2016-4-11 20:37 上傳
其工作界面如圖4-3所示:
1.049.jpg (2.84 KB, 下載次數(shù): 235)
下載附件
2016-4-11 20:37 上傳
4.1.4 GPS模塊輔助調(diào)試工具調(diào)試在GPS的調(diào)試過程中,本設計使用的是軟件J-Nav GPSAnalyzer進行輔助調(diào)試的。該軟件可以幫助我確定GPS模塊是否正常工作,其工作界面如圖4-4所示:
1.050.jpg (24.01 KB, 下載次數(shù): 220)
下載附件
2016-4-11 20:37 上傳
1.051.jpg (3.54 KB, 下載次數(shù): 179)
下載附件
2016-4-11 20:37 上傳
4.2 硬件調(diào)試4.2.1 PCB設計軟件介紹Altium Designer 提供了唯一一款統(tǒng)一的應用方案,其綜合電子產(chǎn)品一體化開發(fā)所需的所有必須技術和功能。Altium Designer 在單一設計環(huán)境中集成板級和FPGA系統(tǒng)設計、基于FPGA和分立處理器的嵌入式軟件開發(fā)以及PCB版圖設計、編輯和制造。并集成了現(xiàn)代設計數(shù)據(jù)管理功能,使得Altium Designer成為電子產(chǎn)品開發(fā)的完整解決方案-一個既滿足當前,也滿足未來開發(fā)需求的解決方案。
1.052.jpg (23.95 KB, 下載次數(shù): 200)
下載附件
2016-4-11 20:37 上傳
軟件的工作界面如圖4-5所示:
1.053.jpg (3.17 KB, 下載次數(shù): 236)
下載附件
2016-4-11 20:37 上傳
4.2.2實際電路調(diào)試在實際調(diào)試過程中,制作了多塊實驗電路板,該電路實現(xiàn)了預期的所有功能。圖4-6為實驗電路的正面:
1.054.jpg (11.85 KB, 下載次數(shù): 219)
下載附件
2016-4-11 20:37 上傳
1.055.jpg (2.66 KB, 下載次數(shù): 226)
下載附件
2016-4-11 20:37 上傳
圖4-7為實驗電路的背面:
1.056.jpg (20.63 KB, 下載次數(shù): 195)
下載附件
2016-4-11 20:37 上傳
1.057.jpg (2.86 KB, 下載次數(shù): 204)
下載附件
2016-4-11 20:37 上傳
圖4-8為完整的實驗電路板:
1.058.jpg (17.89 KB, 下載次數(shù): 232)
下載附件
2016-4-11 20:37 上傳
1.059.jpg (2.46 KB, 下載次數(shù): 224)
下載附件
2016-4-11 20:37 上傳
所有的數(shù)據(jù)分為三屏顯示,第一屏顯示時間和經(jīng)緯度坐標,第二屏顯示速度、航向、高度、海拔,第三屏顯示方位角(即順時針方向和正北方向的夾角)、X軸和Y軸的傾角。 圖4-9為顯示的第一屏數(shù)據(jù):
1.060.jpg (12.28 KB, 下載次數(shù): 256)
下載附件
2016-4-11 20:37 上傳
1.061.jpg (2.68 KB, 下載次數(shù): 223)
下載附件
2016-4-11 20:37 上傳
圖4-10為顯示的第二屏數(shù)據(jù):
1.062.jpg (12.31 KB, 下載次數(shù): 213)
下載附件
2016-4-11 20:37 上傳
1.063.jpg (3.4 KB, 下載次數(shù): 217)
下載附件
2016-4-11 20:37 上傳
圖4-11為顯示的第三屏的數(shù)據(jù):
1.064.jpg (10.39 KB, 下載次數(shù): 230)
下載附件
2016-4-11 20:37 上傳
1.065.jpg (3.32 KB, 下載次數(shù): 237)
下載附件
2016-4-11 20:37 上傳
4.3本章小結本章介紹了整個設計的軟件和硬件調(diào)試過程。軟件調(diào)試部分介紹了單片機的開發(fā)環(huán)境、程序燒錄環(huán)境、串口調(diào)試助手和GPS輔助調(diào)試軟件及使用方法。硬件調(diào)試部分則介紹了PCB設計軟件及實際制作的實驗電路板的一些情況。
結論隨著GPS技術的應用越來越廣泛,GPS設備的普及速度也將大大加快,在我們國內(nèi)GPS產(chǎn)業(yè)才剛剛起步,GPS產(chǎn)業(yè)的興起勢必也將大大的推進GPS技術在民間的應用。當前GPS技術已在各個領域發(fā)揮了至關重要重要的作用,為促進我們的生活和人類的發(fā)展作出了不可估量的貢獻。 不過由于其自身技術的限制和一些特定環(huán)境的限制,使得GPS設備還存在種種的弊端。這次設計針對這些弊端提出一種解決思路,即采用GPS和電子羅盤相結合的方式,從而解決了在靜態(tài)和特殊地理環(huán)境下GPS無法準確定位的情況,具有很大的使用價值。 所設計的多用途定位儀具有以下特點: 1.采用ATmega16單片機,采用5V電壓工作,系統(tǒng)工作穩(wěn)定,成本低廉。 2.采用LCD12864大屏幕進行中文顯示,使得相關的測量數(shù)據(jù)的顯示更加清晰易懂,各屏數(shù)據(jù)間只需一個按鍵即可相互切換。 3.應用范圍廣泛,由于測量顯示的數(shù)據(jù)非常多,包括:時間、坐標、速度、航向、高度、海拔、方向和傾角。故該儀器可用航海、野外旅行、車載導航等諸多方面。 4.采用GPS加電子羅盤的方式克服了單純的GPS設備在靜態(tài)情況和沒有GPS信號的情況下無法準確及時測量當前方向的問題。 綜上所述,實驗完成了預期的目標,不過由于時間和技術的原因,此系統(tǒng)設計還存在很多不足之處,如程序設計上缺乏靈活性、測量的精度上也有待提高、設備的耗電量也比較大、整體布局也有不合理的地方,今后將在這些方面進一步改進。
附錄: 一、任務書中本階段工作目標與任務要求 1.對ATmega16單片機的學習和使用; 2.學習并熟練在單片機上進行C語言程序的編寫和調(diào)試; 3.完成對整個控制電路的設計與制作; 4.單片機和GPS模塊、HMC5883L三軸地磁傳感器以及ADXL345三軸加速度傳感器的通信,并能將所需要的數(shù)據(jù)從中采集出來; 5.學習128*64顯示屏的使用,并能將所需的數(shù)據(jù)進行顯示; 6.尋找合適的算法,以解決外界各種干擾因素給電子羅盤和GPS帶來的誤差,盡可能提高設備的精度; 二、目前已完成任務情況 1.ATmega16,ICCAVR的學習和使用及相關單片機控制電路的設計
1.066.jpg (23.66 KB, 下載次數(shù): 195)
下載附件
2016-4-11 20:37 上傳
本設計采用ATmega16為控制核心,該芯片使用的開發(fā)環(huán)境為ICCAVR,圖1為該軟件的工作界面: 圖1 ICCAVR開發(fā)環(huán)境工作環(huán)境 圖2為當前設計的整體實驗電路:
1.067.jpg (32.53 KB, 下載次數(shù): 227)
下載附件
2016-4-11 20:37 上傳
圖2系統(tǒng)整體電路圖 2.GPS,HMC5883L,ADXL345的使用并搭建實驗電路,進行數(shù)據(jù)采集 圖3為GPS模塊和單片機的通信接口電路:
1.068.jpg (12.35 KB, 下載次數(shù): 197)
下載附件
2016-4-11 20:37 上傳
圖3 GPS通信接口電路
1.069.jpg (28.55 KB, 下載次數(shù): 237)
下載附件
2016-4-11 20:37 上傳
圖5為HMC5883L和ADXL345和單片機通信的接口電路: 圖5電子羅盤接口電路 3.LCD屏128*64的使用并搭建實驗電路進行顯示實驗
1.070.jpg (18.31 KB, 下載次數(shù): 219)
下載附件
2016-4-11 20:37 上傳
圖6為12864顯示屏的接口電路: 圖6 12864接口電路
1.071.jpg (30.15 KB, 下載次數(shù): 207)
下載附件
2016-4-11 20:37 上傳
4.制作整體實驗電路進行調(diào)試并根據(jù)結果對電路和程序進行整改 圖7為制作的實際實驗電路板: 圖7實驗電路板 三、存在的問題和擬解決方法 1.功耗問題,整個電路功耗較大:改良電路設計,尋找功耗更低的原件和顯示屏,同時在程序上予以優(yōu)化。 2.電子羅盤的精度問題:更加合理布局電路板,查閱資料,尋找更加合適的算法,從程序上對外界的干擾予以補償以提高精度。
附錄:gps信息提取程序:
- /*************************************************
- 函數(shù)名稱:GPS_RMC_Parse
- 作用:提取$GPRMC的信息
- *************************************************/
- int GPS_RMC_Parse(char *line,GPS_INFO *GPS)
- {
- uchar ch,status,tmp;
- float lati_cent_tmp, lati_second_tmp;
- float long_cent_tmp, long_second_tmp;
- float speed_tmp;
- char *buf=line;
- ch=buf[5];
- status = buf[GetComma(2, buf)];
- if (ch == 'C') //如果第五個字符是C,($GPRMC)
- {
- if (status == 'A') //如果數(shù)據(jù)有效,則分析
- {
- GPS -> NS = buf[GetComma(4, buf)];
- GPS -> EW = buf[GetComma(6, buf)];
- GPS->latitude = Get_Double_Number(&buf[GetComma(3, buf)]);
- GPS->longitude = Get_Double_Number(&buf[GetComma( 5, buf)]);
- GPS->latitude_Degree = (int)GPS->latitude / 100; //分離緯度
- lati_cent_tmp = (GPS->latitude - GPS->latitude_Degree * 100);
- GPS->latitude_Cent = (int)lati_cent_tmp;
- lati_second_tmp = (lati_cent_tmp - GPS->latitude_Cent) * 60;
- GPS->latitude_Second = (int)lati_second_tmp;
- GPS->longitude_Degree = (int)GPS->longitude / 100; //分離經(jīng)度
- long_cent_tmp = (GPS->longitude - GPS->longitude_Degree * 100);
- GPS->longitude_Cent = (int)long_cent_tmp;
- long_second_tmp = (long_cent_tmp - GPS->longitude_Cent) * 60;
- GPS->longitude_Second = (int)long_second_tmp;
- speed_tmp = Get_Float_Number(&buf[GetComma(7, buf)]); //速度(單位:海里/時)
- GPS->speed=speed_tmp* 1.85; //1海里=1.85公里
- GPS->direction = Get_Float_Number(&buf[GetComma(8, buf)]); //角度
- GPS->D.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); //時間
- GPS->D.minute = (buf[9] - '0') * 10 + (buf[10] - '0');
- GPS->D.second = (buf[11] - '0') * 10 + (buf[12] - '0');
- tmp = GetComma(9, buf);
- GPS->D.day = (buf[tmp + 0] - '0') * 10 + (buf[tmp + 1] - '0'); //日期
- GPS->D.month = (buf[tmp + 2] - '0') * 10 + (buf[tmp + 3] - '0');
- GPS->D.year = (buf[tmp + 4] - '0') * 10 + (buf[tmp + 5] - '0')+2000;
-
- UTC2BTC(&GPS->D);
- return 1;
- }
- }
- return 0;
- }
- /************************************************
- 函數(shù)名稱:GPS_GGA_Parse
- 作用:提取GPGGA的數(shù)據(jù)
- *************************************************/
- int GPS_GGA_Parse(char *line,GPS_INFO *GPS)
- {
- uchar ch, status;
- char *buf = line;
- ch = buf[4];
- status = buf[GetComma(2, buf)];
- if (ch == 'G') //$GPGGA
- {
- if (status != ',')//只有有數(shù)據(jù)就采集
- {
- GPS->height_sea = Get_Float_Number(&buf[GetComma(9, buf)]);
- GPS->height_ground = Get_Float_Number(&buf[GetComma(11, buf)]);
- return 1; //有數(shù)據(jù)返回1
- }
- }
- return 0; //無數(shù)據(jù)返回0
- }
- 2.系統(tǒng)主程序
- /*****************************************
- 中斷名稱:uart_rx
- 作用:串口接收數(shù)據(jù)
- ******************************************/
- void uart_rx(void)
- {
- uchar ch;
- UCSRB&=~BIT(RXCIE);
- ch = UDR;
- if ((ch == '
- ) && (gps_flag == 0)) //如果收到字符'
- ,便開始接收
- {
- rev_start = 1;
- rev_stop = 0;
- }
- if (rev_start == 1) //標志位為1,開始接收
- {
- rev_buf[num++] = ch; //字符存到數(shù)組中
- if (ch == '') //如果接收到換行
- {
- rev_buf[num] = '';
- rev_start = 0;
- rev_stop = 1;
- gps_flag = 1;
- num = 0;
- }
- }
- UCSRB|=BIT(RXCIE);
- }
- /***************************************
- 函數(shù)名稱:Init_hmc5883
- 作用:初始化芯片hmc5883
- ****************************************/
- void Init_hmc5883(void)
- {
- //I2C_write(0x00,0x70);
- //I2C_write(0x01,0x40);
- I2C_write(HMC_SLA_W,0X02,0X00);
- }
- /***********************************************
- 函數(shù)名稱:Init_ADXL345
- 作用:初始化ADXL345
- *************************************************/
- void Init_ADXL345(void)
- {
- I2C_write(ADXL_SLA_W,0x31,0x0B); //測量范圍,正負16g,13位模式
- I2C_write(ADXL_SLA_W,0x2D,0x08); //選擇電源模式參考pdf24頁
- I2C_write(ADXL_SLA_W,0x2E,0x80); //使能 DATA_READY 中斷
- I2C_write(ADXL_SLA_W,0x2C,0x08); //速率設定為12.5 參考pdf13頁
- I2C_write(ADXL_SLA_W,0x1E,0x00); //X 偏移量
- I2C_write(ADXL_SLA_W,0x1F,0x00); //Y 偏移量
- I2C_write(ADXL_SLA_W,0x20,0x05);//Z 偏移量
- }
- /**********************************
- 函數(shù)名稱:Multiple_read_hmc5883
- 作用:讀取X,Y,Z,六個寄存中的值
- ************************************/
- void Multiple_read(void)
- {
- uchar i;
- int x,y,z;
- int a,b;
- double temp1,temp2;
- double angle,angle_x,angle_y;
- double X_h,Y_h;
- x=I2C_read(ADXL_SLA_W,ADXL_SLA_R,0x33)<<8|I2C_read(ADXL_SLA_W,ADXL_SLA_R,0x32);
- y=I2C_read(ADXL_SLA_W,ADXL_SLA_R,0x35)<<8|I2C_read(ADXL_SLA_W,ADXL_SLA_R,0x34);
- z=I2C_read(ADXL_SLA_W,ADXL_SLA_R,0x37)<<8|I2C_read(ADXL_SLA_W,ADXL_SLA_R,0x36);
- angle_x=atan2((double)x,(double)z);
- angle_y=atan2((double)y,(double)z);
- temp1=angle_x*(180/3.14159265)*10;
- if(angle_x<0)
- {
- temp1=-temp1;
- line10[9]='-';
- }
- else
- line10[9]=' ';
- conversion(temp1);
- line10[10]=bai;
- line10[11]=shi;
- line10[13]=ge;
- temp2=angle_y*(180/3.14159265)*10;
- if(angle_y<0)
- {
- temp2=-temp2;
- line11[9]='-';
- }
- else
- line11[9]=' ';
- conversion(temp2);
- line11[10]=bai;
- line11[11]=shi;
- line11[13]=ge;
- for(i=0;i<6;i++)
- {
- direction_data[i]=I2C_read(HMC_SLA_W,HMC_SLA_R,0x03+i);
- }
- x=direction_data[0]<<8|direction_data[1]; //Combine MSB and LSB of X Data output register
- z=direction_data[2]<<8|direction_data[3]; //Combine MSB and LSB of Z Data output register
-
- y=direction_data[4]<<8|direction_data[5]; //Combine MSB and LSB of Y Data output register
- X_h=(double)x*cos(angle_y)+(double)y*sin(angle_x)*sin(angle_y);
- X_h=X_h-(double)z*cos(angle_x)*sin(angle_y);
- Y_h=(double)y*cos(angle_x)+(double)z*sin(angle_x);
- angle= atan2(Y_h,X_h) * 57.3 + 180; // angle in degrees
- if(angle>=0&&angle<352.5)
- angle=angle+7.5;
- else if(angle>=352.5&&angle<360)
- angle=angle-352.5;
- angle*=10;
- conversion(angle);
- line9[6]=qian;
- line9[7]=bai;
- line9[8]=shi;
- line9[10]=ge;
- }
- /******************************************
- 函數(shù)名稱:conversion
- 作用:對讀出的數(shù)據(jù)進行轉化
- *********************************************/
- void conversion(uint temp_data)
- {
- wan=temp_data/10000+0x30 ;
- temp_data=temp_data%10000; //取余運算
- qian=temp_data/1000+0x30 ;
- temp_data=temp_data%1000; //取余運算
- bai=temp_data/100+0x30 ;
- temp_data=temp_data%100; //取余運算
- shi=temp_data/10+0x30 ;
- temp_data=temp_data%10; //取余運算
- ge=temp_data+0x30;
- }
-
- /*******************主函數(shù)***************************/
- void main(void)
- {
- uchar error_num = 0;
- DDRD|=BIT(6)|BIT(7);
- PORTD|=BIT(6);
- uart_init(4800); //初始化串口
- init_int0();
- delayms(100);
- LCD_init(); //初始化12864
- LCD_clear();
- TWI_init(); //初始化TWI通信
- GPS_Init(); //初始化GPS
- rev_stop=0;
- PORTD|=BIT(7);
- while(1)
- {
- if (rev_stop) //如果接收完一行
- {
- if (change_page==1) //換頁
- {
- if (GPS_GGA_Parse(rev_buf, &GPS)) //解析GPGGA
- {
- GPS_DisplayTwo(); //顯示第二屏信息
- error_num = 0;
- gps_flag = 0;
- rev_stop = 0;
- }
- else
- {
- error_num++;
- if (error_num >= 20) //如果數(shù)據(jù)無效超過20次
- {
- error_num = 20;
- GPS_Init(); //返回初始化
- }
- gps_flag = 0;
- rev_stop = 0;
- }
- }
- else if(change_page==0)
- {
- if (GPS_RMC_Parse(rev_buf, &GPS)) //解析GPRMC
- {
- GPS_DisplayOne(); //顯示GPS第一屏信息
- error_num = 0;
- gps_flag = 0;
- rev_stop = 0;
- }
- else
- {
- error_num++;
- if (error_num >= 20) //如果數(shù)據(jù)無效超過20次
- {
- error_num = 20;
- GPS_Init(); //返回初始化
- }
- gps_flag = 0;
- rev_stop = 0;
- }
- }
- }
- if(change_page==2)
- {
- Init_ADXL345();
- Init_hmc5883();
- Multiple_read();
- send_string(0,0,line9);
- send_string(0,1,line10);
- send_string(0,2,line11);
- send_string(0,3,line12);
- delayms(40);
- }
- }
- }
- /*******************************************
- 函數(shù)名稱:GPS_DisOne
- 作用:用來顯示第一屏的數(shù)據(jù)
- *******************************************/
- void GPS_DisplayOne(void)
- {
- uchar i = 0;
- char time[5];
- char info[10];
- /**************************顯示年**************************/
- Int_To_Str(GPS.D.year,time); //將年轉換成字符串,存在time中
- if(strlen(time)==4) //判斷接收數(shù)據(jù)是否有效,有效則顯示
- {
- i = 0;
- while(time[i] != '')
- {
- line1[0+i]=time[i];//顯示年
- i++;
- }
- }
- /*******************顯示月****************************/
- Int_To_Str(GPS.D.month,time);
- if(strlen(time)==2)
- {
- i = 0;
- while(time[i] != '')
- {
- line1[6+i]=time[i];
- i++;
- }
- }
- /*************************顯示日*****************************/
- Int_To_Str(GPS.D.day,time);
- if(strlen(time)==2)
- {
- i = 0;
- while(time[i] != '')
- {
- line1[10+i]=time[i];
- i++;
- }
- }
- /**********************顯示小時*************************/
- Int_To_Str(GPS.D.hour,time);
- if(strlen(time)==2)
- {
- i = 0;
- while(time[i] != '')
- {
- line2[0+i] =time[i];
- i++;
- }
- }
- /***********************顯示分鐘************************/
- Int_To_Str(GPS.D.minute,time);
- if(strlen(time)==2)
- {
- i = 0;
- while(time[i] != '')
- {
- line2[4+i]=time[i];
- i++;
- }
- }
-
- /**********************顯示秒*********************/
- Int_To_Str(GPS.D.second,time);
- if(strlen(time)==2)
- {
- i = 0;
- while(time[i] != '')
- {
- line2[8+i]=time[i];
- i++;
- }
- }
- /************************顯示緯度**********************/
- if (GPS.NS == 'N') //判斷是北緯還是南緯
- line3[14]='N';
- else if (GPS.NS == 'S')
- line3[14]='S';
- Int_To_Str(GPS.latitude_Degree,info); //緯度
- if(strlen(info)==2)
- { //只有正常顯示緯度,才顯示緯分
- i = 0;
- while(info[i] != '')
- {
- line3[6+i]=info[i];
- i++;
- }
- Int_To_Str(GPS.latitude_Cent,info); //緯分
- if(strlen(info)==2)
- { //只有正常顯示緯分,才顯示緯秒
- i = 0;
- while(info[i] != '')
- {
- line3[9+i]=info[i];
- i++;
- }
- Int_To_Str(GPS.latitude_Second,info); //緯秒
- if(strlen(info)==2)
- {
- i = 0;
- while(info[i] != '')
- {
- line3[12+i]= info[i];
- i++;
- }
- }
- }
- }
- /***********************顯示經(jīng)度***********************/
- if (GPS.EW == 'E') //判斷是東經(jīng)還是西經(jīng)
- line4[14]='E';
- else if (GPS.EW == 'W')
- line4[14]='w';
- Int_To_Str(GPS.longitude_Degree,info); //經(jīng)度
- if(strlen(info)==3)
- {
- i = 0;
- while(info[i] != '')
- {
- line4[5+i]=info[i];
- i++;
- }
- Int_To_Str(GPS.longitude_Cent,info); //經(jīng)分
- if(strlen(info)==2)
- {
- i = 0;
- while(info[i] != '')
- {
- line4[9+i]=info[i];
- i++;
- }
- Int_To_Str(GPS.longitude_Second,info); //經(jīng)秒
- if(strlen(info)==2)
- {
- i = 0;
- while(info[i] != '')
- {
- line4[12+i]=info[i];
- i++;
- }
- }
- }
- }
- send_string(0,0,line1);
- send_string(0,1,line2);
- send_string(0,2,line3);
- send_string(0,3,line4);
- }
-
- /********************************************
- 函數(shù)名稱:GPS_DisplayTwo
- 作用:用來顯示第二屏的數(shù)據(jù)
- *********************************************/
- void GPS_DisplayTwo(void)
- {
- int integar;
- char Info[10];
- float fla;
- uchar i;
-
- /*********************顯示速度部分*********************/
- fla=GPS.speed;
- integar = (int)fla;
- Int_To_Str(fla,Info); //顯示整數(shù)部分
- i = 0;
- while(Info[i] !='')
- {
- line5[5+i]=Info[i];
- i++;
- }
- line5[5+i]=0X2E;
- fla = fla - integar; //顯示小數(shù)部分
- fla = fla * 10; // 顯示 0.1
- integar = (int) fla;
- fla = fla - integar; // 改變fla的值,使fla總是小于1
- line5[6+i]= integar+0x30;
- fla = fla*10; // 顯示 0.01
- integar = (int) fla;
- fla = fla - integar; // 改變fla的值,使fla總是小于1
- line5[7+i]=integar+0x30 ;
-
- /*********************顯示航向部分********************/
- fla=GPS.direction;
- integar = (int)fla; // 顯示整數(shù)部分
- Int_To_Str(fla,Info);
- i = 0;
- while(Info[i] !='')
- {
- line6[6+i]=Info[i];
- i++;
- }
- line6[6+i]=0X2E;
- fla = fla - integar; //顯示小數(shù)部分
- fla = fla * 10; // 顯示 0.1
- integar = (int) fla;
- fla = fla - integar; // 改變fla的值,使fla總是小于1
- line6[7+i]= integar+0x30;
- fla = fla*10; // 顯示 0.01
- integar = (int) fla;
- fla = fla - integar; // 改變fla的值,使fla總是小于1
- line6[8+i]=integar+0x30 ;
- /****************顯示高度部分******************/
- fla=GPS.height_ground;
- integar = (int)fla; // 顯示整數(shù)部分
- Int_To_Str(fla,Info);
- i = 0;
- while(Info[i] !='')
- {
- line7[6+i]=Info[i];
- i++;
- }
- line7[6+i]=0X2E;
- fla = fla - integar; //顯示小數(shù)部分
- fla = fla * 10; // 顯示 0.1
- integar = (int) fla;
- fla = fla - integar; // 改變fla的值,使fla總是小于1
- line7[7+i]= integar+0x30;
- fla = fla*10; // 顯示 0.01
- integar = (int) fla;
- fla = fla - integar; // 改變fla的值,使fla總是小于1
- line7[8+i]=integar+0x30 ;
- /*******************顯示海拔高度部分*******************/
- fla=GPS.height_sea;
- integar = (int)fla; // 顯示整數(shù)部分
- Int_To_Str(fla,Info);
- i = 0;
- while(Info[i] !='')
- {
- line8[6+i]=Info[i];
- i++;
- }
- line8[6+i]=0X2E;
- fla = fla - integar; //顯示小數(shù)部分
- fla = fla * 10; // 顯示 0.1
- integar = (int) fla;
- fla = fla - integar; // 改變fla的值,使fla總是小于1
- line8[7+i]= integar+0x30;
- fla = fla*10; // 顯示 0.01
- integar = (int) fla;
- fla = fla - integar; // 改變fla的值,使fla總是小于1
- line8[8+i]=integar+0x30 ;
- send_string(0,0,line5);
- send_string(0,1,line6);
- send_string(0,2,line7);
- send_string(0,3,line8);
- }
復制代碼
|