zoukankan      html  css  js  c++  java
  • 一个汇编写得GPS串口接收数据程序

    GPS串口数据接收程序实例


    摘 要:目前GPS(全球定位系统)定位应用市场日趋成熟,正在进入应用的高速发展时期。本文以一款EverMore公司的GM-X205GPS接受模块为例,介绍了其数据格式,以及应用PIC16F874单片机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、 PIC16F874数据接收程序
    笔者在系统中把接收到的数据处理后,显示到图形液晶屏上。限于篇幅在这里只给出数据接收部分程序,并且只接收经度和时间信息,并且给出格林威治时间转换为北京时间的转换函数。其他数据接收程序类似。
    ;**********************************************************
    ;         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
  • 相关阅读:
    上海汉得面试:
    二叉树的遍历
    操作系统知识总结
    mysql单表查询&&多表查询(职员表14+9)
    数据库查询
    数据库设计三大范式及事务
    某硕笔试题mysql数据库部分(较为全面)
    java 读取excel 将数据插入到数据库
    java 读取excel 正常 xls
    java 读取excel(Map结构)xls
  • 原文地址:https://www.cnblogs.com/buffer/p/1280773.html
Copyright © 2011-2022 走看看