我想通过单片机控制tc35i模块,如果我发信息“吃饭”给tc35i,tc35i就会控制单片机让相应的继电器吸合,并且打电话给我确认。但是总是实现不了,请高手指点,程序如下:
#include<reg51.h>
#include<string.h>
sbit Race=P0^1;
sbit AIR=P0^2;
sbit START=P3^2; //启动端口
bit i=1,l=1; //main函数中的变量
unsigned char RsPoint=0; //接收缓存指针
unsigned char RsBuf[60]="/n"; //接收缓存数组
//延时函数
void delay(unsigned char n)
{
unsigned char i=204;
while(n--)
{
while(i--);
}
}
//51单片机初始化
void init51(void)
{
P1=0x00; //控制端端口初始化
TMOD=0X20;//定时器1,定时方式2
TH1=0XFD; //波特9600初始化
TL1=0XFD;
PCON=0X00; //波特不加倍
TCON=0X40;//定时器开始计数
SCON=0X50;//串口方式1,允许接收
IE=0X9;//EA=1,ES=1
}
//给TC35I发送ASC字符
void SendASC(unsigned char ASC)
{
bit es;
es=ES;
ES=0;
TI=0;
SBUF=ASC;
while(!TI);
TI=0;
ES=es;
}
//给TC35I发信息
void SendToTC35(unsigned char *p,unsigned char n)
{
while(n--)
{
SendASC(*p++);
}
}
//打电话的子程序 拨通后可自动挂断
void Call(void)
{
unsigned char *p;
while(1)
{
SendToTC35("ATD13484997206;",15);
SendASC(0x0d);
delay(2000);
p=strstr(RsBuf,"BUSY"); //在缓冲区寻找BUSY的出现
if(p!=NULL)
{
SendToTC35("ATH",3);
SendASC(0x0d);
break;
}
}
}
//TC51初始化设置
void initTC51i(void)
{
delay(1000);
SendToTC35("AT+CNMI=1,2,0,0,1",17); SendASC(0x0d);//有短信直接发给51
delay(1000);
SendToTC35("AT+CLIP=1",9); SendASC(0x0d);//来电显示
delay(1000);
SendToTC35("AT+CMGF=0",9); SendASC(0x0d);//中文短信
delay(1000);
}
//*************************************************************
//串口中断
//*************************************************************
void com_init(void) interrupt 4 using 3
{
char *Ring;
if(RI)
{
RsBuf[RsPoint++]=SBUF;
if(RsPoint>=sizeof(RsBuf)) //计算缓冲区的长度
{
RsPoint=0;
}
Ring=strstr(RsBuf,",161,,,,0") ;//查询到有来电标志的话 挂机
if(Ring!=NULL)
{
delay(400);
SendToTC35("ATH",3);
SendASC(0x0d);
strcpy(RsBuf+(strlen(RsBuf)-9),"/n");//清除来电激活标志: ,161,,,,0
}
RI=0;
}
}
void clr_buf(void)
{ unsigned char j;
for(j=0;j<60;j++)
RsBuf[j]=0;
j=0;
}
//*************************************************************
//主函数
//*************************************************************
void main(void)
{
unsigned char *pass;
init51();
initTC51i(); // 初始化
clr_buf();
while(1)
{
delay(300);
pass=strstr(RsBuf,"505A996D");//做饭的UNICODE代码 查询接收的短信中有做饭的代码 接通继电器
if(pass!=NULL)
{
if(i==1) { Race =1; i=0; } //开p2.0继电器
else { Race =0; i=1; } //断p2.0继电器
Call();
strcpy(RsBuf,pass+8); //接收到的PDU串 8是命令的长度(如做饭8个unicode字符)48是短信无信息时的字符个数
RsPoint=strlen(RsBuf);
}
pass=strstr(RsBuf,"1 3484997206");//接收到指定的电话后 接通相应继电器
if(pass!=NULL)
{
if(l==1) { AIR=1; l=0; }
else { AIR=0; l=1; }
strcpy(RsBuf,pass+11);
RsPoint=strlen(RsBuf);
}
}
}