⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gps.c

📁 这是用W77E58编写的控制GSM模块
💻 C
字号:
#include <w77e58.h>
#include "global.h"
#include "io.h"
#include "serial.h"
#include "timer.h"
#include "gps.h"

enum
{
  LONLAT_DMM=1,    /*LONGITUDE LATITUDE DEGREE MINUTE MINUTE/10000 format */
  LONLAT_DMS,	   /*LONGITUDE LATITUDE DEGREE MINUTE SECOND format */
	
};

#define GPRMC_TIME             1
#define GPRMC_AV_STATUS        2
#define GPRMC_NS_STATUS        4
#define GPRMC_EW_STATUS        6


#define GPRMC_LONGITUDE        5
#define GPRMC_LATTUDE          3
#define GPRMC_SPEED            7
#define GPRMC_ANGLE            8
#define GPRMC_YMD              9

#ifdef DEBUG_GPS
code uchar * debug_gps ="$GPRMC,090058.01,A,2233.4264,N,11406.1970,E,000.0,000.0,041206,002.1,W,A*29";
#endif

bit             GPSReady;
bit             GPSav;           //1 = A
bit             GPSns;           //1 = N 
bit             GPSew;           //1 = E
uchar    xdata  JWDMode;
UINT32   xdata  Speed;
UINT32   xdata  LonDeg,LonMin1,LonMin2,LatDeg,LatMin1,LatMin2;
UINT32	 xdata  xYear,xMonth,xDay;
UINT32	 xdata  xHour,xMin,xSec;

enum
{
   JWD_DU=0,
   JWD_DMS,
   JWD_DMM,
};


uchar xdata m_Buffer[100];



extern char xdata TP_UD[];


//void ParseGPRMC(uchar xdata* GprmcBuff);
//void ParseNMEA0183(uchar xdata* GpsBuff);

int Split(uchar* str,uchar dot)
{
      int i;
      uchar dot_count;

      dot_count=0;
 
      for(i=0;i<250;i++)
      {
      	  if(str[i]==',')
      	  {
      	     dot_count++;
          }
      	  if(str[i]=='\r'&&str[i+1]=='\n') break;	
          if(dot_count==dot) return i;
      	
      }	
      return 0;   
     
}




void GPSModule_init(void)
{

     GPS_EN = HIGH;
	 delay_ms(20);
     GPS_RESET=HIGH;
     delay_ms(20);
     GPS_RESET=LOW;
     delay_ms(100);
     GPS_RESET=HIGH;

}


UINT32 GetGpsInfoDmm(UINT32 degree,UINT32 minute1,UINT32 minute2,UINT8 mode)
{

            if(mode==LONLAT_DMM)
               return degree*600000+minute1*10000+minute2;
            else
                return degree*600000+minute1*10000+minute2*10000/60;
            
}

extern char xdata cmd[];                       // 命令串     


void ParseGPRMC(uchar* GprmcBuff)
{
        int   i,j,k;
		UINT32   xdata Longitude;
        UINT32   xdata Latitude;
    
	    
		i=Split(GprmcBuff,GPRMC_TIME);   /*GPRMC_TIME =1*/
        if(i==0) return;
           
        /*	检查时间数据,eg:204700,A,*/
        if(GprmcBuff[i+10]==',')  //16
        {
          	
          if(GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
	      GprmcBuff[i+2]<'0'||GprmcBuff[i+2]>'9'||
	      GprmcBuff[i+3]<'0'||GprmcBuff[i+3]>'9'||
	      GprmcBuff[i+4]<'0'||GprmcBuff[i+4]>'9'||
	      GprmcBuff[i+5]<'0'||GprmcBuff[i+5]>'9'||
	      GprmcBuff[i+6]<'0'||GprmcBuff[i+6]>'9'||
	      GprmcBuff[i+7]!='.'||
	      GprmcBuff[i+8]<'0'||GprmcBuff[i+8]>'9'||
	      GprmcBuff[i+9]<'0'||GprmcBuff[i+9]>'9')
	      return;
	  
        
        }	
        else
        {
            if(	GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
		    GprmcBuff[i+2]<'0'||GprmcBuff[i+2]>'9'||
		    GprmcBuff[i+3]<'0'||GprmcBuff[i+3]>'9'||
		    GprmcBuff[i+4]<'0'||GprmcBuff[i+4]>'9'||
		    GprmcBuff[i+5]<'0'||GprmcBuff[i+5]>'9'||
		    GprmcBuff[i+6]<'0'||GprmcBuff[i+6]>'9'||
		    GprmcBuff[i+7]!='.'||
		    GprmcBuff[i+8]<'0'||GprmcBuff[i+8]>'9'||
		    GprmcBuff[i+9]<'0'||GprmcBuff[i+9]>'9'||
	   	    GprmcBuff[i+10]<'0'||GprmcBuff[i+10]>'9')
	        return;	
     
     
     
        } 	
        xHour=(GprmcBuff[i+1]-'0')*10+(GprmcBuff[i+2]-'0');
 	    xMin =(GprmcBuff[i+3]-'0')*10+(GprmcBuff[i+4]-'0');
	    xSec =(GprmcBuff[i+5]-'0')*10+(GprmcBuff[i+6]-'0');

		i=Split(GprmcBuff,GPRMC_AV_STATUS);   
        if(i==0) return;
        if(GprmcBuff[i+1]!='A'&& GprmcBuff[i+1]!='V')return; 
        
		GPSav = ((GprmcBuff[i+1]=='A')? 1:0); 
		
        //if(GPSav=='V')return;	

  
        /*	检查经度数据,eg:11709.432,W,*/
        i=Split(GprmcBuff,GPRMC_LONGITUDE);   
        if(i==0) return;
	    if(	GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
		GprmcBuff[i+2]<'0'||GprmcBuff[i+2]>'9'||
		GprmcBuff[i+3]<'0'||GprmcBuff[i+3]>'9'||
		GprmcBuff[i+4]<'0'||GprmcBuff[i+4]>'9'||
		GprmcBuff[i+5]<'0'||GprmcBuff[i+5]>'9'||
		GprmcBuff[i+6]!='.'||
		GprmcBuff[i+7]<'0'||GprmcBuff[i+7]>'9'||
		GprmcBuff[i+8]<'0'||GprmcBuff[i+8]>'9'||
		GprmcBuff[i+9]<'0'||GprmcBuff[i+9]>'9'||
		GprmcBuff[i+10]<'0'||GprmcBuff[i+10]>'9')
	    return;

   	    LonDeg=(GprmcBuff[i+1]-'0')*100+
                                   (GprmcBuff[i+2]-'0')*10+
                                   GprmcBuff[i+3]-'0';
        LonMin1=(GprmcBuff[i+4]-'0')*10+
       	                     GprmcBuff[i+5]-'0';  
        LonMin2=(GprmcBuff[i+7]-'0')*1000+
       	                     (GprmcBuff[i+8]-'0')*100+
       	                     (GprmcBuff[i+9]-'0')*10+
       	                     GprmcBuff[i+10]-'0';


      /*	检查纬度数据,eg:3403.868,N,*/
       i=Split(GprmcBuff,GPRMC_LATTUDE);   
       if(i==0) return;
       if(	GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
		GprmcBuff[i+2]<'0'||GprmcBuff[i+2]>'9'||
		GprmcBuff[i+3]<'0'||GprmcBuff[i+3]>'9'||
		GprmcBuff[i+4]<'0'||GprmcBuff[i+4]>'9'||
		GprmcBuff[i+5]!='.'||
		GprmcBuff[i+6]<'0'||GprmcBuff[i+6]>'9'||
		GprmcBuff[i+7]<'0'||GprmcBuff[i+7]>'9'||
		GprmcBuff[i+8]<'0'||GprmcBuff[i+8]>'9'||
		GprmcBuff[i+9]<'0'||GprmcBuff[i+9]>'9')
        return;		

        LatDeg=(GprmcBuff[i+1]-'0')*10+
                                   GprmcBuff[i+2]-'0';
        LatMin1=(GprmcBuff[i+3]-'0')*10+
       	                     GprmcBuff[i+4]-'0';  
        LatMin2=(GprmcBuff[i+6]-'0')*1000+
       	                     (GprmcBuff[i+7]-'0')*100+
       	                     (GprmcBuff[i+8]-'0')*10+
                             GprmcBuff[i+9]-'0';

        i=Split(GprmcBuff,GPRMC_YMD);   
        if(i==0) return;
        
        if(	GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
		GprmcBuff[i+2]<'0'||GprmcBuff[i+2]>'9'||
		GprmcBuff[i+3]<'0'||GprmcBuff[i+3]>'9'||
		GprmcBuff[i+4]<'0'||GprmcBuff[i+4]>'9'||
		GprmcBuff[i+5]<'0'||GprmcBuff[i+5]>'9'||
		GprmcBuff[i+6]<'0'||GprmcBuff[i+6]>'9')
	    return;
      
        xYear =(GprmcBuff[i+5]-'0')*10+GprmcBuff[i+6]-'0';
	    xMonth=(GprmcBuff[i+3]-'0')*10+GprmcBuff[i+4]-'0';
	    xDay  =(GprmcBuff[i+1]-'0')*10+GprmcBuff[i+2]-'0';


        i=Split(GprmcBuff,GPRMC_SPEED);   
        if(i==0) return;
	    if(GprmcBuff[i+4]=='.')
	    {
	     if(GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
	        GprmcBuff[i+2]<'0'||GprmcBuff[i+2]>'9'||
	        GprmcBuff[i+3]<'0'||GprmcBuff[i+3]>'9'||
	        GprmcBuff[i+4]!='.'||
	        GprmcBuff[i+5]<'0'||GprmcBuff[i+5]>'9')
	        return;      
	      Speed = (GprmcBuff[i+1]-'0')*1000+(GprmcBuff[i+2]-'0')*100+(GprmcBuff[i+3]-'0')*10+(GprmcBuff[i+5]-'0'); /*ELARGE 10*/
	    }	
	    else
	    if(GprmcBuff[i+3]=='.')
	    {
	      if(GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
	        GprmcBuff[i+2]<'0'||GprmcBuff[i+2]>'9'||
	        GprmcBuff[i+3]!='.'||
	        GprmcBuff[i+4]<'0'||GprmcBuff[i+4]>'9')
	        return;      
	      Speed = (GprmcBuff[i+1]-'0')*100+(GprmcBuff[i+2]-'0')*10+(GprmcBuff[i+4]-'0'); /*ELARGE 10*/
	    }	
	    else
	    if(GprmcBuff[i+2]=='.')
	    {
	       if(GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
	       GprmcBuff[i+2]!='.'||
	       GprmcBuff[i+3]<'0'||GprmcBuff[i+3]>'9')
	       return;      
	       Speed = (GprmcBuff[i+1]-'0')*10+(GprmcBuff[i+3]-'0'); /*ELARGE 10*/
	    }	
	    else
	    if(GprmcBuff[i+1]==',' && GprmcBuff[i+2] != '.' && GPSav==1)
	    {
	       Speed = 0;
	    }
        else
            return;

        JWDMode=JWD_DU;
	    
		sprintf(TP_UD,"Lat:");
        if(JWDMode==JWD_DU)   //度,如114。573124度
		{
	    
	      i= LatDeg;
		  j= (LatMin1*10000+LatMin2)/60;                   //33.4264  ==> 33*10000=330000+4264=334264/60=5571
		  k= (LatMin1*10000+LatMin2-j*60);       //(334264-5571X60)=4/60
          k=k*100/6;
		  if(k>=100)
		     sprintf(cmd,"%d.%d%d",i,j,k);
	      else
          {
      	     sprintf(cmd,"%d.%d0%d",i,j,k);
         
		  }

		}
		else
       	if(JWDMode==JWD_DMS) //度分秒 如114。27'34"
		{
    	  
		  i= LatDeg;     
          j= LatMin1;      //MIN 
		  k= LatMin2*60/10000;      //SEC

          sprintf(cmd,"%d %d'%d\"",i,j,k);


        }       	
        strcat(TP_UD, cmd);                               
        strcat(TP_UD, "\r\n");                               
        strcat(TP_UD, "Long:");                               

        if(JWDMode==JWD_DU)   //度,如114。573124度
		{
		  i= LonDeg;
		  j= (LonMin1*10000+LonMin2)/60;                   //33.4264  ==> 33*10000=330000+4264=334264/60=5571
		  k= (LonMin1*10000+LonMin2-j*60);       //(334264-5571X60)=4/60
          k=k*100/6;
		  if(k>=100)
		     sprintf(cmd,"%d.%d%d",i,j,k);
	      else
          {
      	     sprintf(cmd,"%d.%d0%d",i,j,k);
         
		  }
		}
		else
       	if(JWDMode==JWD_DMS) //度分秒 如114。27'34"
		{
		  i= LonDeg;     
          j= LonMin1;      //MIN 
		  k= LonMin2*60/10000;      //SEC
		  sprintf(cmd,"%d %d'%d\"",i,j,k);

        }       	
	
	    strcat(TP_UD, cmd);                               
        strcat(TP_UD, "\r\n");                               
        strcat(TP_UD, "Speed:");                               
        
		i= (Speed/10);
        j= Speed%10;   
        sprintf(cmd,"%d.%d",i,j);
       	strcat(TP_UD, cmd);                               
        strcat(TP_UD, "\r\n"); 

        sprintf(cmd,"%d-%d-%d",(int)xYear+2000,(int)xMonth,(int)xDay);
        strcat(TP_UD, cmd);                               
        strcat(TP_UD, "\r\n"); 

	    
        sprintf(cmd,"%d:%d:%d",(int)xHour+8,(int)xMin,(int)xSec);
        strcat(TP_UD, cmd);                               
        strcat(TP_UD, "\r\n"); 



		GPSns = ((GprmcBuff[i+10]=='N')? 1:0);
        GPSew = ((GprmcBuff[i+23]=='E')? 1:0);
        
        GPSReady = TRUE;
     
}	


void ParseNMEA0183(uchar* GpsBuff)
{
        
       
	    if(strncmp(GpsBuff, "$GPRMC",5)==0)
        {

/*jiuwang data format:*/	
/*      $GPRMC,090058.01,A,2233.4264,N,11406.1970,E,000.0,000.0,041206,002.1,W,A*29*/
            if(GpsBuff[6]==',')
		    {
		       ParseGPRMC(GpsBuff);
            } 
           
        }
	

}       



void ReadGPS(void)
{
     int i;
     uchar retry;
#ifdef DEBUG_GPS    
     ParseNMEA0183(debug_gps);

#else
     //if(GPS_UART1_RDY==FALSE) return NULL; 
     
	 retry=250;
     i=0;
     while(retry--)
     {  
       if((m_Buffer[i]=getdp310())=='$') break;
     
	 }       
     
     if(retry!=0)
     {
          while(1)
          {
              m_Buffer[++i]=getbyte1();
              if(m_Buffer[i-1]=='\r' &&  m_Buffer[i]=='\n') break;       
              else if(i>100)break;
                     
          }
     }
     

     if(m_Buffer[0]=='$') 
     {
          ParseNMEA0183(m_Buffer);
         //gsmSendMessage();
	   #ifdef DEBUG  
		 for(i=0;i<100;i++)
		 {
            if(m_Buffer[i-1]=='\r' &&  m_Buffer[i]=='\n')
       	    {
               
               m_Buffer[i+1]=0;     
			   putstring(m_Buffer);
	  		   break;
			}
              
		 }
        #endif 
         m_Buffer[0]=NULL; 
     }

#endif

     
}






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -