新人一枚,由于某些需要制作这一块的东西,就把自己的理解写在这里,欢迎各位大佬交流。
GPS定位的基本工作原理是:导航卫星上搭载了专用的无线电设备,可向地面用户不断的发射固定频段的无线电信号,用户利用导航接收机收到卫星上的导航信号后,通过时间测距或多普勒测速获得自己相对于卫星的距离参数,并根据卫星发播的轨道、时间参数等信息求得卫星的实时位置,进而解算出自身的地理位置坐标和速度矢量。
卫星星文信息的解算我们大可不必深究,市面上有现成的集成模块可以实现卫星信号的解算输出,并且几乎所有的模块都遵循或至少兼容统一的串口通信协议--NMEA 0183。
多数GPS模块的引脚主要为VCC、GND、TXD、RXD、PPS。其中TXD、RXD为串口通信接口,PPS为秒脉冲输出接口,用于同步授时。模块的串口输出如图所示(可用一个USB转TTL模块将GPS模块和电脑相连,再用串口助手或模块自带的配置软件查看GPS模块串口的输出)
由此可见,GPS模块每秒各输出一次$GPGGA $GPGSA $GPGSV $GPGLL $GPRMC $GPVTG语句,其中最常用的语句为$GPRMC。它的基本格式如下: $GPRMC,(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)*hh(CR)(LF) (1) UTC时间,hhmmss(时分秒) (2) 定位状态,A=有效定位,V=无效定位 (3) 纬度ddmm.mmmmm(度分) (4) 纬度半球N(北半球)或S(南半球) (5) 经度dddmm.mmmmm(度分) (6) 经度半球E(东经)或W(西经) (7) 地面速率(000.0~999.9节) (8) 地面航向(000.0~359.9度,以真北方为参考基准) (9) UTC日期,ddmmyy(日月年) (10)磁偏角(000.0~180.0度,前导位数不足则补0) (11) 磁偏角方向,E(东)或W(西) (12) 模式指示(A=自主定位,D=差分,E=估算,N=数据无效) 可以通过GPS模块的配置软件让模块只输出这一条语句,也可以通过判断第四位的字符是不是"M"从这几条语句中筛选出$GPRMC语句。编程的流程图如下图所示: 这样解码的效率较低,但不影响效果。可以在串口接收中断里定义一个5位的命令类型数组,在中断内就判断命令的类型,这样免去了每条命令都完全接收的麻烦。这里卫星解码过后的定位数据、时间数据可以直接用1602和12864显示。由于我的课设需求是要有一个基于LabView的上位机显示,所以还需要考虑串口被占用的问题。由于还有其他数据需要处理,加之用普通IO口模拟串口输出效率较低需要占用较多资源,所以暂定用三态门拓展串口。以后不定期再更新完善,欢迎各位交流指点。1602和12864显示的代码就添加在附件里了。
V1.0第一次编写
V1.1更改一些外部中断的BUG
V1.2加入UTC时间/日期和北京时间/日期的转换,包括闰年、日/月/年的进位计算
单片机源程序如下:
所有资料51hei提供下载:
51GPS信息获取例程.zip
(372.2 KB, 下载次数: 277)
|