SIM900A模块TC35i怎样控制单片机工作?

2019-07-18 14:09发布

怎样才能手机发信息给SIM900A模块TC35i,模块传给单片机,实现功能?主要是控制P0口的高低电平,附件里有程序,硬件电路图,不知道什么问题,就是不成功。求教大神们,新手不懂,非常感谢帮助!!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册 x
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
无语大户
2019-07-18 15:21
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define RxIn 90        //定义 接收的 数组长 度为90
/********************************** 宏定义*******************************************/
uchar code AT[]="AT";        //握 手信 号
uchar code ATE[]="ATE";         // 关回 显
uchar code AT_CNMI[]="AT+CNMI=2,1";//设置这组参数是来了新信息奖直接显示到串口,不作存储
uchar code AT_CSCA[]="AT+CSCA="+8615816497476""; //设置 服务中心 号码
uchar code AT_CMGF[]="AT+CMGF=1";//设置短信的格 式为 text格式
uchar code AT_CMGR[]="AT+CMGR=";//读取 短信指令
uchar code AT_CMGS[]="AT+CMGS=";//发送 短信指令
uchar code AT_CMGD[]="AT+CMGD=";//发送 短信指令
uchar code successfully[]="Operate Successfully!"; //发送操作成功信息到 目标号码
uchar code fail[]="Operate failed,try again!";         //发送操作失败 信息到目标号码
uchar AT_delete[12];
uchar AT_Read[12];        //用来存储发送读取短信指令
uchar AT_SendNumber[25];  //用来存储发送短信号码指令
uchar numberbuf[3];                 //用来保存短信条数
uchar idata SystemBuf[RxIn];  //储存出口接收数据
uchar CommandBuf[6];            //用来储存指令
uchar idata state[17];             //用来存  储IO口状态
uchar idata state1[17];           //用来存储IO口状态
uchar Rx=0;
uint temp;          //记录状  态          
uchar temp1;            // 用于  记录P0口状态
uchar temp2;     //  用于记录P2口状态
bit check=0;          //查询标志位
bit receiveready=0;                    //接收短信标志位
bit sendready=0;                     //发送短信准备标志位
bit send=0;                                       //发送短信标志位
bit flag=0;                                   //指令标志位

/*****************************位定义******************************************/
sbit P3_7=P2^5;   //启动GSM的启动线连IGT
sbit LED0=P0^0;    //LED1
sbit LED1=P0^1;   //LED2
sbit LED2=P0^2;   //LED3
sbit LED3=P0^3;   //继电器1
sbit MOTOR1=P0^7;  //继电器5
/*********************************函数声明*************************************/
void Delay_ms(uint i);
void Start_GSM(void);
void UART_init (void);
void sendchar(uchar ch);
void sendstring(uchar *p);
void GSM_INIT(void);
void receive_ready(void);
void message_read(void);
void read_message(void);
void sendmessage(void);

/*************************************************************************************/
////////////////////////////////函数void Delay_ms(uint i);     实现功能:进行毫秒延时//////////////////////////////
/*************************************************************************************/
void Delay_ms(uint i)
{
    unsigned int j;
    for(;i>0;i--){
    for(j=0;j<125;j++)
    {;}
}
}

/*************************************************************************************/
//////////////////////函数void UART_init;     实现功能:对串口进行初始化//////////////////////////////////////////////
/*************************************************************************************/
void UART_init (void)
{
           TMOD=0x20;                //选择定时器1
     PCON=0x00;                 ///波特率不加倍
     SCON=0x50;         //串行工作方式1允许串行接收               
     TH1=0xFD;                 //实验板上晶振位11.0592MHZ,选择波特率为9600
     TL1=0xFD;                //在相应计数器上赋值
     EA=1;                       //总中断开启
     ES=1;                        //串行中断开启
     TR1=1;                     //开启定时器1
  }
/************************************************************************************/
//////////////////////函数void sendchar(uchar ch);实现功能:发送一字节数据///////////////////////////////////////
/************************************************************************************/
void sendchar(uchar ch)
{
    SBUF=ch;
        while(TI==0);
        TI=0;
}
/***********************************************************************************/
//////////////////////函数void sendstring(uchar *p);实现功能:通过串口发送字符串///////////////////
/***********************************************************************************/
void sendstring(uchar *p)
{  

  while(*p)
  {
  sendchar(*p);
  p++;
}

  sendchar(0x0D);         
  sendchar(0x0A);
}
/************************************************************************************/
///////////////////函数void receive(void) interrupt 4 using 1;实现功能:通过串口接收数据/////////////////////////
/************************************************************************************/
void receive(void) interrupt 4 using 1
{       
if(RI)
{

          if(Rx<RxIn)
  {
  SystemBuf[Rx]=SBUF;
  Rx++;
  }
  RI=0;

}
}

/*************************************************************************************/
///////////////////函数void GSM_INIT(void);实现功能:初始化TC35模块///////////////////////////////////////////////
/*************************************************************************************/
void GSM_INIT(void)
{
LOOP:
        Delay_ms(1000);
        sendstring(AT);
        Delay_ms(1000);
    sendstring(ATE);
        Delay_ms(1000);
        sendstring(AT_CNMI);
        Delay_ms(1000);
        //sendstring(AT_CSCA);
        Delay_ms(1000);
        for(Rx=0;Rx<RxIn;Rx++)
                {

                        SystemBuf[Rx]=0x00;   
                }
                Rx=0;
    sendstring(AT_CMGF);
          Delay_ms(1000);
        if((SystemBuf[2]=='O')&&(SystemBuf[3]=='K'))         //判断是否模块初始化成功,成功的话模块会回复"OK"给单片机
        {       
                                                                                //如果单片机没有收到OK,就继续发送初始化指令/
                           
            for(Rx=0;Rx<RxIn;Rx++)
                {
                        SystemBuf[Rx]=0x00;   
                }
                Rx=0;
        }
        else
        {     
         
               
             for(Rx=0;Rx<RxIn;Rx++)
                {
                        SystemBuf[Rx]=0x00;   
                }
                Rx=0;
                goto LOOP;           
        }
}

/*************************************************************************************/
///////////////////函数void receive_ready(void);实现功能:接收短信准备///////////////////////////////////////////
/*************************************************************************************/
void receive_ready(void)
{

  uchar i;

if((SystemBuf[5]==0x54)&&SystemBuf[6]==0x49)                 //如果有新短信来,模块会通过串口向单片机发送字符串,TI
{                                                                                                         //此函数的功能是判断是否有新短信来,如果来的话就置位准备接受位标志为1
receiveready=1;                                                                         //如果不是新短信的指令,就舍弃,并将接收数组清零/
}
else{

for(i=0;i<Rx;i++)
                {
                        SystemBuf[i]=0x00;   
                }
       Rx=0;
}
}

/*************************************************************************************/
/////////////函数 void message_read(void);实现功能:判断短信,准备是否回复短信给目标号码////////
/*************************************************************************************/
void message_read(void)
{
   
  if((sendready==1)&&(SystemBuf[5]==0x47)&&(SystemBuf[6]==0x52))    //GR

  send=1;
  }

/*************************************************************************************/
///////////////////函数  void read_message(void);实现功能:发送读取短信指令,/////////////////////////////////////
/*************************************************************************************/          
   void read_message(void)
{

   uchar i;
   Delay_ms(1000);
   for(i=0;i<3;i++)
   {

        numberbuf[i]=SystemBuf[14+i];
        }
  
   for(i=0;i<8;i++)
        {

        AT_Read[i]=AT_CMGR[i];
        }
   for(i=8;i<11;i++)
   {

        AT_Read[i]=numberbuf[i-8];                                  
        }
        for(Rx=0;Rx<RxIn;Rx++)
                {
                        SystemBuf[Rx]=0x00;   
                }
                Rx=0;  
   sendstring(AT_Read);                                                   //发送AT+CMGR=?,?代表短信储存所在位置
   
}

/*************************************************************************/
///////////////////函数void readcommend(void);实现功能:读取短信内容,判断相应指令是否正确///////////////////
/********************************************************************************/
void readcommend(void)
{

          uchar i;
   for(i=0;i<5;i++)                  //将短信内容中的指令部分截取出来放到
            {                                                        //CommandBuf数组中
         CommandBuf[i]=SystemBuf[64+i];

                                                }
   if((CommandBuf[0]=='o')&&(CommandBuf[1]=='p')&&(CommandBuf[2]=='e')&&(CommandBuf[3]=='n'))                  //判断指令是否为开继电器指令
         {
            
             switch(CommandBuf[4])
                {
                   case 0x31: LED0=0;                                        //LED1开启
                                break;

                       case 0x32: LED1=0;                                        //LED 2开启
                                break;

                       case 0x33: LED2=0;                                    //LED 3开启
                                break;
                       case 0x34: LED3=0;                                        //继电器1开启
                                break;
                       case 0x35: MOTOR1=0;                            //继电器 2开启
                                break;
                       /*case 0x36: realy5=0;                            //继电器 6开启
                                break;
                       case 0x37: realy6=0;                                         //继电器 7开启
                                break;
                       case 0x38: realy7=0;                                         //继电器 8开启
                                break;
                           case 0x41: key1=0;                                        //开关1开启
                                break;
                           case 0x42: key2=0;                                        //开关2开启
                                    break;
                           case 0x43: key3=0;                                        //开关3开启
                                break;
                           case 0x44: key4=0;                                        //开关4开启
                                break;
                           case 0x45: key5=0;                                        //开关5开启
                                break;
                           case 0x46: key6=0;                                        //开关6开启
                                break;
                           case 0x47: key7=0;                                        //开关7开启
                                break;
                           case 0x48: key8=0;                                        //开关8开启
                                break;
                           case 0x4f: P0=0;P2=0;
                                    break;
                           case 0x3f: temp1=P0;
                                      temp2=P2;
                                                  temp=temp2;
                                                  temp<<=8;
                                                  temp=temp|temp1;
                                                  check=1;
                                                break;*/
                       default:flag=1;                                                  //其他指令定义为错误操作
                                break;                                                   //置位错误操作位为1
          }
          }
        else
        {       
        if((CommandBuf[0]=='s')&&(CommandBuf[1]=='h')&&(CommandBuf[2]=='u')&&(CommandBuf[3]=='t'))        //判断指令是否为关闭电器指令
             {
                 
                    switch(CommandBuf[4])
               {
                 case 0x31: LED0=1;                  //关闭LED1
                           break;
                     case 0x32: LED1=1;                 //关闭LED2
                           break;
                     case 0x33: LED2=1;                 //关闭LED3
                          break;                       
                     case 0x34: LED3=1;                //关闭继电器1
                          break;
                     case 0x35: MOTOR1=1;                //关闭继电器2
                           break;
                     /*case 0x36: realy5=1;                //关闭继电器6
                          break;
                     case 0x37: realy6=1;             //关闭继电器7
                           break;
                     case 0x38: realy7=1;                 //关闭继电器8
                          break;
                         case 0x41: key1=1;                                        //开关1关闭
                          break;
                         case 0x42: key2=1;                                        //开关2关闭
                              break;
                         case 0x43: key3=1;                                        //开关3关闭
                          break;
                         case 0x44: key4=1;                                        //开关4关闭
                          break;
                         case 0x45: key5=1;                                        //开关5关闭
                          break;
                         case 0x46: key6=1;                                        //开关6关闭
                          break;
                         case 0x47: key7=1;                                        //开关7关闭
                          break;
                         case 0x48: key8=1;                                        //开关8关闭
                          break;
                          case 0x53:P0=0xff;P2=0xff;
                              break;*/
                     default:flag=1;                                //其他指令定义为错误操作
                          break;                                         //置位错误操作位为1
          }

          }
     else {flag=1;}                                                  //如果发送的指令既不是open也不是shut就定义为错误操作
        }
}

/***********************************************************************************/
///////////////////函数void readstate;实现功能:将P0,P2口的状态转化为数组,///////////////////
/**********************************************************************************/
void readstate(void)
{  

   uint bitcnt,i,j;

   for(bitcnt=0,i=0;bitcnt<16,i<16;bitcnt++,i++)
   {
       if((temp<<bitcnt)&0x8000){state1[i]=0x30;}

           else state1[i]=0x31;
           }

        for(j=15,i=0;j>=0,i<16;j--,i++)
        {

          state[j]=state1[i];
          }
   
           }

/***********************************************************************************/
///////////////////函数  void delete_message;实现功能:删除读短信指令,////////////////
/********************************************************************************/
  void delete_message(void)
{
   uchar i;

   Delay_ms(1000);
   Delay_ms(1000);
   Delay_ms(5000);
   for(i=0;i<8;i++)
        {

        AT_delete[i]=AT_CMGD[i];
        }
   for(i=8;i<11;i++)
   {

        AT_delete[i]=numberbuf[i-8];                                  
        }

        for(Rx=0;Rx<RxIn;Rx++)
                {
        SystemBuf[Rx]=0x00;   
                }
                Rx=0;  
   sendstring(AT_delete);                 //发送AT+CMGR=?,?代表短信储存所在位置
   
}

/******************************************************************************/
///////////////////函数 void sendmessage(void);实现功能:发送回复短信指令,///////////////////////////////////////
/*********************************************************************************/  
void sendmessage(void)
{
  uchar i;

        for(i=0;i<8;i++)
                        {
                                AT_SendNumber[i]=AT_CMGS[i];
                        }
         for(i=8;i<24;i++)
                        {
   AT_SendNumber[i]=SystemBuf[14+i];                //将对方号码提取用来回复给对方
                        }
         
        sendstring(AT_SendNumber);
        Delay_ms(400);
        if(flag==0){ if(check==1){sendstring(state);}                 //如果查询位置1时,发送状态信息
    sendstring(successfully);
        check=0;
        }

        else
{
        sendstring(fail);
        }

        Delay_ms(30);
        sendchar(0X1A);
        }

/*****************************************************************************//////////函数void main();实现功能:主函数,//////////////////
/************************************************************************/  
void main()
  {       
   Delay_ms(10000);                        //延时大约10秒 ,等待模块联网/
   UART_init();                                 //串口初始化/
   GSM_INIT();
  P0=0XFF;
       
  while(1)
  {
   receive_ready();
   if(receiveready==1)
   {
     
           read_message();
         receiveready=0;
         sendready=1;
    }
     Delay_ms(300);
     message_read();

     if(send==1)
  {   
     Delay_ms(2000);
         readcommend();
         readstate();
     sendmessage();
         Delay_ms(1000);
         delete_message();
         flag=0;
         for(Rx=0;Rx<RxIn;Rx++)                                                  //每一次操作完成后对接收数组清零//
                {
  SystemBuf[Rx]=0x00;   
                }
    Rx=0;  
        send=0;
        }
        LED3=1;
        Delay_ms(1000);
        LED3=0;
        Delay_ms(1000);
}         
}

一周热门 更多>