news 2026/4/18 8:07:45

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

作者头像

张小明

前端开发工程师

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

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

点赞分享一起学习成长。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 8:02:23

双层无纺布和薄膜香蕉袋制袋机哪家性价比高

《双层无纺布和薄膜香蕉袋制袋机哪家好:排名前五专业深度测评》 开篇:定下基调 在农业包装领域,双层无纺布和薄膜香蕉袋制袋机的需求日益增长。为了帮助对这类制袋机感兴趣的人群挑选到合适的产品,我们展开了本次测评。本次参与…

作者头像 李华
网站建设 2026/3/27 19:53:55

Comsol Mie米氏散射:多极子分解仿真与案例分析

Comsol Mie米氏散射多极子分解仿真 包括单个散射体多极子分解、超表面周期性结构多极子分解 计算吸收截面,散射截面,消光截面 一共大概有5-6个案例,包会,不刀,爽快的来,直接发文件,同时fdtd多极…

作者头像 李华
网站建设 2026/4/18 6:38:20

無限鏡屋:當Python解釋器在自我模擬的量子世界中甦醒

無限鏡屋:當Python解釋器在自我模擬的量子世界中甦醒序幕:代碼的俄羅斯套娃在計算機科學的邊緣地帶,存在著一種近乎哲學的實踐——創建自指涉的系統。而我最近完成的項目,正是這種思想的終極體現:一個Python解釋器&…

作者头像 李华
网站建设 2026/4/17 13:38:13

汇川PLC AM系列脉冲控制伺服功能快案例分享

汇川plcam系列脉冲控制伺服功能快案例资料,总线控制已经很常见了,有时候需要用到脉冲控制,这个案例介绍了 脉冲的写法在自动化控制领域,总线控制虽说如今已经相当普遍,但在一些特定场景下,脉冲控制依然有着…

作者头像 李华