标题:
51单片机串口接收并解析GPS数据+12864显示源程序
[打印本页]
作者:
QQ897410052
时间:
2018-12-9 21:27
标题:
51单片机串口接收并解析GPS数据+12864显示源程序
最近玩了一下GPS, 把GPS的数据通过单片机串口接收并解析和显示出来,效果还不错,分享给大家 希望对有需要的人能起到帮助!
单片机源程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit duan=P2^6;
sbit wei=P2^7;
sbit A=P1^0;
sbit lcd_en=P2^7;
sbit lcd_rs=P2^6;
sbit lcd_rw=P2^5;
sbit lcd_psb=P3^2;
uchar a,b,c,d,i,flag,temp;
uchar table0[64];
void delay(uint z);
void write_com(uchar com);
void write_date(uchar date);
void init();
void main()
{
init();
write_com(0x90);
for(a=0;a<17;a++)//局部定义数组并写入液晶(局部定义极大的节省RAM)
{
uchar table[]="51黑单片机";
write_date(table[a]);
}
delay(5000);
write_com(0x01);//清屏
write_com(0x90);//局部定义数组并写入液晶
for(a=0;a<16;a++)
{
uchar table1[]="GPS 信号接收中";
write_date(table1[a]);
}
write_com(0x8b);//局部定义数组并写入液晶
for(a=0;a<10;a++)
{
uchar table2[]={"请稍后…………"};
write_date(table2[a]);
}
delay(6000);
ES=1;
while(1)
{
if(flag==1)
{
if(table0[4]=='M')//确定是否收到"GPGGA"这一帧数据
{
d++;
if((d>=0)&&(d<=15))//前15秒显示经纬度
{
//以下给液晶写经纬度内容
uchar table3[]="纬度:";
uchar table4[]="经度:";
if(d==1)
write_com(0x01);//显示之前清屏
write_com(0x80);
for(a=0;a<7;a++)
write_date(table3[a]);
write_com(0x88);
for(a=0;a<7;a++)
write_date(table4[a]);
write_com(0x92);
for(a=0;a<11;a++)
write_date(table0[a+18]);
write_com(0x9a);
for(a=0;a<12;a++)
write_date(table0[a+30]);
ES=1;
flag=0;
}
if((d>=16)&&(d<=30))//后15秒显示时间和高度
{
uchar temp1,temp2,shi_1,shi_2,i,j,k;
uchar code sj[]="0123456789";
uchar table5[]="时间:";
uchar table6[]="日期:";
uchar table7[]="年";
uchar table8[]="月";
uchar table9[]="日";
uchar GD[8];
a=0;
for(b=0;b<64;b++)//这里完成日期数据分离
{
if(table0[b]==',')
{
a++;
if(a==9)
{
for(c=0;c<6;c++)
{
GD[c]=table0[b+c+1];//将分离的日期内容写入高度数组
}
}
}
}
if(d==30)
d=0;
if(d==16)
write_com(0x01);//显示之前清屏
//以下给液晶写高度内容
write_com(0x80);
for(a=0;a<6;a++)
write_date(table5[a]); //发送时间到12864上显示
write_com(0x88);
for(a=0;a<6;a++)
write_date(table6[a]); //发送日期到12864上显示
write_com(0x98+2);
for(a=0;a<8;a++)
{
for(i=4;i<6;i++)
{
write_date(GD[i]);
}
write_com(0x9B);
for(i=0;i<2;i++)
{
write_date(table7[i]);
}
for(j=2;j<4;j++)
{
write_date(GD[j]);
}
write_com(0x9D);
for(j=0;j<2;j++)
{
write_date(table8[j]);
}
for(k=0;k<2;k++)
{
write_date(GD[k]);
}
write_com(0x9F);
for(k=0;k<8;k++)
{
write_date(table9[k]);
}
// if(GD[a]==',')
// {
// a=9;
// write_date('M');//无数据提前退出写入同时结尾补写单位'M'
// }
// else
// write_date(GD[a]);
}
switch(table0[7])//分离字符串
{
case '0':
temp1=0;
break;
case '1':
temp1=1;
break;
case '2':
temp1=2;
break;
}
switch(table0[8])//分离字符串
{
case '0':
temp2=0;
break;
case '1':
temp2=1;
break;
case '2':
temp2=2;
break;
case '3':
temp2=3;
break;
case '4':
temp2=4;
break;
case '5':
temp2=5;
break;
case '6':
temp2=6;
break;
case '7':
temp2=7;
break;
case '8':
temp2=8;
break;
case '9':
temp2=9;
break;
}
c=temp1*10+temp2;//时差转换(即转换为北京时间)
if(c>=16,c<=23)
{
shi_1=0;
shi_2=c-16;
}
if(c>=2,c<=15)
{
c+=8;
shi_1=c/10;
//shi_2=c;
shi_2=c%10;
}
if(c>=0,c<=1)
{
shi_1=0;
shi_2=c+8;
}
//以下给液晶写时间内容
write_com(0x90);
write_date(sj[shi_1]);
write_com(0x90+1);
write_date(sj[shi_2]);
write_com(0x90+2);
write_date(':');
write_com(0x90+3);
write_date(table0[9]);
write_com(0x90+4);
write_date(table0[10]);
write_com(0x90+5);
write_date(':');
write_com(0x90+6);
write_date(table0[11]);
write_com(0x90+7);
write_date(table0[12]);
ES=1;
flag=0;
}
}
else
ES=1;
flag=0;
}
}
}
void write_com(uchar com)//写指令函数
{
lcd_rs=0;
lcd_rw=0;
lcd_en=0;
P0=com;
delay(5);
lcd_en=1;
delay(5);
lcd_en=0;
}
void write_date(uchar date)//写数据函数
{
lcd_rs=1;
lcd_rw=0;
lcd_en=0;
P0=date;
delay(5);
lcd_en=1;
delay(5);
lcd_en=0;
}
void init()//初始化液晶、接收中断方式
{
duan=0;
wei=0;
i=0;
lcd_psb=1;
write_com(0x30);
delay(5);
write_com(0x0c);
delay(5);
write_com(0x01);
delay(5);
TMOD=0x20;
TH1=0xFD;
TL1=0xFD;
SM0=0;
SM1=1;
REN=1;
EA=1;
TR1=1;
}
void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void ser()interrupt 4//串口中断、初次分离'特殊符号无法显示'开头的字符串,并写入接收数组
{
uchar ok=1;
RI=0;
temp=SBUF;
table0[i++]=temp;
SBUF=temp;
while(!TI);TI=0;
if(table0[0] == '特殊符号无法显示见附件' )//如果是此字符;马上接收数据
{
// table0[i++]=temp;
if(i==64)
{
i=0;
flag=1;
ES=0;
A=0;
}
}
else
i=0;
}
复制代码
所有资料51hei提供下载:
GPS.zip
(37.82 KB, 下载次数: 182)
2018-12-9 21:27 上传
点击文件名下载附件
GPS+12864显示
下载积分: 黑币 -5
作者:
欧阳哲
时间:
2018-12-12 09:00
我想问一下,GPS TXD连接单片机RXD 为什么单片机一直进不去中断函数?
作者:
潇湘雨
时间:
2019-4-30 22:15
学习一下
作者:
anyway132
时间:
2019-6-19 14:37
感谢楼主贡献,学习学习
作者:
gxm0451
时间:
2019-9-24 17:23
谢谢楼主分享
作者:
迁就
时间:
2019-10-11 09:45
谢谢分享
作者:
yyzf998
时间:
2020-4-24 23:30
谢谢楼主的大公无私精神!谢谢!
作者:
QQ897410052
时间:
2020-5-20 16:12
欧阳哲 发表于 2018-12-12 09:00
我想问一下,GPS TXD连接单片机RXD 为什么单片机一直进不去中断函数?
波特率设置对了吗
作者:
cmyldd
时间:
2022-2-21 11:20
例子真好的,多谢!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1