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

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

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

功能介绍

具体功能:

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

2.LED作指示灯;

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

​演示视频:

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


#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原理图、设计报告、任务书、流程图、结构图、元件清单、仿真视频等。具体内容如下,全网最全! !

资料获取请观看前面演示视频!

点赞分享一起学习成长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/637523.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中的变量与常量

标识符 Java语言规定标识符由任意顺序的字母、下划线(_)、美元符号($)和数字组成,并且第一个字符不能是数字。标识符也不能是Java中的关键字(保留字)。 在Java语言中,标识符的字母…

负载均衡——华为云ELB

登陆华为云--点击控制台 首先购买弹性云服务器ECS (能省则省) 基础配置 网络配置 高级配置 (购买两台) 点击购买 在安全组开放了一个端口9090 分别登陆两台后端服务器,打开http服务于9090端口 用 nohup python …

Spark集群的搭建

1.1搭建Spark集群 Spark集群环境可分为单机版环境、单机伪分布式环境和完全分布式环境。本节任务是学习如何搭建不同模式的Spark集群,并查看Spark的服务监控。读者可从官网下载Spark安装包,本文使用的是spark-2.0.0-bin-hadoop2.7.gz。 1.1.1搭建单机版…

4.9 启动系统任务❤❤❤

有一些特殊的任务需要在系统启动时执行,例如配置文件加载、数据库初始化等操作。 Spring Boot对此提供了两种解决方案:CommandLineRunner和ApplicationRunner。 CommandLineRunner和ApplicationRunner基本一致,差别主要体现在参数上。 1. Co…

代码随想录第42天|416. 分割等和子集

416. 分割等和子集 416. 分割等和子集 - 力扣(LeetCode) 代码随想录 (programmercarl.com) 动态规划之背包问题,这个包能装满吗?| LeetCode:416.分割等和子集_哔哩哔哩_bilibili 给你一个 只包含正整数 的 非空 数组…

[NISACTF 2022]鸣神的国土

第一次接触汇编语言 要用到kali虚拟机 as命令将汇编代码编译为二进制代码,让再用gcc编译成程序,再次用ida打开即可

gradle安装和部署

准备工作 下载地址:https://gradle.org/releases/ 安装和配置环境变量 将压缩包解压到/usr/local/目录下 unzip gradle-8.7-bin.zip -d /usr/local/找到gradle的安装目录/usr/local/gradle-8.7 编辑/etc/vi /etc/profileprofile配置环境变量(这是ce…

【五十七】【算法分析与设计】IndexTree,IndexTree的作用,IndexTree流程,IndexTree代码

IndexTree作用 给你一个nums数组,实现查询区间和操作单点更新nums数组操作。 可以使用IndexTree结构实现这两个操作。 IndexTree流程 1. IndexTree的大小和nums数组大小相同。 2. IndexTree下标必须从1开始,为了方便也将nums数组的下标一一对应。 …

【学习笔记十九】EWM Yard Management概述及后台配置

一、EWM Yard堆场管理业务概述 1.Yard Management基本概念 YARD管理针对的是库房以外的区域,可以理解为入大门开始到库门之前的这部分的区域 堆场结构 像在仓库中一样,将相应仓位映射为堆场仓位,可将其分组到堆场分区。场地中可能具有以下结…

C++相关概念和易错语法(5)(析构函数、拷贝构造、运算符重载、赋值重载)

上篇文章分享了一些构造函数和析构函数的易错点,这篇文章则将继续分享一些构造函数、拷贝构造函数的易错点。 1.变量声明处赋缺省值 我们已经知道了自动构造函数的初始化规则了。我们可以认为这个初始化规则比较保守,能不修改成员变量的值就不修改&…

大厂高频面试题:ReentrantLock 与 synchronized异同点对比

写在开头 在过去的博文中我们学习了ReentrantLock 与 synchronized这两种Java并发使用频率最高的同步锁,在很多大厂面试题中有个经典考题: ReentrantLock 与 synchronized异同点对比! 今天我们针对这一考题来做一个尽可能全面的总结哈。 Re…

UML/SysML建模工具更新情况-截至2024年4月(1)5款-Trufun建模平台 v2024

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 工具最新版本:itemis CREATE 5.2.2 更新时间 2024年3月22日 工具简介 原名YAKINDU Statechart Tools。状态机建模工具,支持各种语言的代码生成,提…