|
本帖最后由 墨染宸星 于 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)
|
评分
-
查看全部评分
|