- #include <reg52.h>
- void UTCDate2LocalDate(void);
- uchar GetMaxDay(uchar Month_Value,uint Year_Value);
- bit IsLeapYear(uint uiYear);
- //void Scan_Key();
- //void GPS_Data_Get(void);
- //void GPSShow(void);
- uchar start=1;
- uchar xdata RX_Buffer[68];
- uchar RX_Count = 0;
- uchar Hour = 0,Min_High = 0,Min_Low = 0,Sec_High = 0,Sec_Low = 0;
- uchar Month = 0,Day = 0,Month_High = 0, Month_Low = 0,Day_Low = 0 ,Day_High = 0, Year_High = 0,Year_Low = 0;
- uint Year = 0;
- long speed;
- bit Flag_GPS_OK = 0;
- uchar MaxDay = 0;
- uchar KEY_NUM = 0;
- uchar Display_GPGGA_Buffer[68];
- uchar Display_GPRMC_Buffer[68];
- bit Flag_OV = 0;
- bit Flag_Calc_GPGGA_OK = 0;
- bit Flag_Calc_GPRMC_OK = 0;
- //**********************************************************
- //oˉêyÃû3Æ: void GPSShow(void)
- //oˉêy1|Äü£oGPS×ø±êÏÔê¾
- //èë¿ú2Îêy: ÎT 3ö¿ú2Îêy£oÎT
- //***********************************************************
- void GPSShow(void)
- {
- if(Flag_Calc_GPRMC_OK == 1 && Flag_Calc_GPGGA_OK == 1)
- {
- Flag_Calc_GPGGA_OK = 0;
- Flag_Calc_GPRMC_OK = 0;
- start=0;
- LCD12864_Str_Write(1,1,"Î3¶è£o"); //ÏÔê¾ÄúèY
- LCD12864_Data_Write(Display_GPGGA_Buffer[28]); //N »òÕß S
- LCD12864_Data_Write(' ');
- LCD12864_Data_Write(Display_GPGGA_Buffer[17]); //Î3¶è
- LCD12864_Data_Write(Display_GPGGA_Buffer[18]); //Î3¶è
- LCD12864_Data_Write(0x07);
- // LCD12864_Str_Write(1,6,"¡ã");
- LCD12864_Data_Write(Display_GPGGA_Buffer[19]); //Î3¶è
- LCD12864_Data_Write(Display_GPGGA_Buffer[20]); //Î3¶è
- LCD12864_Data_Write(Display_GPGGA_Buffer[21]); //Î3¶è
- LCD12864_Data_Write(Display_GPGGA_Buffer[22]);
- LCD12864_Data_Write(0x27); //×Ö·û¡®·Ö¡ˉ
-
- LCD12864_Str_Write(2,1,"¾-¶è£o"); //ÏÔê¾ÄúèY
- LCD12864_Data_Write(Display_GPGGA_Buffer[42]); //E »òÕß W
- LCD12864_Data_Write(Display_GPGGA_Buffer[30]); //¾-¶è
- LCD12864_Data_Write(Display_GPGGA_Buffer[31]);
- LCD12864_Data_Write(Display_GPGGA_Buffer[32]);
- LCD12864_Data_Write(0x07);
- // LCD12864_Str_Write(2,6,"¡ã");
- LCD12864_Data_Write(Display_GPGGA_Buffer[33]);
- LCD12864_Data_Write(Display_GPGGA_Buffer[34]);
- LCD12864_Data_Write(Display_GPGGA_Buffer[35]);
- LCD12864_Data_Write(Display_GPGGA_Buffer[36]);
- LCD12864_Data_Write(0x27);
- speed=((Display_GPRMC_Buffer[46]*1000+Display_GPRMC_Buffer[48]*100+Display_GPRMC_Buffer[49]*10+Display_GPRMC_Buffer[50])-53328)*1.852; //Ëù¶èo£àï×a»»3é1«àï
- LCD12864_Str_Write(3,1,"Ëù¶è£o"); //ÏÔê¾ÄúèY
- if(speed>10000)
- {
- LCD12864_Data_Write((char)(speed/10000+0x30));
- LCD12864_Data_Write((char)(speed%10000/1000+0x30));
- LCD12864_Data_Write('.');
- LCD12864_Data_Write((char)(speed%10000%1000/100+0x30));
- LCD12864_Data_Write((char)(speed%10000%1000%100/10+0x30));
- LCD12864_Data_Write((char)(speed%10000%1000%100%10+0x30));
- }
- else
- {
- LCD12864_Data_Write((char)(speed/1000+0x30));
- LCD12864_Data_Write('.');
- LCD12864_Data_Write((char)(speed%1000/100+0x30));
- LCD12864_Data_Write((char)(speed%1000%100/10+0x30));
- LCD12864_Data_Write((char)(speed%1000%100%10+0x30));
- }
- LCD12864_Str_Write(3,7,"Km/h");
- LCD12864_Str_Write(4,1,"o£°Î£o"); //ÏÔê¾ÄúèY
- if('0'<Display_GPGGA_Buffer[54]<='9')
- LCD12864_Data_Write(Display_GPGGA_Buffer[54]);
- LCD12864_Data_Write(Display_GPGGA_Buffer[55]);
- LCD12864_Data_Write(Display_GPGGA_Buffer[56]);
- if(Display_GPGGA_Buffer[57]!='.')
- LCD12864_Data_Write(Display_GPGGA_Buffer[57]);
- LCD12864_Str_Write(4,7,"Ã× ");
- }
- if(start == 1 )
- {
- LCD12864_Str_Write(2,3,"×ø±ê»ñè¡ÖD");
- LCD12864_Str_Write(3,3,"ÇëéÔoó...");
-
- }
- }
- //**********************************************************
- //oˉêyÃû3Æ: void GPS_Data_Get(void)
- //oˉêy1|Äü£o»ñè¡GPS×a»»oóêy¾Y
- //èë¿ú2Îêy: ÎT 3ö¿ú2Îêy£oÎT
- //***********************************************************
- void GPS_Data_Get(void)
- {
- uchar i = 0;
- if(Flag_GPS_OK == 1 && RX_Buffer[4] == 'G' && RX_Buffer[6] == ',' && RX_Buffer[13] == '.') //è·¶¨êÇ·ñêÕμ½"GPGGA"Õaò»Ö¡êy¾Y
- {
- 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ê±¼ä×a»»μ½±±¾©ê±¼äUTC+8
- //0X30ÎaASCIIÂë×a»»Îaêy×Ö
- if( Hour >= 24) //òç3ö
- {
- 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"Õaò»Ö¡êy¾Y
- {
- 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) //óD½øλ
- {
- UTCDate2LocalDate(); //UTCèÕÆú×a»»Îa±±¾©ê±¼ä
- }
- Flag_Calc_GPRMC_OK = 1;
- }
- }
- //**********************************************************
- //oˉêyÃû3Æ: void RECEIVE_DATA(void) interrupt 8 using 3
- //oˉêy1|Äü£oÖD¶Ïoˉêy£¬í¨1y′®¿ú¶t»ñè¡GPSÔ-ê¼êy¾Y
- //èë¿ú2Îêy: ÎT 3ö¿ú2Îêy£oÎT
- //***********************************************************
- void RECEIVE_DATA(void) interrupt 8 using 3
- {
- uchar temp=0;
- SCON =0x50; //Çå3yÖD¶ÏÇëÇó
- IE2=0x00; //1رÕ′®¿ú¶tÖD¶Ï
- temp = S2BUF;
-
- 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;
- }
- IE=0x01; //′ò¿a′®¿úÖD¶Ï
- }
- //**********************************************************
- //oˉêyÃû3Æ: void UTCDate2LocalDate(void)
- //oˉêy1|Äü£oUTCèÕÆúóëμ±μØèÕÆú×a»»
- //èë¿ú2Îêy: ÎT 3ö¿ú2Îêy£oÎT
- //**********************************************************
- 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); //»ñè¡μ±Ô ììêy ×î′óÖμ
- if(Day > MaxDay) //òç3ö
- {
- Day = 1;
- Month += 1;
- if(Month > 12)
- {
- Year+=1;
- }
- }
- Day_High = Day/10 + 0x30; //×a»»èÕÆúÖμÎaASCII
- Day_Low = Day%10 + 0x30;
- Month_High = Month/10 + 0x30; //×a»»Ô·YÖμÎaASCII
- Month_Low = Month%10 + 0x30;
- Year_High = Year%100/10 + 0x30; //×a»»Äê·YÖμÎaASCII
- Year_Low = Year%10 + 0x30;
- }
- //**********************************************************
- //oˉêyÃû3Æ: uchar GetMaxDay(uchar Month_Value,uint Year_Value)
- //oˉêy1|Äü£o»ñè¡μ±ÔÂèÕÆú×î′óÖμ
- //èë¿ú2Îêy: uchar Month_Value,uint Year_Value 3ö¿ú2Îêy£ouchar
- //**********************************************************
- uchar GetMaxDay(uchar Month_Value,uint 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:
- {
- iDays = IsLeapYear(Year_Value)?29:28; //2Ô·Y±è½ÏìØêa£¬Dèòa¸ù¾YêÇ2»êÇèòÄêà′ÅD¶Ïμ±ÔÂêÇ28ìì»129ìì
- }
- break;
- case 4:
- case 6:
- case 9:
- case 11:
- {
- iDays = 30;
- }
- break;
- default : break;
- }
- return(iDays);
- }
- //**********************************************************
- //oˉêyÃû3Æ: bit IsLeapYear(uint uiYear)
- //oˉêy1|Äü£oèòÄê¼ì2a
- //èë¿ú2Îêy: uint uiYear 3ö¿ú2Îêy£obit
- //**********************************************************
- bit IsLeapYear(uint uiYear)
- {
- return (((uiYear%4)==0)&&((uiYear%100)!=0))||((uiYear%400)==0);
- }
- #endif
复制代码 |