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

📄 sms.lst

📁 用51单片机收发短消息的源程序,有祥细的注释说明.
💻 LST
📖 第 1 页 / 共 3 页
字号:
 462   2            // 内容合法
 463   2            // 处理消息内容中的操作指令
 464   2            // AA 修改密码
 465   2            // AB 修改短消息中新号码
 466   2              process_cmd();
 467   2              delay(2);
 468   2      
 469   2              // 合法后,给发送方返回一条短消息
 470   2              type = 4;
 471   2              buffzero(buff, 0, BUFF_SIZE);
 472   2              idx2 = 0;
 473   2      
 474   2              // 在BUFF中放置发送返回消息的AT指令的头
 475   2              // 要从INBUF中解析发送方的手机号码
 476   2              buff[idx2++]='A';
 477   2              buff[idx2++]='T';
 478   2              buff[idx2++]='+';
 479   2              buff[idx2++]='C';
 480   2              buff[idx2++]='M';
 481   2              buff[idx2++]='G';
 482   2              buff[idx2++]='S';
 483   2              buff[idx2++]='=';
 484   2              buff[idx2++]='\"';
 485   2              buff[idx2++]=/*'1'; /*/ inbuf[3];
 486   2              buff[idx2++]=/*'3'; /*/ inbuf[4];
 487   2              buff[idx2++]=/*'5'; /*/ inbuf[5];
 488   2              buff[idx2++]=/*'2'; /*/ inbuf[6];
 489   2              buff[idx2++]=/*'2'; /*/ inbuf[7];
C51 COMPILER V7.07   SMS                                                                   03/17/2004 17:22:20 PAGE 9   

 490   2              buff[idx2++]=/*'0'; /*/ inbuf[8];
 491   2              buff[idx2++]=/*'3'; /*/ inbuf[9];
 492   2              buff[idx2++]=/*'5'; /*/ inbuf[10];
 493   2              buff[idx2++]=/*'5'; /*/ inbuf[11];
 494   2              buff[idx2++]=/*'9'; /*/ inbuf[12];
 495   2              buff[idx2++]=/*'3'; /*/ inbuf[13];
 496   2              buff[idx2++]='\"';
 497   2              buff[idx2++]=0x0d;
 498   2              
 499   2          }
 500   1          // 手机号码无+86的情况下,INBUF第11为开始为消息内容    
 501   1          else if(buff[0] == inbuf[11]  // 无+86
 502   1            && buff[1] == inbuf[12]
 503   1            && buff[2] == inbuf[13]
 504   1            && buff[3] == inbuf[14]
 505   1            && buff[4] == inbuf[15]
 506   1            && buff[5] == inbuf[16]
 507   1              )
 508   1          {
 509   2            // 内容合法
 510   2            // 处理消息内容中的操作指令
 511   2            // AA 修改密码
 512   2            // AB 修改短消息中新号码      
 513   2              process_cmd();
 514   2              delay(2);
 515   2      
 516   2              // 合法后,给发送方返回一条短消息
 517   2              type = 4;
 518   2              buffzero(buff, 0, BUFF_SIZE);
 519   2              idx2 = 0;
 520   2      
 521   2              // 在BUFF中放置发送返回消息的AT指令的头
 522   2              // 要从INBUF中解析发送方的手机号码
 523   2              buff[idx2++]='A';
 524   2              buff[idx2++]='T';
 525   2              buff[idx2++]='+';
 526   2              buff[idx2++]='C';
 527   2              buff[idx2++]='M';
 528   2              buff[idx2++]='G';
 529   2              buff[idx2++]='S';
 530   2              buff[idx2++]='=';
 531   2              buff[idx2++]='\"';
 532   2              buff[idx2++]=/*'1'; /*/ inbuf[0];
 533   2              buff[idx2++]=/*'3'; /*/ inbuf[1];
 534   2              buff[idx2++]=/*'5'; /*/ inbuf[2];
 535   2              buff[idx2++]=/*'2'; /*/ inbuf[3];
 536   2              buff[idx2++]=/*'2'; /*/ inbuf[4];
 537   2              buff[idx2++]=/*'0'; /*/ inbuf[5];
 538   2              buff[idx2++]=/*'3'; /*/ inbuf[6];
 539   2              buff[idx2++]=/*'5'; /*/ inbuf[7];
 540   2              buff[idx2++]=/*'5'; /*/ inbuf[8];
 541   2              buff[idx2++]=/*'9'; /*/ inbuf[9];
 542   2              buff[idx2++]=/*'3'; /*/ inbuf[10];
 543   2              buff[idx2++]='\"';
 544   2              buff[idx2++]=0x0d;        
 545   2          }
 546   1          else
 547   1          {
 548   2               buffzero(inbuf, 0, INBUFF_SIZE);
 549   2               idx = 0;
 550   2          }
 551   1          
C51 COMPILER V7.07   SMS                                                                   03/17/2004 17:22:20 PAGE 10  

 552   1      }
 553          
 554          
 555          // 处理新接收到的短消息
 556          // 步骤:1> 从新到消息标记 +CMTI: "SM",1 中获取新消息的SIM卡中的位置
 557          //       2> 从SIM卡中读取新消息的内容
 558          //       3> 从SIM卡中删除已读的短消息
 559          //       4> 判断消息内容是否合法(密码是否正确)
 560          void process_recv_msg()
 561          {
 562   1          unsigned char k = 0, i = 0;
 563   1      
 564   1          for(k=0;k<idx;k++)
 565   1          {    
 566   2             // 确认新到消息标记  "SM",1
 567   2             // 并从中得到新到消息在SIM卡中的位置
 568   2             if( inbuf[k++] == ' '
 569   2                 && inbuf[k++] == '\"'
 570   2                 && inbuf[k++] == 'S'
 571   2                 && inbuf[k++] == 'M'
 572   2                 && inbuf[k++] == '\"'
 573   2                 && inbuf[k++] == ',')  // recved one new msg
 574   2             {
 575   3            // DATA2变化:从新消息到来的标志(放在inbuf中)判断到了"SM"字符,
 576   3            // 从而可以解析后跟的新消息在SIM卡中的存放位置        
 577   3                 date2 ++;
 578   3      
 579   3                 i = inbuf[k++];   // 新消息在SIM卡中的存放位置
 580   3                 read_msg(i);      // 从SIM卡中读取新到短消息 
 581   3                 delete_msg(i);    // 读取新消息内容后,将其从SIM卡中删除
 582   3                 is_legal_msg();   // 判断新消息内容是否合法
 583   3                                   // 合法后,消息操作类型type=4,可在主循环中作其他操作
 584   3                
 585   3                 break;
 586   3             }
 587   2          }
 588   1      }
 589          
 590          // 主函数
 591          void main(void)
 592          {
 593   1         unsigned char data k;
 594   1         unsigned char start = 0;
 595   1      
 596   1         delay(1);
 597   1          
 598   1      
 599   1             ///////////////////////////////////////////////////////
 600   1             // 初始化串口
 601   1             setup_t1();
 602   1             setup_ck();
 603   1             TR1=1;
 604   1             EA=1;
 605   1             ES=1;
 606   1      
 607   1             // 设置文本收发模式前,给设备充分的启动时间
 608   1             delay(3);
 609   1      
 610   1             // 设置为文本格式发送/接收短消息
 611   1             setcmgftxt();
 612   1      
 613   1             // delay
C51 COMPILER V7.07   SMS                                                                   03/17/2004 17:22:20 PAGE 11  

 614   1             delay(3);
 615   1      
 616   1             // 命令处理死循环
 617   1             while(1)
 618   1             {
 619   2               show();  // 在每次循环中刷新数码管显示,反映data1,data2,data3,data4的变化
 620   2      
 621   2               // delay
 622   2               delay(3);
 623   2      
 624   2               if(1 == send) // send=1 有新的短消息到达
 625   2               {
 626   3                   delay(2); // 延迟,保证接收中断已经读完所有的新到消息标志
 627   3                   process_recv_msg(); // 处理新到消息
 628   3                   delay(2);
 629   3      
 630   3                   // idx>0   如果消息内容不为空
 631   3                   // 4==type 且消息内容是合法的
 632   3                   // 则向发送消息的手机返回一个消息
 633   3                   if(idx > 0 && 4 == type) // send msg
 634   3                 {
 635   4                          date3 ++;    // DATA3变化:收到的新消息是合法消息
 636   4         
 637   4                               k = 0;
 638   4                               // 首先向串口输出发送短消息AT指令的头,如:AT+CMGS="13522035593"<CR>
 639   4                         while(1)
 640   4                         {
 641   5                             if(k>BUFF_SIZE || buff[k] == 0)
 642   5                                  break;
 643   5                             SBUF = buff[k++]; delay(1);
 644   5                         }
 645   4                           
 646   4                               // 返回的消息内容忽略掉对方的手机号码
 647   4                if(1 == hasplus86)
 648   4                    start = 20;
 649   4                else
 650   4                    start = 17;
 651   4                    
 652   4                // 向串口输出发送短消息的内容    
 653   4                          for(k=start;k<idx;k++)
 654   4                          {
 655   5                              if(k<INBUFF_SIZE && inbuf[k] != 0)
 656   5                                 // && ((inbuf[k]>='a' && inbuf[k]<='z') ||(inbuf[k]>='A' && inbuf[k]<='Z')||(inbu
             -f[k]>='0' && inbuf[k]<='9')))
 657   5                              {
 658   6                                   SBUF = inbuf[k]; delay(1);
 659   6                              }
 660   5                              else
 661   5                                 break;
 662   5                          }
 663   4                          
 664   4                          // 发送短消息AT指令的结束符号 Ctrl+Z
 665   4                          SBUF = 0x1a;
 666   4                   }
 667   3      
 668   3                   type = 0; // 消息操作类型改为空操作
 669   3                   send = 0; // 将新到消息标志=0,准备接收下一条消息
 670   3               }
 671   2      
 672   2                delay(3);
 673   2      
 674   2         }
C51 COMPILER V7.07   SMS                                                                   03/17/2004 17:22:20 PAGE 12  

 675   1      }
 676          
 677          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2168    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     91      17
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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