📄 gps.lst
字号:
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 + -