📄 main.lst
字号:
301 1 byte i,j,cc,Len;
302 1 byte Pt; //分析信息指针
303 1
C51 COMPILER V7.10 MAIN 05/03/2007 10:20:04 PAGE 6
304 1 SMS_INFO pdata *Info = &pData[0];
305 1
306 1
307 1 SCON= 0X50; //定议串口
308 1 TMOD=0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装) */
309 1 PCON=0X80; //波特率加倍
310 1
311 1 TR0=0;
312 1 TF0=0;
313 1 TH0 =256-80; //用IO模拟的串口速率为 19200.
314 1 TL0=TH0;
315 1 ET0=1; //允许定时器0中断
316 1
317 1 TH1 = 0XF6; //单片机的串口速度为9600,用于接收GPS数据.
318 1 TL1 = 0XF6;
319 1 TR1 = 1; //启动定时器1
320 1 ES = 1; //允许串口中断
321 1
322 1 EA=1; //开总中断
323 1 delay = 0;
324 1
325 1 sector_erase(0x2800);
326 1
327 1 while(1)
328 1 {
329 2
330 2 #ifdef DEBUG_SMS
331 2 putch('A');
332 2 #endif
333 2 memset(pData,0,256);
334 2 Len =SendAT("ATE0",ACK_OK,pData+150);
335 2 if(Len>=0X80) break; //开机是如果未接上SMS模块,则一直等待
336 2
337 2 }
338 1
339 1 // EEPROM用4扇区可用.
340 1 /*
341 1 0--14 为密码
342 1 15--39 为手机号.
343 1 40--59为 管理者名字
344 1
345 1 60为 BCC
346 1 61,62为 55,66
347 1
348 1 */
349 1 cc = 0;
350 1 for(i=0;i<60;i++)
351 1 cc +=byte_verify(0x2E00+i);
352 1
353 1 if(byte_verify(0x2E00+60)!=cc ||byte_verify(0x2E00+61)!=0x55 || byte_verify(0x2E00+62)!=0x66)
354 1 {
355 2 putch('B');
356 2 sector_erase(0x2E00); //把旧数据擦除
357 2 memset(&pData[0],0xff,100);
358 2 for(i=0;i<6;i++)
359 2 pData[i]='8'; //默认密码为 888888
360 2 pData[6]=0;
361 2 memcpy(pData+15,"0D91683156909013F4",19);
362 2
363 2 memcpy(pData+40,"Hello",6);
364 2 Len = 0;
365 2 for(i=0;i<60;i++)
C51 COMPILER V7.10 MAIN 05/03/2007 10:20:04 PAGE 7
366 2 Len +=pData[i];
367 2 pData[60] =Len;
368 2 pData[61] =0x55;
369 2 pData[62] =0x66;
370 2 for(i=0;i<63;i++)
371 2 byte_program((0x2E00+i),pData[i]);
372 2 }
373 1
374 1 else
375 1 {
376 2 for(i=0;i<63;i++)
377 2 {
378 3 pData[i] =byte_verify(0x2E00 +i);
379 3 putch(pData[i]);
380 3 }
381 2
382 2 }
383 1
384 1
385 1 sendSMS(pData+15,"How Are You Owner !"); //开机时发一条短信报告.
386 1
387 1 REN = 1;
388 1 while(1)
389 1 {
390 2 REN = 1;
391 2 delay++;
392 2 if(delay>=600000L) //读短信
393 2 {
394 3 REN = 0;
395 3 Len=0;
396 3 LongDataFlag = 0;
397 3 memset(pData,0,256);
398 3 Len =SendAT("ATE0",ACK_OK,pData);
399 3 if(cmp(pData,"OK")==0XFF)
400 3 goto NoMobil;
401 3
402 3
403 3
404 3 putch('O');
405 3 putch('K');
406 3 putch(0x0d);
407 3 putch(0x0a);
408 3
409 3
410 3 LongDataFlag =0;
411 3 memset(pData,0,256);
412 3
413 3 SendAT("AT+CMGL=0",ACK_OK,pData);
414 3 /*
415 3 if(CPL)
416 3 {
417 3 CPL=0;
418 3 SendAT("AT+CMGR=6",ACK_OK,pData); //密码 888888 设置手机为 13650909314
419 3 }
420 3 else
421 3 {
422 3 CPL =1;
423 3 SendAT("AT+CMGR=7",ACK_OK,pData); //旧密码 888888 更改密码为456ABCJIE
424 3 }
425 3 */
426 3 Pt =cmp(pData,"+CMG");
427 3 if(Pt==0xff) goto NoMobil;
C51 COMPILER V7.10 MAIN 05/03/2007 10:20:04 PAGE 8
428 3 {
429 4 for(i=0;i<256;i++)
430 4 {
431 5 if(pData[i]==0) break;
432 5 putch(pData[i]);
433 5 }
434 4
435 4 putch('N');
436 4 putch('e');
437 4 putch('w');
438 4 putch('S');
439 4 putch('M');
440 4 putch('S');
441 4 putch(0x0d);
442 4 putch(0x0a);
443 4
444 4 //短消息的第9个字节开始为 消息索引
445 4 Info->Index[0] = 0;
446 4 Info->Index[1] = 0;
447 4 Info->Index[2] = 0;
448 4 Info->Index[3] = 0;
449 4
450 4 if(pData[Pt+7]!=0x2C)
451 4 {
452 5 Info->Index[0] = pData[Pt+7];
453 5 if(pData[Pt+8]!=0x2C)
454 5 {
455 6 Info->Index[1] = pData[Pt+8];
456 6 if(pData[Pt+9]!=0x2C)
457 6 {
458 7 Info->Index[2] = pData[Pt+9];
459 7 }
460 6
461 6 }
462 5 }
463 4
464 4
465 4
466 4 putch('I');
467 4 putch('n');
468 4 putch('d');
469 4 putch('e');
470 4 putch('x');
471 4 putch(0x0d);
472 4 putch(0x0a);
473 4 for(i=0;i<4;i++)
474 4 {
475 5 if(Info->Index[i]!=0)
476 5 putch(Info->Index[i]);
477 5 }
478 4
479 4
480 4
481 4 for(Pt=9;Pt<25;Pt++)
482 4 {
483 5 if(pData[Pt]==0x0A) //换行,信息开始.
484 5 break;
485 5 }
486 4 if(Pt==25)
487 4 {
488 5 putch('S');
489 5 putch('M');
C51 COMPILER V7.10 MAIN 05/03/2007 10:20:04 PAGE 9
490 5 putch('S');
491 5 putch('e');
492 5 putch('r');
493 5 putch('r');
494 5 putch('o');
495 5 putch('r');
496 5 putch(0x0d);
497 5 putch(0x0a);
498 5 goto NoMobil;
499 5 }
500 4 //
501 4
502 4 //判断短信中心的数据长度.
503 4 Pt +=1;
504 4 Len =pData[Pt]<=0x39 ? pData[Pt]-0x30:pData[Pt]-0x41+10;
505 4 Len =(Len<<4) + (pData[Pt+1]<=0x39 ? pData[Pt+1]-0x30:pData[Pt+1]-0x41+10);
506 4 Len +=2;
507 4 Len =Len <<1; //乘以2,为字节总数.
508 4 Pt +=Len; //Pt指向目的手机的开始地址.
509 4
510 4 //判断目的手机的号码数
511 4 Len =pData[Pt]<=0x39 ? pData[Pt]-0x30:pData[Pt]-0x41+10;
512 4 Len =(Len<<4) + (pData[Pt+1]<=0x39 ? pData[Pt+1]-0x30:pData[Pt+1]-0x41+10);
513 4 //如果码号数为奇数,要加1成为偶数.
514 4 i = Len;
515 4 if(i&0x01) Len +=1;
516 4 putch('t');
517 4 putch('e');
518 4 putch('l');
519 4 putch(0x0d);
520 4 putch(0x0a);
521 4 //把目的手机号保存下来.
522 4
523 4 for(i=Pt;i<Pt+Len+4;i++)
524 4 {
525 5 Info->TelNum[i-Pt] =pData[i];
526 5 }
527 4
528 4 Info->TelNum[i-Pt] =0; //手机号结束符
529 4
530 4 //指针指向手机号码后的第一个字节.
531 4 Pt = i;
532 4 for(i=0;i<Len+4;i++)
533 4 putch(Info->TelNum[i]);
534 4
535 4 if(pData[Pt+2]=='0' && pData[Pt+3]=='0') //是ASC码短信.7-bit编码
536 4 {
537 5 SMS_TYPE=0;
538 5 }
539 4
540 4 else if(pData[Pt+2]=='0' && pData[Pt+3]=='8')
541 4 {
542 5 SMS_TYPE=1;
543 5 }
544 4
545 4 else //只处理PDU格式和ASC码格式.其它不处理
546 4 goto InfoEnd;
547 4
548 4
549 4 Pt +=18; //短信息数据长度字节.
550 4
551 4 // putch(pData[Pt]); //转换成ASC码后的字符.
C51 COMPILER V7.10 MAIN 05/03/2007 10:20:04 PAGE 10
552 4 // putch(pData[Pt+1]); //短信字符数
553 4
554 4 Len =pData[Pt]<=0x39 ? pData[Pt]-0x30:pData[Pt]-0x41+10;
555 4 Len =(Len<<4) + (pData[Pt+1]<=0x39 ? pData[Pt+1]-0x30:pData[Pt+1]-0x41+10);
556 4 Len = Len<<1; //乘以2,为信息字节总数.
557 4 Pt+=2; //指向信息开始地址.
558 4
559 4
560 4 putch('I');
561 4 putch('n');
562 4 putch('f');
563 4 putch('o');
564 4
565 4 if(SMS_TYPE==0) //ASC码,要用7-BIT解码解出内容
566 4 {
567 5 i = Pt;
568 5 j = Pt;
569 5 while(1)
570 5 {
571 6 if(pData[i]==0x0D || pData[i]==0x0A) break;
572 6 cc =pData[i]<=0x39 ? pData[i]-0x30:pData[i]-0x41+10;
573 6 cc =(cc<<4) + (pData[i+1]<=0x39 ? pData[i+1]-0x30:pData[i+1]-0x41+10);
574 6 pData[j]=cc;
575 6 i +=2;
576 6 j +=1;
577 6 }
578 5
579 5 Len =gsmDecode7bit(&pData[Pt],&Info->SMS_text[0],j-Pt);
580 5 Info->SMS_text[Len] = 0;
581 5 putch('A');
582 5 }
583 4 else //PDU码,解出内容
584 4 {
585 5 j = 0;
586 5 for(i=0;i<Len;)
587 5 {
588 6 i+=2;
589 6 cc =pData[Pt+i]<=0x39 ? pData[Pt+i]-0x30:pData[Pt+i]-0x41+10;
590 6 i+=1;
591 6 cc =(cc<<4) + (pData[Pt+i]<=0x39 ? pData[Pt+i]-0x30:pData[Pt+i]-0x41+10);
592 6 Info->SMS_text[j] = cc;
593 6 i+=1;
594 6 j+=1;
595 6 }
596 5 Info->SMS_text[j] =0;
597 5 Len = j;
598 5 putch('P');
599 5 }
600 4
601 4 putch(0x0d);
602 4 putch(0x0a);
603 4
604 4 putch('T');
605 4 putch('E');
606 4 putch('X');
607 4 putch('T');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -