久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10774|回復: 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, 下載次數: 106)

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人免费视频网站高清观看视频 | 一级毛片视频 | 欧美久久久久久久久 | 国产美女在线看 | 国产黄色在线观看 | 久精品视频 | 欧美精品一区二区在线观看 | 国产a视频 | www国产成人免费观看视频,深夜成人网 | 久久精品网 | 国产综合久久 | 久久1区| 欧美v在线| 岛国精品 | 黑人巨大精品 | 欧美一级在线免费观看 | 天天操天天干天天透 | 成人在线| 日本在线综合 | 免费大黄视频 | 久草欧美视频 | 蜜月aⅴ免费一区二区三区 99re在线视频 | 日韩在线免费 | 国产美女高潮 | 精品久久九九 | 欧美一级片a | 欧美成年人视频在线观看 | 欧美成人免费在线 | 久久看精品| 国产精品九九九 | 99在线视频观看 | 成人三区 | 国产美女精品视频 | 宅女噜噜66国产精品观看免费 | 欧美一级一区 | 国产毛片久久久久久久久春天 | 成人av在线播放 | 精品久久99| 久久黄视频 | 自拍偷拍一区二区三区 | 日韩在线免费电影 |