我是靠谱客的博主 机灵舞蹈,最近开发中收集的这篇文章主要介绍基于51单片机和GPS的经纬度时间速度航向系统设计定位电子罗盘原理图程序设计,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前言

(末尾附文件)

通常的导航仪器主要有两种:陀螺罗经和磁罗盘。对地磁场测量方向的仪器叫做磁罗盘。我国发明指南针就是一个简易的磁罗盘,对整个人类社会发展做出巨大贡献。在公元 50 年左右,磁石已经被运用到导航航啦,并且研制出了司南。在公元 960-1127 年时候,支撑是的指南针——指南龟被研制出来。到 20 世纪初,随着工业的发展,罗盘制造工艺也得到了飞速的发展,材料的选择和机械制造使得罗盘的性能有了显著地提高。尤其是是机械式磁罗盘,现在某些情况下依然使用机械式磁罗盘 。到了20世纪出,陀螺罗盘的问世,对罗盘又是一场革命。罗盘感应这地球的自转,磁性物质对其没有影响。使得陀螺罗盘的标度盘非常稳定,读取数据更加精确。当代GPS虽然有广泛的应用,但是信号经常被物体所遮挡,使其精度大打折扣。有效性也大大降低。数字电子罗盘系统则将填补这一个不足,采用地磁场的工作原理,无论何时何地磁场的水平分量永远指向地磁北极,对GPS信号进行有效补偿。
随着科技发展和道路建设完善,汽车会给人们生活极大方便,汽车将会普及在我们生活中。电子罗盘定向系统将会出现每一辆汽车里;届时很多人会开自己的车旅游,回家,谈生意等等,当置于一个陌生的环境中,导航定向对于行车安全非常重要。所以,迫切需要研究出一种低功耗,便于携带,内置磁场感应器,系统稳定,并且能完成精确定向的微系统,而本课题设计就是研究出一个数字电子罗盘,专门解决这个问题而产生的。

硬件设计

原理图设计 (此次设计采用 Beitian BN-880 双模GPS模块,带HMC5883L电子罗盘。)
在这里插入图片描述

程序设计

#include <reg52.h>
#include <string.h>
#include "gps.h"
#include "lcd12864.h"
#include "delay.h"
uchar code init1[] = {"
GPS
"};
uchar code init2[] = {"
显示项目
"};
uchar code init3[] = {"GPS 初始化......"};
uchar code init4[] = {"搜索定位卫星...."};
u8 code beiwei[]
= "北纬";
u8 code nanwei[]
= "南纬";
u8 code dongjing[]
= "东经";
u8 code xijing[]
= "西经";
u8 code date[]
= "
年
月
日
";
u8 code speed[]
= "速度: ";
u8 code jie[]
= "节";
u8 xdata rev_buf[80];
//接收缓存
u8 xdata num = 0;
u8 error_num = 0;
bit rev_start = 0;
//接收开始标志
bit rev_stop
= 0;
//接收停止标志
bit gps_flag
= 0;
//GPS处理标志
static u8 GetComma(u8 num,s8 *str)
{
u8 i,j = 0;
u16 len=strlen(str);
for(i = 0;i < len;i ++)
{
if(str[i] == ',')
j++;
if(j == num)
return i + 1;
}
return 0;
}
void displaytime(void)//显示GPS时间函数
{
u8 tmp;
u8 hour;
tmp = GetComma(9,rev_buf);
Lcd_DispLine(0,0,date);
//年月日
Lcd_DispLine(0,0,"20");
Lcd_SetPos(0,1);
Lcd_WriteDat(rev_buf[tmp+4]);
Lcd_WriteDat(rev_buf[tmp+5]);
Lcd_SetPos(0,3);
Lcd_WriteDat(rev_buf[tmp+2]);
Lcd_WriteDat(rev_buf[tmp+3]);
Lcd_SetPos(0,5);
Lcd_WriteDat(rev_buf[tmp+0]);
Lcd_WriteDat(rev_buf[tmp+1]);
Lcd_SetPos(1,1);
hour=((rev_buf[7]-0x30)*10+(rev_buf[8]-0x30)+8)%24;//时分秒
Lcd_WriteDat(hour/10+0x30);
Lcd_WriteDat(hour%10+0x30);
Lcd_DispLine(1,2," :");
Lcd_SetPos(1,3);
Lcd_WriteDat(rev_buf[9]);
Lcd_WriteDat(rev_buf[10]);
Lcd_DispLine(1,4," :");
Lcd_SetPos(1,5);
Lcd_WriteDat(rev_buf[11]);
Lcd_WriteDat(rev_buf[12]);
}
void displaywd(void) //显示GPS纬度函数
{
u16 weidunum;
Lcd_SetPos(2, 0);
if(rev_buf[30]=='N') Lcd_DispLine(2, 0, beiwei);
else if(rev_buf[30]=='S')
Lcd_DispLine(2, 0, nanwei);
Lcd_SetPos(2, 2);
Lcd_WriteDat(rev_buf[19]);
Lcd_WriteDat(rev_buf[20]);
Lcd_DispLine(2,3,"
");
Lcd_WriteDat(0xA1);
Lcd_WriteDat(0xE3);
Lcd_WriteDat(rev_buf[21]);
Lcd_WriteDat(rev_buf[22]);
Lcd_WriteDat(0xA1);
Lcd_WriteDat(0xE4);
weidunum=(((rev_buf[24]-48)*10)+((rev_buf[25]-48)))*6;
if(weidunum>=100)
{
if(weidunum%100%10>=5)
{
Lcd_WriteDat(weidunum/100+0x30);
Lcd_WriteDat(weidunum%100/10+1+0x30);
}
else
{
Lcd_WriteDat(weidunum/100+0x30);
Lcd_WriteDat(weidunum%100/10+0x30);
}
}
if(weidunum<100&&weidunum>=10)
{
if(weidunum%10>=5)
{
Lcd_WriteDat('0');
Lcd_WriteDat(weidunum/10+1+0x30);
}
else
{
Lcd_WriteDat('0');
Lcd_WriteDat(weidunum/10+0x30);
}
}
if(weidunum<10)
{
if(weidunum>=5)
{
Lcd_WriteDat('0');
Lcd_WriteDat('1');
}
else
{
Lcd_WriteDat('0');
Lcd_WriteDat('0');
}
}
}
void displayjd(void) //显示GPS精度函数
{
u8 i;
u16 jingdunum;
if(rev_buf[44]=='E') Lcd_DispLine(3,0,dongjing);
else if(rev_buf[44]=='W')
Lcd_DispLine(3,0,xijing);
Lcd_SetPos(3, 2);
for(i=32;i<35;i++)
Lcd_WriteDat(rev_buf[i]);
Lcd_WriteDat(' ');
Lcd_WriteDat(0xA1);
Lcd_WriteDat(0xE3);
Lcd_WriteDat(rev_buf[35]);
Lcd_WriteDat(rev_buf[36]);
Lcd_WriteDat(0xA1);
Lcd_WriteDat(0xE4);
jingdunum=(((rev_buf[38]-48)*10)+((rev_buf[39]-48)))*6;
if(jingdunum>=100)
{
if(jingdunum%100%10>=5)
{
Lcd_WriteDat(jingdunum/100+0x30);
Lcd_WriteDat(jingdunum%100/10+1+0x30);
}
else
{
Lcd_WriteDat(jingdunum/100+0x30);
Lcd_WriteDat(jingdunum%100/10+0x30);
}
}
if(jingdunum<100&&jingdunum>=10)
{
if(jingdunum%10>=5)
{
Lcd_WriteDat('0');
Lcd_WriteDat(jingdunum/10+1+0x30);
}
else
{
Lcd_WriteDat('0');
Lcd_WriteDat(jingdunum/10+0x30);
}
}
if(jingdunum<10)
{
if(jingdunum>=5)
{
Lcd_WriteDat('0');
Lcd_WriteDat('1');
}
else
{
Lcd_WriteDat('0');
Lcd_WriteDat('0');
}
}
}
void displayspeed(void) //显示GPS速度函数
{
u8 aa,bb,i;
Lcd_DispLine(3,0,speed);
//速度
Lcd_DispLine(3,6,jie);
if (rev_stop)//GPS搜索到卫星
{
if(rev_buf[0]=='$'&&rev_buf[1]=='G'&&rev_buf[2]=='N'&&rev_buf[3]=='R'&&rev_buf[4]=='M'&&rev_buf[5]=='C'&&rev_buf[17]=='A')
{
if(RI==0)
{
aa=GetComma(7,rev_buf);
bb=GetComma(8,rev_buf)-3;
if((bb-aa)==3)
{
Lcd_DispLine(3,3,"00");
Lcd_SetPos(3,4);
}
else if((bb-aa)==4)
{
Lcd_SetPos(3,3);
Lcd_WriteDat('0');
}
else if((bb-aa)==5)
{
Lcd_SetPos(3,3);
}
for(i=aa;i<bb;i++)
{
Lcd_WriteDat(rev_buf[i]);
}
}
}
rev_stop
= 0;
gps_flag = 0;
}
}
void GPS_Init(void) //GPS初始化函数
{
Lcd_DispLine(0, 0, init1);
Lcd_DispLine(1, 0, init2);
Lcd_DispLine(2, 0, init3);
Lcd_DispLine(3, 0, init4);
}
void GPS_DisplayOne(void) //第一屏显示函数
{
if (rev_stop)//GPS搜索到卫星
{
if(rev_buf[0]=='$'&&rev_buf[1]=='G'&&rev_buf[2]=='N'&&rev_buf[3]=='R'&&rev_buf[4]=='M'&&rev_buf[5]=='C'&&rev_buf[17]=='A')
{
if(RI==0)
{
displaytime();
displaywd();
displayjd();
error_num=0;
}
}
rev_stop
= 0;
gps_flag = 0;
}
else//GPS卫星通讯断开
{
error_num++;
DelayMS(50);
}
if(error_num==20)
{
GPS_Init();
error_num=0;
}
}

.

文件仅供参考:
链接:https://pan.baidu.com/s/1JAGteF7odF1i1nV3uoCIhQ
提取码:rkou

.

最后

以上就是机灵舞蹈为你收集整理的基于51单片机和GPS的经纬度时间速度航向系统设计定位电子罗盘原理图程序设计的全部内容,希望文章能够帮你解决基于51单片机和GPS的经纬度时间速度航向系统设计定位电子罗盘原理图程序设计所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部