标题:
GPS定位单片机源程序
[打印本页]
作者:
FLX
时间:
2017-3-31 19:54
标题:
GPS定位单片机源程序
#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
复制代码
作者:
lyxxzrb
时间:
2017-4-1 06:39
没仔细看吗,有很多乱码。
作者:
1113634577
时间:
2018-7-14 17:34
乱码没关系,那仅是注释显示错误
作者:
单片机学习12138
时间:
2018-7-17 15:05
有人做出效果图嘛 发一下可以么
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1