搜索
bottom↓
回复: 1

请大家帮忙看看这个程序51控制TC35I

[复制链接]

出0入0汤圆

发表于 2009-4-25 10:02:51 | 显示全部楼层 |阅读模式
#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)

出0入0汤圆

发表于 2009-4-28 16:54:29 | 显示全部楼层
你好,你用430编过控制TC35i的程序吗
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 00:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表