600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 基于51单片机和GPS的经纬度时间速度航向系统设计定位电子罗盘原理图程序设计

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

时间:2019-04-23 18:45:31

相关推荐

基于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;}}

.

文件仅供参考:

链接:/s/1JAGteF7odF1i1nV3uoCIhQ

提取码:rkou

.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。