用单片机处理GPS数据---程序实例
- 格式:pdf
- 大小:408.72 KB
- 文档页数:17
GPS自动授时数码管显示程序#include "reg52.h"#define LEDPORT P0sbit D1=P3^4;sbit D2=P3^5;sbit D3=P3^6;sbit D4=P3^7;sbit LED=P2^5;sbit CLK=P2^1;sbit IO=P2^2;sbit RST=P2^3;sbit ACC0=ACC^0;sbit ACC7=ACC^7;unsigned char flash;unsigned char dp=0xff;bit rev_start,rev_stop;unsigned char code tab[]={0xA0,0xBE,0x64,0x2C,0x3A,0x29,0x21,0xBC,0x20,0x28,0xff };//数码管码表unsigned char buf[80]; //请把GPS那货发来的数据放到我的肚子里void TimerInit(){TMOD=0x21;TH0 = 0xF1; //4ms左右TL0 = 0x9A;EA=1;ET0=1;TR0=1;SCON = 0x50; //使用串行工作方式1,10位异步收发8位数据,波特率可变(由T1的溢出率控制)TH1 = 0xFD; //9600波特率的初值TL1 = TH1; //9600波特率的初值ES = 1;TR1 = 1;}void inputbyte(unsigned char ucDa){unsigned char i;ACC = ucDa;for(i=8; i>0; i--){IO = ACC0; //相当于汇编中的RRCCLK = 1;CLK = 0;ACC = ACC >> 1;}}unsigned char outputbyte(void){unsigned char i;for(i=8; i>0; i--){ACC = ACC >>1; //相当于汇编中的RRCACC7 = IO;CLK = 1;CLK = 0;}return(ACC);}/************************************************************** ******** 名称: v_W1302* 说明: 先写地址,后写命令/数据* 功能: 往DS1302写入数据* 调用: v_RTinputbyte()* 输入: ucAddr: DS1302地址, ucDa: 要写的数据* 返回值: 无*************************************************************** ********/ void write(unsigned char ucAddr, unsigned char ucDa) {RST = 0;CLK = 0;RST = 1;inputbyte(ucAddr); //地址,命令inputbyte(ucDa); //写1Byte数据CLK = 1;RST =0;}/************************************************************** ******** 名称: uc_R1302* 说明: 先写地址,后读命令/数据* 功能: 读取DS1302某地址的数据* 调用: v_RTinputbyte() , uc_RToutputbyte()* 输入: ucAddr: DS1302地址* 返回值: ucDa :读取的数据*************************************************************** ********/ unsigned char read(unsigned char ucAddr) {unsigned char ucDa;RST = 0;CLK = 0;RST = 1;inputbyte(ucAddr); //地址,命令ucDa = outputbyte(); //读1Byte数据CLK = 1;RST =0;return(ucDa);}void DS1302_init(){if(read(0xc1)!=0x82) //如果1302掉电,写入下面的初始值{write(0x8e,0x00);//关闭写保护write(0x80,0x00); //设置秒write(0x82,0x00);//设置分钟write(0x84,0x00); // 小时write(0x90,0xa5);//涓流充电write(0xc0,0x81);//掉电标志位}}void Display(unsigned char hour,min) //数码管显示{static unsigned char i;LEDPORT=0xff;switch (i){case 0: if(hour/16) LEDPORT=tab[hour/16]&dp else LEDPORT=tab[10]&dpD1=0;D2=D3=D4=1; break;case 1: LEDPORT=tab[hour%16]; D2=0;D1=D3=D4=1; break;case 2: LEDPORT=tab[min/16]; D3=0;D1=D2=D4=1; break;case 3: LEDPORT=tab[min%16]; D4=0;D2=D3=D1=1; break;}i++;if(i==4)i=0;}void main(){unsigned char hour,min,sec;TimerInit();DS1302_init();while(1){if((rev_stop==1)&&(buf[5]=='C'))//如果接收到GPRMC{ES=0;if(buf[18]=='A')//如果GPS成功定位{dp=0xdf; //点亮第一位数码管的小数点hour= (buf [7]-0x30)* 16+ buf[8] -0x30;min= (buf [9]-0x30)* 16+ buf[10]-0x30;sec= (buf[11]-0x30)* 16+ buf[12]-0x30;hour= hour / 16 * 10 + hour % 16;hour= (hour+8) % 24; //UTC Time换算成北京时间hour=hour/10*16+hour%10;if(sec!=read(0x81)||min!=read(0x83)||hour!=read(0x85))//如果GPS标准时间与DS1302不同就修正{write(0x84,hour);write(0x82,min);write(0x80,sec);}}elsedp=0xff; //如果不能成功定位,就把第一位数码管的小数点干掉ES=1;rev_stop=0;}if(flash>=250) {flash=0; LED=!LED; } //亲,您要不停的按电灯开关,1秒钟1次哦!}}void Timer0() interrupt 1{TH0 = 0xF1;TL0 = 0x9A;Display(read(0x85),read(0x83));//定时器兄弟简单而单调的工作,很轻松的。
车辆实时定位方案随着物联网技术的发展, 实时定位系统广泛应用于车辆管理、路况监控、紧急救援等领域。
本文将介绍一种车辆实时定位的方案,详细说明其设计过程、原理以及实现方法。
方案概述本方案采用GPS定位技术,结合GPRS/4G网络通信,实现车辆的实时定位。
具体实现流程如下:1.车辆装有GPS设备,以及SIM卡。
2.GPS设备获取车辆的位置信息,并通过GPRS/4G网络上传至服务器。
3.服务器接收到GPS数据后,进行解析和计算,得到车辆的实时位置。
4.用户通过Web或移动端的应用程序,查询车辆的位置信息。
设计原理GPS定位技术是本方案的核心。
GPS(Global Positioning System) 全球卫星定位系统,是一种卫星导航系统,由美国政府运营。
该系统由一组卫星、地面控制站以及用户接收设备组成。
通过GPS设备接收到卫星发射的位置信号,就能够确定设备的位置。
GPS定位的优点是定位精度高、覆盖面广,可以全球范围内进行位置定位。
本方案采用GPS模块与单片机相结合的硬件设计,用MCU(Micro Control Unit)来采集GPS数据。
MCU通过串口中断方式接收GPS发送的NMEA协议格式数据,并通过GPRS/4G网络上传到云服务器。
服务器解析接收到的GPS数据,并得到了定位信息,即车辆的实时位置。
实现方法硬件部分1.GPS模块:采用U-blox公司的GPS模块进行定位。
2.单片机:采用STM32F103C8T6单片机进行数据采集。
3.SIM卡:使用3G/4G通信模块,需要插入支持GPRS/4G通信的SIM卡。
4.电源:使用汽车电瓶或者另加电源模块进行供电。
软件部分1.GPS模块驱动程序:根据U-blox公司提供的硬件接口手册来编写GPS模块的驱动程序。
2.数据上传程序:将GPS数据通过GPRS/4G网络上传至服务器。
3.服务器数据解析程序:解析上传的GPS数据,并把解析的数据存储在数据库中。
4.用户查询程序:Web或移动端应用程序,用于查询车辆的位置信息。
GPS卫星位置的计算利用C++编写了一段能计算单一瞬时卫星坐标的程序,在运行程序之前,需做部分准备工作:(1)在F盘下建立一名为“单一卫星广播星历”的txt文件。
(2)从“广播星历.txt”文件中拷贝从卫星PRN号开始的8行数据到“单一卫星广播星历.txt”中(3)在编辑选项中,将全部的“D”替换为“E”。
下面为我所选取的一个广播星历:18 06 8 25 6 0 0.0-2.472363412380E-04-1.023*********E-12 0.000000000000E+001.410000000000E+02-1.721875000000E+01 4.502687555010E-09 1.413760604187E+00-7.990747690201E-07 7.598234573379E-03 1.118145883083E-05 5.153709835052E+034.536000000000E+05-1.303851604462E-08-1.095067942661E-01 1.527369022369E-079.571235745530E-01 1.640000000000E+02-2.656176299285E+00-8.0374********E-09-5.193073455211E-10 1.000000000000E+00 1.389000000000E+03 0.000000000000E+002.000000000000E+00 0.000000000000E+00-1.024*********E-08 1.410000000000E+024.464490000000E+05 4.000000000000E+00程序设计部分:#include<stdio.h>#include<math.h>int main(){int i = 0;double n[50], n0, nn, t, tk, Mk, Ek, Vk, Yk, Gu, Gr, Gi, uk, rk, ik, xk, yk, zk, X, Y, Z, Lk, UT, yy, mm, JD, gpsz;FILE *fp;fp = fopen("F:\\单一卫星广播星历.txt", "r");if (fp == NULL){printf ("文件打开失败!\n");return 0;}while (! feof (fp)){fscanf(fp, "%lf", &n[i]);i++;}n0 = (sqrt(3986005E+8))/pow(n[17], 3);nn = n0 + n[12];/*计算卫星运行的平均角速度*/UT = n[4] + (n[5] / 60) + (n[7] / 3600);/*民用日的时分秒化为实数时*/if (n[1] >= 80)/*广播星历中年只有后两位,化为4位,参考1980年1月6日0点*/ {if (n[1] == 80 && n[2] == 1 && n[3] < 6){n[1] = n[1] + 2000;}n[1] = n[1] + 1900;}else{n[1] = n[1] + 2000;}if (n[2] <= 2){yy = n[1] - 1;mm = n[2] + 12;}if (n[2] > 2){yy = n[1];mm = n[2];}JD = (int)(365.25 * yy) + (int)(30.6001 * (mm + 1)) + n[3] + (UT / 24) + 1720981.5;/*化为儒略日*/gpsz = (int)((JD - 2444244.5) / 7);/*计算GPS周*/t = (JD - 2444244.5 - 7 * gpsz) * 24 * 3600;/*得出GPS秒*/tk = t - n[18];/*tk1为中间值,用以判断tk与正负302400的关系,然后返回到tk上*/ while (tk > 302400 || tk < -302400){if (tk > 302400){tk = tk - 604800;}else{tk = tk + 604800;}}/*计算归化观测时间*/Mk = n[13] + nn * tk;/*观测时刻的卫星平近点角*/Ek = Mk;Ek = Mk + n[15] * sin(Ek);Ek = Mk + n[15] * sin(Ek);/*迭代两次计算观测时刻的偏近点角*/Vk = atan(sqrt(1 - n[15] * n[15]) * sin(Ek)) / (cos(Ek) - n[15]);/*真近点角*/Yk = Vk + n[24];/*升交距角*/Gu = n[14] * cos(2 * Yk) + n[16] * sin(2 * Yk);Gr = n[23] * cos(2 * Yk) + n[11] * sin(2 * Yk);Gi = n[19] * cos(2 * Yk) + n[21] * sin(2 * Yk);/*摄动改正项*/uk = Yk + Gu;rk = n[17] * n[17] * (1 - n[15] * cos(Ek)) + Gr;ik = n[22] + Gi + n[26] * tk;/*经摄动改正后的升交距角、卫星矢径、轨道倾角*/xk = rk * cos(uk);yk = rk * sin(uk);zk = 0;/*卫星在轨道坐标系的坐标*/Lk = n[20] + (n[25] - 7.29211515E-5) * tk - 7.29211515E-5 * n[18];/*观测时刻t的升交点经度*/X = xk * cos(Lk) - yk * cos(ik) * sin(Lk);Y = xk * sin(Lk) + yk * cos(ik) * cos(Lk);Z = yk * sin(ik);/*卫星在WGS-84坐标系的坐标*/printf("该卫星在WGS-84坐标系中的坐标为:\nX = %lf m\nY = %lf m\nZ = %lf m\n", X, Y, Z);fclose(fp);return 0;}计算结果:该卫星在WGS-84坐标系中的坐标为:X = 9223153.692525 mY = 24133486.931401 mZ = 6032585.919385 m。
如何使用gps模块?从头到尾,详细讲解和程序说明GPS 模块是全球定位系统的一种实现方式,是一种位置信息获取的设备。
GPS 模块通过透过设备信号,可将设备所在的位置、速度和时间等信息准确传达给用户。
GPS 模块的使用主要包括以下几个步骤:1. 确认 GPS 模块和设备连接正常在开始使用 GPS 模块前,需要先确认 GPS 模块和设备之间的连接是否稳定。
这一步需要确认各种接口是否正确连接并且是否适合使用。
2. 配置 GPS 模块GPS 模块需要进行配置后才能正常使用,因为不同的模块具有不同的协议,所以需要根据模块的使用手册进行配置。
配置可以通过串口通信实现,用户需要根据模块的指令手册完成配置。
3. 获取位置信息当 GPS 模块已经连接并且配置完成后,就可以开始获取位置信息了。
使用 GPS 模块的淘宝例程来获取经度和纬度:```arduino#include <TinyGPS++.h> // 导入 TinyGPS++ 的库TinyGPSPlus gps;void loop() {while (Serial.available()) {gps.encode(Serial.read());}if (gps.location.isUpdated()) { // 检测是否更新Serial.print("Latitude= ");Serial.print(t(), 6);Serial.print(" Longitude= ");Serial.println(gps.location.lng(), 6);}delay(1000);}```上述程序首先导入 TinyGPS++ 的库,然后初始化 TinyGPSPlus 对象。
在主循环中,使用 `Serial.available()` 检测串口是否有数据,然后调用 `gps.encode()` 来解码接收到的数据。
简述gps数据处理基本流程和步骤GPS(全球定位系统)数据处理是将采集到的GPS信息进行处理和分析,从而得出有用的信息和结果的过程。
GPS数据处理基本流程可以分为数据采集、数据预处理、数据分析和结果展示四个步骤。
下面将分别介绍这四个步骤的具体内容。
首先是数据采集阶段。
GPS数据的采集是通过GPS接收器获得,GPS接收器可以测量卫星信号和计算位置、速度、时间、姿态等信息。
GPS接收器具有天线接收GPS信号,接收到的信号包括卫星信号和地面干扰信号,卫星信号是由美国国家航空航天局的卫星发出的,地面干扰信号则是由城市的建筑物、树木等形成的。
接收到的信号会被GPS 接收器搜集并保存下来,形成GPS原始数据。
接着是数据预处理阶段。
在数据预处理阶段,需要对采集到的GPS 原始数据进行清洗和筛选。
清洗就是对数据进行去噪声,去除异常值等处理,保证数据的准确性和可靠性。
筛选则是对数据进行筛选,选择需要的数据进行后续处理。
此外,还需要对数据进行校正,如时钟误差校正、电离层延迟校正等,保证数据的精度和稳定性。
然后是数据分析阶段。
数据分析是对预处理过的GPS数据进行处理和分析,从中提取有用的信息。
主要包括轨迹重建、速度计算、加速度计算、路网匹配等过程。
轨迹重建是将GPS数据点连接成轨迹,并对轨迹进行分段处理。
速度计算是根据轨迹数据计算车辆的速度,加速度计算是根据速度数据计算车辆的加速度。
路网匹配是将轨迹数据匹配到实际的道路上,得到车辆在道路上的行驶轨迹。
最后是结果展示阶段。
在结果展示阶段,将数据分析得到的结果以可视化的方式展示出来,使用户能够直观地了解分析结果。
主要包括轨迹图、速度图、加速度图、轨迹匹配图等展示方式。
公路交通部门可以通过这些展示结果了解车辆的行驶轨迹、行驶速度和行驶状态,为交通管理和规划提供有力的数据支持。
综上所述,GPS数据处理的基本流程包括数据采集、数据预处理、数据分析和结果展示四个步骤。
在实际应用中,每个步骤都需要仔细处理和精心设计,才能得到准确、可靠的分析结果。
基于单片机的GPS接收机设计作者:陈铁来源:《消费电子·理论版》2013年第08期摘要:采用单片机实现GPS接收机方案,实现了数据的接收、处理和液晶显示,给出了系统实现原理图和程序流程图,对原理做了详细说明。
关键词:GPS;16450;液晶显示中图分类号:TN85 文献标识码:A 文章编号:1674-7712 (2013) 16-0000-02全球定位系统(Global Positioning System,GPS)是美国从20世纪70年代开始研制,于1994年全面建成,以接收导航卫星信号为基础的非自主式导航与定位系统。
它以全球覆盖、全天候、连续实时提供高精度的三维位置、三维速度和时间信息的能力,很好地解决了人类导航和定位问题。
随着全球定位系统的不断改进,软硬件的不断完善,应用领域正在不断的开拓,无论在军事还是民用领域都得到广泛地应用和发展。
实际应用中,GPS接收机收到轨道卫星的信号后,经过解调输出的,是标准格式的GPS定位数据,该数据必须经过进一步处理,才能在用户数据终端上显示。
一、接收机硬件设计系统采用AT89S51单片机作微控制器,用GPS_GB10接收模块接收轨道卫星的信号,经GPS信号处理后用16450进行串并转换,通过数据总线传给CPU,再经8255发送给LCD显示,系统结构如图1所示。
(一)控制单元由于单片机芯片数据存储容量不足,用6264扩展8K外部数据存储单元来临时存储接收的GPS数据,用74LS138译码器产生GPS与液晶的片选信号,同时用74LS373对数据进行锁存,以实现单片机P0口的数据地址复用。
原理图如图2所示。
(二)GPS数据接收部分GPS模块GB10接收多颗卫星的定位信息,进行处理后按一定的格式输出串行数据,16450实现串并转换,通过总线与单片机通信。
GPS接收模块默认设置输出为:(三)液晶显示液晶显示部分采用OCMJ2*8A汉字图形液晶显示模块,用并行总线方式通过8255与单片机连接,显示速度较快。
基于PIC单片机和GPS接收模块的手持式GPS定位系统1 引言GPS以其高精度,全天候,全球覆盖,方便灵活和优质价廉吸引全世界许多用户。
GPS 的广泛应用改变了人们的工作方式,提高工作效率,带来巨大的经济效益。
这里提出一种基于EM411GPS接收模块和PIC18F2550单片机的手持式GPS定位系统设计方案。
该系统采用点阵字符液晶屏显示接收GPS卫星数据,并用SD卡记录所接收到的GPS信息,从而实现GPS数据导入电子地图。
2 NEMA协议简介目前,GPS采用NMEA-0183协议做为发送和接收数据的标准,NMEA-0183是美国国家海洋电子协会(NationalMarine ElectroNIcs Association)为统一海洋导航规范而制定的标准,该格式标准已成为国际通用的一种格式,协议内容在兼容NMEA-180和NMEA-0182的基础上。
增加了GPS、测深仪、罗经方位系统等多种设备接口和通讯协议定义,同时还允许一些特定厂商对其设备通信自定协议。
NMEA-0183格式数据串的所有数据都采用ASCⅡ文本字符表示,数据传输以“$”开头,后面是语句头。
语句头由5个字母组成。
其前2个字母表示“系统ID”,即表示该语句是属于何种系统或设备,例如GP表示该语句属于GPS 定位系统,HC表示该语句属于罗经方位系统; 后3个字母表示“语句ID“,表示该语句是关于何方面的数据。
语句头后是数据体,包含不同的数据体字段,语句末尾为校验码(可选),以回车换行符《CR》《LF》结束,也就是ACSII字符“回车”(十六进制的0D)和“换行”(十六进制的0A)。
数据字段以逗号分隔识别,空字段保留逗号。
在GPS系统中常用语句有GPGGA(GPS定位信息),GPGSA(当前卫星信息),GPGSV(可见卫星信息),GPRMC (推荐定位信息),GPGLL(定位地理信息),GPVTG(地面速度信息)等。
GPS数据传输是以标准异步串行方式发送,其串行通信波特率为4 800 b/s、数据位8位、停止位1位、无奇偶校验位。