找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9958|回复: 3
打印 上一主题 下一主题
收起左侧

NEO-6M GPS模块的使用经验总结

[复制链接]
跳转到指定楼层
楼主
本帖最后由 墨染宸星 于 2019-12-16 21:51 编辑

      最近使用GPS 模块做了一些东西,也遇到了很多问题,在解决之后我整理总结希望能对初学者有帮助。
       我用GPS 模块主要是检测经纬度和本地时间,包括年月日,时分秒。还是很准确的。然后将GPS模块得到的数据可以通过串口发送到串口屏上,也可以发送到LCD屏幕。

1.GPS 模块的到的时间为UTC时间所以需要用函数进行转化为自己所在时区的时间日期。单片机代码如下:

  1. int time[4];          //储存时间  年 月 日 小时
  2. // UTC时间转换为本地时间函数
  3. void UTCTOLocalTime(){
  4.    int year,month,day,hour;
  5.    int lastday = 0;          // 月的最后一天的日期
  6.    int lastlastday = 0;      // 上月的最后一天的日期
  7.    year = gpsx.utc.year;     //已知的UTC时间
  8.    month = gpsx.utc.month;   //已知的UTC时间
  9.    day = gpsx.utc.date;      //已知的UTC时间
  10.    hour = gpsx.utc.hour + 8; //已知的UTC时间+所在的时区,这里选择的是第八时区

  11.     if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12){
  12.         lastday = 31;
  13.         if(month == 3){
  14.             if((year%400 == 0)||(year%4 == 0 && year%100 != 0))//判断是否为闰年,年号能被400整除或年号能被4整除,而不能被100整除为闰年
  15.                 lastlastday = 29;                              // 闰年的2月为29天,平年为28天
  16.             else
  17.                 lastlastday = 28;
  18.         }
  19.         if(month == 8)
  20.             lastlastday = 31;
  21.     }
  22.     else if(month == 4 || month == 6 || month == 9 || month == 11){
  23.         lastday = 30;
  24.         lastlastday = 31;
  25.     }
  26.     else{
  27.         lastlastday = 31;
  28.         if((year%400 == 0)||(year%4 == 0 && year%100 != 0))// 闰年的2月为29天,平年为28天
  29.             lastday = 29;
  30.         else
  31.             lastday = 28;
  32.     }

  33.     if(hour >= 24){// 当算出的区时大于或等于24:00时,应减去24:00,日期加一天
  34.             hour -= 24;
  35.             day += 1;

  36.             if(day > lastday){ // 当算出的日期大于该月最后一天时,应减去该月最后一天的日期,月份加上一个月
  37.                 day -= lastday;
  38.                 month += 1;

  39.                 if(month > 12){// 当算出的月份大于12时,应减去12,年份加上一年
  40.                     month -= 12;
  41.                     year += 1;
  42.                 }
  43.             }
  44.         }
  45.     if(hour < 0){// 当算出的区时为负数时,应加上24:00,日期减一天
  46.             hour += 24;
  47.             day -= 1;
  48.             if(day < 1){ // 当算出的日期为0时,日期变为上一月的最后一天,月份减去一个月
  49.                 day = lastlastday;
  50.                 month -= 1;
  51.                 if(month < 1){ // 当算出的月份为0时,月份变为12月,年份减去一年
  52.                     month = 12;
  53.                     year -= 1;
  54.                 }
  55.             }
  56.         }
  57.    //得到转换后的本地时间
  58.    time[0] = year;
  59.    time[1] = month;
  60.    time[2] = day;
  61.    time[3]= hour;
  62. }

  63. 通过这段代码就可以通过调用time[];数组来调用自己调整过的数据了。


  64. 2,GPS通过LCD屏幕显示,代码如下
  65. //显示GPS定位信息
  66. void Gps_Msg_Show(void)
  67. {
  68.          float tp;                  
  69.         POINT_COLOR=BLUE;           
  70.         tp=gpsx.longitude;           
  71.         sprintf((char *)dtbuf,"Longitude:%.5f %1c   ",tp/=100000,gpsx.ewhemi);        //得到经度字符串
  72.          LCD_ShowString(30,130,200,16,16,dtbuf);                    
  73.         tp=gpsx.latitude;           
  74.         sprintf((char *)dtbuf,"Latitude:%.5f %1c   ",tp/=100000,gpsx.nshemi);        //得到纬度字符串
  75.          LCD_ShowString(30,150,200,16,16,dtbuf);                  
  76.         tp=gpsx.altitude;           
  77.          sprintf((char *)dtbuf,"Altitude:%.1fm     ",tp/=10);                                    //得到高度字符串
  78.          LCD_ShowString(30,170,200,16,16,dtbuf);                                    
  79.         tp=gpsx.speed;           
  80.          sprintf((char *)dtbuf,"Speed:%.3fkm/h     ",tp/=1000);                                    //得到速度字符串         
  81.          LCD_ShowString(30,190,200,16,16,dtbuf);                                             
  82.         if(gpsx.fixmode<=3)                                                                                                                //定位状态
  83.         {  
  84.                 sprintf((char *)dtbuf,"Fix Mode:%s",fixmode_tbl[gpsx.fixmode]);        
  85.                   LCD_ShowString(30,210,200,16,16,dtbuf);                           
  86.         }                    
  87.         sprintf((char *)dtbuf,"Valid satellite:%02d",gpsx.posslnum);                         //用于定位的卫星数
  88.          LCD_ShowString(30,230,200,16,16,dtbuf);            
  89.         sprintf((char *)dtbuf,"Visible satellite:%02d",gpsx.svnum%100);                         //可见卫星数
  90.          LCD_ShowString(30,250,200,16,16,dtbuf);                 
  91.         sprintf((char *)dtbuf,"UTC Date:%04d/%02d/%02d   ",time[0],time[1],time[2]);        //显示UTC日期
  92.         LCD_ShowString(30,270,200,16,16,dtbuf);                    
  93.         sprintf((char *)dtbuf,"UTC Time:%02d:%02d:%02d   ",gpsx.utc.hour+8,gpsx.utc.min,gpsx.utc.sec);        //显示UTC时间
  94.           LCD_ShowString(30,290,200,16,16,dtbuf);                  
  95. }         


  96. 主函数如下
  97. int main(void)
  98. {
  99.          float tp=gpsx.longitude;                  
  100.         float w=gpsx.latitude;
  101.         u16 i,rxlen;
  102.         u16 lenx;
  103.         u8 key=0XFF;
  104.         delay_init();                     //延时函数初始化         
  105.         uart_init(38400);                 //串口初始化为9600
  106.         USART2_Init(38400);        //初始化串口2
  107.         LED_Init();                                //初始化与LED连接的硬件接口
  108.         KEY_Init();                                //初始化与LED连接的硬件接口
  109.         LCD_Init();                                //初始化LCD
  110.          POINT_COLOR=RED;
  111.         LCD_ShowString(30,40,200,16,16,"NE0-6M GPS TEST");                                                                                                           
  112.         if(Ublox_Cfg_Rate(1000,1)!=0)        //设置定位信息更新速度为1000ms,顺便判断GPS模块是否在位.
  113.         {
  114.                    LCD_ShowString(30,120,200,16,16,"NEO-6M Setting...");
  115.                 while((Ublox_Cfg_Rate(1000,1)!=0)&&key)        //持续判断,直到可以检查到NEO-6M,且数据保存成功
  116.                 {
  117.                         USART2_Init(9600);                                //初始化串口2波特率为9600(EEPROM没有保存数据的时候,波特率为9600.)
  118.                           Ublox_Cfg_Prt(38400);                        //重新设置模块的波特率为38400
  119.                         USART2_Init(38400);                                //初始化串口2波特率为38400
  120.                         Ublox_Cfg_Tp(1000000,100000,1);        //设置PPS为1秒钟输出1次,脉冲宽度为100ms            
  121.                         key=Ublox_Cfg_Cfg_Save();                //保存配置  
  122.                 }                                                   
  123.                    LCD_ShowString(30,120,200,16,16,"NEO-6M Set Done!!");
  124.                 delay_ms(500);
  125.                 LCD_Fill(30,120,30+200,120+16,WHITE);//清除显示
  126.         }
  127.         while(1)
  128.         {        
  129.                 UTCTOLocalTime();
  130.                 delay_ms(1);
  131.                 if(USART2_RX_STA&0X8000)                //接收到一次数据了
  132.                 {
  133.                         rxlen=USART2_RX_STA&0X7FFF;        //得到数据长度
  134.                         for(i=0;i<rxlen;i++)USART1_TX_BUF[i]=USART2_RX_BUF[i];           
  135.                          USART2_RX_STA=0;                           //启动下一次接收
  136.                         USART1_TX_BUF[i]=0;                        //自动添加结束符
  137.                         GPS_Analysis(&gpsx,(u8*)USART1_TX_BUF);//分析字符串
  138.                         Gps_Msg_Show();                                //显示信息        
  139.                         printf("Beijing Time:%02d/%02d/%02d %02d:%02d:%02d",time[0],time[1],time[2],time[3],gpsx.utc.min,gpsx.utc.sec);
  140.                         printf("%.5f  %1c %.5f %1c" ,gpsx.latitude/=100000,gpsx.nshemi,gpsx.longitude/=100000,gpsx.ewhemi);
  141.                  }
  142.                 if((lenx%500)==0)LED0=!LED0;                                             
  143.                 lenx++;        
  144.         }                                                                                            
  145. }
复制代码
  
全部资料51hei下载地址:
RCT6NEO-6M GPS.7z (262.02 KB, 下载次数: 104)

IMG_20191216_214701.jpg (1.7 MB, 下载次数: 95)

IMG_20191216_214701.jpg

gps室内屏幕显示.jpg (2.5 MB, 下载次数: 105)

gps室内屏幕显示.jpg

GPS室内串口打印.png (8.09 KB, 下载次数: 123)

GPS室内串口打印.png

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:758657 发表于 2020-5-22 20:14 | 只看该作者
为啥我在室外也全显示0呢
回复

使用道具 举报

板凳
ID:1025296 发表于 2022-5-10 10:12 | 只看该作者
ESP8266怎么连接
回复

使用道具 举报

地板
ID:1025296 发表于 2022-5-11 09:28 | 只看该作者

有ESP8266连接的方法吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表