gpsrecieve.c
来自「这些源码有的是我自已公司使用的一些实用的程序」· C语言 代码 · 共 114 行
C
114 行
#include<reg51.h>
#include<string.h>
#define uchar unsigned char
sbit P1_6=P1^6;
sbit P3_4=P3^4;
sbit GPS_POW=P1^5;
uchar idata Data[70]; //定义定位数据缓存空间
bit flag;
void serial() interrupt 4 using 1{
uchar c;
if (RI)
{c=SBUF;
RI=0;ES=0;
if(c=='p')flag=1;
}
}
void receive_gps(void) //从GPS模块接收数据中提取所需数据
{ uchar n;
do {
do {
while (RI==0);
RI=0;
Data[0]=SBUF;
} while (Data[0]!='$');
for(n=1;n<6;n++)
{while (RI==0);
if(RI==1)
{RI=0;
Data[n]=SBUF;
}
}
} while (strcmp(Data,"$GPRMC")!=0);
n=5;
do {
while (RI==0);
if (RI==1)
{ n++;
Data[n]=SBUF;
RI=0;
}
} while (Data[n]!='\n');
}
struct GPS //存储GPS接收提取出来的有用数据
{
uchar UTC_time[10]; //时间
uchar latitude[9]; //纬度
uchar longitude[10]; //经度
uchar speed[4]; //速度
uchar magnetic[6]; //变化方向
}gps;
void extract(void) //在缓存数组Data中提出各各种定位数据.
{ uchar i,k,l,m,n,j,SectionID;
j=k=l=m=n=0;
for(i=0;i<strlen(Data);i++)
{
if (Data[i]=='$')
SectionID=0;
if (Data[i]==',')
SectionID++;
else
switch(SectionID)
{
case 1 : {gps.UTC_time[j]=Data[i];j++;} break;
case 3 : {gps.latitude[k]=Data[i];k++;} break;
case 5 : {gps.longitude[l]=Data[i];l++;} break;
case 7 : {gps.speed[m]=Data[i];m++;} break;
case 8 : {gps.magnetic[n]=Data[i];n++;} break;
default :break;
}
}
}
void main(void)
{
uchar i;
GPS_POW=0;
TMOD=0x20; //定时器1,方式2;串口方式3,晶振22.1184MHZ,波特率9600
TL1=0xfa;TH1=0xfa;
SCON=0xd0;PCON=0x00;
TR1=1;EA=1;ES=1;
//while (RI==0);
//RI=0;
//c=SBUF;
while(1)
{ ES=1;
if (flag)
{
P1_6=0;P3_4=0;
receive_gps();
extract();
P1_6=1;P3_4=1;
for (i=0;Data[i]!='\n';i++)
{ SBUF=Data[i];
while (TI==0);
TI=0;
}
for (i=0;i<70;i++)
Data[i]='\0'; flag=0;
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?