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

📄 duan1224.c

📁 GSM模块短信编程,C51格式,处次上发,希望大家间量
💻 C
📖 第 1 页 / 共 2 页
字号:
        Rec_cont=0;
        Rec_stats=0;
        Send_stats=0;
        Send_cont=0;
        Send_longth=0;
        Comm_send_errio=0;
        Start_rec=0;
        Comm_errio=0;
        Sending=0;
        Comm_send_times=0;
       }
      break;
     }
     default:
     {
      Rec_cont=0;
      Rec_stats=0;
      Comm_send_errio=0;
      Start_rec=0;
      Comm_errio=0;
      Sending=0;
     }
    }
   }
   else
   {
    Rec_buff1[Rec_cont]=SBUF;
    Rec_cont++;
    Start_rec=1;
    if(Rec_cont>=Send_longth)
    {
     Command=0;
     Rec_cont=0;
     Rec_stats=0;
    }

   }

 }
 else
 {       //发送中断//
  TI=0;

  if(Send_cont<Send_longth)   //如果没有发送完继续发送数据//
  {
   SBUF=Send_buff1[Send_cont];
   Send_cont++;
  }
  else
  {
   Send_cont=0;
   //Sending=0;
   //Comm_send_times=0;

  }


 }
}
/////////////////////////////////////////////////



void main()
 {
  uchar j=0,i=0;
  uchar k=0;
  EA=0;

  P0=0XFF;
  P2=0XFF;

  P1=0XFF;
  P3=0XFF;
  IE=0x12;
  IP=0x10;             //Serial Port is high level.
  TMOD=0x21;
  TH1=0xfa;            //晶振用11.0592M,serial is 9600bps;//
  TL1=0xfa;
  TH0=0x3C;           //T0 50ms;//
  TL0=0xAF;
  PCON=0x80;
  TCON=0x50;
  SCON=0x50;
  //////////////////////////////////////


  //////////////////////////////////////////////
  for(j=0;j<11;j++)
   {
     TEL_num[j]=I2C_ReadData(j);    //从AT24C02中读取号码,地址是0--10,11位电话号码//

   }

  /////////////////////////////////////////////
  if(errio)
  {

   for(j=0;j<11;j++)
   {
     TEL_num[j]=TEL_num_back[j];    //如果读取AT24V02失败,使用备用电话号码//

   }
  }

 // delay(500);   //延时一段时间等待GSM模块找到信号//
  TR0=1;
  IE=0X82;
  /////////////////////////////////////////和GSM模块握手,如果没有回应或回应错误,继续发送握手信号;
  AT_COM_STEP=0;
  i=1;
  while(i==1)
  {
    WDOG=~WDOG;
    switch (AT_COM_STEP)
    {
     case 0:        //发送AT握手指令//
     {
      Rec_cont=0;
      Start_rec=0;
      Comm_errio=0;

      TI=1;
      j=0;
      while(j<3)
      {
       if(TI==1)
       {
        TI=0;
        SBUF=AT[j];
        j++;
       }
      }
      while(TI==0);
      TI=0;

      AT_COM_STEP=1;
      Start_rec=1;
      break;
     }
     case 1:
     {
      if(RI==1)
      {
       RI=0;
       Rec_buff1[Rec_cont]=SBUF;
       Rec_cont++;
       if(Rec_cont>=9)      //判断返回OK//
       {
        if(Rec_buff1[5]==0x4f&&Rec_buff1[6]==0x4b&&Rec_buff1[7]==0x0d&&Rec_buff1[8]==0x0a)    //返回OK,表示发送命令成功//
        {
         AT_COM_STEP=2;
         Start_rec=0;
         Comm_errio=0;
        }
       }
      }
      if(Comm_errio>=50)   //超过2.5秒没有返回OK,返回上一步从法AT//
      {
       AT_COM_STEP=0;
       Start_rec=0;
       Comm_errio=0;
      }
      break;
     }
     case 2:            //发送模块收到短信后的提示方法//
     {
      Comm_errio=0;
      Rec_cont=0;
      TI=1;
      j=0;
      while(j<12)
      {
       if(TI==1)
       {
        TI=0;
        SBUF=AT_CNMI[j];
        j++;
       }
      }
      while(TI==0);
      TI=0;
      AT_COM_STEP=3;
      Start_rec=1;
      break;
     }
     case 3:
     {
      if(RI==1)
      {
       RI=0;
       Rec_buff1[Rec_cont]=SBUF;
       Rec_cont++;
       if(Rec_cont>=18)
       {
        if(Rec_buff1[14]==0x4f&&Rec_buff1[15]==0x4b&&Rec_buff1[16]==0x0d&&Rec_buff1[17]==0x0a)    //返回OK,表示发送命令成功//
        {
         AT_COM_STEP=4;
         Start_rec=0;
         Comm_errio=0;
        }
       }
      }
      if(Comm_errio>=50)
      {
       AT_COM_STEP=2;
       Start_rec=0;
       Comm_errio=0;
      }
      break;
     }
     case 4:        //发送命令使模块工作于文本方式//
     {
      Comm_errio=0;
      Rec_cont=0;
      TI=1;
      j=0;
      while(j<10)
      {
       if(TI==1)
       {
        TI=0;
        SBUF=AT_CMGF[j];
        j++;
       }
      }
      while(TI==0);
      TI=0;
      AT_COM_STEP=5;
      Start_rec=1;
      break;
     }
     case 5:
     {
      if(RI==1)
      {
       RI=0;
       Rec_buff1[Rec_cont]=SBUF;
       Rec_cont++;
       if(Rec_cont>=16)
       {
        if(Rec_buff1[12]==0x4f&&Rec_buff1[13]==0x4b&&Rec_buff1[14]==0x0d&&Rec_buff1[15]==0x0a)    //返回OK,表示发送命令成功//
        {
         i=0;
         Start_rec=0;
         Comm_errio=0;
        }
       }
      }
      if(Comm_errio>=50)
      {
       AT_COM_STEP=4;
       Start_rec=0;
       Comm_errio=0;
      }
      break;
     }

     default:
     {
      Comm_errio=0;
      Start_rec=0;
      Rec_cont=0;
      Rec_stats=0;
      AT_COM_STEP=0;
     }

    }

  }


  ////////////////////////////////////////
  Comm_errio=0;
  Start_rec=0;
  Rec_cont=0;
  Rec_stats=0;
  Command=0;
  Sending=0;
  for(j=0;j<82;j++)
  {
   Rec_buff1[j]=0;
  }
     Send_oe=1;
     Send_stats=1;
     Stats_old=P2&0xe0;
     if(Stats_old&0x80)
     {
      Stats_real=Stats_real|0x04;
     }
     else
     {
      Stats_real=Stats_real&0xfb;
     }
     if(Stats_old&0x40)
     {
      Stats_real=Stats_real|0x02;
     }
     else
     {
      Stats_real=Stats_real&0xfd;
     }
     if(Stats_old&0x20)
     {
      Stats_real=Stats_real|0x01;
     }
     else
     {
      Stats_real=Stats_real&0xfe;
     }
  IE=0X92;

  for(;;)
  {
   WDOG=~WDOG;
   if((P2&0xe0)!=Stats_old)//&&Send_cont==0)
   {
    delay(15);
    if(((P2&0xe0)!=Stats_old)&&Sending==0&&Rec_cont==0)  //如果标志是变化并且没有数据正在发送则置发送数据标志//
    {
     Send_oe=1;
     Send_stats=1;
     Stats_old=P2&0xe0;
     if(Stats_old&0x80)
     {
      Stats_real=Stats_real|0x04;
     }
     else
     {
      Stats_real=Stats_real&0xfb;
     }
     if(Stats_old&0x40)
     {
      Stats_real=Stats_real|0x02;
     }
     else
     {
      Stats_real=Stats_real&0xfd;
     }
     if(Stats_old&0x20)
     {
      Stats_real=Stats_real|0x01;
     }
     else
     {
      Stats_real=Stats_real&0xfe;
     }
    }
   }

   if(Send_oe)
   {
    Send_oe=0;
    Sending=1;
    switch (Send_stats)
    {
     case 0:
     {
      break;
     }
     case 1:             //发送短消息号码,AT+CMGS=手机号//
     {
      Send_buff1[0]=0x41;
      Send_buff1[1]=0x54;
      Send_buff1[2]=0x2b;
      Send_buff1[3]=0x43;
      Send_buff1[4]=0x4d;
      Send_buff1[5]=0x47;
      Send_buff1[6]=0x53;
      Send_buff1[7]=0x3d;
      Send_buff1[8]=TEL_num[0];     //假设目的号码为13933809394//
      Send_buff1[9]=TEL_num[1];
      Send_buff1[10]=TEL_num[2];
      Send_buff1[11]=TEL_num[3];
      Send_buff1[12]=TEL_num[4];
      Send_buff1[13]=TEL_num[5];
      Send_buff1[14]=TEL_num[6];
      Send_buff1[15]=TEL_num[7];
      Send_buff1[16]=TEL_num[8];
      Send_buff1[17]=TEL_num[9];
      Send_buff1[18]=TEL_num[10];
      Send_buff1[19]=0x0d;
      SBUF=Send_buff1[0];
      Send_longth=20;
      Send_cont=1;
      Command=1;
      break;
     }
     case 2:          //发送信息内容//
     {
      Send_buff1[0]=0x41;  //假设发送数据是AA000007BB//
      Send_buff1[1]=0x41;
      Send_buff1[2]=0x30;
      Send_buff1[3]=0x30;
      Send_buff1[4]=0x30;
      Send_buff1[5]=0x30;
      Send_buff1[6]=0x30;
      Send_buff1[7]=Stats_real;
      Send_buff1[8]=0x42;
      Send_buff1[9]=0x42;
      Send_buff1[10]=0x1a;  //结束符//
     // Send_buff1[11]=0x0A;
      SBUF=Send_buff1[0];
      Send_longth=11;
      Send_cont=1;
      Command=1;
      break;
     }

     case 3:          //发送读取短信命令,AT+CMGR=短信地址//
     {
      Send_buff1[0]=0x41;
      Send_buff1[1]=0x54;
      Send_buff1[2]=0x2b;
      Send_buff1[3]=0x43;
      Send_buff1[4]=0x4d;
      Send_buff1[5]=0x47;
      Send_buff1[6]=0x52;
      Send_buff1[7]=0x3d;
      /*
      Send_buff1[8]=0x31;//假设读第1条短信//
      Send_buff1[9]=0x0d;    */
      if(message_addr<10)
      {
       Send_buff1[8]=message_addr|0x30;
       Send_buff1[9]=0x0d;
       SBUF=Send_buff1[0];
       Send_longth=10;
       Send_cont=1;
       Command=1;
      }
      else
      {
       if(message_addr>9&&message_addr<100)
       {
        Send_buff1[8]=(message_addr/10)|0x30;
        Send_buff1[9]=(message_addr%10)|0x30;
        Send_buff1[10]=0x0d;
        SBUF=Send_buff1[0];
        Send_longth=11;
        Send_cont=1;
        Command=1;
       }
       else
       {
        if(message_addr>99&&message_addr<1000)
        {
         Send_buff1[8]=(message_addr/100)|0x30;
         Send_buff1[9]=((message_addr%100)/10)|0x30;
         Send_buff1[10]=(message_addr%10)|0x30;
         Send_buff1[11]=0x0d;
         SBUF=Send_buff1[0];
         Send_longth=12;
         Send_cont=1;
         Command=1;
        }
        else
        {
         if(message_addr>999&&message_addr<10000)
         {
          Send_buff1[8]=(message_addr/1000)|0x30;
          Send_buff1[9]=((message_addr%1000)/100)|0x30;
          Send_buff1[10]=((message_addr%100)/10)|0x30;
          Send_buff1[11]=(message_addr%10)|0x30;
          Send_buff1[12]=0x0d;
          SBUF=Send_buff1[0];
          Send_longth=13;
          Send_cont=1;
          Command=1;
         }
        }
       }
      }

      break;
     }
     case 4:        //发送删除短信命令,AT+CMGD=短信地址//
     {
      Send_buff1[0]=0x41;
      Send_buff1[1]=0x54;
      Send_buff1[2]=0x2b;
      Send_buff1[3]=0x43;
      Send_buff1[4]=0x4d;
      Send_buff1[5]=0x47;
      Send_buff1[6]=0x44;
      Send_buff1[7]=0x3d;
      if(message_addr<10)
      {
       Send_buff1[8]=message_addr|0x30;
       Send_buff1[9]=0x0d;
       SBUF=Send_buff1[0];
       Send_longth=10;
       Send_cont=1;
       Command=1;
      }
      else
      {
       if(message_addr>9&&message_addr<100)
       {
        Send_buff1[8]=(message_addr/10)|0x30;
        Send_buff1[9]=(message_addr%10)|0x30;
        Send_buff1[10]=0x0d;
        SBUF=Send_buff1[0];
        Send_longth=11;
        Send_cont=1;
        Command=1;
       }
       else
       {
        if(message_addr>99&&message_addr<1000)
        {
         Send_buff1[8]=(message_addr/100)|0x30;
         Send_buff1[9]=((message_addr%100)/10)|0x30;
         Send_buff1[10]=(message_addr%10)|0x30;
         Send_buff1[11]=0x0d;
         SBUF=Send_buff1[0];
         Send_longth=12;
         Send_cont=1;
         Command=1;
        }
        else
        {
         if(message_addr>999&&message_addr<10000)
         {
          Send_buff1[8]=(message_addr/1000)|0x30;
          Send_buff1[9]=((message_addr%1000)/100)|0x30;
          Send_buff1[10]=((message_addr%100)/10)|0x30;
          Send_buff1[11]=(message_addr%10)|0x30;
          Send_buff1[12]=0x0d;
          SBUF=Send_buff1[0];
          Send_longth=13;
          Send_cont=1;
          Command=1;
         }
        }
       }
      }
      break;
     }
     default:
     {
      Send_stats=0;
      Send_cont=0;
      Send_longth=0;
      Command=0;
     }
    }
   }
   if(errio==1&&Sending==0&&Rec_cont==0)//如果读写24C64错误,在串口空闲时发送出错提示短信//
   {
    errio=0;
    Send_oe=1;
    Send_stats=1;
    Stats_real=0x45;
   }
   if(read_message==1&&Rec_message==1&&Sending==0&&Rec_cont==0)//如果收到短信并且已经读取,在串口空闲时删除收到的短信//
   {
    Send_oe=1;
    Send_stats=4;
    read_message=0;
    Rec_message=0;
   }
   if(REc_end)    //如果接收完成判断是否是所需内容//
   {
    REc_end=0;
    read_message=1;
    if(Rec_buff1[73]==0x42&&Rec_buff1[72]==0x42&&Rec_buff1[71]==0x43&&Rec_buff1[65]==0x41&&Rec_buff1[64]==0x41)
    {
     for(j=0;j<11;j++)
     {
      TEL_num[j]=Rec_buff1[26+j];

     }
      //提取短信来源的手机号码,保存到TEL_num[],并保存到AT24C02//
     for(j=0;j<11;j++)
     {
      I2C_writebyte1(j,TEL_num[j]);

     }

      Send_oe=1;
      Send_stats=1;


     WDOG=~WDOG;
    }

   }


   //////////////////////////////
  }
}

⌨️ 快捷键说明

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