主程序如下

#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显示相关推荐

  1. m基于matlab的GPS卫星信号捕获和数据解析仿真

    目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 全球定位系统(gps)是一种全天候.全球覆盖.高精度.自动化的卫星导航定位系统,该系统向有适当接收设 ...

  2. GPS研究---GPS卫星信号

    文章目录 1.GPS 卫星信号 2.C/A码与P码 1. C/A 码 2. P 码 3.GPS 卫星的导航电文 4.卫星位置计算 1.GPS 卫星信号 GPS 卫星信号是 GPS 卫星向广大用户发送的 ...

  3. GNSS原理与应用(五)——GPS卫星信号

    目录 1.前言 2.GPS卫星信号的组成 2.1关于GPS的三种信号 2.2GPS卫星信号结构 2.3GPS卫星信号频率 3.载波 3.1载波的作用 3.2载波的类型 3.3载波的特点 4.GPS的测 ...

  4. 51单片机的GPS公交车自动报站系统设计

    硬件设计 基于51单片机的GPS自动报站公交车,硬件部分应该具有的功能有,GPS定位.语音播报.液晶显示.按键操作以及相应的指示灯提示,所以本次设计采用了STC89C58RC单片机作为主控芯片.GPS ...

  5. GPS卫星信号(三):载波与其调制、解调

    GPS卫星信号(三):载波与其调制.解调 一.GPS卫星的基准频率f0 定义:基准频率由卫星上的原子钟直接产生,频率为10.23MHz,卫星信号的所有成分均是该基准频率的倍频或分频. 二.载波信号 1 ...

  6. GPS卫星信号(一):测距码信号

    GPS卫星信号(一):测距码信号 一.伪随机码 1.码的基础概念 ①.码    表达不同信息的二进制数及其不同组合. ②.码元  一位二进制数叫一个码元(0 或 1). ③.编码  按某种标准用二进制 ...

  7. 51单片机汽车胎压大气气压测量仪仿真设计_数码管显示

    51单片机汽车胎压大气气压测量仪仿真设计_数码管显示 (仿真+程序) 仿真原版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0018 目录标题 51 ...

  8. 51单片机数字电子钟设计(数电课设,含时间显示、校准、整点报时、闹钟功能)

    51单片机数字电子钟设计(数电课设,含时间显示.校准.整点报时.闹钟功能) 首先展示硬件设计部分,此处采用proteus仿真演示.其中液晶屏上面一行显示的是实际时间,下面一行显示的是设定闹钟时间.通过 ...

  9. 51单片机+L293D控制直流电机起保停+数码管PWM调速显示

    51单片机+L293D控制直流电机起保停+数码管PWM调速显示 PWM速度10级可调 采用L293D驱动 数码管显示PWM当前占空比 可优化的地方是数码管可以采用其他驱动芯片来驱动,提高驱动能力和减少 ...

  10. 51、基于51单片机的GPS定位系统(GSM短信)

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.程序 六.资料包括 摘要 1978年2月22日第一颗GPS试验卫星的入轨运行,开创了以 ...

最新文章

  1. 理解java虚拟机工作后了解吗,【深入理解JAVA虚拟机】第4部分.程序编译与代码优化.2.运行期优化。这章提到的具体的优化技术,应该对以后做性能工作会有帮助。...
  2. 【原】创建Hive表,分号分隔符“;”引起的异常
  3. python100个必背知识-学Python必背的初级单词,你都背了吗?
  4. Python中该使用%还是format来格式化字符串?
  5. 专家谈家教中的心理健康教育
  6. python之绝对导入和相对导入
  7. mybatis中,collection配置后查询只显示一条记录
  8. 540. 有序数组中的单一元素 golang
  9. 循环机换变速箱油教程_问答| 想更换变速箱油,是重力换还是循环换?
  10. AI考拉技术分享会--IDE 常用功能 for Node.js
  11. 运维技术之二(2)、docker安装jumpserver
  12. 单片机编程软件很简单(七),Keil单片机编程软件软件仿真+硬件仿真
  13. html 分页table,利用JS实现HTML TABLE的分页
  14. android面板驱动的使用方法,Android 专用驱动之Ashmen
  15. Java中获取当前时间、昨天、三天前、一周前、一月前时间(2)
  16. 共享电动车风云再起,市场如何才能有序?
  17. iOS 5 故事板进阶(4)
  18. 076 对称区间的定积分性质
  19. 启贤老师:数字货币投资市场何为盈利 实仓客户心路历程
  20. vs2017许可证书过期真正的解决方法

热门文章

  1. 从Zachman企业架构框架想到的
  2. 用几行代码恶搞别人的电脑
  3. IT项目管理规范模板及IT软件招投标模板(共367份,488M)
  4. sql盲注 解决_解决SQL盲注和跨站脚本攻击
  5. 《代码整洁之道姐妹篇》
  6. Linux之unzip命令
  7. 看各行从业人员给你一一点透的黑幕!亮点惊人!
  8. 微软 smtp 服务器,配置 SMTP 服务器
  9. 邮件服务器匿名,smtp服务器发送匿名邮件
  10. 宝塔/Linux下自动更新maccms到github原版的最新版