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

📄 gps.lst

📁 这是用W77E58编写的控制GSM模块
💻 LST
📖 第 1 页 / 共 5 页
字号:
C51 COMPILER V7.50   GPS                                                                   04/04/2007 15:49:17 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE GPS
OBJECT MODULE PLACED IN gps.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE gps.c BROWSE DEBUG OBJECTEXTEND CODE

line level    source

   1          #include <w77e58.h>
   2          #include "global.h"
   3          #include "io.h"
   4          #include "serial.h"
   5          #include "timer.h"
*** WARNING C258 IN LINE 4 OF TIMER.H: 'd': mspace on parameter ignored
*** WARNING C258 IN LINE 5 OF TIMER.H: 'd': mspace on parameter ignored
   6          #include "gps.h"
   7          
   8          enum
   9          {
  10            LONLAT_DMM=1,    /*LONGITUDE LATITUDE DEGREE MINUTE MINUTE/10000 format */
  11            LONLAT_DMS,      /*LONGITUDE LATITUDE DEGREE MINUTE SECOND format */
  12                  
  13          };
  14          
  15          #define GPRMC_TIME             1
  16          #define GPRMC_AV_STATUS        2
  17          #define GPRMC_NS_STATUS        4
  18          #define GPRMC_EW_STATUS        6
  19          
  20          
  21          #define GPRMC_LONGITUDE        5
  22          #define GPRMC_LATTUDE          3
  23          #define GPRMC_SPEED            7
  24          #define GPRMC_ANGLE            8
  25          #define GPRMC_YMD              9
  26          
  27          #ifdef DEBUG_GPS
  28          code uchar * debug_gps ="$GPRMC,090058.01,A,2233.4264,N,11406.1970,E,000.0,000.0,041206,002.1,W,A*29";
  29          #endif
  30          
  31          bit             GPSReady;
  32          bit             GPSav;           //1 = A
  33          bit             GPSns;           //1 = N 
  34          bit             GPSew;           //1 = E
  35          uchar    xdata  JWDMode;
  36          UINT32   xdata  Speed;
  37          UINT32   xdata  LonDeg,LonMin1,LonMin2,LatDeg,LatMin1,LatMin2;
  38          UINT32   xdata  xYear,xMonth,xDay;
  39          UINT32   xdata  xHour,xMin,xSec;
  40          
  41          enum
  42          {
  43             JWD_DU=0,
  44             JWD_DMS,
  45             JWD_DMM,
  46          };
  47          
  48          
  49          uchar xdata m_Buffer[100];
  50          
  51          
  52          
  53          extern char xdata TP_UD[];
C51 COMPILER V7.50   GPS                                                                   04/04/2007 15:49:17 PAGE 2   

  54          
  55          
  56          //void ParseGPRMC(uchar xdata* GprmcBuff);
  57          //void ParseNMEA0183(uchar xdata* GpsBuff);
  58          
  59          int Split(uchar* str,uchar dot)
  60          {
  61   1            int i;
  62   1            uchar dot_count;
  63   1      
  64   1            dot_count=0;
  65   1       
  66   1            for(i=0;i<250;i++)
  67   1            {
  68   2                if(str[i]==',')
  69   2                {
  70   3                   dot_count++;
  71   3                }
  72   2                if(str[i]=='\r'&&str[i+1]=='\n') break;       
  73   2                if(dot_count==dot) return i;
  74   2              
  75   2            } 
  76   1            return 0;   
  77   1           
  78   1      }
  79          
  80          
  81          
  82          
  83          void GPSModule_init(void)
  84          {
  85   1      
  86   1           GPS_EN = HIGH;
  87   1               delay_ms(20);
  88   1           GPS_RESET=HIGH;
  89   1           delay_ms(20);
  90   1           GPS_RESET=LOW;
  91   1           delay_ms(100);
  92   1           GPS_RESET=HIGH;
  93   1      
  94   1      }
  95          
  96          
  97          UINT32 GetGpsInfoDmm(UINT32 degree,UINT32 minute1,UINT32 minute2,UINT8 mode)
  98          {
  99   1      
 100   1                  if(mode==LONLAT_DMM)
 101   1                     return degree*600000+minute1*10000+minute2;
 102   1                  else
 103   1                      return degree*600000+minute1*10000+minute2*10000/60;
 104   1                  
 105   1      }
 106          
 107          extern char xdata cmd[];                       // 命令串     
 108          
 109          
 110          void ParseGPRMC(uchar* GprmcBuff)
 111          {
 112   1              int   i,j,k;
 113   1                      UINT32   xdata Longitude;
 114   1              UINT32   xdata Latitude;
 115   1          
C51 COMPILER V7.50   GPS                                                                   04/04/2007 15:49:17 PAGE 3   

 116   1                  
 117   1                      i=Split(GprmcBuff,GPRMC_TIME);   /*GPRMC_TIME =1*/
 118   1              if(i==0) return;
 119   1                 
 120   1              /*      检查时间数据,eg:204700,A,*/
 121   1              if(GprmcBuff[i+10]==',')  //16
 122   1              {
 123   2                      
 124   2                if(GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
 125   2                    GprmcBuff[i+2]<'0'||GprmcBuff[i+2]>'9'||
 126   2                    GprmcBuff[i+3]<'0'||GprmcBuff[i+3]>'9'||
 127   2                    GprmcBuff[i+4]<'0'||GprmcBuff[i+4]>'9'||
 128   2                    GprmcBuff[i+5]<'0'||GprmcBuff[i+5]>'9'||
 129   2                    GprmcBuff[i+6]<'0'||GprmcBuff[i+6]>'9'||
 130   2                    GprmcBuff[i+7]!='.'||
 131   2                    GprmcBuff[i+8]<'0'||GprmcBuff[i+8]>'9'||
 132   2                    GprmcBuff[i+9]<'0'||GprmcBuff[i+9]>'9')
 133   2                    return;
 134   2                
 135   2              
 136   2              }       
 137   1              else
 138   1              {
 139   2                  if( GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
 140   2                          GprmcBuff[i+2]<'0'||GprmcBuff[i+2]>'9'||
 141   2                          GprmcBuff[i+3]<'0'||GprmcBuff[i+3]>'9'||
 142   2                          GprmcBuff[i+4]<'0'||GprmcBuff[i+4]>'9'||
 143   2                          GprmcBuff[i+5]<'0'||GprmcBuff[i+5]>'9'||
 144   2                          GprmcBuff[i+6]<'0'||GprmcBuff[i+6]>'9'||
 145   2                          GprmcBuff[i+7]!='.'||
 146   2                          GprmcBuff[i+8]<'0'||GprmcBuff[i+8]>'9'||
 147   2                          GprmcBuff[i+9]<'0'||GprmcBuff[i+9]>'9'||
 148   2                          GprmcBuff[i+10]<'0'||GprmcBuff[i+10]>'9')
 149   2                      return; 
 150   2           
 151   2           
 152   2           
 153   2              }       
 154   1              xHour=(GprmcBuff[i+1]-'0')*10+(GprmcBuff[i+2]-'0');
 155   1                  xMin =(GprmcBuff[i+3]-'0')*10+(GprmcBuff[i+4]-'0');
 156   1                  xSec =(GprmcBuff[i+5]-'0')*10+(GprmcBuff[i+6]-'0');
 157   1      
 158   1                      i=Split(GprmcBuff,GPRMC_AV_STATUS);   
 159   1              if(i==0) return;
 160   1              if(GprmcBuff[i+1]!='A'&& GprmcBuff[i+1]!='V')return; 
 161   1              
 162   1                      GPSav = ((GprmcBuff[i+1]=='A')? 1:0); 
 163   1                      
 164   1              //if(GPSav=='V')return; 
 165   1      
 166   1        
 167   1              /*      检查经度数据,eg:11709.432,W,*/
 168   1              i=Split(GprmcBuff,GPRMC_LONGITUDE);   
 169   1              if(i==0) return;
 170   1                  if( GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
 171   1                      GprmcBuff[i+2]<'0'||GprmcBuff[i+2]>'9'||
 172   1                      GprmcBuff[i+3]<'0'||GprmcBuff[i+3]>'9'||
 173   1                      GprmcBuff[i+4]<'0'||GprmcBuff[i+4]>'9'||
 174   1                      GprmcBuff[i+5]<'0'||GprmcBuff[i+5]>'9'||
 175   1                      GprmcBuff[i+6]!='.'||
 176   1                      GprmcBuff[i+7]<'0'||GprmcBuff[i+7]>'9'||
 177   1                      GprmcBuff[i+8]<'0'||GprmcBuff[i+8]>'9'||
C51 COMPILER V7.50   GPS                                                                   04/04/2007 15:49:17 PAGE 4   

 178   1                      GprmcBuff[i+9]<'0'||GprmcBuff[i+9]>'9'||
 179   1                      GprmcBuff[i+10]<'0'||GprmcBuff[i+10]>'9')
 180   1                  return;
 181   1      
 182   1                  LonDeg=(GprmcBuff[i+1]-'0')*100+
 183   1                                         (GprmcBuff[i+2]-'0')*10+
 184   1                                         GprmcBuff[i+3]-'0';
 185   1              LonMin1=(GprmcBuff[i+4]-'0')*10+
 186   1                                   GprmcBuff[i+5]-'0';  
 187   1              LonMin2=(GprmcBuff[i+7]-'0')*1000+
 188   1                                   (GprmcBuff[i+8]-'0')*100+
 189   1                                   (GprmcBuff[i+9]-'0')*10+
 190   1                                   GprmcBuff[i+10]-'0';
 191   1      
 192   1      
 193   1            /*        检查纬度数据,eg:3403.868,N,*/
 194   1             i=Split(GprmcBuff,GPRMC_LATTUDE);   
 195   1             if(i==0) return;
 196   1             if(      GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
 197   1                      GprmcBuff[i+2]<'0'||GprmcBuff[i+2]>'9'||
 198   1                      GprmcBuff[i+3]<'0'||GprmcBuff[i+3]>'9'||
 199   1                      GprmcBuff[i+4]<'0'||GprmcBuff[i+4]>'9'||
 200   1                      GprmcBuff[i+5]!='.'||
 201   1                      GprmcBuff[i+6]<'0'||GprmcBuff[i+6]>'9'||
 202   1                      GprmcBuff[i+7]<'0'||GprmcBuff[i+7]>'9'||
 203   1                      GprmcBuff[i+8]<'0'||GprmcBuff[i+8]>'9'||
 204   1                      GprmcBuff[i+9]<'0'||GprmcBuff[i+9]>'9')
 205   1              return;         
 206   1      
 207   1              LatDeg=(GprmcBuff[i+1]-'0')*10+
 208   1                                         GprmcBuff[i+2]-'0';
 209   1              LatMin1=(GprmcBuff[i+3]-'0')*10+
 210   1                                   GprmcBuff[i+4]-'0';  
 211   1              LatMin2=(GprmcBuff[i+6]-'0')*1000+
 212   1                                   (GprmcBuff[i+7]-'0')*100+
 213   1                                   (GprmcBuff[i+8]-'0')*10+
 214   1                                   GprmcBuff[i+9]-'0';
 215   1      
 216   1              i=Split(GprmcBuff,GPRMC_YMD);   
 217   1              if(i==0) return;
 218   1              
 219   1              if(     GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
 220   1                      GprmcBuff[i+2]<'0'||GprmcBuff[i+2]>'9'||
 221   1                      GprmcBuff[i+3]<'0'||GprmcBuff[i+3]>'9'||
 222   1                      GprmcBuff[i+4]<'0'||GprmcBuff[i+4]>'9'||
 223   1                      GprmcBuff[i+5]<'0'||GprmcBuff[i+5]>'9'||
 224   1                      GprmcBuff[i+6]<'0'||GprmcBuff[i+6]>'9')
 225   1                  return;
 226   1            
 227   1              xYear =(GprmcBuff[i+5]-'0')*10+GprmcBuff[i+6]-'0';
 228   1                  xMonth=(GprmcBuff[i+3]-'0')*10+GprmcBuff[i+4]-'0';
 229   1                  xDay  =(GprmcBuff[i+1]-'0')*10+GprmcBuff[i+2]-'0';
 230   1      
 231   1      
 232   1              i=Split(GprmcBuff,GPRMC_SPEED);   
 233   1              if(i==0) return;
 234   1                  if(GprmcBuff[i+4]=='.')
 235   1                  {
 236   2                   if(GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
 237   2                      GprmcBuff[i+2]<'0'||GprmcBuff[i+2]>'9'||
 238   2                      GprmcBuff[i+3]<'0'||GprmcBuff[i+3]>'9'||
 239   2                      GprmcBuff[i+4]!='.'||
C51 COMPILER V7.50   GPS                                                                   04/04/2007 15:49:17 PAGE 5   

 240   2                      GprmcBuff[i+5]<'0'||GprmcBuff[i+5]>'9')
 241   2                      return;      
 242   2                    Speed = (GprmcBuff[i+1]-'0')*1000+(GprmcBuff[i+2]-'0')*100+(GprmcBuff[i+3]-'0')*10+(GprmcBuff[i+5]-
             -'0'); /*ELARGE 10*/
 243   2                  }   
 244   1                  else
 245   1                  if(GprmcBuff[i+3]=='.')
 246   1                  {
 247   2                    if(GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
 248   2                      GprmcBuff[i+2]<'0'||GprmcBuff[i+2]>'9'||
 249   2                      GprmcBuff[i+3]!='.'||
 250   2                      GprmcBuff[i+4]<'0'||GprmcBuff[i+4]>'9')
 251   2                      return;      
 252   2                    Speed = (GprmcBuff[i+1]-'0')*100+(GprmcBuff[i+2]-'0')*10+(GprmcBuff[i+4]-'0'); /*ELARGE 10*/
 253   2                  }   
 254   1                  else
 255   1                  if(GprmcBuff[i+2]=='.')
 256   1                  {
 257   2                     if(GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
 258   2                     GprmcBuff[i+2]!='.'||
 259   2                     GprmcBuff[i+3]<'0'||GprmcBuff[i+3]>'9')
 260   2                     return;      
 261   2                     Speed = (GprmcBuff[i+1]-'0')*10+(GprmcBuff[i+3]-'0'); /*ELARGE 10*/
 262   2                  }   
 263   1                  else
 264   1                  if(GprmcBuff[i+1]==',' && GprmcBuff[i+2] != '.' && GPSav==1)
 265   1                  {
 266   2                     Speed = 0;
 267   2                  }
 268   1              else
 269   1                  return;
 270   1      
 271   1              JWDMode=JWD_DU;
 272   1                  
 273   1                      sprintf(TP_UD,"Lat:");
 274   1              if(JWDMode==JWD_DU)   //度,如114。573124度
 275   1                      {
 276   2                  
 277   2                    i= LatDeg;
 278   2                        j= (LatMin1*10000+LatMin2)/60;                   //33.4264  ==> 33*10000=330000+4264=334264/60=5571
 279   2                        k= (LatMin1*10000+LatMin2-j*60);       //(334264-5571X60)=4/60
 280   2                k=k*100/6;
 281   2                        if(k>=100)
 282   2                           sprintf(cmd,"%d.%d%d",i,j,k);
 283   2                    else
 284   2                {
 285   3                   sprintf(cmd,"%d.%d0%d",i,j,k);
 286   3               
 287   3                        }
 288   2      
 289   2                      }
 290   1                      else
 291   1              if(JWDMode==JWD_DMS) //度分秒 如114。27'34"
 292   1                      {
 293   2                
 294   2                        i= LatDeg;     
 295   2                j= LatMin1;      //MIN 
 296   2                        k= LatMin2*60/10000;      //SEC

⌨️ 快捷键说明

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