標(biāo)題:
GPS定位程序 用51單片機(jī)+1602實現(xiàn)
[打印本頁]
作者:
DNG3
時間:
2020-3-31 15:54
標(biāo)題:
GPS定位程序 用51單片機(jī)+1602實現(xiàn)
大二的時候?qū)W單片機(jī)沒事做搞得,現(xiàn)在快工作了,做個 紀(jì)念。。
用到的器件:
1、89c52
2、gps
3、1602顯示器
51hei.png
(69.81 KB, 下載次數(shù): 46)
下載附件
2020-3-31 18:13 上傳
單片機(jī)源程序如下:
//包含頭文件
#include <REG52.h>
#include "uart.c"
//宏定義
#define LCM_Data P0 //將P0口定義為LCM_Data
#define uchar unsigned char
#define uint unsigned int
//1602的控制腳
sbit lcd1602_rs=P2^5;
sbit lcd1602_rw=P2^6;
sbit lcd1602_en=P2^7;
#define RsBuf_N 800
unsigned char xdata RsBuf[RsBuf_N]; //定義串口接收數(shù)據(jù)緩沖區(qū)
uchar code sousuo[]="GPS Searching...";
uint RsPoint;
bit dis_flag=0;
unsigned long weidunum=0;
unsigned long jingdunum=0;
//==================================================================================================
//=======================================LCD1602====================================================
//==================================================================================================
//----------------延時函數(shù),后面經(jīng)常調(diào)用----------------------
void delay(uint xms)//延時函數(shù),有參函數(shù)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=10;y>0;y--);
}
//--------------------------寫指令---------------------------
void write_1602com(uchar com)//****液晶寫入指令函數(shù)****
{
lcd1602_rs=0;//數(shù)據(jù)/指令選擇置為指令
lcd1602_rw=0; //讀寫選擇置為寫
P0=com;//送入數(shù)據(jù)
delay(1);
lcd1602_en=1;//拉高使能端,為制造有效的下降沿做準(zhǔn)備
delay(1);
lcd1602_en=0;//en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
}
//-------------------------寫數(shù)據(jù)-----------------------------
void write_1602dat(uchar dat)//***液晶寫入數(shù)據(jù)函數(shù)****
{
lcd1602_rs=1;//數(shù)據(jù)/指令選擇置為數(shù)據(jù)
lcd1602_rw=0; //讀寫選擇置為寫
P0=dat;//送入數(shù)據(jù)
delay(1);
lcd1602_en=1; //en置高電平,為制造下降沿做準(zhǔn)備
delay(1);
lcd1602_en=0; //en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
}
//-------------------------初始化-------------------------
void lcd_init(void)
{
uchar i;
write_1602com(0x38);//設(shè)置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數(shù)據(jù)
write_1602com(0x0c);//開顯示不顯示光標(biāo)
write_1602com(0x06);//整屏不移動,光標(biāo)自動右移
write_1602com(0x01);//清顯示
delay(1000);
write_1602com(0x80);
for(i=0;i<16;i++)
write_1602dat(sousuo[i]);
}
// 通訊中斷接收程序 中斷函數(shù)無返回值
void uart_rx(void) interrupt 4 using 3
{
EA=0;
if((RsPoint<RsBuf_N)&&RI) //必須判斷RI是否為1
{
RI=0;
if(SBUF=='
)
RsPoint=0;
RsBuf[RsPoint++]=SBUF;
}
EA=1;
}
//==============================主函數(shù)===============================
void main(void)
{
uint i;
uchar shi;
lcd_init();
Uart_init();
for(i=0;i<RsBuf_N;i++)
RsBuf[i]='0';
while(1)
{
if(RsBuf[0]=='
&&RsBuf[1]=='G'&&RsBuf[2]=='P'&&RsBuf[3]=='G'&&RsBuf[4]=='G'&&RsBuf[5]=='A'&&RsBuf[44]!='0')
{
if(RI==0&&((RsBuf[30]-48)*100+(RsBuf[31]-48)*10+(RsBuf[32]-48))>=0&&((RsBuf[30]-48)*100+(RsBuf[31]-48)*10+(RsBuf[32]-48))<=180)
{
TR0=1;
if(dis_flag==0)
{
write_1602com(0x80);
write_1602dat('T');
write_1602dat('i');
write_1602dat('m');
write_1602dat('e');
write_1602dat(':');
shi=((RsBuf[7]-0x30)*10+(RsBuf[8]-0x30)+8)%24;
write_1602dat(shi/10+0x30);
write_1602dat(shi%10+0x30);
write_1602dat('-');
write_1602dat(RsBuf[9]);
write_1602dat(RsBuf[10]);
write_1602dat('-');
write_1602dat(RsBuf[11]);
write_1602dat(RsBuf[12]);
write_1602dat(' ');
write_1602dat(' ');
write_1602dat(' ');
write_1602com(0xc0);
write_1602dat('W');
write_1602dat('X');
write_1602dat(':');
write_1602dat(RsBuf[46]);
write_1602dat(RsBuf[47]);
write_1602dat(' ');
write_1602dat(' ');
write_1602com(0xc7);
write_1602dat('J');
write_1602dat('D');
write_1602dat(':');
write_1602dat(RsBuf[49]);
write_1602dat(RsBuf[50]);
write_1602dat(RsBuf[51]);
write_1602dat(RsBuf[52]);
write_1602dat(' ');
write_1602dat(' ');
}
else
{
weidunum= ((RsBuf[17]-48)*10000000+(RsBuf[18]-48)*1000000)
+(((((RsBuf[19]-48)*10)+(RsBuf[20]-48))*100000)/6)
+(((((RsBuf[22]-48)*1000)+((RsBuf[23]-48)*100)+((RsBuf[24]-48)*10)+(RsBuf[25]-48))*10)/6);
write_1602com(0x80);
write_1602dat('W');
write_1602dat('D');
write_1602dat(':');
write_1602dat(' ');
write_1602dat(weidunum/10000000+0x30);
write_1602dat(weidunum%10000000/1000000+0x30);
write_1602dat('.');
write_1602dat(weidunum%1000000/100000+0x30);
write_1602dat(weidunum%100000/10000+0x30);
write_1602dat(weidunum%10000/1000+0x30);
write_1602dat(weidunum%1000/100+0x30);
write_1602dat(weidunum%100/10+0x30);
write_1602dat(weidunum%10+0x30);
write_1602dat(RsBuf[28]);
write_1602dat(' ');
write_1602dat(' ');
jingdunum= (((RsBuf[30]-48)*100000000)+((RsBuf[31]-48)*10000000)+((RsBuf[32]-48)*1000000))
+(((((RsBuf[33]-48)*10)+(RsBuf[34]-48))*100000)/6)
+(((((RsBuf[36]-48)*1000)+((RsBuf[37]-48)*100)+((RsBuf[38]-48)*10)+(RsBuf[39]-48))*10)/6);
write_1602com(0xc0);
write_1602dat('J');
write_1602dat('D');
write_1602dat(':');
write_1602dat(jingdunum/100000000+0x30);
write_1602dat(jingdunum%100000000/10000000+0x30);
write_1602dat(jingdunum%10000000/1000000+0x30);
write_1602dat('.');
write_1602dat(jingdunum%1000000/100000+0x30);
write_1602dat(jingdunum%100000/10000+0x30);
write_1602dat(jingdunum%10000/1000+0x30);
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
882-GPS定位1602顯示.rar
(1.66 MB, 下載次數(shù): 109)
2020-3-31 15:39 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
418854190
時間:
2021-8-26 17:00
為什么緯度和手機(jī)導(dǎo)航軟件手機(jī)衛(wèi)星地圖軟件不一樣
手機(jī)導(dǎo)航上小數(shù)是078531 這個程序顯示068181
根據(jù)坐標(biāo)在衛(wèi)星地圖上看誤差1000多米
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1