历史上的今天
今天是:2024年12月31日(星期二)
2019年12月31日 | 单片机GPS定位LCD1602液晶显示经纬度海拔及时间日期实物制作
2019-12-31 来源:51hei
制作出来的实物图如下:

单片机源程序如下:
#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; //获取当前Hour
Flag_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 或者 S
LCD1602_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 或者 W
LCD1602_write_data(Display_GPGGA_Buffer[30]); //经度
LCD1602_write_data(Display_GPGGA_Buffer[31]);
上一篇:单片机循迹小车制作程序
史海拾趣
|
想做一个九画面VGA分割器,就是能把9台电脑的画面接在一台VGA显示器上显示。 好像AM-209M可以实现,可是网上找不到更详细的资料。真是无重下手。 希望大家能给点宝贵意见。… 查看全部问答> |
|
各位大侠,我现在在调CAN总线,我的CAN总线,控制器是用AT89S52+SJA1000+TJA1050,波特率是250K,总线上有加匹配电阻120,当我的节点少于13个时很正常,可是当大于13个以上的时候,每增加一个节点,我用总线监视器看到的错误就增加了不少,不知道这是什么原 ...… 查看全部问答> |
|
在Windows Mobile下,默认IE是使用Internet 设置来拨号上网的,如果我新建了WAP等连接方式,如何能修改为IE的默认连接方式。很多软件都自己做了拨号连接方式设置,是怎么做的?… 查看全部问答> |
|
用EVC3.0访问ACCESS数据库时,是否可以使用UPDATE语句对记录进行更新,我好像一直都没有用起,后来自己做了一个函数,先把要更新的数据查询出来后保存起来,然后删除记录,再用新的数据添加到数据库中去,但是对于查询\\删除\\添加几个功能在单独使用时是 ...… 查看全部问答> |
|
fpga 扩展异步串行口,通过max485芯片输出的差分信号送给外部设备,没有响应(如果直接通过PC机串口转485后发送信号,外围设备有响应);如果我把max485输出的信号经过RS485转232送回给PC机,通过串口调试助手可以读到相应的信号 咨询一下 ...… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 13:31 编辑 5V/5V模拟隔离,注意前端的R1,R2和运放品种,系统是5V供电,能达到满幅输入输出 … 查看全部问答> |




