标题:
GPS定位程序 用51单片机+1602实现
[打印本页]
作者:
DNG3
时间:
2020-3-31 15:54
标题:
GPS定位程序 用51单片机+1602实现
大二的时候学单片机没事做搞得,现在快工作了,做个 纪念。。
用到的器件:
1、89c52
2、gps
3、1602显示器
51hei.png
(69.81 KB, 下载次数: 46)
下载附件
2020-3-31 18:13 上传
单片机源程序如下:
//包含头文件
#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]; //定义串口接收数据缓冲区
uchar code sousuo[]="GPS Searching...";
uint RsPoint;
bit dis_flag=0;
unsigned long weidunum=0;
unsigned long jingdunum=0;
//==================================================================================================
//=======================================LCD1602====================================================
//==================================================================================================
//----------------延时函数,后面经常调用----------------------
void delay(uint xms)//延时函数,有参函数
{
uint x,y;
for(x=xms;x>0;x--)
for(y=10;y>0;y--);
}
//--------------------------写指令---------------------------
void write_1602com(uchar com)//****液晶写入指令函数****
{
lcd1602_rs=0;//数据/指令选择置为指令
lcd1602_rw=0; //读写选择置为写
P0=com;//送入数据
delay(1);
lcd1602_en=1;//拉高使能端,为制造有效的下降沿做准备
delay(1);
lcd1602_en=0;//en由高变低,产生下降沿,液晶执行命令
}
//-------------------------写数据-----------------------------
void write_1602dat(uchar dat)//***液晶写入数据函数****
{
lcd1602_rs=1;//数据/指令选择置为数据
lcd1602_rw=0; //读写选择置为写
P0=dat;//送入数据
delay(1);
lcd1602_en=1; //en置高电平,为制造下降沿做准备
delay(1);
lcd1602_en=0; //en由高变低,产生下降沿,液晶执行命令
}
//-------------------------初始化-------------------------
void lcd_init(void)
{
uchar i;
write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
write_1602com(0x0c);//开显示不显示光标
write_1602com(0x06);//整屏不移动,光标自动右移
write_1602com(0x01);//清显示
delay(1000);
write_1602com(0x80);
for(i=0;i<16;i++)
write_1602dat(sousuo[i]);
}
// 通讯中断接收程序 中断函数无返回值
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;
}
//==============================主函数===============================
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黑下载附件…………
复制代码
所有资料51hei提供下载:
882-GPS定位1602显示.rar
(1.66 MB, 下载次数: 109)
2020-3-31 15:39 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
418854190
时间:
2021-8-26 17:00
为什么纬度和手机导航软件手机卫星地图软件不一样
手机导航上小数是078531 这个程序显示068181
根据坐标在卫星地图上看误差1000多米
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1