1、GPS 串口数据接收程序实例 作者:天大天财股份有限公司 巩志民 文章来源:单片机及嵌入式系统应用 摘 要 :目前 GPS(全球定位系统)定位应用市场日趋成熟,正在进入应用的高速发展时期。本文以一款 EverMore 公司的 GM-X205GPS接受模块为例,介绍了其数据格式,以及应用 PIC16F874 单片机 RS232 串口进行数据接收的程序。 1、 GPS 应用简介 近年来 GPS系统,已经在大地测绘、海上渔用、车辆定位监控、建筑、农业等各个领域得到广泛应用。从九十年代我国引进GPS定位技术开始,经 过十多年的市场培育, GPS定位应用进入了发展的最好时机,未来十年基于 GPS的应用将
2、会改变我们的生活和工作方式。 目前市场上的大部分 GPS接受模块都是通过 RS232 串口与 MCU 进行数据传输的。这些数据包括经度、纬度、海拔高度、时间、卫星使用情况等基本信息。开发人员再依据这些基本数据,进行数据处理来完成整套的定位系统软件。 2、 GM-X205 模块数据格式 在进行数据接受编程之前,先介绍一下该模块的数据格式。它支持 NMEA-0183 输出格式。信息如下: GGA 位置测定系统定位资 料( Global Positioning System Fix Data) GSV 导航卫星资料( GNSS Satellites in View) RMC 导航卫星特定精简资料(
3、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 协议
4、开始 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 数据微分 本模块中不可用
5、 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 ;*寄存
6、器定义 * 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
7、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
8、 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 SUBW
9、F 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 P
10、AND 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 LON
11、G8 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 Asynchro
12、nous mode MOVLW 0X0C MOVWF SPBRG ;设置波特率为 4800 BCF STATUS,RP0 MOVLW B10010000 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
13、;调用时间转换函数 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 A0 SUBWF T2,1 SUBWF T1,1 MOVLW D10 MOVWF TEMP1 LOOP1 MOVF TEMP1,0 MOVF TEMP1,1 BTFSS STATUS,Z GOTO ADD10 MOVLW D8 ADDWF
14、 T2,1 MOVLW D24 SUBWF T2,1 BTFSC STATUS,C GOTO CON1 ADDWF T2,1 GOTO CON1 CON1 MOVLW D20 MOVWF TEMP1 SUBWF T2,0 BTFSS STATUS,C GOTO CON2 MOVWF T2 MOVLW 0X02 MOVWF T1 GOTO HALT1 CON2 MOVLW D10 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 A0 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 B10010000 MOVWF INTCON ;打开中断 LOOP NOP BCF STATUS,RP0 GOTO LOOP GOTO MAIN END