找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10945|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

NEO-6M GPS模塊的使用經(jīng)驗總結(jié)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:640743 發(fā)表于 2019-12-15 23:07 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 墨染宸星 于 2019-12-16 21:51 編輯

      最近使用GPS 模塊做了一些東西,也遇到了很多問題,在解決之后我整理總結(jié)希望能對初學(xué)者有幫助。
       我用GPS 模塊主要是檢測經(jīng)緯度和本地時間,包括年月日,時分秒。還是很準確的。然后將GPS模塊得到的數(shù)據(jù)可以通過串口發(fā)送到串口屏上,也可以發(fā)送到LCD屏幕。

1.GPS 模塊的到的時間為UTC時間所以需要用函數(shù)進行轉(zhuǎn)化為自己所在時區(qū)的時間日期。單片機代碼如下:

  1. int time[4];          //儲存時間  年 月 日 小時
  2. // UTC時間轉(zhuǎn)換為本地時間函數(shù)
  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時間+所在的時區(qū),這里選擇的是第八時區(qū)

  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){// 當算出的區(qū)時大于或等于24:00時,應(yīng)減去24:00,日期加一天
  34.             hour -= 24;
  35.             day += 1;

  36.             if(day > lastday){ // 當算出的日期大于該月最后一天時,應(yīng)減去該月最后一天的日期,月份加上一個月
  37.                 day -= lastday;
  38.                 month += 1;

  39.                 if(month > 12){// 當算出的月份大于12時,應(yīng)減去12,年份加上一年
  40.                     month -= 12;
  41.                     year += 1;
  42.                 }
  43.             }
  44.         }
  45.     if(hour < 0){// 當算出的區(qū)時為負數(shù)時,應(yīng)加上24:00,日期減一天
  46.             hour += 24;
  47.             day -= 1;
  48.             if(day < 1){ // 當算出的日期為0時,日期變?yōu)樯弦辉碌淖詈笠惶�,月份減去一個月
  49.                 day = lastlastday;
  50.                 month -= 1;
  51.                 if(month < 1){ // 當算出的月份為0時,月份變?yōu)?2月,年份減去一年
  52.                     month = 12;
  53.                     year -= 1;
  54.                 }
  55.             }
  56.         }
  57.    //得到轉(zhuǎn)換后的本地時間
  58.    time[0] = year;
  59.    time[1] = month;
  60.    time[2] = day;
  61.    time[3]= hour;
  62. }

  63. 通過這段代碼就可以通過調(diào)用time[];數(shù)組來調(diào)用自己調(diào)整過的數(shù)據(jù)了。


  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);        //得到經(jīng)度字符串
  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)                                                                                                                //定位狀態(tài)
  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);                         //用于定位的衛(wèi)星數(shù)
  88.          LCD_ShowString(30,230,200,16,16,dtbuf);            
  89.         sprintf((char *)dtbuf,"Visible satellite:%02d",gpsx.svnum%100);                         //可見衛(wèi)星數(shù)
  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. 主函數(shù)如下
  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();                     //延時函數(shù)初始化         
  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)        //設(shè)置定位信息更新速度為1000ms,順便判斷GPS模塊是否在位.
  113.         {
  114.                    LCD_ShowString(30,120,200,16,16,"NEO-6M Setting...");
  115.                 while((Ublox_Cfg_Rate(1000,1)!=0)&&key)        //持續(xù)判斷,直到可以檢查到NEO-6M,且數(shù)據(jù)保存成功
  116.                 {
  117.                         USART2_Init(9600);                                //初始化串口2波特率為9600(EEPROM沒有保存數(shù)據(jù)的時候,波特率為9600.)
  118.                           Ublox_Cfg_Prt(38400);                        //重新設(shè)置模塊的波特率為38400
  119.                         USART2_Init(38400);                                //初始化串口2波特率為38400
  120.                         Ublox_Cfg_Tp(1000000,100000,1);        //設(shè)置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)                //接收到一次數(shù)據(jù)了
  132.                 {
  133.                         rxlen=USART2_RX_STA&0X7FFF;        //得到數(shù)據(jù)長度
  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;                        //自動添加結(jié)束符
  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. }
復(fù)制代碼
  
全部資料51hei下載地址:
RCT6NEO-6M GPS.7z (262.02 KB, 下載次數(shù): 104)

IMG_20191216_214701.jpg (1.7 MB, 下載次數(shù): 95)

IMG_20191216_214701.jpg

gps室內(nèi)屏幕顯示.jpg (2.5 MB, 下載次數(shù): 106)

gps室內(nèi)屏幕顯示.jpg

GPS室內(nèi)串口打印.png (8.09 KB, 下載次數(shù): 123)

GPS室內(nèi)串口打印.png

評分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:758657 發(fā)表于 2020-5-22 20:14 | 只看該作者
為啥我在室外也全顯示0呢
回復(fù)

使用道具 舉報

板凳
ID:1025296 發(fā)表于 2022-5-10 10:12 | 只看該作者
ESP8266怎么連接
回復(fù)

使用道具 舉報

地板
ID:1025296 發(fā)表于 2022-5-11 09:28 | 只看該作者

有ESP8266連接的方法嗎
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表