|
#include<reg51.h>
#include<string.h>
#include<stdio.h>
unsigned char RsBuf[400]="\n";
unsigned char RsPoint=0;
//延时程序(延时N毫秒)
delay(unsigned char n)
{
unsigned char i,j,k;
for(i=2;i>0;i--)
for(j=n;j>0;j--)
for(k=125;k>0;k--);
}
//51单片机初始化
void init51(void)
{
P1=0; //监视端端口初始化
P2=0; //控制端商口初始化
TMOD=0X20;//定时器1,定时方式2
TH1=0XFD; //波特9600初始化
TL1=0XFD;
PCON=0X00; //波特不加倍
TCON=0X40;//定时器开始计数
SCON=0X50;//串口方式1,允许接收
IE=0X99;//EA=1,ES=1,ET1=1,EX0=1
}
//给TC35I发送ASC字符
void SendASC(unsigned char ASC)
{
IT0=0;//屏蔽中断
TI=0;
SBUF=ASC;
while(!TI);
}
//给TC35I发信息
void SendToTC35(unsigned char *pp,int n)
{ unsigned int i=0;
IT0=0;//屏蔽中断
while(n--)
{
SendASC(*(pp+i)); i++;
}
IT0=1;
}
//打电话的子程序 拨通后可自动挂断
void Call()
{
unsigned char *p;
IT0=0; //外中断关闭
while(1)
{
SendToTC35("ATD15881084287;",15);
SendASC(0x0d);
delay(2000);
p=strstr(RsBuf,"BUSY");
if(p!=NULL) //如果打通了后就延时一下,再挂机
{
delay(1000);
SendToTC35("ATH",3);
SendASC(0x0d);//回车
break;
}
}
IT0=1;
}
//TC51初始化
void initTC51i()
{
SendToTC35("AT",2); SendASC(0x0d);//测试回应
SendToTC35("AT+CNMI=1,2,0,0,1",17); SendASC(0x0d);//有短信直接发给51
SendToTC35("AT+CLIP=1",9); SendASC(0x0d);//来电显示
SendToTC35("/AT+CMGF=0",9); SendASC(0x0d);//中文短信
Call();//初始化后回拔电话表示已完成
}
//发短信
void SendMSG(char *p)
{ unsigned char final[128]="0891683108200805F0";//设短信有20个字,总共128个长度
unsigned char sub[110]="11000d81685188014882f7000800";//
unsigned char send[11] ; //装AT+CMGS=长度来发送
unsigned char *ss;
unsigned char subb[3]; //发送内容长度两位十六进制
unsigned int i=strlen(p);
sprintf(subb,"%02x",i);
strcat(sub,subb); //添加长度
strcat(sub,p);//添加内容
i=strlen(sub);
sprintf(send,"AT+CMGS=%02d",i);
strcat (final,sub); //最终发送的PDU串
while(1)
{
SendToTC35(send,strlen(send));//发送AT+CMGS=??
SendASC(0x0d);
delay(2000); //让TC35有时间反应
ss=strstr(RsBuf,"0x3e"); //0x3e就是‘>’
if(ss!=NULL)
{
SendToTC35(final,strlen(final));
SendASC(0x1a);//发送短信结束符
delay(2000);//让TC35有时间反应
ss=strstr(RsBuf,"OK");
if(ss!=NULL)
break;
}
}
}
// IT0中断函数
void time0_init() interrupt 0 using 1
{
unsigned char answer[80]="8B66544A"; //发送短信串初始为“警告”
if(P1^0==1) strcat(answer,"53D173B0964C751F4EBA");// “发现陌生人”
if(P1^1==1) strcat(answer,"592971366C146CC46F0F");//"天然气泄漏"
EA=1;
ES=1;
SendToTC35(answer,strlen(answer));
SendASC(0x0d);
delay(200);
IT0=1;
}
//串口中断
void com_init() interrupt 4 using 2
{
char *Ring;
EA=0;
if(RI==1)
{
RsBuf[RsPoint++]=SBUF;
if(RsPoint>=sizeof(RsBuf))
{
RsPoint=0;
}
Ring=strstr(RsBuf,",161,,,,0") ;
if(Ring!=NULL)
{
SendToTC35("ATH",3);
SendASC(0x0d);
strcpy(RsBuf+(strlen(RsBuf)-9),"\n");//清除来电激活标志: ,161,,,,0
} }}
//主函数
void main()
{
unsigned int i=-1,j=-1,k=-1,l=-1;
unsigned char *pass;
//设置RsBuf和Judge两个数组是为了以防在WHILE循环下RSBUF变化而造成没有对原数据判断到的情况
unsigned char Judge[400]="\n";
init51() ;
initTC51i();
strcpy(Judge,RsBuf);
while(1)
{
pass=strstr(Judge,"505A996D");//做饭的UNICODE代码
if(pass!=NULL)
{
i=-i;
if(i==1) P2^0=1; //开p2.0继电器
else P2^0=0; //断p2.0继电器
call();
}
pass=strstr(Judge,"7A7A8C03");//空调的UNICODE代码
if(pass!=NULL)
{
j=-j;
if(j==1) P2^1=1;//开p2.1继电器
else P2^1=0;//断p2.1继电器
call();
}
pass=strstr(Judge,"753A89C6");//电视的UNICODE代码
if(pass!=NULL)
{
k=-k;
if(k==1) P2^2=1;//开p2.2继电器
else P2^2=0;//断p2.2继电器
call();
}
pass=strstr(Judge,"15881084287");//来电话后
if(pass!=NULL)
{
l=-l;
if(l==1) P2^3=1;
else P2^3=0;
call();
}
if(strcmp(RsBuf,Judge)!=0) // 判断两个数组变没有
{
strcpy(Judge,RsBuf);
strcpy(RsBuf," ");//清接收缓冲
}
}
我要实现在功能是(1)用热释红外等东西组成监控部分,有情况时会给51单片机发信息,51再通过TC35把相应的情况以短信的方式给告知机主
(2)机主可以给TC35发短信,51通过查看短信内容进行相应操作(对一些继电器进行关合以达到控制家电的目的)
现在的情况是,我编译时不能通过,有‘_SendMSG’:auto segment too large等三个问题,如下附图中显示的一样
请各位帮我看一下这个程序,看看哪出问题了,
另外程序中肯定还有不对的地方,也请大家给看看,谢谢大家了!!!
编译出错图 (原文件名:问题d.JPG) |
|