<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        51單片機+GSM_TC35接收短信并處理(第三層)

        作者:佚名   來源:本站原創   點擊數:  更新時間:2014年04月10日   【字體:
        趁熱打鐵,完成了前面的第一層和第二層,到第三層有種水到渠成的感覺。與前面兩層不同的是,第三層是將西門子TC35I_GSM模塊作為接受終端來使用。但我手機發送指定的指令給GSM模塊的SIM卡時,51單片機進行處理判斷,執行相應操作。至此,我的GSM模塊3層練就完成!



        GSM_receive.c
        //*********************************GSM接收終端
        //2012-12-2
        #include<reg51.h>
        #include<string.h>
        #define uchar unsigned char
        #define uint unsigned int
        #define Buf_Max 100   //緩存長度
        uchar i=0;
        uchar Rec_Buf[Buf_Max];    //定義緩存數組 
        sbit LED1=P1^0;  //握手指示燈
        sbit LED2=P1^1;  //設置接收英文短信指示燈
        sbit LED3=P1^2;  //設置來短信提示指示燈
        sbit LED4=P1^3;  //設置刪除1號位置短信指示燈
        sbit LED5=P1^4;
        sbit LED6=P1^5;
        sbit LED7=P1^6;
        sbit LED8=P1^7;
        //**************************延時函數
        void delay_ms(uint z);
        //**************************串口初始化函數
        void Serial_Init();
        //**************************串口發送字符串函數
        void Send_String(uchar *tab);
        //**************************串口發送字符函數
        void Send_Char(uchar a);
        //***************************清除緩存區內容
        void CLR_Buf();
        //***************************串口握手函數
        bit Hand(uchar *a);
        //**************************延時函數
        void delay_ms(uint z)
        {
         uint i,j;
         for(i=z;i>0;i--)
          for(j=110;j>0;j--);
        }
        //**************************串口初始化函數
        void Serial_Init()
        {
         SCON=0x50; //使用串口方式1,允許接收(SM1,SM0=0,1),(REN=1)
         PCON=0x00; //比特率不加倍(此語句可屏蔽,系統默認為0)
         TMOD=0x20; //使用定時器1的工作方式2,8位自動重裝計數來產生波特率
         TH1=0xFD;
         TL1=0xFD; //產生的波特率為9600
         IE=0x90; //EA=1,ES=1
         TR1=1;
        }
        //**************************串口發送字符串函數
        void Send_String(uchar *tab)
        {
         ES=0;      //關串口中斷,防止中斷的嵌套
         for(tab;*tab!='\0';tab++)
          {
           SBUF=*tab;
           while(TI==0);
           TI=0;
          }
         ES=1;
        }
        /*
        void Send_String(uchar *tab)
        {        
         ES=0;       
         while(*tab!='\0')    
          {
           Send_Char(*tab++);  //Send_Char(*tab); tab++;  
          }
         ES=1;
        }
        */
        /*
        //**************************串口發送字符函數
        void Send_Char(uchar a)
        {
         ES=0;
         SBUF=a;
         while(TI==0);
         TI=0;
         ES=1; 
        }
        */
        //***************************清除緩存區內容
        void CLR_Buf()
        {
         uchar k;
         for(k=0;k<Buf_Max;k++)   //清空緩存區
          {
           Rec_Buf[k]=0;
          }
         i=0;      //接收字符串的起始存儲位置
        }
        //***************************串口握手函數
        bit Hand(uchar *a)
        {
         if(strstr(Rec_Buf,a)!=NULL)
          return 1;
         else
          return 0;
        }
        //***************************串口中斷函數
        void Serial_Int() interrupt 4
        {
         ES=0;      //關串口中斷,防止中斷的嵌套
         if(TI)       //如果是串口發送中斷不進行處理
          {
           TI=0;
          }
         if(RI)
          {
           RI=0;     //接收中斷標志清0
           Rec_Buf[i]=SBUF;
           i++;
           if(i>Buf_Max)
            {
             i=0;
            }
          }
         ES=1;      //開啟串口中斷
        }
        //***************************主函數
        void main()
        {
         Serial_Init();
         CLR_Buf();
         
         Send_String("AT\r\n"); //握手指令(AT+回車+換行)
         //Send_Char(0x0d); //回車
         //Send_Char(0x0a); //換行
         delay_ms(100);
         while(!Hand("OK"))
          {
           Send_String("AT\r\n");
           delay_ms(100);  
          }
         CLR_Buf();
         LED1=0;   //握手成功
         Send_String("AT+CMGF=1\r\n"); //接收英文短信
         delay_ms(100);
         while(!Hand("OK"));
         CLR_Buf();
         LED2=0;      //設置為接收英文短信模式成功
         Send_String("AT+CNMI=2,1\r\n"); //當有新短信時提示并顯示儲存位置
         delay_ms(100);
         while(!Hand("OK"));
         CLR_Buf();
         LED3=0;      //設置為來短信提示模式成功
         Send_String("AT+CMGD=1\r\n");  //刪除1號位置短信
         delay_ms(100);
         while(!Hand("OK"));
         CLR_Buf();
         LED4=0;      //刪除1號位置短信成功
         
         while(1)
         {
          if(strstr(Rec_Buf,"+CMTI")!=NULL)  //緩存中有+CMTI字符
           {
            CLR_Buf();
            Send_String("AT+CMGR=1\r\n"); //讀取1號位置的短信
            delay_ms(100);
            while(!Hand("OK")); //此處換成"+8613297961386"則只有指定的手機都能短信控制
            //+CMGR: "REC UNREAD","+8613297961386",,"12/12/02,09:26:54+32"
            //maK1
            //OK
                    
            if(strstr(Rec_Buf,"maK1")!=NULL)
             LED5=0;       //“maK1”指令開5號指示燈
            else if(strstr(Rec_Buf,"maC1")!=NULL)
             LED5=1;       //“maC1”指令關5號指示燈
            else if(strstr(Rec_Buf,"maK2")!=NULL)
             LED6=0;
            else if(strstr(Rec_Buf,"maC2")!=NULL)
             LED6=1;
            else if(strstr(Rec_Buf,"maK3")!=NULL)
             LED7=0;
             else if(strstr(Rec_Buf,"maC3")!=NULL)
             LED7=1;
            else if(strstr(Rec_Buf,"maK4")!=NULL)
             LED8=0; 
            else if(strstr(Rec_Buf,"maC4")!=NULL)
             LED8=1; 
            CLR_Buf(); 
            
            Send_String("AT+CMGD=1\r\n"); //刪除1號位置短信
            delay_ms(100);
            while(!Hand("OK"));
            CLR_Buf();         
           } 
         }

         
        關閉窗口
        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮