久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
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.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
日韩一区二区在线观看视频
|
天天操天天操
|
久久综合婷婷
|
av天天爽
|
在线三级电影
|
久久av网站
|
成人网av
|
国产精品久久久久久久久大全
|
亚洲成av
|
一级毛片在线视频
|
日日碰狠狠躁久久躁96avv
|
97精品一区二区
|
欧美午夜精品理论片a级按摩
|
欧美日韩精品一区二区三区蜜桃
|
日韩在线观看
|
国产精品一区二区久久久久
|
美女黄网站
|
欧美成人免费在线
|
日韩成人在线观看
|
亚洲精品色
|
久久伊人久久
|
久久久久久美女
|
狠狠爱综合
|
亚洲高清成人
|
91精品www
|
成人日韩
|
国产精品视频网
|
欧美日韩中文在线观看
|
欧美在线一区二区三区
|
久久亚洲国产
|
欧美色a v
|
亚洲精品日韩在线
|
亚洲精品国产电影
|
久久成人18免费网站
|
超碰人人人
|
久久男人
|
综合精品在线
|
www.蜜桃av.com
|
在线一区
|
午夜成人免费视频
|
国产免费一区
|