趁熱打鐵,完成了前面的第一層和第二層,到第三層有種水到渠成的感覺(jué)。與前面兩層不同的是,第三層是將西門子TC35I_GSM模塊作為接受終端來(lái)使用。但我手機(jī)發(fā)送指定的指令給GSM模塊的SIM卡時(shí),51單片機(jī)進(jìn)行處理判斷,執(zhí)行相應(yīng)操作。至此,我的GSM模塊3層練就完成!
.jpeg)
.jpeg)
GSM_receive.c
//*********************************GSM接收終端
//2012-12-2
.jpeg)
.jpeg)
GSM_receive.c
//*********************************GSM接收終端
//2012-12-2
#include<reg51.h>
#include<string.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
#define uint unsigned int
#define Buf_Max 100 //緩存長(zhǎng)度
uchar i=0;
uchar Rec_Buf[Buf_Max]; //定義緩存數(shù)組
uchar Rec_Buf[Buf_Max]; //定義緩存數(shù)組
sbit LED1=P1^0; //握手指示燈
sbit LED2=P1^1; //設(shè)置接收英文短信指示燈
sbit LED3=P1^2; //設(shè)置來(lái)短信提示指示燈
sbit LED4=P1^3; //設(shè)置刪除1號(hào)位置短信指示燈
sbit LED5=P1^4;
sbit LED6=P1^5;
sbit LED7=P1^6;
sbit LED8=P1^7;
sbit LED2=P1^1; //設(shè)置接收英文短信指示燈
sbit LED3=P1^2; //設(shè)置來(lái)短信提示指示燈
sbit LED4=P1^3; //設(shè)置刪除1號(hào)位置短信指示燈
sbit LED5=P1^4;
sbit LED6=P1^5;
sbit LED7=P1^6;
sbit LED8=P1^7;
//**************************延時(shí)函數(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);
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í)函數(shù)
void delay_ms(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
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; //比特率不加倍(此語(yǔ)句可屏蔽,系統(tǒng)默認(rèn)為0)
void Serial_Init()
{
SCON=0x50; //使用串口方式1,允許接收(SM1,SM0=0,1),(REN=1)
PCON=0x00; //比特率不加倍(此語(yǔ)句可屏蔽,系統(tǒng)默認(rèn)為0)
TMOD=0x20; //使用定時(shí)器1的工作方式2,8位自動(dòng)重裝計(jì)數(shù)來(lái)產(chǎn)生波特率
TH1=0xFD;
TL1=0xFD; //產(chǎn)生的波特率為9600
IE=0x90; //EA=1,ES=1
TR1=1;
}
TH1=0xFD;
TL1=0xFD; //產(chǎn)生的波特率為9600
IE=0x90; //EA=1,ES=1
TR1=1;
}
//**************************串口發(fā)送字符串函數(shù)
void Send_String(uchar *tab)
{
ES=0; //關(guān)串口中斷,防止中斷的嵌套
for(tab;*tab!='\0';tab++)
{
SBUF=*tab;
while(TI==0);
TI=0;
}
ES=1;
}
void Send_String(uchar *tab)
{
ES=0; //關(guān)串口中斷,防止中斷的嵌套
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_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;
}
*/
//**************************串口發(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; //接收字符串的起始存儲(chǔ)位置
}
void CLR_Buf()
{
uchar k;
for(k=0;k<Buf_Max;k++) //清空緩存區(qū)
{
Rec_Buf[k]=0;
}
i=0; //接收字符串的起始存儲(chǔ)位置
}
//***************************串口握手函數(shù)
bit Hand(uchar *a)
{
if(strstr(Rec_Buf,a)!=NULL)
return 1;
else
return 0;
}
bit Hand(uchar *a)
{
if(strstr(Rec_Buf,a)!=NULL)
return 1;
else
return 0;
}
//***************************串口中斷函數(shù)
void Serial_Int() interrupt 4
{
ES=0; //關(guān)串口中斷,防止中斷的嵌套
if(TI) //如果是串口發(fā)送中斷不進(jìn)行處理
{
TI=0;
}
if(RI)
{
RI=0; //接收中斷標(biāo)志清0
Rec_Buf[i]=SBUF;
i++;
if(i>Buf_Max)
{
i=0;
}
}
ES=1; //開(kāi)啟串口中斷
}
void Serial_Int() interrupt 4
{
ES=0; //關(guān)串口中斷,防止中斷的嵌套
if(TI) //如果是串口發(fā)送中斷不進(jìn)行處理
{
TI=0;
}
if(RI)
{
RI=0; //接收中斷標(biāo)志清0
Rec_Buf[i]=SBUF;
i++;
if(i>Buf_Max)
{
i=0;
}
}
ES=1; //開(kāi)啟串口中斷
}
//***************************主函數(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; //握手成功
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; //設(shè)置為接收英文短信模式成功
delay_ms(100);
while(!Hand("OK"));
CLR_Buf();
LED2=0; //設(shè)置為接收英文短信模式成功
Send_String("AT+CNMI=2,1\r\n"); //當(dāng)有新短信時(shí)提示并顯示儲(chǔ)存位置
delay_ms(100);
while(!Hand("OK"));
CLR_Buf();
LED3=0; //設(shè)置為來(lái)短信提示模式成功
delay_ms(100);
while(!Hand("OK"));
CLR_Buf();
LED3=0; //設(shè)置為來(lái)短信提示模式成功
Send_String("AT+CMGD=1\r\n"); //刪除1號(hào)位置短信
delay_ms(100);
while(!Hand("OK"));
CLR_Buf();
LED4=0; //刪除1號(hào)位置短信成功
while(1)
{
if(strstr(Rec_Buf,"+CMTI")!=NULL) //緩存中有+CMTI字符
{
CLR_Buf();
Send_String("AT+CMGR=1\r\n"); //讀取1號(hào)位置的短信
delay_ms(100);
while(!Hand("OK")); //此處換成"+8613297961386"則只有指定的手機(jī)都能短信控制
//+CMGR: "REC UNREAD","+8613297961386",,"12/12/02,09:26:54+32"
//maK1
//OK
if(strstr(Rec_Buf,"maK1")!=NULL)
LED5=0; //“maK1”指令開(kāi)5號(hào)指示燈
else if(strstr(Rec_Buf,"maC1")!=NULL)
LED5=1; //“maC1”指令關(guān)5號(hào)指示燈
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號(hào)位置短信
delay_ms(100);
while(!Hand("OK"));
CLR_Buf();
}
}
}
delay_ms(100);
while(!Hand("OK"));
CLR_Buf();
LED4=0; //刪除1號(hào)位置短信成功
while(1)
{
if(strstr(Rec_Buf,"+CMTI")!=NULL) //緩存中有+CMTI字符
{
CLR_Buf();
Send_String("AT+CMGR=1\r\n"); //讀取1號(hào)位置的短信
delay_ms(100);
while(!Hand("OK")); //此處換成"+8613297961386"則只有指定的手機(jī)都能短信控制
//+CMGR: "REC UNREAD","+8613297961386",,"12/12/02,09:26:54+32"
//maK1
//OK
if(strstr(Rec_Buf,"maK1")!=NULL)
LED5=0; //“maK1”指令開(kāi)5號(hào)指示燈
else if(strstr(Rec_Buf,"maC1")!=NULL)
LED5=1; //“maC1”指令關(guān)5號(hào)指示燈
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號(hào)位置短信
delay_ms(100);
while(!Hand("OK"));
CLR_Buf();
}
}
}