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

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