51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机源码 > 详细内容
GPS串口数据接收程序实例
发布时间:2009/7/12  阅读次数:1074  字体大小: 【】 【】【

摘 要:目前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
(注:部份文章为网上收录供大家共同学习参考之用,并不代表本站意见。如存在版权问题请马上通知我们,我们将马上删除。)
我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号