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

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

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2014年04月10日   【字體:
趁熱打鐵,完成了前面的第一層和第二層,到第三層有種水到渠成的感覺。與前面兩層不同的是,第三層是將西門子TC35I_GSM模塊作為接受終端來使用。但我手機發(fā)送指定的指令給GSM模塊的SIM卡時,51單片機進行處理判斷,執(zhí)行相應操作。至此,我的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];    //定義緩存數(shù)組 
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;
//**************************延時函數(shù)
void delay_ms(uint z);
//**************************串口初始化函數(shù)
void Serial_Init();
//**************************串口發(fā)送字符串函數(shù)
void Send_String(uchar *tab);
//**************************串口發(fā)送字符函數(shù)
void Send_Char(uchar a);
//***************************清除緩存區(qū)內(nèi)容
void CLR_Buf();
//***************************串口握手函數(shù)
bit Hand(uchar *a);
//**************************延時函數(shù)
void delay_ms(uint z)
{
 uint i,j;
 for(i=z;i>0;i--)
  for(j=110;j>0;j--);
}
//**************************串口初始化函數(shù)
void Serial_Init()
{
 SCON=0x50; //使用串口方式1,允許接收(SM1,SM0=0,1),(REN=1)
 PCON=0x00; //比特率不加倍(此語句可屏蔽,系統(tǒng)默認為0)
 TMOD=0x20; //使用定時器1的工作方式2,8位自動重裝計數(shù)來產(chǎn)生波特率
 TH1=0xFD;
 TL1=0xFD; //產(chǎn)生的波特率為9600
 IE=0x90; //EA=1,ES=1
 TR1=1;
}
//**************************串口發(fā)送字符串函數(shù)
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;
}
*/
/*
//**************************串口發(fā)送字符函數(shù)
void Send_Char(uchar a)
{
 ES=0;
 SBUF=a;
 while(TI==0);
 TI=0;
 ES=1; 
}
*/
//***************************清除緩存區(qū)內(nèi)容
void CLR_Buf()
{
 uchar k;
 for(k=0;k<Buf_Max;k++)   //清空緩存區(qū)
  {
   Rec_Buf[k]=0;
  }
 i=0;      //接收字符串的起始存儲位置
}
//***************************串口握手函數(shù)
bit Hand(uchar *a)
{
 if(strstr(Rec_Buf,a)!=NULL)
  return 1;
 else
  return 0;
}
//***************************串口中斷函數(shù)
void Serial_Int() interrupt 4
{
 ES=0;      //關串口中斷,防止中斷的嵌套
 if(TI)       //如果是串口發(fā)送中斷不進行處理
  {
   TI=0;
  }
 if(RI)
  {
   RI=0;     //接收中斷標志清0
   Rec_Buf[i]=SBUF;
   i++;
   if(i>Buf_Max)
    {
     i=0;
    }
  }
 ES=1;      //開啟串口中斷
}
//***************************主函數(shù)
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();         
   } 
 }

 
關閉窗口