基于51单片机的GPS定位系统设计

基于51单片机的GPS定位系统

(仿真+程序+PCB+原理图+设计报告)

功能介绍

具体功能:

1.UBLOX-NEO-6M GPS模块采集信息;

2.LED作指示灯;

3.LCD12864显示数据信息,时间、经纬度、方向速度、海拔;


#include "display.h"

GPS_INFO   GPS;  //GPS信息结构体


uchar code beiwei[]     = "北纬";
uchar code nanwei[]     = "南纬";
uchar code dongjing[]   = "东经";
uchar code xijing[]     = "西经";
uchar code sudu[]       = "速度: ";
uchar code hangxiang[]  = "航向: ";
uchar code gaodu[]      = "高度: ";
uchar code jiaodu[]     = "角度: ";
uchar code haiba[]      = "海拔: ";
uchar code du[]         = "度";
uchar code meter[]      = "米";
uchar code kmperhour[]  = "km/h";
uchar code date[]       = "    年  月  日  ";

void Show_Float(float fla, uchar x, uchar y);


void GPS_DispTime(void)
{
	uchar i = 0;
	uchar ch;
	//char * yearp;
	//char year[5];
	//char month[3];
	//char day[3];

	//char hour[3];
	//char minu[3];
	//char seco[3];
	//yearp=year;
	char time[5];

	Lcd_DispLine(0, 0, date);  //年月日
	//yearp="     ";
	Int_To_Str(GPS.D.year,time);  //将年转换成字符串,存在time中
	Lcd_SetPos(0, 0);             //设置显示地址
	if(strlen(time)==4)	  		 	//判断接收数据是否有效,有效则显示
	{
		i = 0;
		while(time[i] != '\0')
		{
			ch = time[i++];
			Lcd_WriteDat(ch);	      //显示年
		}
	}

	Int_To_Str(GPS.D.month,time);
	Lcd_SetPos(0, 3);
	if(strlen(time)==2)
	{
		i = 0;
		while(time[i] != '\0')
		{
			ch =time[i++];
			Lcd_WriteDat(ch);	
		}
	}
	Int_To_Str(GPS.D.day,time);
	Lcd_SetPos(0, 5);
	if(strlen(time)==2)
	{
		i = 0;
		while(time[i] != '\0')
		{
			ch =time[i++];
			Lcd_WriteDat(ch);	
		}
	}

	Int_To_Str(GPS.D.hour,time);
	Lcd_SetPos(1, 1);
		if(strlen(time)==2)
	{
		i = 0;
		while(time[i] != '\0')
		{
			ch =time[i++];
			Lcd_WriteDat(ch);	
		}
	}
	Lcd_WriteDat(' ');
	Lcd_WriteDat(':');

	Int_To_Str(GPS.D.minute,time);
	Lcd_SetPos(1, 3);
		if(strlen(time)==2)
	{
		i = 0;
		while(time[i] != '\0')
		{
			ch =time[i++];
			Lcd_WriteDat(ch);	
		}
	}
	Lcd_WriteDat(' ');
	Lcd_WriteDat(':');

	Int_To_Str(GPS.D.second,time);
	Lcd_SetPos(1, 5);
		if(strlen(time)==2)
	{
		i = 0;
		while(time[i] != '\0')
		{
			ch =time[i++];
			Lcd_WriteDat(ch);	
		}
	}
}


void GPS_DisplayOne(void)
{
	uchar ch, i;
	 char info[10];
	ET0=0;
	clr_screen();//Lcd_WriteCmd(0x01);    //清屏

/*	Lcd_SetPos(3, 4);
	Lcd_WriteDat(0xA1);
	Lcd_WriteDat(0xE3);

	Lcd_SetPos(3, 6);
	Lcd_WriteDat(0xA1);
	Lcd_WriteDat(0xE4);	
	 
	Lcd_SetPos(2, 4);
	Lcd_WriteDat(0xA1);
	Lcd_WriteDat(0xE3);

	Lcd_SetPos(2, 6);
	Lcd_WriteDat(0xA1);
	Lcd_WriteDat(0xE4);	  */

	GPS_DispTime();	   	//显示日期,时间

	if (GPS.NS == 'N')              //判断是北纬还是南纬
		Lcd_DispLine(2, 0, beiwei);
	else if (GPS.NS == 'S')
		Lcd_DispLine(2, 0, nanwei);

	if (GPS.EW == 'E')              //判断是东经还是西经
		Lcd_DispLine(3, 0, dongjing);
	else if (GPS.EW == 'W')
		Lcd_DispLine(3, 0, xijing);


	//Lcd_DispLine(2, 2, info);


	//Int_To_Str(GPS.latitude_Cent,info);  //纬分
	//Lcd_DispLine(2, 5, info);


	//Int_To_Str(GPS.latitude_Second,info);  //纬秒
	//Lcd_DispLine(2, 7, info);

	Int_To_Str(GPS.latitude_Degree,info);  //纬度
	Lcd_SetPos(2, 2);
	if(strlen(info)==2)
	{						  //只有正常显示纬度,才显示纬分
		i = 0;
		while(info[i] != '\0')
		{
			ch = info[i++];
			Lcd_WriteDat(ch);
		}
		Lcd_WriteDat(' ');
		Lcd_WriteDat(' ');
		Lcd_WriteDat(0xA1);
		Lcd_WriteDat(0xE3);	

		Int_To_Str(GPS.latitude_Cent,info);  //纬分
		if(strlen(info)==2)
		{					  //只有正常显示纬分,才显示纬秒
			i = 0;
			while(info[i] != '\0')
			{
				ch = info[i++];
				Lcd_WriteDat(ch);
			}
			Lcd_WriteDat(0xA1);
			Lcd_WriteDat(0xE4);

			Int_To_Str(GPS.latitude_Second,info);  //纬秒
			if(strlen(info)==2)
			{
				i = 0;
				while(info[i] != '\0')
				{
					ch = info[i++];
					Lcd_WriteDat(ch);
				}
			}
		}	
	} 

	//Int_To_Str(GPS.longitude_Degree,info);  //经度
	//Lcd_SetPos(3, 2);
	//Lcd_WriteDat(' ');
	//Lcd_DispLine(3, 2, info);


	//Int_To_Str(GPS.longitude_Cent,info);  //经分
	//Lcd_DispLine(3, 5, info);


	//Int_To_Str(GPS.longitude_Second,info);  //经秒
	//Lcd_DispLine(3, 7, info);
	Int_To_Str(GPS.longitude_Degree,info);  //经度
	if(strlen(info)==3)
	{
		//Lcd_SetPos(3, 2);
		//i = 0;
		//while(info[i] != '\0')
		//{
		//	ch = info[i++];
		//	Lcd_WriteDat(ch);
		//}
		Lcd_DispLine(3, 2, info);
		Lcd_WriteDat(' ');
		Lcd_WriteDat(0xA1);
		Lcd_WriteDat(0xE3);
	
		Int_To_Str(GPS.longitude_Cent,info);  //经分
		if(strlen(info)==2)
		{
			//i = 0;
			//while(info[i] != '\0') 
			//{
			//	ch = info[i++];
			//	Lcd_WriteDat(ch);
			//}
			Lcd_DispLine(3, 5, info);
			Lcd_WriteDat(0xA1);
			Lcd_WriteDat(0xE4);
		
			Int_To_Str(GPS.longitude_Second,info);  //经秒
			if(strlen(info)==2)
			{
				//i = 0;
				//while(info[i] != '\0') 
				//{
				//	ch = info[i++];
				//	Lcd_WriteDat(ch);
				//} 
				Lcd_DispLine(3, 7, info);
			}
		}
	} 
	ET0=1;
}


void GPS_DisplayTwo(void)
{
	clr_screen();//Lcd_WriteCmd(0x01);    //清屏
	ET0=0;
	Lcd_DispLine(0, 0, sudu);
	Lcd_DispLine(1, 0, hangxiang);
	Lcd_DispLine(2, 0, gaodu);
	Lcd_DispLine(3, 0, haiba);

	Show_Float(GPS.speed, 0, 3);
	Lcd_DispLine(0, 6, kmperhour);

	Show_Float(GPS.direction, 1, 3);
	Lcd_DispLine(1, 6, du);
	
	Show_Float(GPS.height_ground, 2, 3);
	Lcd_DispLine(2, 6, meter);

	Show_Float(GPS.height_sea, 3, 3);
	Lcd_DispLine(3, 6, meter);
	ET0=1;	
}


硬件设计

使用元器件:

单片机:STC89C52;

(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)

12864液晶显示屏;

UBLOX-NEO-6M GPS模块;

LED灯(红、绿、黄);

1K电阻;10K滑动变阻;

30pf电容;10K电阻;

按键;AMS1117稳压器;

DC电源插口;

导线:若干;

流程图:

设计资料

01 仿真图

本设计使用proteus8.9版本设计,资料里有安装教程,无需担心!具体如图!

02 原理图

本系统原理图采用Altium Designer19设计,具体如图!

03 程序

本设计使用软件keil5版本编程设计,资料里有安装教程,无需担心!具体如图!

04 设计报告

六千字设计报告,具体如下!

05 设计资料

全部资料包括仿真源文件 、程序(含注释)、PCB电路图、AD原理图、设计报告、任务书、流程图、结构图、元件清单、仿真视频等。具体内容如下,全网最全! !

下面是开源51单片机设计资料

​大家共同学习进步:

链接:https://pan.baidu.com/s/1dKH-eHPWi6IR90_09u066w?pwd=qy0u

提取码:qy0u

点赞分享,一起学习进步!一起成长。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的51单片机解析GPS模块的代码示例,以UART方式接收GPS数据: ```c #include <reg51.h> #include <stdio.h> #define GPS_RX P3_0 #define GPS_TX P3_1 void UART_Init(void) { TMOD = 0x20; // 设置定时器1为模式2,8位自动重装计数器 TH1 = 0xFD; // 波特率2400,实际波特率为2405 SCON = 0x50; // 启动UART,8位数据,无校验,1位停止位 TR1 = 1; // 启动定时器1 } void UART_SendChar(char c) { SBUF = c; // 将数据写入发送缓冲区 while (!TI); // 等待发送完成 TI = 0; // 清除发送标志位 } char UART_ReceiveChar(void) { while (!RI); // 等待接收完成 RI = 0; // 清除接收标志位 return SBUF; // 返回接收到的数据 } void GPS_SendCommand(char* cmd) { while (*cmd) { UART_SendChar(*cmd++); } } void GPS_ParseData(char* data) { // 解析NMEA格式数据,提取出坐标数据并转换为10进制表示 // 具体实现可以参考其他资料或者自行编写 } void main() { char buffer[100]; char data; char* ptr = buffer; UART_Init(); // 初始化UART GPS_SendCommand("$GPGGA,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15*"); while (1) { data = UART_ReceiveChar(); // 接收GPS数据 if (data == '$') // 找到NMEA格式数据的起始符 { ptr = buffer; // 初始化缓冲区指针 } *ptr++ = data; // 将数据存入缓冲区 if (data == '\r') // 找到NMEA格式数据的终止符 { *ptr = '\0'; // 在缓冲区末尾添加结束符 GPS_ParseData(buffer); // 解析GPS数据 } } } ``` 这只是一个简单的示例代码,具体的实现方式需要根据GPS模块的型号和规格进行相应的修改和调整。同时,在实际开发中,还需要考虑一些特殊情况的处理,例如数据丢失、数据错误等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值