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