51微控制器對GPS衛星訊號的解碼並通過LCD1602或12864顯示
阿新 • • 發佈:2019-01-29
主程式如下
1602的程式如下#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; //»ñÈ¡µ±Ç°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(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; //ת»»ÈÕÆÚֵΪASCII Day_Low = Day%10 + 0x30; Month_High = Month/10 + 0x30; //ת»»Ô·ÝֵΪASCII Month_Low = Month%10 + 0x30; Year_High = Year%100/10 + 0x30; //ת»»Äê·ÝֵΪASCII Year_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++); }
GPS程式如下#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); //ÇåÆÁÖ¸Áî }
三個.h檔案#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λUART REN = 1; //ÔÊÐí´®ÐпڽÓÊÕÊý¾Ý PCON = 0x00; //SMOD=0;²¨ÌØÂʲ»¼Ó±¶ TMOD = 0x20; //T1·½Ê½2£¬ÓÃÓÚ²úÉú²¨ÌØÂÊ TH1 = 0xFD; //×°³õÖµ TL1 = 0xFD; TR1 = 1; //Æô¶¯¶¨Ê±Æ÷1 EA = 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; }
#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