GPS全球定位

  • 格式:doc
  • 大小:2.86 MB
  • 文档页数:28

GPS全球定位系统1、引言GPS全球导航定位系统越来越多的应用于汽车、手机等领域,是当今信息时代发展中的重要组成部分。

因其具有性能好、精度高、应用广等特点,使其成为了迄今最后的导航定位系统。

本文以凌阳科技有限公司提供的GPS接收模组为例,介绍了GPS的通信协议。

讨论了基于SPCE061A单片机的GPS接收系统设计,提出了对GPS全球定位系统定位信息的接收以及对各定位参数数据的提取方法,并给出了系统的硬件电路及软件流程图。

使用单片机实现该系统,可以很好的掌握单片机的应用,同时学习GPS 定位原理,为以后开发打下基础。

本系统由单片机控制GPS模块较为精确地计算和显示日期、时间、经度、纬度等卫星信息。

该方案十分强调趣味性,配合SPLC501 液晶模组,可以实现地图定位功能,经纬度、时间的显示与播报等功能。

1.1 功能简介本方案可以实现:具有GPS 信号搜索功能;利用SPLC501 液晶模组显示一幅中国地图,当GPS 接收到信号后会显示当前的位置;可以显示、语音播报当前地理位置的经纬度;可以显示、语音播报从GPS 模组接收的标准时间。

1.2 设计意义GPS全球定位可以应用到实际生活的各个方面,利用其基本功能可以扩展其它功能。

可以进行位移测量,通过外扩一个4*4键盘输入目标城市的经纬度,就可以得出当前位置到目标城市的实际位移。

可以为汽车导航,为公共汽车报站等功能。

还可以在地质灾害预警中发挥作用。

1.2 系统组成结构图中为GPS全球定位系统的系统框图,采用SPCE061A作为主控制器,通过串口接收GPS模组发来的卫星消息。

根据消息特定的格式,对其进行解析,最后将解析后的信息用于各种显示。

GPS模组SPCE061A精简开发板SPLC501液晶模组1.4 GPS全球定位系统1.4.1 概述GPS(Global Positioning System-全球定位系统)是美国从本世纪70 年代开始研制,历时20 年,耗资200 亿美元,具有在海、陆、空进行全方位实时三维导航与定位能力的新一代卫星导航与定位系统。

GPS 的主要优点包括:(1)全球,全天候工作:能为用户提供连续,实时的三维位置,三维速度和精密时间。

不受天气的影响。

(2)定位精度高:单机定位精度优于10 米,采用差分定位,精度可达厘米级和毫米级。

(3)功能多,应用广:目前已广泛的应用于大地测量、工程测量、航空摄影测量、运载工具导航和管制、地壳运动监测、工程变形监测、资源勘察、地球动力学等学科领域。

GPS 由三个独立的部分组成:空间部分:21 颗工作卫星,3 颗备用卫星。

地面支撑系统:1 个主控站,3 个注入站,5 个监测站。

用户设备部分:接收GPS 卫星发射信号,以获得必要的导航和定位信息,经数据处理,完成导航和定位工作。

GPS接收机硬件一般由主机、天线和电源组成。

1.4.2 GPS消息格式GPS 以NMEA 协议格式发送消息,要正确解析出信息首先要了解NMEA 协议的格式。

基本NMEA 指令是一个ASCII 字符串,它以’$’字符开始、以<CR><LF>序列结束。

NMEA 标准消息以’GP’开始,然后是三个字符的消息标识码。

消息头和后面的内容通过逗号进行分隔,消息以校检码结束(校检码由一个‘*’和两个16 位的校验字组成。

校验码字段并不用逗号进行分隔。

目前,校验码得到的方式是从‘$’到‘*’之间的字符进行逐位计算。

作为ASCII表示法,每个字段的长度是随着精度的不同而变化的,因此记录的长短是变化的。

这里以$GPRMC为例分校NMEA协议的格式字段格式描述消息标识$GPRMC RMC协议头时间Hhmmss.sss 时间精确到1ms状态Char A:有效V:无效纬度Float 度*100+分N/S Char N:北纬S:南纬经度Float 度*100+分E/W Char E:东经W:西经速度Float 单位:knots(节)地面航向Float 0~359度,以北为参考基准日期Ddmmyy 日月年格式磁偏角Float 0~180度磁偏角方向Char E:东W:西校验码*xx 2digits消息结尾<CR><LF> ASCII,13ASCII,10下面以实际的例子分析NMEA 消息格式$GPRMC, 161229.487, A, 3723.2475, N, 12158.3416, W, 0.13, 309.62, 120598, , *10 从上面的消息可以得到对于消息$GPRMC时间第一个逗号后面161229.487 表示时间为16点12分29.487秒有效位第二个逗号后面A 表示这条消息是有效的纬度第三个逗号后面3723.2475 和N 表示北纬3723.2475经度第五个逗号的12158.3416和E表示东经12158.34162、硬件系统设计SPCE061A开发板2.1 LCD液晶显示1.3 SPLC501液晶模组SPLC501 液晶显示模组为128*64 点阵,面板采用STN(Super Twisted Nematic)超扭曲向列技术制成并且由128 Segment 和64 Common 组成,LCM 非常容易通过接口被访问。

下面为SPLC501 液晶显示模组的基本参数:显示模式黄色模式STN液晶显示格式128*64点阵地图液晶显示输入数据兼容68/80系列MPU数据输入背光黄绿色LED模块尺寸72.8(长)×73.6(宽)×9.5(高)mm视屏尺寸58.84(宽)×35.79(长)mm点大小0.42(宽)×0.51(长)mm像素尺寸0.46(宽)×0.56(长)mm模组上的液晶显示器采用的驱动控制芯片为凌阳科技的SPLC501A 芯片,该芯片为液晶显示控制驱动器,集行、列驱动器和控制器于一体,广泛用于小规模液晶显示模块。

SPLC501A 单芯片液晶驱动,可以直接与其他微控制器接口总线相连。

微控制器可以将显示数据通过8 位数据总线或者串行接口写到SPLC501A 的显存中。

下列是SPLC501A 的特点:◇内置8580 位显示RAM。

RAM 中的一位数据控制液晶屏上的一个象素点的亮、暗状态。

“1”亮“0”暗。

◇具有65 行驱动输出和132 列驱动输出(注:模组中的液晶显示面板仅为64 行、128 列)◇可以直接与80 系列和68 系列微处理器相连。

◇内置晶振电路,也可以外接晶振◇工作温度范围为-40 摄氏度~+85 摄氏度为方便学生进行单片机接口方面的学习专门设计的模块,SPLC501 液晶显示模组可以方便的和61 板连接,可进行字符显示、汉字显示以及图形显示;应用在需要图形、文本显示的系统中。

SPLC501 液晶模组的电路图如图2.7所示图 SPLC501液晶模组SPLC501液晶显示模组引出了时序操作的接口引脚,还引出了对操作时序进行选择的C86和PS 接线。

模组中的接口引脚“+”、“V3”分别为电源输入端和高电平引针(供时序选择跳线用),而“—”、“GND ”都是接地引脚。

模组接口定义表接口引脚名说明 CS1 片选,低电平有效RES 复位脚 A0 数据命令选择脚R/W对于6800系列MPU 的读/写信号(R/W ) 对于8080系列MPU 的写信号(W/R )EP对于6800系列MPU 的时钟信号使能脚(EP )对于8080系列MPU 的读信号(RD )DB08位数据总线DB1 DB2 DB3DB4DB5DB6DB7VR 端口输出电压C86 C86=‘H’选择6800MPU系列C86=‘L’选择8080MPU系列PS 串、并行时序选择SPLC501 液晶模组的实物图如图2.4所示:2.2 GPS模组GPS 模组是一款高性能的GPS(Global Positioning System)信号接收模组,该模组采用APM7101 主芯片,定位精度在10米以内。

它集成了SiRFstarⅢGPS 处理器,LNA 电路,SAW 滤波器,振荡和校准电路,该模组具有以下特性:20 个通道接收弱信号下快速TTFFs(Time to First Fix)两个UART 收发通道接收灵敏度可达-159dBm支持NMEA-0183 和SiRF 协议支持SBAS(WAAS、EGONS)GPS模组电路如图:图GPS模组电路图GPS模组带有一个10针的接口,该接口可以在使用时直接与单片机MCU连接,或者通过RS232转换模块和PC机相连接使用。

通过串口发送或接受数据。

在连接好以后,需要将GPS的短天线接到GPS模组,如果室内信号不好,需要外加长天线。

下表是GPS Module接口定义表:Pin No 功能1 电源,3V~6.5V2 复位信号RST3 备选复位信号4 备选复位信号5 备选复位信号6 备选复位信号7 备选复位信号8 串行数据接收口Rx9 串行数据输出口Tx10 地GPS模组实物图(左侧为天线):2.3 GPS全球定位系统硬件连接图3、系统软件设计3.1 软件构成本系统软件包括下面程序模块:主程序:首先完成硬件模块的初始化,进行键盘扫描,处理键盘信息,再根椐键值跳转到各功能子模块;键盘扫描模块:完成对61 板三个按键的扫描并加入去抖功能;UART 接收模块:完成对UART 接口的初始化,利用中断接收数据;Queue 队列模块:配合UART 中断使用,完成对接收信息的保存与提取;SPLC501 驱动模块:驱动SPLC501 LCD ;GPS 消息解析模块:完成GPS 消息的解析;GPS 各功能子模块:实现地图显示、经纬度显示、日历功能。

语音播报子模块:实现经纬度、时间语音播报3.2 主程序主程序流程如图。

程序运行后首先初始化各个硬件模块,然后程序进入主循环,不断进行按键扫描,根据按键进入相应的功能模块。

开始显示欢迎界面显示中国地图键值获取硬件初始化KEY1按下KEY3按下KEY2按下显示日历显示经纬度键盘扫描YNY YNN图3.2 主程序流程图// 工程名称: GPS_061A// 功能描述: 通过GPS 模块接收到的信息,显示时间,经纬度及在地图上定位当前位置.// 涉及的库: CMacro1016.lib //clib.lib// 组成文件: main.c// china.c china.h DataOSfortLCD.asm SPLC501Driver_IO.asm// gps.c gps.h picture.c picture.h Key.c Key.h// Queue.c uart.c//// 硬件连接: GPS 61板// 电源------------电源// 地------------地// TX------------IOB7// RX------------IOB10// R4------------IOB8//// SPLC501 61板// LCD D0~D7 --- 接IOA8~IOA15// LCD EP ---- 接IOB6// LCD RWP ---- 接IOB5// LCD A0 ---- 接IOB4// LCD /CS1 ---- 接IOB9 或接地也可// IO高电平:3.3V// 维护记录: 2007-08-9 v1.0////========================================================//======================================================== // 文件名称: main.c// 功能描述: GPS定位// 维护记录: 2007-08-9 v1.0//======================================================== #include "spce061a.h"#include "UART.h"#include "gps.h"#include "china.h"#include "Key.h"#include "./c501/SPLC501User.h"#include "picture.h"#define SIZE 16//======================================================== // 语法格式: int CPU_Init(void)// 实现功能:初始化CPU时钟49MHz// 参数:无// 返回值:0//========================================================int Init_CPU(){*P_SystemClock = C_Fosc_49M | C_Fosc;// 设置系统时钟与CPU时钟全为49MHz*P_INT_Ctrl_New = *P_INT_Ctrl_New | C_IRQ5_2Hz | C_IRQ5_4Hz ; // 打开2Hz中断用于滚动显示信息.return 0;}//======================================================== // 语法格式: void Open_IRQ_2Hz()// 实现功能:打开2Hz中断// 参数:无// 返回值:无//========================================================void Open_IRQ_2Hz(){*P_INT_Ctrl_New |= C_IRQ5_2Hz ;// 打开2Hz中断用于滚动显示信息.}//======================================================== // 语法格式: void Close_IRQ_2Hz()// 实现功能:关闭2Hz中断// 参数:无// 返回值:无//========================================================void Close_IRQ_2Hz(){*P_INT_Ctrl_New &= ~ C_IRQ5_2Hz ;// 打开2Hz中断用于滚动显示信息.}//======================================================== // 语法格式: int main(void)// 实现功能: GPS定位// 参数:无// 返回值:无//========================================================int main(){int Key;unsigned int i;Init_CPU();Init_Key();Init_UART();Init_GPS();// LCD501_Init(5);// LCD501_ClrScreen(0);// LCD501_SetPaintMode(PAINT_COVER);for(i = 0xf;i > 0;i --) // 凌阳科技DEMO,仅供演示{*P_Watchdog_Clear=1;LCD501_Bitmap(1 * SIZE, 1 * SIZE,encoding_23); // 演LCD501_Bitmap(2 * SIZE, 1 * SIZE,encoding_24); // 示LCD501_Bitmap(3 * SIZE, 1 * SIZE,encoding_25); // 程LCD501_Bitmap(4 * SIZE, 1 * SIZE,encoding_26); // 序LCD501_Bitmap(5 * SIZE, 1 * SIZE,encoding_27); // 严LCD501_Bitmap(6 * SIZE, 1 * SIZE,encoding_28); // 禁LCD501_Bitmap(1 * SIZE, 2 * SIZE,encoding_29); // 用LCD501_Bitmap(2 * SIZE, 2 * SIZE,encoding_2a); // 于LCD501_Bitmap(3 * SIZE, 2 * SIZE,encoding_2b); // 毕LCD501_Bitmap(4 * SIZE, 2 * SIZE,encoding_2c); // 业LCD501_Bitmap(5 * SIZE, 2 * SIZE,encoding_2d); // 设LCD501_Bitmap(6 * SIZE, 2 * SIZE,encoding_2e); // 计}LCD501_ClrScreen(0);*P_Watchdog_Clear = 1;LCD501_Bitmap(2 * SIZE, 1 * SIZE,encoding_10); // 凌LCD501_Bitmap(3 * SIZE, 1 * SIZE,encoding_11); // 阳LCD501_Bitmap(4 * SIZE, 1 * SIZE,encoding_12); // 科LCD501_Bitmap(5 * SIZE, 1 * SIZE,encoding_13); // 技LCD501_Bitmap(0.5 * SIZE, 2 * SIZE,encoding_14); // GLCD501_Bitmap(1.5 * SIZE, 2 * SIZE,encoding_15); // PLCD501_Bitmap(2.5 * SIZE, 2 * SIZE,encoding_16); // SLCD501_Bitmap(3.5 * SIZE, 2 * SIZE,encoding_17); // 定LCD501_Bitmap(4.5 * SIZE, 2 * SIZE,encoding_18); // 位LCD501_Bitmap(5.5 * SIZE, 2 * SIZE,encoding_19); // 系LCD501_Bitmap(6.5 * SIZE, 2 * SIZE,encoding_1a); // 统while(1){Key=Key_GetValue();switch(Key){case C_KEY2 :Close_IRQ_2Hz(); // 关闭2Hz中断,在显示地图时并不显示流动信息.Show_Map();Open_IRQ_2Hz();*P_Watchdog_Clear = 1;LCD501_Bitmap(2 * SIZE, 1 * SIZE,encoding_10); // 凌LCD501_Bitmap(3 * SIZE, 1 * SIZE,encoding_11); // 阳LCD501_Bitmap(4 * SIZE, 1 * SIZE,encoding_12); // 科LCD501_Bitmap(5 * SIZE, 1 * SIZE,encoding_13); // 技LCD501_Bitmap(0.5 * SIZE, 2 * SIZE,encoding_14); // GLCD501_Bitmap(1.5 * SIZE, 2 * SIZE,encoding_15); // PLCD501_Bitmap(2.5 * SIZE, 2 * SIZE,encoding_16); // SLCD501_Bitmap(3.5 * SIZE, 2 * SIZE,encoding_17); // 定LCD501_Bitmap(4.5 * SIZE, 2 * SIZE,encoding_18); // 位LCD501_Bitmap(5.5 * SIZE, 2 * SIZE,encoding_19); // 系LCD501_Bitmap(6.5 * SIZE, 2 * SIZE,encoding_1a); // 统break;case C_KEY1:Show_Num();*P_Watchdog_Clear = 1;LCD501_Bitmap(2 * SIZE, 1 * SIZE,encoding_10); // 凌LCD501_Bitmap(3 * SIZE, 1 * SIZE,encoding_11); // 阳LCD501_Bitmap(4 * SIZE, 1 * SIZE,encoding_12); // 科LCD501_Bitmap(5 * SIZE, 1 * SIZE,encoding_13); // 技LCD501_Bitmap(0.5 * SIZE, 2 * SIZE,encoding_14); // GLCD501_Bitmap(1.5 * SIZE, 2 * SIZE,encoding_15); // PLCD501_Bitmap(2.5 * SIZE, 2 * SIZE,encoding_16); // SLCD501_Bitmap(3.5 * SIZE, 2 * SIZE,encoding_17); // 定LCD501_Bitmap(4.5 * SIZE, 2 * SIZE,encoding_18); // 位LCD501_Bitmap(5.5 * SIZE, 2 * SIZE,encoding_19); // 系LCD501_Bitmap(6.5 * SIZE, 2 * SIZE,encoding_1a); // 统break;case C_KEY3:Show_Time();*P_Watchdog_Clear = 1;LCD501_Bitmap(2 * SIZE, 1 * SIZE,encoding_10); // 凌LCD501_Bitmap(3 * SIZE, 1 * SIZE,encoding_11); // 阳LCD501_Bitmap(4 * SIZE, 1 * SIZE,encoding_12); // 科LCD501_Bitmap(5 * SIZE, 1 * SIZE,encoding_13); // 技LCD501_Bitmap(0.5 * SIZE, 2 * SIZE,encoding_14); // GLCD501_Bitmap(1.5 * SIZE, 2 * SIZE,encoding_15); // PLCD501_Bitmap(2.5 * SIZE, 2 * SIZE,encoding_16); // SLCD501_Bitmap(3.5 * SIZE, 2 * SIZE,encoding_17); // 定LCD501_Bitmap(4.5 * SIZE, 2 * SIZE,encoding_18); // 位LCD501_Bitmap(5.5 * SIZE, 2 * SIZE,encoding_19); // 系LCD501_Bitmap(6.5 * SIZE, 2 * SIZE,encoding_1a); // 统break;}*P_Watchdog_Clear = 1;}}3.3 键盘扫描模块键盘扫描模块提供如下三个API 函数供用户使用。