最近玩了一下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)
|