C52控制GPS程序
时间:2026-01-20
时间:2026-01-20
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit E=P2^7; //1602使能端
sbit RW=P2^6; //1602读写选择
sbit RS=P2^5; //
bit ReceivingF = 0; //开始接收标志
bit EndF = 0; //结束标志
bit RMCF = 0; //$GPRMC
bit GGAF = 0; //$GPGGA
bit VTGF = 0; //$GPVTG
bit GSAF = 0; //$GPGSA
bit NewByteF;
uchar GPS_time[9]; //UTC时间
uchar GPS_wd[12]; //纬度
uchar GPS_jd[13]; //经度
uchar GPS_warn; //定位警告
uchar GPS_quality; //定位质量
uchar GPS_status; //定位状态
uchar GPS_alt[8]; //海拔
uchar GPS_sv[3]; //使用卫星
uchar GPS_speed[10]; //速度
uchar GPS_date[9]; //UTC日期
uchar Segment; //逗号计数
uchar Bytes_counter;
uchar Command;
uchar num = 10; //1602重复次数
void GPRMC(uchar);
void GPGGA(uchar);
void GPVTG(uchar);
void GPGSA(uchar);
void GPS(uchar);
void delay_10ms(uint del) //延时10ms*del
{
uint i,j;
for(i=0; i<del; i++)
for(j=0; j<1827; j++)
;
}
void delay()
{
int i,j;
for(i=0; i<=10; i++)
for(j=0; j<=2; j++)
;
}
void enable(uchar del)
{
P0 = del;
RS = 0;
RW = 0;
E = 0;
delay();
E = 1;
delay();
}
void write(uchar del)
{
P0 = del;
RS = 1;
RW = 0;
E = 0;
delay();
E = 1;
delay();
}
void L1602_init(void)
{
enable(0x01);
enable(0x38);
enable(0x0c);
enable(0x06);
enable(0xd0);
}
void L1602_string(uchar hang,uchar lie,uchar *p)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
while(1)
{
if(*p == '\0') break;
write(*p);
p++;
}
}
void Com_init(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd; //设置波特率9600
TL1 = 0xFd;
TR1 = 1;//启动定时器1
ES = 1;//开串口中断
EA = 1;//开总中断
}
void GPS_interrupt() interrupt 4
{
if(RI == 1)
{
EA = 0;
GPS(SBUF);
}
RI = 0;
EA = 1;
}
void GPS(uchar tmp)
{
if(tmp == '$')//起始标志
{
Command = 0;
ReceivingF = 1;
Bytes_counter = 0;
Segment = 0; //清空语句段计数器
return;
}
if(ReceivingF)
{
if(tmp == ',')
{
++Segment;
Bytes_counter = 0; //清空段字节计数器
return;
}
if(tmp == '*')//收到结束标志
{
ReceivingF = 0;
EndF = 1;
return;
}
if(Segment == 0)
{
if(Bytes_counter == 3) //段0,语句类型判断
switch(tmp)
{
case 'G':Command = 1;//语句类型 $GPGGA
GGAF = 1;
break;
cas
下一篇:16管道热处理硬度检测报告