本帖最后由 墨染宸星 于 2019-12-16 21:51 編輯
最近使用GPS 模塊做了一些東西,也遇到了很多問題,在解決之后我整理總結希望能對初學者有幫助。
我用GPS 模塊主要是檢測經緯度和本地時間,包括年月日,時分秒。還是很準確的。然后將GPS模塊得到的數據可以通過串口發送到串口屏上,也可以發送到LCD屏幕。
1.GPS 模塊的到的時間為UTC時間所以需要用函數進行轉化為自己所在時區的時間日期。單片機代碼如下:
- int time[4]; //儲存時間 年 月 日 小時
- // UTC時間轉換為本地時間函數
- void UTCTOLocalTime(){
- int year,month,day,hour;
- int lastday = 0; // 月的最后一天的日期
- int lastlastday = 0; // 上月的最后一天的日期
- year = gpsx.utc.year; //已知的UTC時間
- month = gpsx.utc.month; //已知的UTC時間
- day = gpsx.utc.date; //已知的UTC時間
- hour = gpsx.utc.hour + 8; //已知的UTC時間+所在的時區,這里選擇的是第八時區
- if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12){
- lastday = 31;
- if(month == 3){
- if((year%400 == 0)||(year%4 == 0 && year%100 != 0))//判斷是否為閏年,年號能被400整除或年號能被4整除,而不能被100整除為閏年
- lastlastday = 29; // 閏年的2月為29天,平年為28天
- else
- lastlastday = 28;
- }
- if(month == 8)
- lastlastday = 31;
- }
- else if(month == 4 || month == 6 || month == 9 || month == 11){
- lastday = 30;
- lastlastday = 31;
- }
- else{
- lastlastday = 31;
- if((year%400 == 0)||(year%4 == 0 && year%100 != 0))// 閏年的2月為29天,平年為28天
- lastday = 29;
- else
- lastday = 28;
- }
- if(hour >= 24){// 當算出的區時大于或等于24:00時,應減去24:00,日期加一天
- hour -= 24;
- day += 1;
- if(day > lastday){ // 當算出的日期大于該月最后一天時,應減去該月最后一天的日期,月份加上一個月
- day -= lastday;
- month += 1;
- if(month > 12){// 當算出的月份大于12時,應減去12,年份加上一年
- month -= 12;
- year += 1;
- }
- }
- }
- if(hour < 0){// 當算出的區時為負數時,應加上24:00,日期減一天
- hour += 24;
- day -= 1;
- if(day < 1){ // 當算出的日期為0時,日期變為上一月的最后一天,月份減去一個月
- day = lastlastday;
- month -= 1;
- if(month < 1){ // 當算出的月份為0時,月份變為12月,年份減去一年
- month = 12;
- year -= 1;
- }
- }
- }
- //得到轉換后的本地時間
- time[0] = year;
- time[1] = month;
- time[2] = day;
- time[3]= hour;
- }
- 通過這段代碼就可以通過調用time[];數組來調用自己調整過的數據了。
- 2,GPS通過LCD屏幕顯示,代碼如下
- //顯示GPS定位信息
- void Gps_Msg_Show(void)
- {
- float tp;
- POINT_COLOR=BLUE;
- tp=gpsx.longitude;
- sprintf((char *)dtbuf,"Longitude:%.5f %1c ",tp/=100000,gpsx.ewhemi); //得到經度字符串
- LCD_ShowString(30,130,200,16,16,dtbuf);
- tp=gpsx.latitude;
- sprintf((char *)dtbuf,"Latitude:%.5f %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) //定位狀態
- {
- 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); //用于定位的衛星數
- LCD_ShowString(30,230,200,16,16,dtbuf);
- sprintf((char *)dtbuf,"Visible satellite:%02d",gpsx.svnum%100); //可見衛星數
- LCD_ShowString(30,250,200,16,16,dtbuf);
- sprintf((char *)dtbuf,"UTC Date:%04d/%02d/%02d ",time[0],time[1],time[2]); //顯示UTC日期
- LCD_ShowString(30,270,200,16,16,dtbuf);
- sprintf((char *)dtbuf,"UTC Time:%02d:%02d:%02d ",gpsx.utc.hour+8,gpsx.utc.min,gpsx.utc.sec); //顯示UTC時間
- LCD_ShowString(30,290,200,16,16,dtbuf);
- }
- 主函數如下
- int main(void)
- {
- float tp=gpsx.longitude;
- float w=gpsx.latitude;
- u16 i,rxlen;
- u16 lenx;
- u8 key=0XFF;
- delay_init(); //延時函數初始化
- uart_init(38400); //串口初始化為9600
- USART2_Init(38400); //初始化串口2
- LED_Init(); //初始化與LED連接的硬件接口
- KEY_Init(); //初始化與LED連接的硬件接口
- LCD_Init(); //初始化LCD
- POINT_COLOR=RED;
- LCD_ShowString(30,40,200,16,16,"NE0-6M GPS TEST");
- if(Ublox_Cfg_Rate(1000,1)!=0) //設置定位信息更新速度為1000ms,順便判斷GPS模塊是否在位.
- {
- LCD_ShowString(30,120,200,16,16,"NEO-6M Setting...");
- while((Ublox_Cfg_Rate(1000,1)!=0)&&key) //持續判斷,直到可以檢查到NEO-6M,且數據保存成功
- {
- USART2_Init(9600); //初始化串口2波特率為9600(EEPROM沒有保存數據的時候,波特率為9600.)
- Ublox_Cfg_Prt(38400); //重新設置模塊的波特率為38400
- USART2_Init(38400); //初始化串口2波特率為38400
- Ublox_Cfg_Tp(1000000,100000,1); //設置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)
- {
- UTCTOLocalTime();
- delay_ms(1);
- if(USART2_RX_STA&0X8000) //接收到一次數據了
- {
- rxlen=USART2_RX_STA&0X7FFF; //得到數據長度
- for(i=0;i<rxlen;i++)USART1_TX_BUF[i]=USART2_RX_BUF[i];
- USART2_RX_STA=0; //啟動下一次接收
- USART1_TX_BUF[i]=0; //自動添加結束符
- GPS_Analysis(&gpsx,(u8*)USART1_TX_BUF);//分析字符串
- Gps_Msg_Show(); //顯示信息
- printf("Beijing Time:%02d/%02d/%02d %02d:%02d:%02d",time[0],time[1],time[2],time[3],gpsx.utc.min,gpsx.utc.sec);
- printf("%.5f %1c %.5f %1c" ,gpsx.latitude/=100000,gpsx.nshemi,gpsx.longitude/=100000,gpsx.ewhemi);
- }
- if((lenx%500)==0)LED0=!LED0;
- lenx++;
- }
- }
復制代碼
全部資料51hei下載地址:
RCT6NEO-6M GPS.7z
(262.02 KB, 下載次數: 104)
2019-12-16 11:41 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|