📄 1602gps.lst
字号:
192 3 while(!KEY1);
193 3 delayms(10);
194 3 return(1);
195 3 }
196 2 }
197 1 return(0);
198 1 }
199
200 //系统初始化
201 void sys_init() {
202 1 unsigned char i;
203 1 SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */
204 1 TMOD = 0x21; /* TMOD: timer 1, mode 2, 8-bit reload */
205 1 TH1 = 0xfa; /* TH1: reload value for 4800 baud @ 11.059MHz */
206 1 if(SPD_TYPE){
207 2 spd_type=1; //速度单位km/h
208 2 }else{
209 2 spd_type=0; //速度单位knot
210 2 }
211 1 TR1 = 1; /* TR1: timer 1 run */
212 1 LCD_init(); //初始化LCD
213 1 LCD_write_string(0,0,"GPS&GSM TANKING");
214 1 //显示版权信息
215 1 LCD_write_string(0,1,"Design by 0523-1");
216 1 for(i=1;i<10;i++){
217 2 delayms(250);
218 2 }
219 1 LCD_cls();
220 1 LCD_write_string(0,0," Faster Higher");
221 1 LCD_write_string(0,1," Stronger!!! ");
222 1 for(i=1;i<10;i++){
223 2 delayms(250);
224 2 }
225 1 LCD_cls();
226 1 IE=0x90; //开总中断、串口中断
227 1 }
228
229 //串口接收中断
230 void uart(void) interrupt 4
231 {
232 1 unsigned char tmp;
233 1 if(RI){
234 2 tmp=SBUF;
235 2 switch(tmp){
236 3 case '$':
237 3 cmd_number=0; //命令类型清空
238 3 mode=1; //接收命令模式
239 3 byte_count=0; //接收位数清空
240 3 break;
241 3 case ',':
C51 COMPILER V6.23a 1602GPS 06/16/2008 13:14:49 PAGE 5
242 3 seg_count++; //逗号计数加1
243 3 byte_count=0;
244 3 break;
245 3 case '*':
246 3 switch(cmd_number){
247 4 case 1:
248 4 buf_full|=0x01;
249 4 break;
250 4 case 2:
251 4 buf_full|=0x02;
252 4 break;
253 4 case 3:
254 4 buf_full|=0x04;
255 4 break;
256 4 }
257 3 mode=0;
258 3 break;
259 3 default:
260 3 if(mode==1){
261 4 //命令种类判断
262 4 cmd[byte_count]=tmp; //接收字符放入类型缓存
263 4 if(byte_count>=4){ //如果类型数据接收完毕,判断类型
264 5 if(cmd[0]=='G'){
265 6 if(cmd[1]=='P'){
266 7 if(cmd[2]=='G'){
267 8 if(cmd[3]=='G'){
268 9 if(cmd[4]=='A'){
269 10 cmd_number=1;
270 10 mode=2;
271 10 seg_count=0;
272 10 byte_count=0;
273 10 }
274 9 }
275 8 else if(cmd[3]=='S'){
276 9 if(cmd[4]=='V'){
277 10 cmd_number=2;
278 10 mode=2;
279 10 seg_count=0;
280 10 byte_count=0;
281 10 }
282 9 }
283 8 }
284 7 else if(cmd[2]=='R'){
285 8 if(cmd[3]=='M'){
286 9 if(cmd[4]=='C'){
287 10 cmd_number=3;
288 10 mode=2;
289 10 seg_count=0;
290 10 byte_count=0;
291 10 }
292 9 }
293 8 }
294 7 }
295 6 }
296 5 }
297 4 }
298 3 else if(mode==2){
299 4 //接收数据处理
300 4 switch (cmd_number){
301 5 case 1: //类型1数据接收。GPGGA
302 5 switch(seg_count){
303 6 case 2: //纬度处理
C51 COMPILER V6.23a 1602GPS 06/16/2008 13:14:49 PAGE 6
304 6 if(byte_count<9){
305 7 WD[byte_count]=tmp;
306 7 }
307 6 break;
308 6 case 3: //纬度方向处理
309 6 if(byte_count<1){
310 7 WD_a=tmp;
311 7 }
312 6 break;
313 6 case 4: //经度处理
314 6 if(byte_count<10){
315 7 JD[byte_count]=tmp;
316 7 }
317 6 break;
318 6 case 5: //经度方向处理
319 6 if(byte_count<1){
320 7 JD_a=tmp;
321 7 }
322 6 break;
323 6 case 6: //定位判断
324 6 if(byte_count<1){
325 7 lock=tmp;
326 7 }
327 6 break;
328 6 case 7: //定位使用的卫星数
329 6 if(byte_count<2){
330 7 use_sat[byte_count]=tmp;
331 7 }
332 6 break;
333 6 case 9: //高度处理
334 6 if(byte_count<6){
335 7 high[byte_count]=tmp;
336 7 }
337 6 break;
338 6 }
339 5 break;
340 5 case 2: //类型2数据接收。GPGSV
341 5 switch(seg_count){
342 6 case 3: //天空中的卫星总数
343 6 if(byte_count<2){
344 7 total_sat[byte_count]=tmp;
345 7 }
346 6 break;
347 6 }
348 5 break;
349 5 case 3: //类型3数据接收。GPRMC
350 5 switch(seg_count){
351 6 case 1:
352 6 if(byte_count<6){ //时间处理
353 7 time[byte_count]=tmp;
354 7 }
355 6 break;
356 6 case 7: //速度处理
357 6 if(byte_count<5){
358 7 speed[byte_count]=tmp;
359 7 }
360 6 break;
361 6 case 8: //方位角处理
362 6 if(byte_count<5){
363 7 angle[byte_count]=tmp;
364 7 }
365 6 break;
C51 COMPILER V6.23a 1602GPS 06/16/2008 13:14:49 PAGE 7
366 6 }
367 5 break;
368 5 }
369 4 }
370 3 byte_count++; //接收数位加1
371 3 break;
372 3 }
373 2 }
374 1 RI=0;
375 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1787 ----
CONSTANT SIZE = 133 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 63 11
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -