基于51单片机和GPS的经纬度时间速度航向系统设计定位电子罗盘原理图程序设计

链接:https://pan.baidu.com/s/1JAGteF7odF1i1nV3uoCIhQ
提取码:rkou

前言

通常的导航仪器主要有两种:陀螺罗经和磁罗盘。对地磁场测量方向的仪器叫做磁罗盘。我国发明指南针就是一个简易的磁罗盘,对整个人类社会发展做出巨大贡献。在公元 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;
	 }
}

.

文件仅供参考:

.

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值