新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 用PIC16F874單片機進行GPS串口數據接收

        用PIC16F874單片機進行GPS串口數據接收

        作者: 時間:2012-01-14 來源:網絡 收藏

         目前GPS(全球定位系統)定位應用市場日趨成熟,正在進入應用的高速發展時期。本文以一款EverMore公司的GM-X205GPS接受模塊為例,介紹了其數據格式,以及應用單片機RS232串口進行數據接收的程序。
        1、 GPS應用簡介


          近年來GPS系統,已經在大地測繪、海上漁用、車輛定位監控、建筑、農業等各個領域得到廣泛應用。從九十年代我國引進GPS定位技術開始,經過十多年的市場培育,GPS定位應用進入了發展的最好時機,未來十年基于GPS的應用將會改變我們的生活和工作方式。


          目前市場上的大部分GPS接受模塊都是通過RS232串口與MCU進行數據傳輸的。這些數據包括經度、緯度、海拔高度、時間、衛星使用情況等基本信息。開發人員再依據這些基本數據,進行數據處理來完成整套的定位系統軟件。

        2、 GM-X205模塊數據格式


          在進行數據接受編程之前,先介紹一下該模塊的數據格式。它支持NMEA-0183輸出格式。信息如下:


          GGA位置測定系統定位資料(Global Positioning System Fix Data)
          GSV 導航衛星資料(GNSS Satellites in View)
          RMC導航衛星特定精簡資料(Recommended Minimum Specific GNSS Data)
          VTG 方向及速度等相關資料(Course Over Ground and Ground Speed)
          由于文章篇幅問題,筆者在這里只以接收GGA數據為例,格式如下:
          $GPGGA,hhmmss,dddmm.mmmm,a,dddmm.mmmm,a,x,xx,x.x,x.x,M,,M,x.x,xxxx*CS
          例:$GPGGA,033744,2446.5241,N,12100.1536,E,1,10,0.8,133.4,M,,,,*1F
          說明見表:
          
        區域
        名稱
        單位
        說明
        1
        信息ID
        $GPGGA
        GGA協議開始
        2
        UTC時間
        033744
        hhmmss
        3
        緯度
        2446.5241
        dddmm.mmmm
        4
        南/北半球指示
        N
        N=north ; S=south
        5
        經度
        12100.1536
        dddmm.mmmm
        6
        東/西半球指示
        E
        E=east ; W=west
        7
        定位指示
        1
        0 =未定位
        1=定位SPS模式
        2=定位DGPS, SPS模式
        8
        應位衛星數
        10
        00-12
        9
        HDOP
        0.8
        10
        海拔高度
        133.4
        11
        海拔高度單位
        M
        12
        WGS84水準面劃分
        13
        WGS-84水準面劃分單位
        14
        累計GPS數據微分
        本模塊中不可用
        15
        參考工作站ID
        本模塊中不可用
        16
        校驗位
        *1F


          上面例子中,我們可讀出位置信息:北緯24度46.5241分,西經121度00.1536分
          格林威治時間:3點37分44秒

        3、 數據接收程序


          筆者在系統中把接收到的數據處理后,顯示到圖形液晶屏上。限于篇幅在這里只給出數據接收部分程序,并且只接收經度和時間信息,并且給出格林威治時間轉換為北京時間的轉換函數。其他數據接收程序類似。
          ;**********************************************************
          ; THIS IS A GPS RECEIVER PROGRAM *
          ;**********************************************************
          LIST P=16F874
          INCLUDE P16F874.INC
          ;*******寄存器定義 ********************
          TEMP1 EQU 0X27
          W_TEMP EQU 0X54
          STATUS_TEMP EQU 0X55
          LONG1 EQU 0X40 ;LONG1--- LONG10經度的10位數據
          LONG2 EQU 0X41
          LONG3 EQU 0X42
          LONG4 EQU 0X43
          LONG5 EQU 0X44
          LONG6 EQU 0X45
          LONG7 EQU 0X46
          LONG8 EQU 0X47
          LONG9 EQU 0X48
          LONG10 EQU 0X49
          T1 EQU 0X58 ;T1---T6時間的6位數據
          T2 EQU 0X59
          T3 EQU 0X60
          T4 EQU 0X61
          T5 EQU 0X62
          T6 EQU 0X63
          ;********************************************************
          ORG 00H
          NOP
          NOP
          GOTO MAIN
          ORG 04H ;設定按中端健才開始數據接受
          NOP
          NOP
          GOTO INTERRUPT
          ;*********判斷頭文件是不是‘$GPGGA’**********
          IDMESSAGE
          BCF STATUS,RP0
          BREAK0
          CALL PAND
          MOVWF TEMP1
          MOVLW ‘$‘ ;detect $
          SUBWF TEMP1,0
          BTFSS STATUS,Z
          GOTO BREAK0
          CALL PAND
          MOVWF TEMP1
          MOVLW ‘G‘ ;detect G
          SUBWF TEMP1,0
          BTFSS STATUS,Z
          GOTO BREAK0
          CALL PAND
          MOVWF TEMP1
          MOVLW ‘P‘ ;detect P
          SUBWF TEMP1,0
          BTFSS STATUS,Z
          GOTO BREAK0
          CALL PAND
          MOVWF TEMP1
          MOVLW ‘G‘ ;detect G
          SUBWF TEMP1,0
          BTFSS STATUS,Z
          GOTO BREAK0
          CALL PAND
          MOVWF TEMP1
          MOVLW ‘G‘ ;detect G
          SUBWF TEMP1,0
          BTFSS STATUS,Z
          GOTO BREAK0
          CALL PAND
          MOVWF TEMP1
          MOVLW ‘A‘ ;detect A
          SUBWF TEMP1,0
          BTFSS STATUS,Z
          GOTO BREAK0
          CALL PAND ;跳過逗號
          RETURN
          ;************接收函數******************
          RECEIVE
          CALL PAND ;開始時間數據接收
          MOVWF T1
          CALL PAND
          MOVWF T2
          CALL PAND
          MOVWF T3
          CALL PAND
          MOVWF T4
          CALL PAND
          MOVWF T5
          CALL PAND
          MOVWF T6 ;時間數據接收完成
          CALL PAND ;跳過逗號
          CALL PAND ;跳過10位緯度數據---開始
          CALL PAND
          CALL PAND
          CALL PAND
          CALL PAND
          CALL PAND
          CALL PAND
          CALL PAND
          CALL PAND
          CALL PAND ;跳過10位緯度數據---結束
          CALL PAND ;跳過逗號
          CALL PAND ;跳過南/北緯判斷位數據
          CALL PAND ;跳過逗號
          CALL PAND ;接受經度信號開始
          MOVWF LONG1
          CALL PAND
          MOVWF LONG2
          CALL PAND
          MOVWF LONG3
          CALL PAND
          MOVWF LONG4
          CALL PAND
          MOVWF LONG5
          CALL PAND
          MOVWF LONG6
          CALL PAND
          MOVWF LONG7
          CALL PAND
          MOVWF LONG8
          CALL PAND
          MOVWF LONG9
          CALL PAND
          MOVWF LONG10 ;接受經度信號結束
          RETURN
          ;***************串口寄存器中是否數據*****************
          PAND
          BCF STATUS,RP0
          CC BTFSS PIR1,5
          GOTO CC
          MOVF RCREG,0
          RETURN
          ;*****************中斷函數***************************
          INTERRUPT
          BCF INTCON,7 ;SET GIE=0屏蔽所有中端
          BCF STATUS,RP0
          BCF RCSTA,1 ;清除溢出錯誤位
          BSF STATUS,RP0
          BCF TXSTA,2 ;BRGH=0 Low speed
          BCF TXSTA,4 ;Set Asynchronous mode
          MOVLW 0X0C
          MOVWF SPBRG ;設置波特率為4800
          BCF STATUS,RP0
          MOVLW B‘10010000‘
          MOVWF RCSTA ;串口接收相關設置
          BSF STATUS,RP0
          BSF OPTION_REG,6 ; RB0/INT 引腳上升沿中斷
          MOVWF W_TEMP
          SWAPF STATUS,W
          BCF STATUS,RP0
          MOVWF STATUS_TEMP
          BCF STATUS,RP0
          CALL IDMESSAGE
          CALL RECEIVE
          BCF STATUS,RP0
          CLRF RCSTA ;清除串口設置
          CALL CONVERT ;調用時間轉換函數
          OUT BCF STATUS,RP0 ;跳出中斷部分,恢復寄存器
          SWAPF STATUS_TEMP,W
          MOVWF STATUS
          SWAPF W_TEMP,F
          SWAPF W_TEMP,W
          BSF INTCON,7 ;SET GIE=1允許所有中端
          NOP
          RETFIE
          ;************ 格林威治時間轉換為北京時間******************
          CONVERT
          MOVLW A‘0‘
          SUBWF T2,1
          SUBWF T1,1
          MOVLW D‘10‘
          MOVWF TEMP1
          LOOP1 MOVF TEMP1,0
          MOVF TEMP1,1
          BTFSS STATUS,Z
          GOTO ADD10
          MOVLW D‘8‘
          ADDWF T2,1
          MOVLW D‘24‘
          SUBWF T2,1
          BTFSC STATUS,C
          GOTO CON1
          ADDWF T2,1
          GOTO CON1
          CON1 MOVLW D‘20‘
          MOVWF TEMP1
          SUBWF T2,0
          BTFSS STATUS,C
          GOTO CON2
          MOVWF T2
          MOVLW 0X02
          MOVWF T1
          GOTO HALT1
          CON2 MOVLW D‘10‘
          MOVWF TEMP1
          SUBWF T2,0
          BTFSS STATUS,C
          GOTO CON3
          MOVWF T2
          MOVLW 0X01
          MOVWF T1
          GOTO HALT1
          CON3 MOVLW 0X00
          MOVWF T1
          HALT1 MOVLW A‘0‘
          ADDWF T1,1
          ADDWF T2,1
          RETURN
          ADD10 MOVF T1,0
          ADDWF T2,1
          DECF TEMP1,1
          GOTO LOOP1
          RETURN
          ;******************MAIN***********************
          MAIN
          BCF STATUS,RP0
          MOVLW B‘10010000‘
          MOVWF INTCON ;打開中斷
          LOOP NOP
          BCF STATUS,RP0
          GOTO LOOP
          GOTO MAIN
          END


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 和静县| 安岳县| 宾川县| 黄平县| 浪卡子县| 兴隆县| 蒙山县| 根河市| 聂荣县| 民丰县| 金门县| 高州市| 曲麻莱县| 晋城| 德格县| 习水县| 海口市| 大英县| 萨迦县| 比如县| 潼南县| 信阳市| 台江县| 四平市| 麻阳| 开化县| 温州市| 平谷区| 信宜市| 凤城市| 凤山市| 临沂市| 古交市| 涟源市| 乌拉特前旗| 乌拉特中旗| 丹寨县| 新营市| 鲜城| 杭州市| 荔浦县|