单片机控制tc35i程序源代码

我想通过单片机控制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);

 
   }
}    
 
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值