GPS接受程序.docx
- 文档编号:7663585
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:28
- 大小:45.85KB
GPS接受程序.docx
《GPS接受程序.docx》由会员分享,可在线阅读,更多相关《GPS接受程序.docx(28页珍藏版)》请在冰豆网上搜索。
GPS接受程序
附录B:
程序
#include"display.h"
GPS_INFOGPS;//GPS信息结构体GPS为结构体类型变量
ucharcodebeiwei[]="北纬";
ucharcodenanwei[]="南纬";
ucharcodedongjing[]="东经";
ucharcodexijing[]="西经";
ucharcodesudu[]="速度:
";
ucharcodehangxiang[]="航向:
";
ucharcodegaodu[]="高度:
";
ucharcodejiaodu[]="角度:
";
ucharcodehaiba[]="海拔:
";
ucharcodedu[]="度";
ucharcodemeter[]="米";
ucharcodekmperhour[]="km/h";
ucharcodedate[]="年月日";
voidShow_Float(floatfla,ucharx,uchary);
voidGPS_DispTime(void)
{
uchari=0;
ucharch;
chartime[5];
Lcd_DispLine(0,0,date);//年月日
Int_To_Str(GPS.D.year,time);//将年转换成字符串,存在time中
Lcd_SetPos(0,0);//设置显示地址
if(strlen(time)==4)//判断接收数据是否有效,有效则显示
{
i=0;
while(time[i]!
='\0')
{
ch=time[i++];
Lcd_WriteDat(ch);//显示年
}
}
Int_To_Str(GPS.D.month,time);
Lcd_SetPos(0,3);
if(strlen(time)==2)//判断接收数据是否有效,有效则显示
{
i=0;
while(time[i]!
='\0')
{
ch=time[i++];
Lcd_WriteDat(ch);
}
}
Int_To_Str(GPS.D.day,time);
Lcd_SetPos(0,5);
if(strlen(time)==2)//判断接收数据是否有效,有效则显示
{
i=0;
while(time[i]!
='\0')
{
ch=time[i++];
Lcd_WriteDat(ch);
}
}
Int_To_Str(GPS.D.hour,time);
Lcd_SetPos(1,1);
if(strlen(time)==2)//判断接收数据是否有效,有效则显示
{
i=0;
while(time[i]!
='\0')
{
ch=time[i++];
Lcd_WriteDat(ch);
}
}
Lcd_WriteDat('');
Lcd_WriteDat(':
');
Int_To_Str(GPS.D.minute,time);
Lcd_SetPos(1,3);
if(strlen(time)==2)//判断接收数据是否有效,有效则显示
{
i=0;
while(time[i]!
='\0')
{
ch=time[i++];
Lcd_WriteDat(ch);
}
}
Lcd_WriteDat('');
Lcd_WriteDat(':
');
Int_To_Str(GPS.D.second,time);
Lcd_SetPos(1,5);
if(strlen(time)==2)//判断接收数据是否有效,有效则显示
{
i=0;
while(time[i]!
='\0')
{
ch=time[i++];
Lcd_WriteDat(ch);
}
}
}
voidGPS_DisplayOne(void)//第一屏
{
ucharch,i;
charinfo[10];
ET0=0;//T0的溢出中断允许位,禁止T0的溢出中断
clr_screen();//Lcd_WriteCmd(0x01);//清屏
GPS_DispTime();//显示日期,时间
if(GPS.NS=='N')//判断是北纬还是南纬
Lcd_DispLine(2,0,beiwei);
elseif(GPS.NS=='S')
Lcd_DispLine(2,0,nanwei);
if(GPS.EW=='E')//判断是东经还是西经
Lcd_DispLine(3,0,dongjing);
elseif(GPS.EW=='W')
Lcd_DispLine(3,0,xijing);
Int_To_Str(GPS.latitude_Degree,info);//纬度
Lcd_SetPos(2,2);
if(strlen(info)==2)
{//只有正常显示纬度,才显示纬分
i=0;
while(info[i]!
='\0')
{
ch=info[i++];
Lcd_WriteDat(ch);
}
Lcd_WriteDat('');
Lcd_WriteDat('');
Lcd_WriteDat(0xA1);
Lcd_WriteDat(0xE3);//显示度的符号
Int_To_Str(GPS.latitude_Cent,info);//纬分
if(strlen(info)==2)
{//只有正常显示纬分,才显示纬秒
i=0;
while(info[i]!
='\0')
{
ch=info[i++];
Lcd_WriteDat(ch);
}
Lcd_WriteDat(0xA1);
Lcd_WriteDat(0xE4);//显示秒的符号
Int_To_Str(GPS.latitude_Second,info);//纬秒
if(strlen(info)==2)
{
i=0;
while(info[i]!
='\0')
{
ch=info[i++];
Lcd_WriteDat(ch);
}
}
}
}
Int_To_Str(GPS.longitude_Degree,info);//经度
if(strlen(info)==3)
{
Lcd_DispLine(3,2,info);
Lcd_WriteDat('');
Lcd_WriteDat(0xA1);
Lcd_WriteDat(0xE3);
Int_To_Str(GPS.longitude_Cent,info);//经分
if(strlen(info)==2)
{
Lcd_DispLine(3,5,info);
Lcd_WriteDat(0xA1);
Lcd_WriteDat(0xE4);
Int_To_Str(GPS.longitude_Second,info);//经秒
if(strlen(info)==2)
{
Lcd_DispLine(3,7,info);
}
}
}
ET0=1;
}
voidGPS_DisplayTwo(void)//第二屏用于显示单位
{
clr_screen();//Lcd_WriteCmd(0x01);//清屏
ET0=0;
Lcd_DispLine(0,0,sudu);
Lcd_DispLine(1,0,hangxiang);
Lcd_DispLine(2,0,gaodu);
Lcd_DispLine(3,0,haiba);
Show_Float(GPS.speed,0,3);
Lcd_DispLine(0,6,kmperhour);
Show_Float(GPS.direction,1,3);
Lcd_DispLine(1,6,du);
Show_Float(GPS.height_ground,2,3);
Lcd_DispLine(2,6,meter);
Show_Float(GPS.height_sea,3,3);
Lcd_DispLine(3,6,meter);
ET0=1;
}
voidShow_Float(floatfla,ucharx,uchary)
{
intintegar;
charInfo[10],ch;
uchari;
Lcd_SetPos(x,y);
integar=(int)fla;//显示整数部分
Int_To_Str(fla,Info);//显示整数部分
i=0;
while(Info[i]!
='\0')
{
ch=Info[i++];
Lcd_WriteDat(ch);
}
Lcd_WriteDat('.');//显示小数点
fla=fla-integar;//显示小数部分
fla=fla*10;//0.1//显示0.1
integar=(int)fla;
fla=fla-integar;//改变fla的值,使fla总是小于1
ch=integar+0x30;
Lcd_WriteDat(ch);
fla=fla*10;//0.01//显示0.01
integar=(int)fla;
fla=fla-integar;//改变fla的值,使fla总是小于1
ch=integar+0x30;
Lcd_WriteDat(ch);
}
GPS程序:
#include"GPS.h"
#include"LCD.h"
#include
ucharcodeinit1[]={"BASE-MCUGPS终端"};
ucharcodeinit2[]={"商院电信091班"};
ucharcodeinit3[]={"GPS初始化......"};
ucharcodeinit4[]={"搜索定位卫星...."};
staticucharGetComma(ucharnum,char*str);
staticdoubleGet_Double_Number(char*s);//得到双精度的数据
staticfloatGet_Float_Number(char*s);//得到单精度的数据
staticvoidUTC2BTC(DATE_TIME*GPS);//格林时间到北京时间的转换
voidGPS_Init(void)//GPS初始化
{
Lcd_DispLine(0,0,init1);
Lcd_DispLine(1,0,init2);
Lcd_DispLine(2,0,init3);
Lcd_DispLine(3,0,init4);
}
intGPS_RMC_Parse(char*line,GPS_INFO*GPS)//运输定位数据最大帧70
{//*GPS为结构体类型的指针
ucharch,status,tmp;
floatlati_cent_tmp,lati_second_tmp;//经度的分、秒临时变量
floatlong_cent_tmp,long_second_tmp;//纬度的分、秒临时变量
floatspeed_tmp;//速度的临时变量
char*buf=line;
ch=buf[5];
status=buf[GetComma(2,buf)];//定位状态给status,判断是否是A,
if(ch=='C')//如果第五个字符是C,($GPRMC)推荐最小定位信息
{
if(status=='A')//如果数据有效,则分析‘V’无效,‘A’有效
{
GPS->NS=buf[GetComma(4,buf)];
GPS->EW=buf[GetComma(6,buf)];
GPS->latitude=Get_Double_Number(&buf[GetComma(3,buf)]);//经度
GPS->longitude=Get_Double_Number(&buf[GetComma(5,buf)]);//纬度
GPS->latitude_Degree=(int)GPS->latitude/100;//分离纬度
lati_cent_tmp=(GPS->latitude-GPS->latitude_Degree*100);
GPS->latitude_Cent=(int)lati_cent_tmp;
lati_second_tmp=(lati_cent_tmp-GPS->latitude_Cent)*60;
GPS->latitude_Second=(int)lati_second_tmp;
GPS->longitude_Degree=(int)GPS->longitude/100;//分离经度
long_cent_tmp=(GPS->longitude-GPS->longitude_Degree*100);
GPS->longitude_Cent=(int)long_cent_tmp;
long_second_tmp=(long_cent_tmp-GPS->longitude_Cent)*60;
GPS->longitude_Second=(int)long_second_tmp;
speed_tmp=Get_Float_Number(&buf[GetComma(7,buf)]);//速度(单位:
海里/时)
GPS->speed=speed_tmp*1.85;//1海里=1.85公里
GPS->direction=Get_Float_Number(&buf[GetComma(8,buf)]);//角度
GPS->D.hour=(buf[7]-'0')*10+(buf[8]-'0');//时间
GPS->D.minute=(buf[9]-'0')*10+(buf[10]-'0');
GPS->D.second=(buf[11]-'0')*10+(buf[12]-'0');
tmp=GetComma(9,buf);
GPS->D.day=(buf[tmp+0]-'0')*10+(buf[tmp+1]-'0');//日期
GPS->D.month=(buf[tmp+2]-'0')*10+(buf[tmp+3]-'0');
GPS->D.year=(buf[tmp+4]-'0')*10+(buf[tmp+5]-'0')+2000;
UTC2BTC(&GPS->D);
return1;
}
}
return0;
}
intGPS_GGA_Parse(char*line,GPS_INFO*GPS)//全球定位数据,最大帧为72
{//丛这个数据得到海拔的数据
ucharch,status;
char*buf=line;
ch=buf[4];
status=buf[GetComma(2,buf)];
if(ch=='G')//$GPGGA丛这个数据得到海拔的数据
{
if(status!
=',')
{
GPS->height_sea=Get_Float_Number(&buf[GetComma(9,buf)]);
GPS->height_ground=Get_Float_Number(&buf[GetComma(11,buf)]);
return1;
}
}
return0;
}
staticfloatStr_To_Float(char*buf)//字符串到单精度的转换函数
{
floatrev=0;
floatdat;
intinteger=1;
char*str=buf;//
inti;
while(*str!
='\0')
{
switch(*str)
{
case'0':
dat=0;
break;
case'1':
dat=1;
break;
case'2':
dat=2;
break;
case'3':
dat=3;
break;
case'4':
dat=4;
break;
case'5':
dat=5;
break;
case'6':
dat=6;
break;
case'7':
dat=7;
break;
case'8':
dat=8;
break;
case'9':
dat=9;
break;
case'.':
dat='.';
break;
}
if(dat=='.')
{
integer=0;
i=1;
str++;
continue;
}
if(integer==1)
{
rev=rev*10+dat;
}
else
{
rev=rev+dat/(10*i);
i=i*10;
}
str++;
}
returnrev;
}
staticfloatGet_Float_Number(char*s)
{
charbuf[10];
uchari;
floatrev;
i=GetComma(1,s);
i=i-1;
strncpy(buf,s,i);
buf[i]=0;
rev=Str_To_Float(buf);
returnrev;
}
staticdoubleStr_To_Double(char*buf)//字符串到双精度的转换函数
{
doublerev=0;
doubledat;
intinteger=1;
char*str=buf;
inti;
while(*str!
='\0')
{
switch(*str)
{
case'0':
dat=0;
break;
case'1':
dat=1;
break;
case'2':
dat=2;
break;
case'3':
dat=3;
break;
case'4':
dat=4;
break;
case'5':
dat=5;
break;
case'6':
dat=6;
break;
case'7':
dat=7;
break;
case'8':
dat=8;
break;
case'9':
dat=9;
break;
case'.':
dat='.';
break;
}
if(dat=='.')
{
integer=0;
i=1;
str++;
continue;
}
if(integer==1)
{
rev=rev*10+dat;
}
else
{
rev=rev+dat/(10*i);
i=i*10;
}
str++;
}
returnrev;
}
staticdoubleGet_Double_Number(char*s)
{
charbuf[10];
uchari;
doublerev;
i=GetComma(1,s);
i=i-1;
strncpy(buf,s,i);
buf[i]=0;
rev=Str_To_Double(buf);
returnrev;
}
staticucharGetComma(ucharnum,char*str)
{
uchari,j=0;
intlen=strlen(str);//字符串的长度
for(i=0;i { if(str[i]==',')//计算字符串中的逗号的个数 j++; if(j==num) returni+1;//把逗号后的字符下标值返回 } ret
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- GPS 接受 程序