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

📄 main.lst

📁 单片机通过控制SIM300C 短信模块读GPS 数据
💻 LST
📖 第 1 页 / 共 4 页
字号:
 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 + -