找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stm32 GPS模塊實(shí)驗(yàn) ATK-NEO-6M

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:216618 發(fā)表于 2017-7-2 19:32 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
單片機(jī)源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"  
  3. #include "usart.h"  
  4. #include "led.h"
  5. #include "lcd.h"
  6. #include "usmart.h"        
  7. #include "usart3.h"         
  8. #include "key.h"         
  9. #include "string.h"                  
  10. #include "gps.h"         
  11. #include "ff.h"
  12. #include "exfuns.h"            

  13. //ALIENTEK 探索者STM32F407開發(fā)板 擴(kuò)展實(shí)驗(yàn)2
  14. //ATK-NEO-6M GPS模塊測試實(shí)驗(yàn) -庫函數(shù)版本

  15.                                           
  16. u8 USART1_TX_BUF[USART3_MAX_RECV_LEN];                                         //串口1,發(fā)送緩存區(qū)
  17. nmea_msg gpsx;                                                                                         //GPS信息
  18. __align(4) u8 dtbuf[50];                                                                   //打印緩存器
  19. const u8*fixmode_tbl[4]={"Fail","Fail"," 2D "," 3D "};        //fix mode字符串
  20.          
  21. //顯示GPS定位信息
  22. void Gps_Msg_Show(void)
  23. {
  24.          float tp;                  
  25.         POINT_COLOR=BLUE;           
  26.         tp=gpsx.longitude;           
  27.         sprintf((char *)dtbuf,"Longitude:%.7f %1c   ",tp/=100000,gpsx.ewhemi);        //得到經(jīng)度字符串
  28.          LCD_ShowString(30,130,200,16,16,dtbuf);                    
  29.         tp=gpsx.latitude;           
  30.         sprintf((char *)dtbuf,"Latitude:%.7f %1c   ",tp/=100000,gpsx.nshemi);        //得到緯度字符串
  31.          LCD_ShowString(30,150,200,16,16,dtbuf);                  
  32.         tp=gpsx.altitude;           
  33.          sprintf((char *)dtbuf,"Altitude:%.1fm     ",tp/=10);                                    //得到高度字符串
  34.          LCD_ShowString(30,170,200,16,16,dtbuf);                                    
  35.         tp=gpsx.speed;           
  36.          sprintf((char *)dtbuf,"Speed:%.3fkm/h     ",tp/=1000);                                    //得到速度字符串         
  37.          LCD_ShowString(30,190,200,16,16,dtbuf);                                             
  38.         if(gpsx.fixmode<=3)                                                                                                                //定位狀態(tài)
  39.         {  
  40.                 sprintf((char *)dtbuf,"Fix Mode:%s",fixmode_tbl[gpsx.fixmode]);        
  41.                   LCD_ShowString(30,210,200,16,16,dtbuf);                           
  42.         }                    
  43.         sprintf((char *)dtbuf,"Valid satellite:%02d",gpsx.posslnum);                         //用于定位的衛(wèi)星數(shù)
  44.          LCD_ShowString(30,230,200,16,16,dtbuf);            
  45.         sprintf((char *)dtbuf,"Visible satellite:%02d",gpsx.svnum%100);                         //可見衛(wèi)星數(shù)
  46.          LCD_ShowString(30,250,200,16,16,dtbuf);                 
  47.         sprintf((char *)dtbuf,"UTC Date:%04d/%02d/%02d   ",gpsx.utc.year,gpsx.utc.month,gpsx.utc.date);        //顯示UTC日期
  48.         //printf("year2:%d\r\n",gpsx.utc.year);
  49.         LCD_ShowString(30,270,200,16,16,dtbuf);                    
  50.         sprintf((char *)dtbuf,"UTC Time:%02d:%02d:%02d   ",gpsx.utc.hour,gpsx.utc.min,gpsx.utc.sec);        //顯示UTC時(shí)間
  51.           LCD_ShowString(30,290,200,16,16,dtbuf);                  
  52. }         


  53. int main(void)
  54. {
  55.         u8 record=0;
  56.         u16 i,rxlen,j=0;
  57.         u16 r=0;        
  58.         u16 lenx;
  59.         u8 key=0XFF;
  60.         u8 upload=0;
  61.         u8 temp[24];
  62.         u32 total,free;
  63.         
  64.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級分組2
  65.         delay_init(168);      //初始化延時(shí)函數(shù)
  66.         uart_init(115200);                //初始化串口波特率為115200
  67.         
  68.         usart3_init(9600);                //初始化串口3波特率為9600
  69.         usmart_dev.init(84);                 //初始化USMART               

  70.         LED_Init();                                        //初始化LED
  71.         KEY_Init();                                        //初始化按鍵
  72.          LCD_Init();                                         //初始化LCD
  73.         usmart_dev.init(72);                 //初始化USMART           
  74.          exfuns_init();                                        //為fatfs相關(guān)變量申請內(nèi)存  
  75.   f_mount(fs[0],"0:",1);                                         //掛載SD卡

  76.   while(SD_Init())                    //初始化SD卡失敗
  77.          {            
  78.                 LCD_ShowString(60,150,240,16,16,"SD Init Error!");
  79.                 delay_ms(200);                                 
  80.         }

  81.         //如果之前有記錄,重新上電先算出之前記錄的條數(shù),非常重要
  82.         f_open(file, "gps_log.gtxt", FA_READ );
  83.         r=(*file).fsize/64;
  84.         f_close(file);                         //關(guān)閉文件
  85.         
  86.          POINT_COLOR=RED;
  87.         LCD_ShowString(30,20,200,16,16,"ALIENTEK STM32F4 ^_^");        
  88.         LCD_ShowString(30,40,200,16,16,"NE0-6M GPS TEST");        
  89.         LCD_ShowString(30,60,200,16,16,"ATOM@ALIENTEK");
  90.         LCD_ShowString(30,80,200,16,16,"KEY0:Upload NMEA Data SW");                                                                                                         
  91.   LCD_ShowString(30,100,200,16,16,"NMEA Data Upload:OFF");   
  92.         if(Ublox_Cfg_Rate(1000,1)!=0)        //設(shè)置定位信息更新速度為1000ms,順便判斷GPS模塊是否在位.
  93.         {
  94.            LCD_ShowString(30,120,200,16,16,"NEO-6M Setting...");
  95.                 while((Ublox_Cfg_Rate(1000,1)!=0)&&key)        //持續(xù)判斷,直到可以檢查到NEO-6M,且數(shù)據(jù)保存成功
  96.                 {
  97.                         usart3_init(9600);                        //初始化串口3波特率為9600(EEPROM沒有保存數(shù)據(jù)的時(shí)候,波特率為9600.)
  98.                           Ublox_Cfg_Prt(38400);                        //重新設(shè)置模塊的波特率為38400
  99.                         Ublox_Cfg_Tp(1000000,100000,1);        //設(shè)置PPS為1秒鐘輸出1次,脈沖寬度為100ms            
  100.                         key=Ublox_Cfg_Cfg_Save();                //保存配置  
  101.                 }                                                   
  102.           LCD_ShowString(30,120,200,16,16,"NEO-6M Set Done!!");
  103.                 delay_ms(500);
  104.                 LCD_Fill(30,120,30+200,120+16,WHITE);//清除顯示
  105.         }
  106.         while(1)
  107.         {               
  108.                 delay_ms(1);
  109.                 if(USART3_RX_STA&0X8000)                //接收到一次數(shù)據(jù)了
  110.                 {
  111.                         rxlen=USART3_RX_STA&0X7FFF;        //得到數(shù)據(jù)長度
  112.                         for(i=0;i<rxlen;i++)USART1_TX_BUF[i]=USART3_RX_BUF[i];           
  113.                          USART3_RX_STA=0;                           //啟動(dòng)下一次接收
  114.                         USART1_TX_BUF[i]=0;                        //自動(dòng)添加結(jié)束符
  115.                         GPS_Analysis(&gpsx,(u8*)USART1_TX_BUF);//分析字符串
  116.                         Gps_Msg_Show();                                //顯示信息        

  117.                         //SD卡信息顯示
  118.                         exf_getfree("0",&total,&free);        //得到SD卡總?cè)萘亢褪S嗳萘?nbsp;                                                                                                  
  119.                         LCD_ShowString(30,   330,200,16,16,"SD Card:");                  
  120.                         sprintf(temp,"%d/%dMB",free>>10,total>>10);        
  121.                         LCD_ShowString(30+80,330,200,16,16,temp);                  

  122.                         if(upload)printf("\r\n%s\r\n",USART1_TX_BUF);//發(fā)送接收到的數(shù)據(jù)到串口1
  123.                  }
  124.                 if(j>=1000)   //大約1s記錄一次
  125.                 {
  126.                         j=0;
  127.                         if(record)
  128.                         {
  129.                                 r++;                                
  130.                                 f_lseek(file,(*file).fsize); //移動(dòng)指針
  131.                                 f_printf(file,"記錄%03d 自動(dòng) ",r);          //寫序號
  132.                                 sprintf(temp,"%04d-%02d-%02d ",gpsx.utc.year,gpsx.utc.month,gpsx.utc.date);        //日期
  133.                                 f_write(file,temp,11,&br);  //日期
  134.                                 sprintf(temp,"%02d:%02d:%02d ",gpsx.utc.hour,gpsx.utc.min,gpsx.utc.sec);        //時(shí)間
  135.                                 f_write(file,temp,9,&br);   //時(shí)間        
  136.                                 sprintf(temp,"(%03.7f,",gpsx.longitude/100000+gpsx.longitude%100000/100000.0);        //得到經(jīng)度字符串        
  137.                                 f_write(file,temp,13,&br);   //經(jīng)度               
  138.                                 sprintf(temp,"%02.7f)",gpsx.latitude/100000+gpsx.latitude%100000/100000.0);        //得到緯度字符串        
  139.                                 f_write(file,temp,12,&br);   //緯度               
  140.         
  141.                                 f_printf(file,"\r\n");         //回車換行
  142.                         }
  143.                 }
  144.                 j++;
  145.                 key=KEY_Scan(0);
  146.                 if(key==KEY0_PRES)
  147.                 {
  148.                         upload=!upload;
  149.                         POINT_COLOR=RED;
  150.                         if(upload)LCD_ShowString(30,100,200,16,16,"NMEA Data Upload:ON ");
  151.                         else LCD_ShowString(30,100,200,16,16,"NMEA Data Upload:OFF");
  152. ……………………

  153. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
擴(kuò)展實(shí)驗(yàn)2 ATK-NEO-6M GPS模塊實(shí)驗(yàn)(文件記錄).7z (893.37 KB, 下載次數(shù): 87)


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

使用道具 舉報(bào)

沙發(fā)
ID:243700 發(fā)表于 2017-12-22 11:50 | 只看該作者
樓樓有沒有proteus的仿真圖??proteus元件也行
回復(fù)

使用道具 舉報(bào)

板凳
ID:243700 發(fā)表于 2017-12-22 11:51 | 只看該作者
ATK-NEO-6M的GPS在proteus怎么找啊??
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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