51单片机对GPS卫星信号的解码并通过LCD1602或12864显示
主程序如下
#include "main.h"
#include "LCD1602.h"
#include "GPS.h"//¶¨Òå±äÁ¿
unsigned char KEY_NUM = 0;
char temp,temp1,b,d;
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(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 == 0 && Flag_Calc_GPGGA_OK == 1) //½ÓÊÕµ½GPGGAÊý¾Ý °´¼üδ°´ÏÂ{/*LED1 = ~LED1; */Flag_Calc_GPGGA_OK = 0;LCD1602_write_com(0x80); //ÉèÖÃÖ¸ÕëLCD1602_write_data(Display_GPGGA_Buffer[28]); //N »òÕßS ½«±äÁ¿¸³ÓèDisplay GPGGA BUFFER ²¢Ö±½Ó¶ÁÈ¡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_data(Display_GPGGA_Buffer[21]); LCD1602_write_data(Display_GPGGA_Buffer[22]);LCD1602_write_data(Display_GPGGA_Buffer[23]);LCD1602_write_data(Display_GPGGA_Buffer[24]);LCD1602_write_data(Display_GPGGA_Buffer[25]);LCD1602_write_data(Display_GPGGA_Buffer[26]);LCD1602_write_word("'"); //·ÖLCD1602_write_com(0x80+0x40); //ÉèÖÃÖ¸Õë LCD1602_write_data(Display_GPGGA_Buffer[42]); //E »òÕß W ͬÉÏLCD1602_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_data(Display_GPGGA_Buffer[35]); //СÊýµãLCD1602_write_data(Display_GPGGA_Buffer[36]);LCD1602_write_data(Display_GPGGA_Buffer[37]);LCD1602_write_data(Display_GPGGA_Buffer[38]);LCD1602_write_data(Display_GPGGA_Buffer[39]);LCD1602_write_data(Display_GPGGA_Buffer[40]); LCD1602_write_word("'"); }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_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");} }
}
//****************************************************
//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Ô·ݱȽÏÌØÊ⣬ÐèÒª¸ù¾ÝÊDz»ÊÇÈòÄêÀ´Åжϵ±ÔÂÊÇ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++);
}
1602的程序如下
#include "LCD1602.h"//****************************************************
//MSÑÓʱº¯Êý(12M¾§ÕñϲâÊÔ)
//****************************************************
void LCD1602_delay_ms(unsigned int n)
{unsigned int i,j;for(i=0;i<n;i++)for(j=0;j<123;j++);
}//****************************************************
//дָÁî
//****************************************************
void LCD1602_write_com(unsigned char com) //ʹLCD1602ʹÄܵÈÖ¸Áî
{LCD1602_RS = 0;LCD1602_delay_ms(1);LCD1602_EN = 1;LCD1602_PORT = com;LCD1602_delay_ms(1);LCD1602_EN = 0;
}//****************************************************
//дÊý¾Ý
//****************************************************
void LCD1602_write_data(unsigned char dat)
{LCD1602_RS = 1;LCD1602_delay_ms(1); LCD1602_PORT = dat;LCD1602_EN = 1;LCD1602_delay_ms(1);LCD1602_EN = 0;
}//****************************************************
//Á¬Ðøд×Ö·û
//****************************************************
void LCD1602_write_word(unsigned char *s)
{while(*s>0){LCD1602_write_data(*s);s++;}
}void Init_LCD1602() //δ½Óµ½GPSÖ¸ÁîÇ° LCD1602µÈ´ý״̬
{LCD1602_EN = 0;LCD1602_RW = 0; //ÉèÖÃΪд״̬LCD1602_write_com(0x38); //ÏÔʾģʽÉ趨LCD1602_write_com(0x0c); //¿ª¹ØÏÔʾ¡¢¹â±êÓÐÎÞÉèÖᢹâ±êÉÁ˸ÉèÖÃLCD1602_write_com(0x06); //дһ¸ö×Ö·ûºóÖ¸Õë¼ÓÒ»LCD1602_write_com(0x01); //ÇåÆÁÖ¸Áî
}
GPS程序如下
#include "GPS.h"unsigned char RX_Buffer[68];
unsigned char RX_Count = 0;
unsigned char Hour = 0,Min_High = 0,Min_Low = 0,Sec_High = 0,Sec_Low = 0;
unsigned char Month = 0,Day = 0,Month_High = 0, Month_Low = 0,Day_Low = 0 ,Day_High = 0, Year_High = 0,Year_Low = 0;
unsigned int Year = 0;
bit Flag_GPS_OK = 0;
unsigned char MaxDay = 0;void Uart_Init()
{SCON = 0X50; //UART·½Ê½1£»8λUARTREN = 1; //ÔÊÐí´®ÐпڽÓÊÕÊý¾ÝPCON = 0x00; //SMOD=0;²¨ÌØÂʲ»¼Ó±¶TMOD = 0x20; //T1·½Ê½2£¬ÓÃÓÚ²úÉú²¨ÌØÂÊTH1 = 0xFD; //×°³õÖµTL1 = 0xFD;TR1 = 1; //Æô¶¯¶¨Ê±Æ÷1EA = 1; //´ò¿ªÈ«¾ÖÖжϿØÖÆES = 1; //´ò¿ª´®ÐпÚÖжÏ
}void RECEIVE_DATA(void) interrupt 4 using 3 //ÖжÏ4ʹÓÃ3ºÅ¼Ä´æ´¦
{ unsigned char temp = 0;ES=0;temp = SBUF;RI = 0;
// LED1 = ~LED1;if(temp == '$'){RX_Count = 0;Flag_GPS_OK = 0; }RX_Buffer[RX_Count++] = temp;if(RX_Count >= 59){RX_Count = 59;Flag_GPS_OK = 1; }ES=1;
}
三个.h文件
#ifndef __LCD1602_H__
#define __LCD1602_H__#include <reg52.h>//LCD1602 IOÉèÖÃ
#define LCD1602_PORT P0
sbit LCD1602_RS = P2^7;
sbit LCD1602_RW = P2^6;
sbit LCD1602_EN = P2^5;//º¯Êý»òÕß±äÁ¿ÉùÃ÷
extern void LCD1602_delay_ms(unsigned int n);
extern void LCD1602_write_com(unsigned char com);
extern void LCD1602_write_data(unsigned char dat);
extern void LCD1602_write_word(unsigned char *s);
extern void Init_LCD1602();#endif
#ifndef __GPS_H__
#define __GPS_H__#include <reg52.h>
#include "main.h"//º¯Êý»òÕß±äÁ¿ÉùÃ÷
extern void Uart_Init();extern unsigned char RX_Buffer[68];
extern unsigned char RX_Count;
extern unsigned char Hour,Min_High,Min_Low,Sec_High,Sec_Low;
extern unsigned char Month,Day,Month_High, Month_Low,Day_Low ,Day_High, Year_High,Year_Low;
extern unsigned int Year;
extern unsigned char MaxDay;extern bit Flag_GPS_OK;#endif
#ifndef __MAIN_H__
#define __MAIN_H__#include <reg52.h>sbit KEY4 = P1^0;//º¯Êý»òÕß±äÁ¿ÉùÃ÷
extern void Delay_ms(unsigned int n);
extern void Scan_Key();
extern void UTCDate2LocalDate(void);
extern bit IsLeapYear(unsigned int uiYear);
extern unsigned char GetMaxDay(unsigned char Month_Value,unsigned int Year_Value);#endif
51单片机对GPS卫星信号的解码并通过LCD1602或12864显示相关推荐
- m基于matlab的GPS卫星信号捕获和数据解析仿真
目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 全球定位系统(gps)是一种全天候.全球覆盖.高精度.自动化的卫星导航定位系统,该系统向有适当接收设 ...
- GPS研究---GPS卫星信号
文章目录 1.GPS 卫星信号 2.C/A码与P码 1. C/A 码 2. P 码 3.GPS 卫星的导航电文 4.卫星位置计算 1.GPS 卫星信号 GPS 卫星信号是 GPS 卫星向广大用户发送的 ...
- GNSS原理与应用(五)——GPS卫星信号
目录 1.前言 2.GPS卫星信号的组成 2.1关于GPS的三种信号 2.2GPS卫星信号结构 2.3GPS卫星信号频率 3.载波 3.1载波的作用 3.2载波的类型 3.3载波的特点 4.GPS的测 ...
- 51单片机的GPS公交车自动报站系统设计
硬件设计 基于51单片机的GPS自动报站公交车,硬件部分应该具有的功能有,GPS定位.语音播报.液晶显示.按键操作以及相应的指示灯提示,所以本次设计采用了STC89C58RC单片机作为主控芯片.GPS ...
- GPS卫星信号(三):载波与其调制、解调
GPS卫星信号(三):载波与其调制.解调 一.GPS卫星的基准频率f0 定义:基准频率由卫星上的原子钟直接产生,频率为10.23MHz,卫星信号的所有成分均是该基准频率的倍频或分频. 二.载波信号 1 ...
- GPS卫星信号(一):测距码信号
GPS卫星信号(一):测距码信号 一.伪随机码 1.码的基础概念 ①.码 表达不同信息的二进制数及其不同组合. ②.码元 一位二进制数叫一个码元(0 或 1). ③.编码 按某种标准用二进制 ...
- 51单片机汽车胎压大气气压测量仪仿真设计_数码管显示
51单片机汽车胎压大气气压测量仪仿真设计_数码管显示 (仿真+程序) 仿真原版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0018 目录标题 51 ...
- 51单片机数字电子钟设计(数电课设,含时间显示、校准、整点报时、闹钟功能)
51单片机数字电子钟设计(数电课设,含时间显示.校准.整点报时.闹钟功能) 首先展示硬件设计部分,此处采用proteus仿真演示.其中液晶屏上面一行显示的是实际时间,下面一行显示的是设定闹钟时间.通过 ...
- 51单片机+L293D控制直流电机起保停+数码管PWM调速显示
51单片机+L293D控制直流电机起保停+数码管PWM调速显示 PWM速度10级可调 采用L293D驱动 数码管显示PWM当前占空比 可优化的地方是数码管可以采用其他驱动芯片来驱动,提高驱动能力和减少 ...
- 51、基于51单片机的GPS定位系统(GSM短信)
毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.程序 六.资料包括 摘要 1978年2月22日第一颗GPS试验卫星的入轨运行,开创了以 ...
最新文章
- 理解java虚拟机工作后了解吗,【深入理解JAVA虚拟机】第4部分.程序编译与代码优化.2.运行期优化。这章提到的具体的优化技术,应该对以后做性能工作会有帮助。...
- 【原】创建Hive表,分号分隔符“;”引起的异常
- python100个必背知识-学Python必背的初级单词,你都背了吗?
- Python中该使用%还是format来格式化字符串?
- 专家谈家教中的心理健康教育
- python之绝对导入和相对导入
- mybatis中,collection配置后查询只显示一条记录
- 540. 有序数组中的单一元素 golang
- 循环机换变速箱油教程_问答| 想更换变速箱油,是重力换还是循环换?
- AI考拉技术分享会--IDE 常用功能 for Node.js
- 运维技术之二(2)、docker安装jumpserver
- 单片机编程软件很简单(七),Keil单片机编程软件软件仿真+硬件仿真
- html 分页table,利用JS实现HTML TABLE的分页
- android面板驱动的使用方法,Android 专用驱动之Ashmen
- Java中获取当前时间、昨天、三天前、一周前、一月前时间(2)
- 共享电动车风云再起,市场如何才能有序?
- iOS 5 故事板进阶(4)
- 076 对称区间的定积分性质
- 启贤老师:数字货币投资市场何为盈利 实仓客户心路历程
- vs2017许可证书过期真正的解决方法