STC12C5A60S2获取GPS信息(LCD1602显示)(一)
文章目录
- 一、简介
- 二、硬件准备
- 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显示)(一)相关推荐
- 程序员是如何通过一张图片获取GPS信息的?简单得不敢相信
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于挣扎的蓝藻 前言 用 python 怎样获得图片的GPS信息?今天推荐一下 exif ...
- 不能解决,复选框在request对象获取的信息后显示在用户信息里面为中文的选项名...
因为方框里面value 不用中文?.? 假如用中文呢? 完全可以!!已经试验 如果不用中文,那么中文可以用对象的参数来获得,即在login.jsp中就要用javabean类属性 转载于:https: ...
- android GPS 获取城市信息
1.取得用户当前位置的经度,纬度. 2.根据经纬度转换成城市名称. 取得用户当前位置的经度,纬度 今天弄了一个多小时,写了一个GPS获取地理位置代码的小例子,包括参考了网上的一些代码,并且对代码进行了 ...
- Dynamics 365Online 如何在手机app端获取当前位置的GPS信息
众所周知365自带的手机app端是很弱的,但再弱还是聊胜于无,至少还是可以用的,而且功能也在不断的加强中. 本篇要分享的是如果使用SDK中开放的API,在手机端app中调用GPS信息,代码很简单 va ...
- Autojs获取GPS定位信息
记得先把autojs的"定位权限"给开了!!!! console.show(); importClass(android.content.BroadcastReceiver); i ...
- android动态获取地理位置权限,Android6.0获取GPS定位和获取位置权限和位置信息的方法...
1.添加权限--6.0之后要动态获取,下面会说 2.直接上代码,不多说,代码中注释很详细. private static final int BAIDU_READ_PHONE_STATE = 100; ...
- 高德地图 ——获取定位信息
上一篇文章已经讲解了如何集成高德地图SDK:跳转链接 如何你想获取附近位置信息 关键字检索poi:跳转这儿 下面我们介绍下定位功能: 配置AndroidManifest文件 上一篇文章已经讲解清单文件 ...
- Windows Mobile 获取基站信息(LAC,CellID)
前言: 在做手机定位应用软件,有两种方法可以实行定位: 1.利用基站定位,通过手机获取基站信息,再根据该信息获取经纬度: 2.利用GPS定位,直接获取经纬度信息. 利弊: 1.基站定位精确度低,误差范 ...
- android 获取GPS定位,
/** * 得到位置信息 */ private void getLocation() { // 获取位置管理服务 LocationManager locationManager; String ser ...
- 微信网页授权并获取用户信息
介绍 在很多微信H5应用里,当用户访问第三方应用时就需要进行微信网页授权,并且很多涉及安全的操作我们必须要先获取用户信息才能继续,本文章简单介绍了微信授权流程,并通过申请微信测试账号来模拟网页授权,用 ...
最新文章
- linux强制删除文件夹命令 rm -rf
- 何恺明团队新作:图像分割精细度空前,边缘自带抗锯齿,算力仅需Mask R-CNN的2.6%...
- linux运算_LinuxShell算术运算
- Android-DataBinding源码探究
- 左神算法:二叉树的最大 / 最小深度(普通+Morris遍历进阶)(Java版)
- codeblock下载
- SAP UI5 click list item to navigate to detail page
- eclipse扩展点_Eclipse扩展点评估变得容易
- 逻辑运算map函数filter函数reduce函数
- cocos2dx打飞机项目笔记一:项目结构介绍
- C语言:简单计算器多次使用代码实现
- noip2017棋盘(超级详细)
- 基于asp.net的在线问卷调查系统
- Java、JSP电子商城
- 【转】常用单位换算表
- 32位与64位系统基本数据类型的字节数
- 详细解读《个人所得税专项附加扣除暂行办法》
- ,什么叫他妈的惊喜?
- Servlet连接SQLite数据库出现Out of Memory
- 网格搜索法调参神经网络
热门文章
- 实时渲染学习(六)延迟渲染(Deferred Rendering)
- VB.NET数据库编程基础教程
- JavaScript是什么意思?
- 二学位计算机基础试题,计算机基础知识附试题().doc
- 下行文格式图片_通知的格式及范文图片_通知格式 通知的格式及范文
- 例外被抛出且未被接住问题
- 请教问题:ckeditor脚本错误“Error:例外被抛出且未被接住”[已解决]
- 仿站小工具和小飞兔(扒取网站页面)
- 转发:黑客说:我攻击了隔壁女神的路由器,然后
- html写手机登录界面,使用HTML做手机端的登录界面