GPS串口数据接收程序实例.docx
《GPS串口数据接收程序实例.docx》由会员分享,可在线阅读,更多相关《GPS串口数据接收程序实例.docx(14页珍藏版)》请在冰豆网上搜索。
![GPS串口数据接收程序实例.docx](https://file1.bdocx.com/fileroot1/2023-6/15/439a8496-c49b-4f31-a5de-8db0c7eebbb5/439a8496-c49b-4f31-a5de-8db0c7eebbb51.gif)
GPS串口数据接收程序实例
GPS串口数据接收程序实例
作者:
天大天财股份有限公司巩志民文章来源:
单片机及嵌入式系统应用
摘要:
目前GPS(全球定位系统)定位应用市场日趋成熟,正在进入应用的高速发展时期。
本文以一款EverMore公司的
GM-X205GPS接受模块为例,介绍了其数据格式,以及应用PIC16F874单片机RS232串口进行数据接收的程序。
1、GPS应用简介
近年来GPS系统,已经在大地测绘、海上渔用、车辆定位监控、建筑、农业等各个领域得到广泛应用。
从九十年代我国引
进GPS定位技术开始,经过十多年的市场培育,GPS定位应用进入了发展的最好时机,未来十年基于GPS的应用将会改变我
们的生活和工作方式。
目前市场上的大部分GPS接受模块都是通过RS232串口与MCU进行数据传输的。
这些数据包括经度、纬度、海拔高度、
时间、卫星使用情况等基本信息。
开发人员再依据这些基本数据,进行数据处理来完成整套的定位系统软件。
2、GM-X205模块数据格式
在进行数据接受编程之前,先介绍一下该模块的数据格式。
它支持NMEA-0183输出格式。
信息如下:
GGA位置测定系统定位资料(GlobalPositioningSystemFixData)
GSV导航卫星资料(GNSSSatellitesinView)
RMC导航卫星特定精简资料(RecommendedMinimumSpecificGNSSData)
VTG方向及速度等相关资料(CourseOverGroundandGroundSpeed
由于文章篇幅问题,笔者在这里只以接收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=未疋位
仁定位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
间:
3点37分44秒
上面例子中,我们可读岀位置信
息:
北
纬2
4度
46.5
241分,西经1
21度0
0.15
36
分
林威治时
3、PIC16F874数据接收程序
笔者在系统中把接收到的数据处理后,显示到图形液晶屏上。
限于篇幅在这里只给岀数据接收部分程序,并且只接收经度和时间信息,并且给岀格林威治时间转换为北京时间的转换函数。
其他数据接收程序类似。
■**********************************************************
THISISAGPSRECEIVERPROGRAM
■**********************************************************
LISTP=16F874
INCLUDEP16F874」NC
■*******
>
^寄存器定■^义********************
TEMP1
EQU0X27
W_TEMPEQU0X54
STATUS_TEMPEQU0X55
LONG1EQU0X40
;LONG1---LONG10经度的10位数据
LONG2EQU0X41
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
GOTOMAIN
ORG
04H;设定按中端健才开始数据接受
NOP
NOP
GOTOINTERRUPT
.*********
J
判断头文件是不是'$GPGGA'**********
IDMESSAGE
BCF
STATUS,RP0
BREAK0
CALL
PAND
MOVWFTEMP1
MOVLW'$';detect$
SUBWFTEMP1,0
BTFSS
STATUS,Z
GOTOBREAK0
CALL
PAND
MOVWF
TEMP1
MOVLW
'G';detectG
SUBWF
TEMP1,0
BTFSS
STATUS,Z
GOTOBREAK0
CALL
PAND
MOVWF
TEMP1
MOVLW
'P';detectP
SUBWF
TEMP1,0
BTFSS
STATUS,Z
GOTOBREAK0
CALL
PAND
MOVWF
TEMP1
MOVLW
'G';detectG
SUBWF
TEMP1,0
BTFSS
STATUS,Z
GOTOBREAK0
CALL
PAND
MOVWF
TEMP1
MOVLW
'G';detectG
SUBWF
TEMP1,0
BTFSS
STATUS,Z
GOTOBREAK0
CALL
PAND
MOVWF
TEMP1
MOVLW
'A';detectA
SUBWF
TEMP1,0
BTFSS
STATUS,Z
GOTOBREAK0
CALL
PAND
;跳过逗号
RETURN
.************
J
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位纬度数据---开始
CALLPAND
CALLPAND
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
.***************
J
串口寄存器中是否数据*****************
PAND
BCFSTATUS,RP0
CCBTFSSPIR1,5
GOTOCC
BCFINTCON,7
;SETGIE=0屏蔽所有中端
MOVF
RCREG,0
RETURN
.*****************
J
中断函数***************************
INTERRUPT
BCFSTATUS,RP0
BCFRCSTA,1
BSFSTATUS,RP0
BCFTXSTA,2
BCFTXSTA,4
MOVLW0X0C
MOVWFSPBRG
BCFSTATUS,RP0
MOVLWB'10010000'
MOVWFRCSTA
BSFSTATUS,RP0
BSFOPTION_REG,6
MOVWFW_TEMP
SWAPFSTATUS,W
BCFSTATUS,RP0
MOVWFSTATUS_TEMP
BCFSTATUS,RP0
CALLIDMESSAGE
CALLRECEIVE
BCFSTATUS,RP0
CLRFRCSTA
CALLCONVERT
OUTBCFSTATUS,RP0
SWAPFSTATUS_TEMP,W
MOVWFSTATUS
SWAPFW_TEMP,F
SWAPFW_TEMP,W
;清除溢出错误位
;BRGH=0Lowspeed
;SetAsynchronousmode
;设置波特率为4800
;串口接收相关设置
;RB0/INT引脚上升沿中断
;清除串口设置
;调用时间转换函数
;跳出中断部分,恢复寄存器
BSFINTCON,7;SETGIE=1允许所有中端
NOP
RETFIE
CONVERT
MOVLW
A'0'
SUBWF
T2,1
SUBWF
T1,1
MOVLW
D'10'
MOVWF
TEMP1
LOOP1MOVFTEMP1,0
MOVF
TEMP1,1
BTFSSSTATUS,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
CON1MOVLWD'20'
MOVWF
TEMP1
SUBWF
T2,0
BTFSSSTATUS,C
GOTO
CON2
MOVWF
T2
MOVLW
0X02
MOVWF
T1
GOTO
HALT1
CON2MOVLWD'10'
MOVWF
TEMP1
SUBWF
T2,0
BTFSSSTATUS,C
GOTOCON3
MOVWFT2
MOVLW
0X01
MOVWF
T1
GOTO
HALT1
CON3MOVLW0X00
MOVWF
T1
HALT1MOVLWA'0'
ADDWFT1,1
ADDWFT2,1
RETURN
ADD10MOVFT1,0
ADDWFT2,1
DECFTEMP1,1
GOTOLOOP1
RETURN;******************MAIN***********************
MAIN
BCFSTATUS,RP0
MOVLWB'10010000'
MOVWFINTCON;打开中断
LOOPNOP
BCFSTATUS,RP0
GOTOLOOP
GOTOMAIN
END