文章目录

  • 一、简介
  • 二、硬件准备
    • 1、元器件清单
    • 2、接线说明
  • 三、软件准备

一、简介

  接上一篇树莓派与GPS模块的那些事儿,本篇是将NEO-6M GPS模块用于STC12C5A60S2,通过单片机来获取解析GPS数据,并将其显示在LCD1602上,程序来源于购买模块送的资料包,采用了8位总线的方式。

二、硬件准备

1、元器件清单

名称 数量
STC12C5A60S2 1
51最小系统板 1
LCD1602 1
11.0591M晶振 1
B10K电位器 1
NEO-6M GPS 1
USB转TTL 1
面包板 1
6x6x5 按键开关 1

  当然其实这个清单有多余的部分,其实完全可以不用最小系统板,直接插在面包板上即可,我这里是为了自己方便,但结果是整个接线看起来都乱糟糟的。

STC12C5A60S2:

51最小系统板原理图:

2、接线说明

STC12C5A60S2 LCD1602 NEO-6M GPS
GND VSS GND
VCC VDD VCC
* V0 *
P2.7 RS *
P2.6 RW *
P2.5 E *
P0.0 D0 *
P0.1 D1 *
P0.2 D2 *
P0.3 D3 *
P0.4 D4 *
P0.5 D5 *
P0.6 D6 *
P0.7 D7 *
VCC A *
GND K *
P3.0 * TXD
P3.1 * RXD
B10K电位器 LCD1602
1 GND
2 A0
按键开关 STC12C5A60S2
1 GND
2 P3.7

三、软件准备

#include "main.h"
#include "LCD1602.h"
#include "GPS.h"//定义变量
unsigned char KEY_NUM = 0;
bit Page = 0;
unsigned char xdata Display_GPGGA_Buffer[68];
unsigned char xdata Display_GPRMC_Buffer[68];
bit Flag_OV = 0;
bit Flag_Calc_GPGGA_OK = 0;
bit Flag_Calc_GPRMC_OK = 0;//****************************************************
//主函数
//****************************************************
void main()
{unsigned char i = 0;Init_LCD1602();LCD1602_write_com(0x80);                       //指针设置LCD1602_write_word("Welcome to use!");  // 液晶显示屏初始化显示Delay_ms(1000);Uart_Init();while(1){Scan_Key();if(Flag_GPS_OK == 1 && RX_Buffer[4] == 'G' && RX_Buffer[6] == ',' && RX_Buffer[13] == '.')            //确定是否收到"GPGGA"这一帧数据{for( i = 0; i < 68 ; i++){Display_GPGGA_Buffer[i] = RX_Buffer[i]; }Hour = (Display_GPGGA_Buffer[7]-0x30)*10+(Display_GPGGA_Buffer[8]-0x30)+8;          //UTC时间转换到北京时间      UTC+8//0x30为ASCII转换为数字if( Hour >= 24)              //溢出{Hour %= 24;               //获取当前HourFlag_OV = 1;         //日期进位}else{Flag_OV = 0;}Min_High = Display_GPGGA_Buffer[9];Min_Low = Display_GPGGA_Buffer[10];Sec_High = Display_GPGGA_Buffer[11];Sec_Low = Display_GPGGA_Buffer[12];Flag_Calc_GPGGA_OK = 1;}if(Page == 0 && Flag_Calc_GPGGA_OK == 1){LED1 = ~LED1;Flag_Calc_GPGGA_OK = 0;LCD1602_write_com(0x80);         //设置指针LCD1602_write_data(Hour/10+0x30);LCD1602_write_data(Hour%10+0x30);LCD1602_write_data(':');LCD1602_write_data(Min_High);LCD1602_write_data(Min_Low);LCD1602_write_data(':');LCD1602_write_data(Sec_High);LCD1602_write_data(Sec_Low);LCD1602_write_word("  ");LCD1602_write_data(Display_GPGGA_Buffer[54]);    LCD1602_write_data(Display_GPGGA_Buffer[55]);   LCD1602_write_data(Display_GPGGA_Buffer[56]);   LCD1602_write_data(Display_GPGGA_Buffer[57]);LCD1602_write_word("m");LCD1602_write_com(0x80+0x40);           //设置指针LCD1602_write_data(Display_GPGGA_Buffer[28]);         //N 或者 SLCD1602_write_data(Display_GPGGA_Buffer[17]);           //纬度LCD1602_write_data(Display_GPGGA_Buffer[18]);           //纬度LCD1602_write_data(0xdf);                               //度LCD1602_write_data(Display_GPGGA_Buffer[19]);            //纬度LCD1602_write_data(Display_GPGGA_Buffer[20]);           //纬度LCD1602_write_word("'");                             //秒LCD1602_write_data(Display_GPGGA_Buffer[42]);            //E 或者 WLCD1602_write_data(Display_GPGGA_Buffer[30]);           //经度LCD1602_write_data(Display_GPGGA_Buffer[31]);   LCD1602_write_data(Display_GPGGA_Buffer[32]);   LCD1602_write_data(0xdf);                               LCD1602_write_data(Display_GPGGA_Buffer[33]);           LCD1602_write_data(Display_GPGGA_Buffer[34]);       LCD1602_write_word("'");}if(Flag_GPS_OK == 1 && RX_Buffer[4] == 'M' && RX_Buffer[52] == ',' && RX_Buffer[59] == ',')           //确定是否收到"GPRMC"这一帧数据{for( i = 0; i < 68 ; i++){Display_GPRMC_Buffer[i] = RX_Buffer[i]; }Year_High = Display_GPRMC_Buffer[57];Year_Low = Display_GPRMC_Buffer[58];Month_High = Display_GPRMC_Buffer[55];Month_Low = Display_GPRMC_Buffer[56];Day_High = Display_GPRMC_Buffer[53];Day_Low = Display_GPRMC_Buffer[54];if(Flag_OV == 1)            //有进位{UTCDate2LocalDate();          //UTC日期转换为北京时间      }Flag_Calc_GPRMC_OK = 1;}if(Page == 1 && Flag_Calc_GPRMC_OK == 1){LED1 = ~LED1;Flag_Calc_GPRMC_OK = 0;LCD1602_write_com(0x80);           //设置指针LCD1602_write_word("20");LCD1602_write_data(Year_High);LCD1602_write_data(Year_Low);LCD1602_write_data('-');LCD1602_write_data(Month_High);LCD1602_write_data(Month_Low);LCD1602_write_data('-');LCD1602_write_data(Day_High);LCD1602_write_data(Day_Low);LCD1602_write_com(0x80+0x40);            //设置指针LCD1602_write_word("Speed:");               //显示内容LCD1602_write_data(Display_GPRMC_Buffer[46]);     LCD1602_write_data(Display_GPRMC_Buffer[47]);       LCD1602_write_data(Display_GPRMC_Buffer[48]);           LCD1602_write_data(Display_GPRMC_Buffer[49]);   LCD1602_write_data(Display_GPRMC_Buffer[50]);LCD1602_write_word("m/s");               }       }
}
//****************************************************
//UTC日期与当地日期转换
//****************************************************
void UTCDate2LocalDate(void)
{Day = (Day_High - 0x30) * 10 + (Day_Low-0x30) + 1;      //日  加一Month = (Month_High - 0x30) * 10 + (Month_Low - 0x30);Year = 2000 + (Year_High - 0x30) * 10 + (Year_Low - 0x30);MaxDay = GetMaxDay(Month,Year);                //获取当月 天数 最大值if(Day > MaxDay)        //溢出{Day = 1;Month += 1;if(Month > 12){Year+=1;}}Day_High = Day/10 + 0x30;                //转换日期值为ASCIIDay_Low = Day%10 + 0x30;Month_High = Month/10 + 0x30;          //转换月份值为ASCIIMonth_Low = Month%10 + 0x30;Year_High = Year%100/10 + 0x30;            //转换年份值为ASCIIYear_Low = Year%10 + 0x30;
}//****************************************************
//获取当月日期最大值
//****************************************************
unsigned char GetMaxDay(unsigned char Month_Value,unsigned int Year_Value)
{unsigned char iDays;switch(Month_Value){case 1:case 3:case 5:case 7:case 8:case 10:case 12:{iDays = 31;}break;case 2:{//2月份比较特殊,需要根据是不是闰年来判断当月是28天还29天iDays = IsLeapYear(Year_Value)?29:28;}break;case 4:case 6:case 9:case 11:{iDays = 30;}break;default : break;}return(iDays);
}//****************************************************
//闰年检测
//****************************************************
bit IsLeapYear(unsigned int uiYear)
{return (((uiYear%4)==0)&&((uiYear%100)!=0))||((uiYear%400)==0);
}//****************************************************
//按键扫描程序
//****************************************************
void Scan_Key()
{if( KEY4 == 0 )                      //按键1扫描{Delay_ms(10);                   //延时去抖if( KEY4 == 0 ){while(KEY4 == 0);         //等待松手KEY_NUM = 3;Page = ~Page;LCD1602_write_com(0X01);   //清屏}}
}
//****************************************************
//MS延时函数(12M晶振下测试)
//****************************************************
void Delay_ms(unsigned int n)
{unsigned int  i,j;for(i=0;i<n;i++)for(j=0;j<123;j++);
}

  实验结果为:一开始上电,LCD1602显示Welcome to use!,待到GPS模块成功获取定位信息,LCD1602显示时间、海拔以及经纬度,点击按钮,切换至第二页,显示日期和地面速率。

STC12C5A60S2获取GPS信息(LCD1602显示)(一)相关推荐

  1. 程序员是如何通过一张图片获取GPS信息的?简单得不敢相信

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于挣扎的蓝藻 前言 用 python 怎样获得图片的GPS信息?今天推荐一下 exif ...

  2. 不能解决,复选框在request对象获取的信息后显示在用户信息里面为中文的选项名...

    因为方框里面value 不用中文?.? 假如用中文呢?  完全可以!!已经试验 如果不用中文,那么中文可以用对象的参数来获得,即在login.jsp中就要用javabean类属性 转载于:https: ...

  3. android GPS 获取城市信息

    1.取得用户当前位置的经度,纬度. 2.根据经纬度转换成城市名称. 取得用户当前位置的经度,纬度 今天弄了一个多小时,写了一个GPS获取地理位置代码的小例子,包括参考了网上的一些代码,并且对代码进行了 ...

  4. Dynamics 365Online 如何在手机app端获取当前位置的GPS信息

    众所周知365自带的手机app端是很弱的,但再弱还是聊胜于无,至少还是可以用的,而且功能也在不断的加强中. 本篇要分享的是如果使用SDK中开放的API,在手机端app中调用GPS信息,代码很简单 va ...

  5. Autojs获取GPS定位信息

    记得先把autojs的"定位权限"给开了!!!! console.show(); importClass(android.content.BroadcastReceiver); i ...

  6. android动态获取地理位置权限,Android6.0获取GPS定位和获取位置权限和位置信息的方法...

    1.添加权限--6.0之后要动态获取,下面会说 2.直接上代码,不多说,代码中注释很详细. private static final int BAIDU_READ_PHONE_STATE = 100; ...

  7. 高德地图 ——获取定位信息

    上一篇文章已经讲解了如何集成高德地图SDK:跳转链接 如何你想获取附近位置信息 关键字检索poi:跳转这儿 下面我们介绍下定位功能: 配置AndroidManifest文件 上一篇文章已经讲解清单文件 ...

  8. Windows Mobile 获取基站信息(LAC,CellID)

    前言: 在做手机定位应用软件,有两种方法可以实行定位: 1.利用基站定位,通过手机获取基站信息,再根据该信息获取经纬度: 2.利用GPS定位,直接获取经纬度信息. 利弊: 1.基站定位精确度低,误差范 ...

  9. android 获取GPS定位,

    /** * 得到位置信息 */ private void getLocation() { // 获取位置管理服务 LocationManager locationManager; String ser ...

  10. 微信网页授权并获取用户信息

    介绍 在很多微信H5应用里,当用户访问第三方应用时就需要进行微信网页授权,并且很多涉及安全的操作我们必须要先获取用户信息才能继续,本文章简单介绍了微信授权流程,并通过申请微信测试账号来模拟网页授权,用 ...

最新文章

  1. linux强制删除文件夹命令 rm -rf
  2. 何恺明团队新作:图像分割精细度空前,边缘自带抗锯齿,算力仅需Mask R-CNN的2.6%...
  3. linux运算_LinuxShell算术运算
  4. Android-DataBinding源码探究
  5. 左神算法:二叉树的最大 / 最小深度(普通+Morris遍历进阶)(Java版)
  6. codeblock下载
  7. SAP UI5 click list item to navigate to detail page
  8. eclipse扩展点_Eclipse扩展点评估变得容易
  9. 逻辑运算map函数filter函数reduce函数
  10. cocos2dx打飞机项目笔记一:项目结构介绍
  11. C语言:简单计算器多次使用代码实现
  12. noip2017棋盘(超级详细)
  13. 基于asp.net的在线问卷调查系统
  14. Java、JSP电子商城
  15. 【转】常用单位换算表
  16. 32位与64位系统基本数据类型的字节数
  17. 详细解读《个人所得税专项附加扣除暂行办法》
  18. ,什么叫他妈的惊喜?
  19. Servlet连接SQLite数据库出现Out of Memory
  20. 网格搜索法调参神经网络

热门文章

  1. 实时渲染学习(六)延迟渲染(Deferred Rendering)
  2. VB.NET数据库编程基础教程
  3. JavaScript是什么意思?
  4. 二学位计算机基础试题,计算机基础知识附试题().doc
  5. 下行文格式图片_通知的格式及范文图片_通知格式 通知的格式及范文
  6. 例外被抛出且未被接住问题
  7. 请教问题:ckeditor脚本错误“Error:例外被抛出且未被接住”[已解决]
  8. 仿站小工具和小飞兔(扒取网站页面)
  9. 转发:黑客说:我攻击了隔壁女神的路由器,然后
  10. html写手机登录界面,使用HTML做手机端的登录界面