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

📄 sms.lst

📁 用51单片机收发短消息的源程序,有祥细的注释说明.
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.07   SMS                                                                   03/17/2004 17:22:20 PAGE 1   


C51 COMPILER V7.07, COMPILATION OF MODULE SMS
OBJECT MODULE PLACED IN sms.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE sms.c BROWSE DEBUG OBJECTEXTEND TABS(3)

stmt level    source

   1          #include <intrins.h>   // 外部函数头文件,只用到了其中的空操作函数_nop_();
   2          #include <At89x52.h>   // AT89C52管脚定义头文件
   3          /////////////////////////////////////
   4          /*采用P1口作控制
   5          // 11.0592的晶体
   6          // RST=20K*/
   7          ////////////////////////////////////
   8          
   9          // 函数声明
  10          void setup_t1(void);   // 设置波特率
  11          void receive(void);    // 串口接收中断响应函数
  12          void setup_ck(void);   // 设置串口
  13          void show(void);       // 在数码管上显示DATA1,DATA2,DATA3,DATA4的值,调试用
  14          
  15          // 下列四个值分别用来显示在数码管上,调试用
  16          // DATA4变化:串口在接收一般字符
  17          // DATA1变化:串口在接收一条新消息到来的标志 +CMTI: "SM",1
  18          // DATA2变化:从新消息到来的标志(放在inbuf中)判断到了"SM"字符,从而可以解析后跟的
  19          //            新消息在SIM卡中的存放位置
  20          // DATA3变化:收到的新消息是合法消息,内容的前6位密码正确
  21          unsigned char data date1=0xa0, date2=0x67 ,date3=0xe6 ,date4=0xaa;
  22          
  23          // num2:用来标志收到新到消息标志+CMTI:的字符序号,只有连续收到+CMTI:即num2=6时,
  24          //       才认为确实收到了一条新消息。
  25          // send: 标志是否有新消息到来
  26          //       =0 没有新到消息
  27          //       =1 有新到消息,开始处理新到消息
  28          unsigned char data num2=1, send = 0;
  29          
  30          // inbuf: 用来存放从sim卡中读取的消息内容;或者要发送的消息内容
  31          unsigned char data inbuf[50];
  32          
  33          //  buff: 用来存放要发送的消息的AT指令头;或者从SIM卡中读取的密码
  34          unsigned char data buff[30];
  35          
  36          // type:定义了短消息操作类型
  37          //       =0 空操作
  38          //       =4 收到了合法短消息
  39          //       =5 从sim卡中读取一条短消息
  40          //       =6 从sim卡中删除一条短消息
  41          //       =7 从sim卡的地址本的1位置中读取密码
  42          unsigned char data type = 0;  // send at cmd type
  43          
  44          // hasplus86: 接收的短消息内容中,发送方的手机号码是否有+86
  45          //            =0 无+86
  46          //            =1 有+86
  47          unsigned char hasplus86 = 0;
  48          
  49          // idx: inbuf缓冲区当前使用字节的计数
  50          char data idx=0;   
  51          
  52          // idx2: buff缓冲区当前使用字节的计数
  53          char data idx2=0;  
  54          
  55          // offset: 在从sim卡中读取一条短消息时候,只读取发送方的电话
C51 COMPILER V7.07   SMS                                                                   03/17/2004 17:22:20 PAGE 2   

  56          //         号码和内容;中间的时间等其他内容将被忽略掉,offset
  57          //         用来标志在读取中要忽略的字节个数。
  58          char data offset=0;  
  59          
  60          #define INBUFF_SIZE 50    // inbuf最大容纳的字节数
  61          #define BUFF_SIZE   30    // buff最大容纳的字节数
  62          #define CLK7219     P1_2  // 数码管显示用管脚
  63          #define DIN7219     P1_1  // 数码管显示用管脚
  64          
  65          // 清空缓冲区
  66          void buffzero(unsigned char *pBuff, unsigned char c, unsigned int size)
  67          {
  68   1          unsigned char i = 0;
  69   1          for(i=0; i<size; i++)
  70   1              *(pBuff+i) = c;
  71   1      }
  72          
  73          // 清空缓冲区//供中断程序调用
  74          void buffzero2(unsigned char *pBuff, unsigned char c, unsigned int size)
  75          {
  76   1          unsigned char i = 0;
  77   1          for(i=0; i<size; i++)
  78   1              *(pBuff+i) = c;
  79   1      }
  80          
  81          // 延迟函数
  82          void delay(int c)
  83          {
  84   1           int i=0, j=0, k=0;
  85   1             _nop_();
  86   1           if(c > 0)
  87   1           {
  88   2          for(i=0;i<31000;i++);
  89   2           { 
  90   3               if(c > 1)
  91   3               {
  92   4               for(j=0;j<31000;j++);
  93   4               {
  94   5                   if(c > 2)   
  95   5                      for(k=0;k<31000;k++);
  96   5               }
  97   4               }
  98   3           }
  99   2           }
 100   1      }
 101          
 102          // 设置波特率
 103          void setup_t1(void)
 104          {
 105   1         TMOD=0x20;
 106   1         TH1=0xfd;
 107   1         TL1=0xfd;
 108   1         TR1=1;
 109   1         // ET1=0;
 110   1      }
 111          
 112          // 设置串口
 113          void setup_ck(void)
 114          {
 115   1         SCON=0x50;
 116   1         PCON=0x00;
 117   1         EA=1;
C51 COMPILER V7.07   SMS                                                                   03/17/2004 17:22:20 PAGE 3   

 118   1         ES=1;
 119   1      }
 120          
 121          // 串口接收中断响应函数
 122          void receive(void) interrupt 4 using 3
 123          {
 124   1           ES=0;  // 禁止串口中断
 125   1           
 126   1           // 向串口发送字符
 127   1           if (TI)
 128   1           {
 129   2               TI=0;
 130   2               ES=1;
 131   2           }
 132   1      
 133   1           // 接收来自串口的字符
 134   1           if (RI)
 135   1           {
 136   2               ES=0;
 137   2               RI=0;
 138   2               if(0 == send)   // 当前没有处理新消息
 139   2               {
 140   3                  date4=SBUF;  // DATA4变化:串口在接收一般字符
 141   3                  
 142   3                  // 握手信号
 143   3                  // 连续收到字符:+CMTI: 就认为有新到消息
 144   3                  switch(num2) 
 145   3                  {
 146   4                     case 1:
 147   4                        num2 = date4=='+' ? ++num2 : 1;
 148   4                        break;
 149   4                     case 2:
 150   4                        num2 = date4=='C' ? ++num2 : 1;
 151   4                        break;
 152   4                     case 3:
 153   4                        num2 = date4=='M' ? ++num2 : 1;
 154   4                        break;
 155   4                     case 4:
 156   4                        num2 = date4=='T' ? ++num2 : 1;
 157   4                        break;
 158   4                     case 5:
 159   4                        num2 = date4=='I' ? ++num2 : 1;
 160   4                        break;
 161   4                     case 6:
 162   4                        num2 = date4==':' ? ++num2 : 1;
 163   4                        if (1 != num2)  // :
 164   4                        {
 165   5                            send = 1; // 新到消息标志置1
 166   5                            num2++;
 167   5                            
 168   5                            // 清空INBUF,准备将新消息标志+CMTI: "SM",1的后半部分 "SM",1放入
 169   5                            buffzero2(inbuf, 0, INBUFF_SIZE);
 170   5                            idx = 0;
 171   5                        }
 172   4                        break;
 173   4                     default:
 174   4                        num2=1;
 175   4                        break;
 176   4                 }
 177   3              }else      
 178   2              {
 179   3                 // DATA1变化:串口在接收一条新消息到来的标志 +CMTI: "SM",1
C51 COMPILER V7.07   SMS                                                                   03/17/2004 17:22:20 PAGE 4   

 180   3                 date1 = SBUF;
 181   3      
 182   3                 // 根据消息的操作类型将AT指令的返回放入不同的缓冲区中
 183   3                 switch(type)
 184   3                 {
 185   4                 case 7:  // 从地址本中读取密码
 186   4                      if(idx2 < 0)  // 忽略掉前-idx2个字符,idx2是负数
 187   4                          idx2 ++;
 188   4                      if(idx2 >= 0 && idx2 < BUFF_SIZE)
 189   4                          buff[idx2++] = date1;
 190   4                      break;
 191   4                 case 5:  // 读取一条消息
 192   4                 case 6:  // 和删除一条消息,都将返回放入到inbuf中
 193   4                      if(idx < 0) // 忽略掉前-idx个字符,idx是负数
 194   4                          idx ++;    
 195   4                          
 196   4                      // inbuf缓冲区没有溢出       
 197   4                      if(idx >= 0 && idx < INBUFF_SIZE)
 198   4                      {
 199   5                          // 因为inbuf中只保存新消息的发送方手机号码和消息内容
 200   5                          // 用offset来表示要忽略掉的其他不需要的字符
 201   5                          if(0 == offset && 0 == idx)
 202   5                               offset = 5;  // 忽略掉读取消息AT指令返回的消息头
 203   5                          else 
 204   5               if(0 == offset && inbuf[0] == '+' && 14 == idx) // has "+86"
 205   5               {
 206   6                  hasplus86 = 1;
 207   6                                      offset = 28;  // 忽略掉返回的消息体中的时间部分
 208   6               }
 209   5                          else 
 210   5               if(0 == offset && inbuf[0] != '+' && 11 == idx) // not "+86"
 211   5               {
 212   6                  hasplus86 = 0;
 213   6                                      offset = 28;  // 忽略掉返回的消息体中的时间部分
 214   6               }
 215   5      
 216   5                          if(offset > 0)
 217   5                               offset --;
 218   5      
 219   5                          if(0 == offset) 
 220   5                          {
 221   6                               inbuf[idx++] = date1;
 222   6                          }
 223   5                      }
 224   4                      break;
 225   4                 default:
 226   4                      if(idx < 0)
 227   4                          idx ++;           

⌨️ 快捷键说明

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