当前位置:文档之家› 51单片机控制GSM模块收发短信代码

51单片机控制GSM模块收发短信代码

#include

/*#define uchar unsigned char
#define uint unsigned int */
#define int4 unsigned char
#define int8 unsigned int
int4 volatile GsmRcvAt[50] = {0};
int4 volatile GsmRcv[50] = {0};
int4 volatile GsmRcvCnt = 0;
int4 volatile GsmAtFlag = 0 ;
char str[5]={"12345"} ;
/*****************************************************
串口2初始化
*****************************************************/
char Uart2Init(char s2smod,char brtx12,int4 reload)
{
S2CON = 0X50;//8位可变波特率,无奇偶位
BRT = reload;//设置独立波特率发生器波特率

if(s2smod == 1)
{
AUXR |= S2SMOD; //S2SMOD = 1;//波特率倍速位
}
else if(s2smod == 0)
{
AUXR &= (~S2SMOD); //S2SMOD = 0;//取消波特率倍速位
}
else
{
return -1;
}

if(brtx12 == 1)
{
AUXR |= BRTx12;//BRTx12 = 1;1T模式
}
else if(brtx12 == 0)
{
AUXR &= (~BRTx12);//BRTx12 = 0;12T模式
}
else
{
return -2;
}

AUXR |= BRTR;//开启波特率发生器
IE2 |= ES2;// ES2 = 1; //允许串口2中断
EA = 1; //开总中断
return 0;
}
/******************************************************************************
名:void Uart2Sends(char* data_at)
作用: 发送字符串到串口2
参数: char* data_at 字符串头地址
返回:
*******************************************************************************/
void Uart2Sends(char* data_at)
{

int4 cnt=0;

IE2 &= (~ES2);//关闭串口2中断//ES2 = 0;
S2CON &= (~S2TI);//S2TI = 0;


while(*(data_at+cnt)) //判断一串数据是否结束
{
S2BUF = *(data_at+cnt);//装入数据
while((S2CON & S2TI) == 0);
S2CON &= (~S2TI);//S2TI = 0;
cnt++;

}

S2CON &= (~S2TI);//S2TI = 0;
IE2 |= ES2;//ES2 = 1;
}
/*////////////////////////////////////////////////////////////////////////////////////////////////////
// 函数名:void Uart2Send(char i)
// 作用: 用于gprs连接的串口1向gps发送1字节数据
// 参数: i 要发送的数据
// 返回: void
////////////////////////////////////////////////////////////////////////////////////////////////////*/
void Uart2Send(char i)
{
int4 temp = 0;

IE2 &= (~ES2);//关闭串口2中断//ES2 = 0;
S2CON &= (~S2TI);//S2TI = 0;
S2BUF = i;//装入数据
do
{
temp = S2CON;
temp = temp & 0x02;//temp = S2TI;
}while(temp == 0);//判断是否发送完毕

S2CON &= (~S2TI);//S2TI = 0;
IE2 |= ES2;//ES2 = 1;

}

/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay1(int4 del)
{
int8 i,j;
for(i=0; ifor(j=0; j<1827; j++)
;
}

void main()
{
int8 g = 0;
Uart2Init(0,0,232);//初始化串口,设置波特率1200

GsmAtFlag = 0;
while(GsmAtFlag == 0)
{
Uart2Sends("AT+IPR=1

200\r");//设置sim300波特率1200
Delay1(100);//延时1秒
}
GsmAtFlag = 0;

Uart2Sends("ATE0\r");//设置sim300波特率

while(1)//这一步删除第一条短信,保证以后收到的短信保存在1的位置
{
Uart2Sends("AT+CMGD=1\r");
Delay1(100);//延时1秒
while(GsmAtFlag == 0);
if(GsmRcvAt[0] == 'O' && GsmRcvAt[1] == 'K' )
{
break;
}
}
while(1)
{
if(GsmAtFlag == 1)
{
GsmAtFlag = 0;
if(GsmRcvAt[0] == '+' && GsmRcvAt[1] == 'C' && GsmRcvAt[2] == 'M' && GsmRcvAt[3] == 'T' && GsmRcvAt[4] == 'I')//收到短信息
{
Uart2Sends("AT+CMGF=1\r");//设置短信TEXT模式,当AT+CMGF=0 是UDP模式
Delay1(100);//延时1秒
Uart2Sends("AT+CMGR=1\r");//读出刚才收到的短信息,短信息保存在1的位置
}

else if(GsmRcvAt[0] == 'O' && GsmRcvAt[1] == 'K')
{
}

else if(GsmRcvAt[0] == '+' && GsmRcvAt[1] == 'C' && GsmRcvAt[2] == 'M' && GsmRcvAt[3] == 'G' && GsmRcvAt[4] == 'R')//收到短信息
{

GsmAtFlag = 0;//将AT指令收到标志位置0
while(GsmAtFlag == 0);//等待读出短信内容
if(GsmRcvAt[0] == '1')//读出的短信内容是1
{
Uart2Sends("AT+CMGF=1\r");//开启英文发送模式
Delay1(5);//等待15秒
Uart2Sends("AT+CMGS=\"187********\"\r"); //接收号码
Delay1(50);
Uart2Sends('1');
Uart2Send(0x1a);
}
else if(GsmRcvAt[0] == '0')//读出的短信内容是0
{
}
Uart2Sends("AT+CMGD=1\r");//删除该短信


}

g = 0;
while(GsmRcvAt[g] != 0)
{
GsmRcvAt[g] = 0;
g++;
}
}
}

}
void Uart2InterruptReceive(void) interrupt 8
{
unsigned char tmp = 0;
int8 i = 0;

IE2 &= (~ES2);//关闭串口2中断//ES2 = 0;
if(S2CON & S2RI) //if(S2RI == 1)
{

S2CON &= (~S2RI);//S2RI = 0;
tmp = S2BUF;

GsmRcv[GsmRcvCnt] = tmp;
GsmRcvCnt++;

if(GsmRcv[GsmRcvCnt-2] == 0x0d && GsmRcv[GsmRcvCnt-1] == 0x0a && GsmRcvCnt >= 2)
{
for(i=0; i{
GsmRcvAt[i] = GsmRcv[i];
GsmRcv[i] = 0;
}
GsmRcvCnt = 0;
GsmAtFlag = 1;

}
else if(GsmRcvCnt >= 99)
{
GsmRcvCnt = 0;
}


}

IE2 |= ES2;//ES2 = 1;
}

相关主题
文本预览
相关文档 最新文档