用PIC16F874单片机进行GPS串口数据接收
2012-12-16
标签: PIC 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

;*******寄存器定义 ********************

TEMP1EQU0X27

W_TEMPEQU0X54

STATUS_TEMPEQU 0X55

LONG1EQU0X40;LONG1--- LONG10经度的10位数据

LONG2EQU0X41

LONG3EQU0X42

LONG4EQU0X43

LONG5EQU0X44

LONG6EQU0X45

LONG7EQU0X46

LONG8EQU0X47

LONG9EQU0X48

LONG10EQU0X49

T1EQU0X58;T1---T6时间的6位数据

T2EQU0X59

T3EQU0X60

T4EQU0X61

T5EQU0X62

T6EQU0X63

;********************************************************

ORG00H

NOP

NOP

GOTO MAIN

ORG04H;设定按中端健才开始数据接受

NOP

NOP

GOTO INTERRUPT

;*********判断头文件是不是‘$GPGGA’**********

IDMESSAGE

BCFSTATUS,RP0

BREAK0

CALLPAND

MOVWFTEMP1

MOVLW‘ lsquo;;detect $

SUBWFTEMP1,0

BTFSSSTATUS,Z

GOTOBREAK0

CALLPAND

MOVWFTEMP1

MOVLW‘G‘;detect G

SUBWFTEMP1,0

BTFSSSTATUS,Z

GOTOBREAK0

CALLPAND

MOVWFTEMP1

MOVLW‘P‘;detect P

SUBWFTEMP1,0

BTFSSSTATUS,Z

GOTOBREAK0

CALLPAND

MOVWFTEMP1

MOVLW‘G‘;detect G

SUBWFTEMP1,0

BTFSSSTATUS,Z

GOTOBREAK0

CALLPAND

MOVWFTEMP1

MOVLW‘G‘;detect G

SUBWFTEMP1,0

BTFSSSTATUS,Z

GOTOBREAK0

CALLPAND

MOVWFTEMP1

MOVLW‘A‘;detect A

SUBWFTEMP1,0

BTFSSSTATUS,Z

GOTOBREAK0

CALLPAND;跳过逗号

RETURN

;************接收函数******************

RECEIVE

CALLPAND;开始时间数据接收

MOVWFT1

CALLPAND

MOVWFT2

CALLPAND

MOVWFT3

CALLPAND

MOVWFT4

CALLPAND

MOVWFT5

CALLPAND

MOVWFT6;时间数据接收完成

CALLPAND;跳过逗号

CALLPAND;跳过10位纬度数据---开始

CALLPAND

CALLPAND

CALLPAND

CALLPAND

CALLPAND

CALLPAND

CALLPAND

CALLPAND

CALLPAND;跳过10位纬度数据---结束

CALLPAND;跳过逗号

CALLPAND;跳过南/北纬判断位数据

CALLPAND;跳过逗号

CALLPAND;接受经度信号开始

MOVWFLONG1

CALLPAND

MOVWFLONG2

CALLPAND

MOVWFLONG3

CALLPAND

MOVWFLONG4

CALLPAND

MOVWFLONG5

CALLPAND

MOVWFLONG6

CALLPAND

MOVWFLONG7

CALLPAND

MOVWFLONG8

CALLPAND

MOVWFLONG9

CALLPAND

MOVWFLONG10;接受经度信号结束

RETURN

;***************串口寄存器中是否数据*****************

PAND

BCFSTATUS,RP0

CCBTFSS PIR1,5

GOTO CC

MOVFRCREG,0

RETURN

;*****************中断函数***************************

INTERRUPT

BCF INTCON,7;SET GIE=0屏蔽所有中端

BCFSTATUS,RP0

BCFRCSTA,1;清除溢出错误位

BSFSTATUS,RP0

BCFTXSTA,2;BRGH=0 Low speed

BCFTXSTA,4;Set Asynchronous mode

MOVLW0X0C

MOVWFSPBRG;设置波特率为4800

BCFSTATUS,RP0

MOVLWB‘10010000‘

MOVWFRCSTA;串口接收相关设置

BSFSTATUS,RP0

BSFOPTION_REG,6; RB0/INT 引脚上升沿中断

MOVWF W_TEMP

SWAPF STATUS,W

BCFSTATUS,RP0

MOVWF STATUS_TEMP

BCFSTATUS,RP0

CALLIDMESSAGE

CALLRECEIVE

BCFSTATUS,RP0

CLRFRCSTA;清除串口设置

CALLCONVERT;调用时间转换函数

OUT BCF STATUS,RP0;跳出中断部分,恢复寄存器

SWAPF STATUS_TEMP,W

MOVWF STATUS

SWAPF W_TEMP,F

SWAPF W_TEMP,W

BSFINTCON,7;SET GIE=1允许所有中端

NOP

RETFIE

;************ 格林威治时间转换为北京时间******************

CONVERT

MOVLWA‘0‘

SUBWFT2,1

SUBWFT1,1

MOVLWD‘10‘

MOVWFTEMP1

LOOP1MOVFTEMP1,0

MOVFTEMP1,1

BTFSSSTATUS,Z

GOTOADD10

MOVLWD‘8‘

ADDWFT2,1

MOVLWD‘24‘

SUBWFT2,1

BTFSCSTATUS,C

GOTOCON1

ADDWFT2,1

GOTOCON1

CON1MOVLWD‘20‘

MOVWFTEMP1

SUBWFT2,0

BTFSSSTATUS,C

GOTOCON2

MOVWFT2

MOVLW0X02

MOVWFT1

GOTOHALT1

CON2MOVLWD‘10‘

MOVWFTEMP1

SUBWFT2,0

BTFSSSTATUS,C

GOTOCON3

MOVWFT2

MOVLW0X01

MOVWFT1

GOTOHALT1

CON3MOVLW0X00

MOVWFT1

HALT1MOVLWA‘0‘

ADDWFT1,1

ADDWFT2,1

RETURN

ADD10MOVFT1,0

ADDWFT2,1

DECFTEMP1,1

GOTOLOOP1

RETURN

;******************MAIN***********************

MAIN

BCFSTATUS,RP0

MOVLWB‘10010000‘

MOVWFINTCON;打开中断

LOOP NOP

BCFSTATUS,RP0

GOTOLOOP

GOTO MAIN

END

可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号