|
單片機(jī)源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "lcd.h"
- #include "usmart.h"
- #include "usart3.h"
- #include "key.h"
- #include "string.h"
- #include "gps.h"
- #include "ff.h"
- #include "exfuns.h"
- //ALIENTEK 探索者STM32F407開發(fā)板 擴(kuò)展實(shí)驗(yàn)2
- //ATK-NEO-6M GPS模塊測試實(shí)驗(yàn) -庫函數(shù)版本
-
- u8 USART1_TX_BUF[USART3_MAX_RECV_LEN]; //串口1,發(fā)送緩存區(qū)
- nmea_msg gpsx; //GPS信息
- __align(4) u8 dtbuf[50]; //打印緩存器
- const u8*fixmode_tbl[4]={"Fail","Fail"," 2D "," 3D "}; //fix mode字符串
-
- //顯示GPS定位信息
- void Gps_Msg_Show(void)
- {
- float tp;
- POINT_COLOR=BLUE;
- tp=gpsx.longitude;
- sprintf((char *)dtbuf,"Longitude:%.7f %1c ",tp/=100000,gpsx.ewhemi); //得到經(jīng)度字符串
- LCD_ShowString(30,130,200,16,16,dtbuf);
- tp=gpsx.latitude;
- sprintf((char *)dtbuf,"Latitude:%.7f %1c ",tp/=100000,gpsx.nshemi); //得到緯度字符串
- LCD_ShowString(30,150,200,16,16,dtbuf);
- tp=gpsx.altitude;
- sprintf((char *)dtbuf,"Altitude:%.1fm ",tp/=10); //得到高度字符串
- LCD_ShowString(30,170,200,16,16,dtbuf);
- tp=gpsx.speed;
- sprintf((char *)dtbuf,"Speed:%.3fkm/h ",tp/=1000); //得到速度字符串
- LCD_ShowString(30,190,200,16,16,dtbuf);
- if(gpsx.fixmode<=3) //定位狀態(tài)
- {
- sprintf((char *)dtbuf,"Fix Mode:%s",fixmode_tbl[gpsx.fixmode]);
- LCD_ShowString(30,210,200,16,16,dtbuf);
- }
- sprintf((char *)dtbuf,"Valid satellite:%02d",gpsx.posslnum); //用于定位的衛(wèi)星數(shù)
- LCD_ShowString(30,230,200,16,16,dtbuf);
- sprintf((char *)dtbuf,"Visible satellite:%02d",gpsx.svnum%100); //可見衛(wèi)星數(shù)
- LCD_ShowString(30,250,200,16,16,dtbuf);
- sprintf((char *)dtbuf,"UTC Date:%04d/%02d/%02d ",gpsx.utc.year,gpsx.utc.month,gpsx.utc.date); //顯示UTC日期
- //printf("year2:%d\r\n",gpsx.utc.year);
- LCD_ShowString(30,270,200,16,16,dtbuf);
- sprintf((char *)dtbuf,"UTC Time:%02d:%02d:%02d ",gpsx.utc.hour,gpsx.utc.min,gpsx.utc.sec); //顯示UTC時(shí)間
- LCD_ShowString(30,290,200,16,16,dtbuf);
- }
- int main(void)
- {
- u8 record=0;
- u16 i,rxlen,j=0;
- u16 r=0;
- u16 lenx;
- u8 key=0XFF;
- u8 upload=0;
- u8 temp[24];
- u32 total,free;
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級分組2
- delay_init(168); //初始化延時(shí)函數(shù)
- uart_init(115200); //初始化串口波特率為115200
-
- usart3_init(9600); //初始化串口3波特率為9600
- usmart_dev.init(84); //初始化USMART
- LED_Init(); //初始化LED
- KEY_Init(); //初始化按鍵
- LCD_Init(); //初始化LCD
- usmart_dev.init(72); //初始化USMART
- exfuns_init(); //為fatfs相關(guān)變量申請內(nèi)存
- f_mount(fs[0],"0:",1); //掛載SD卡
- while(SD_Init()) //初始化SD卡失敗
- {
- LCD_ShowString(60,150,240,16,16,"SD Init Error!");
- delay_ms(200);
- }
- //如果之前有記錄,重新上電先算出之前記錄的條數(shù),非常重要
- f_open(file, "gps_log.gtxt", FA_READ );
- r=(*file).fsize/64;
- f_close(file); //關(guān)閉文件
-
- POINT_COLOR=RED;
- LCD_ShowString(30,20,200,16,16,"ALIENTEK STM32F4 ^_^");
- LCD_ShowString(30,40,200,16,16,"NE0-6M GPS TEST");
- LCD_ShowString(30,60,200,16,16,"ATOM@ALIENTEK");
- LCD_ShowString(30,80,200,16,16,"KEY0:Upload NMEA Data SW");
- LCD_ShowString(30,100,200,16,16,"NMEA Data Upload:OFF");
- if(Ublox_Cfg_Rate(1000,1)!=0) //設(shè)置定位信息更新速度為1000ms,順便判斷GPS模塊是否在位.
- {
- LCD_ShowString(30,120,200,16,16,"NEO-6M Setting...");
- while((Ublox_Cfg_Rate(1000,1)!=0)&&key) //持續(xù)判斷,直到可以檢查到NEO-6M,且數(shù)據(jù)保存成功
- {
- usart3_init(9600); //初始化串口3波特率為9600(EEPROM沒有保存數(shù)據(jù)的時(shí)候,波特率為9600.)
- Ublox_Cfg_Prt(38400); //重新設(shè)置模塊的波特率為38400
- Ublox_Cfg_Tp(1000000,100000,1); //設(shè)置PPS為1秒鐘輸出1次,脈沖寬度為100ms
- key=Ublox_Cfg_Cfg_Save(); //保存配置
- }
- LCD_ShowString(30,120,200,16,16,"NEO-6M Set Done!!");
- delay_ms(500);
- LCD_Fill(30,120,30+200,120+16,WHITE);//清除顯示
- }
- while(1)
- {
- delay_ms(1);
- if(USART3_RX_STA&0X8000) //接收到一次數(shù)據(jù)了
- {
- rxlen=USART3_RX_STA&0X7FFF; //得到數(shù)據(jù)長度
- for(i=0;i<rxlen;i++)USART1_TX_BUF[i]=USART3_RX_BUF[i];
- USART3_RX_STA=0; //啟動(dòng)下一次接收
- USART1_TX_BUF[i]=0; //自動(dòng)添加結(jié)束符
- GPS_Analysis(&gpsx,(u8*)USART1_TX_BUF);//分析字符串
- Gps_Msg_Show(); //顯示信息
- //SD卡信息顯示
- exf_getfree("0",&total,&free); //得到SD卡總?cè)萘亢褪S嗳萘?nbsp;
- LCD_ShowString(30, 330,200,16,16,"SD Card:");
- sprintf(temp,"%d/%dMB",free>>10,total>>10);
- LCD_ShowString(30+80,330,200,16,16,temp);
- if(upload)printf("\r\n%s\r\n",USART1_TX_BUF);//發(fā)送接收到的數(shù)據(jù)到串口1
- }
- if(j>=1000) //大約1s記錄一次
- {
- j=0;
- if(record)
- {
- r++;
- f_lseek(file,(*file).fsize); //移動(dòng)指針
- f_printf(file,"記錄%03d 自動(dòng) ",r); //寫序號
- sprintf(temp,"%04d-%02d-%02d ",gpsx.utc.year,gpsx.utc.month,gpsx.utc.date); //日期
- f_write(file,temp,11,&br); //日期
- sprintf(temp,"%02d:%02d:%02d ",gpsx.utc.hour,gpsx.utc.min,gpsx.utc.sec); //時(shí)間
- f_write(file,temp,9,&br); //時(shí)間
- sprintf(temp,"(%03.7f,",gpsx.longitude/100000+gpsx.longitude%100000/100000.0); //得到經(jīng)度字符串
- f_write(file,temp,13,&br); //經(jīng)度
- sprintf(temp,"%02.7f)",gpsx.latitude/100000+gpsx.latitude%100000/100000.0); //得到緯度字符串
- f_write(file,temp,12,&br); //緯度
-
- f_printf(file,"\r\n"); //回車換行
- }
- }
- j++;
- key=KEY_Scan(0);
- if(key==KEY0_PRES)
- {
- upload=!upload;
- POINT_COLOR=RED;
- if(upload)LCD_ShowString(30,100,200,16,16,"NMEA Data Upload:ON ");
- else LCD_ShowString(30,100,200,16,16,"NMEA Data Upload:OFF");
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
擴(kuò)展實(shí)驗(yàn)2 ATK-NEO-6M GPS模塊實(shí)驗(yàn)(文件記錄).7z
(893.37 KB, 下載次數(shù): 87)
2022-12-13 04:05 上傳
點(diǎn)擊文件名下載附件
gps 下載積分: 黑幣 -5
|
|