搜索
bottom↓
回复: 19

tc35与51单片机联用控制远程设备

[复制链接]

出0入0汤圆

发表于 2012-1-28 19:59:08 | 显示全部楼层 |阅读模式
我想用tc35与单片机at89s52联用,控制远程设备的启停,及报警;
我在网上买了成套元件,买成品买不起,想自己做,买家提供了点程序,可是实现不了啊,求指点,求高手能帮帮忙,给个程序吧,小弟先行谢过啦!
QQ:1101187949
谢谢啦
-=-附件是卖家提供的,求指点···求代码,求程序···嘿嘿···

点击此处下载 ourdev_714720J4QE74.txt(文件大小:4K) (原文件名:TC35副程序.txt)
点击此处下载 ourdev_714721YRWCAK.txt(文件大小:3K) (原文件名:TC35主程序.txt)

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-1-29 10:54:20 | 显示全部楼层
恩!这些代码是发收短信的,没有控制报警部分啊!我贴给你点可以发短信控制继电器的,这个我在用的了!
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define RxIn 90        //定义接收的数组长度为90
uchar code AT[]="AT";        //握手信号
uchar code ATE[]="ATE";         //关回显
uchar code AT_CNMI[]="AT+CNMI=2,1";//设置这组参数来了新信息直接显示到串口,不作存储
uchar code AT_CSCA[]="AT+CSCA=\"+8613800571500\"";//设置服务中心号码
uchar code AT_CMGF[]="AT+CMGF=1";//设置短信的格式为text格式
uchar code AT_CMGR[]="AT+CMGR=";//读取短信指令
uchar code AT_CMGS[]="AT+CMGS=";//发送短信指令
uchar code AT_CMGD[]="AT+CMGD=";//删除短信指令
uchar code successfully[]="Operate Successfully!";//发送操作成功信息到目标号码
uchar code fail[]="Operate failed,try again!";        //发送操作失败信息到目标号码
uchar AT_delete[12];
uchar AT_Read[12];        //用来存储发送读取短信指令
uchar AT_SendNumber[25];  //用来存储发送短信号码指令
uchar numberbuf[3];                 //用来保存短信条数
uchar idata SystemBuf[RxIn];  //储存出口接收数据
uchar CommandBuf[6];         //用来储存指令
uchar idata state[17];          //用来存储IO口状态
uchar idata state1[17];         //用来存储IO口状态
uchar Rx=0;
uint temp;        //记录状态          
uchar temp1;        // 用于记录P0口状态
uchar temp2;   //  用于记录P2口状态
bit check=0;        //查询标志位
bit receiveready=0;                  //接收短信标志位
bit sendready=0;                  //发送短信准备标志位
bit send=0;                                   //发送短信标志位
bit flag=0;                                   //指令标志位
sbit P3_7=P3^7;//启动GSM的启动线连IGT
sbit realy0=P0^0;//继电器1
sbit realy1=P0^1;//继电器2
sbit realy2=P0^2; //继电器3
sbit realy3=P0^3;//继电器4
sbit realy4=P0^4;  //继电器5
sbit realy5=P0^5;  //继电器6
sbit realy6=P0^6;  //继电器7
sbit realy7=P0^7;        //继电器8
sbit key1=P2^0;                 //开关1
sbit key2=P2^1;                 //开关2
sbit key3=P2^2;                 //开关3
sbit key4=P2^3;                 //开关4
sbit key5=P2^4;                 //开关5
sbit key6=P2^5;                 //开关6
sbit key7=P2^6;                 //开关7
sbit key8=P2^7;                //开关8
void Delay_ms(uint i);
void Start_GSM(void);
void UART_init (void);
void sendchar(uchar ch);
void sendstring(uchar *p);
void GSM_INIT(void);
void receive_ready(void);
void message_read(void);
void read_message(void);
void sendmessage(void);
/******************************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////函数void Delay_ms(uint i);实现功能:进行毫秒延时///////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/******************************************************************************************************************/
void Delay_ms(uint i)
{
    unsigned int j;
    for(;i>0;i--){
    for(j=0;j<125;j++)
    {;}
}
}
/******************************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////函数void Start_GSM(void);实现功能:对TC35进行启动,开启TC35///////////////////////////////////
//功能详述:单片机上的P3_7管脚是跟TC35的IGT管脚相连;需要启动TC35,必须在 15脚(/IGT)加时长至少为100ms的低电平信号,
///且该信号下降沿时间小于1ms。启动后,15 脚的信号应保持高电平.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/******************************************************************************************************************/
void Start_GSM(void)
{
  P3_7=0;
  Delay_ms(1000);
  P3_7=1;
  Delay_ms(1000);
  }
/******************************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////函数void UART_init;实现功能:对串口进行初始化////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/******************************************************************************************************************/
void UART_init (void)
{
           TMOD=0x20;         //选择定时器1
     PCON=0x00;        ///波特率不加倍
     SCON=0x50;        //串行工作方式1允许串行接收               
     TH1=0xFD;        //实验板上晶振位11.0592MHZ,选择波特率为9600
     TL1=0xFD;        //在相应计数器上赋值
     EA=1;                //总中断开启
     ES=1;                //串行中断开启
     TR1=1;                //开启定时器1

  }
/******************************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////函数void sendchar(uchar ch);实现功能:发送一字节数据////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/******************************************************************************************************************/
void sendchar(uchar ch)
{
    SBUF=ch;
        while(TI==0);
        TI=0;
}
/******************************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////函数void sendstring(uchar *p);实现功能:通过串口发送字符串/////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/******************************************************************************************************************/
void sendstring(uchar *p)
{
  
  while(*p)
  {
  sendchar(*p);
  p++;
}
  sendchar(0x0D);
  sendchar(0x0A);
}
/******************************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////函数void receive(void) interrupt 4 using 1;实现功能:通过串口接收数据///////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/******************************************************************************************************************/
void receive(void) interrupt 4 using 1
{
         
if(RI)
{
   
          if(Rx<RxIn)
  {
  SystemBuf[Rx]=SBUF;
  Rx++;
  }
  
  RI=0;
}
}
/******************************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////函数void GSM_INIT(void);实现功能:初始化TC35模块///////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/******************************************************************************************************************/
void GSM_INIT(void)
{

LOOP:
        Delay_ms(1000);
        sendstring(AT);
        Delay_ms(1000);
    sendstring(ATE);
        Delay_ms(1000);
        sendstring(AT_CNMI);
        Delay_ms(1000);
        sendstring(AT_CSCA);
        Delay_ms(1000);
        for(Rx=0;Rx<RxIn;Rx++)
                {
                        SystemBuf[Rx]=0x00;   
                }
                Rx=0;
    sendstring(AT_CMGF);
          Delay_ms(1000);
        if((SystemBuf[2]=='O')&&(SystemBuf[3]=='K'))         //判断是否模块初始化成功,成功的话模块会回复"OK"给单片机
        {                                                                                        //如果单片机没有收到OK,就继续发送初始化指令/
                           
            for(Rx=0;Rx<RxIn;Rx++)
                {
                        SystemBuf[Rx]=0x00;   
                }
                Rx=0;
        }
        else
        {               
               
             for(Rx=0;Rx<RxIn;Rx++)
                {
                        SystemBuf[Rx]=0x00;   
                }
                Rx=0;
                goto LOOP;           
        }
}
/******************************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////函数void receive_ready(void);实现功能:接收短信准备///////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/******************************************************************************************************************/
void receive_ready(void)
{
  uchar i;
if((SystemBuf[5]==0x54)&&SystemBuf[6]==0x49)                 //如果有新短信(TI)来,模块会通过串口向单片机发送字符串,
{                                                                                                         //        此函数的功能是判断是否有新短信来,如果来的话就置位准备接受位标志为1
receiveready=1;                                                                         //如果不是新短信的指令,就舍弃,并将接收数组清零/
}
else{
for(i=0;i<Rx;i++)
                {
                        SystemBuf=0x00;   
                }
                Rx=0;
}
}
/******************************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////函数 void message_read(void);实现功能:判断短信,准备是否回复短信给目标号码//////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/******************************************************************************************************************/
void message_read(void)
{
   
  if((sendready==1)&&(SystemBuf[5]==0x47)&&(SystemBuf[6]==0x52))  //GR
  send=1;
  }
/******************************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////函数  void read_message(void);实现功能:发送读取短信指令,////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/******************************************************************************************************************/          
   void read_message(void)
{
   uchar i;
   Delay_ms(1000);
   for(i=0;i<3;i++)
   {
        numberbuf=SystemBuf[14+i];
        }
  
   for(i=0;i<8;i++)
        {
        AT_Read=AT_CMGR;
        }
   for(i=8;i<11;i++)
   {
        AT_Read=numberbuf[i-8];                                  
        }
        for(Rx=0;Rx<RxIn;Rx++)
                {
                        SystemBuf[Rx]=0x00;   
                }
                Rx=0;  
   sendstring(AT_Read);                                                   //发送AT+CMGR=?,?代表短信储存所在位置
   
}
/******************************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////函数  void readcommend(void);实现功能:读取短信内容,判断相应指令是否正确//////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/******************************************************************************************************************/
void readcommend(void)
{
          uchar i;
   for(i=0;i<5;i++)                                                                                                           //将短信内容中的指令部分截取出来放到
                                              {                                                                                                //CommandBuf数组中
                                   CommandBuf=SystemBuf[64+i];
                                                }
   if((CommandBuf[0]=='o')&&(CommandBuf[1]=='p')&&(CommandBuf[2]=='e')&&(CommandBuf[3]=='n'))  //判断指令是否为开继电器指令
         {
            
             switch(CommandBuf[4])
                {
                   case 0x31: realy0=0;                                        //继电器 1开启
                                break;
                       case 0x32: realy1=0;                                        //继电器 2开启
                                break;
                       case 0x33: realy2=0;                                    //继电器 3开启
                                break;
                       case 0x34: realy3=0;                                        //继电器 4开启
                                break;
                       case 0x35: realy4=0;                                        //继电器 5开启
                                break;
                       case 0x36: realy5=0;                                         //继电器 6开启
                                break;
                       case 0x37: realy6=0;                                          //继电器 7开启
                                break;
                       case 0x38: realy7=0;                                          //继电器 8开启
                                break;
                           case 0x41: key1=0;                                        //开关1开启
                                break;
                           case 0x42: key2=0;                                        //开关2开启
                                    break;
                           case 0x43: key3=0;                                        //开关3开启
                                break;
                           case 0x44: key4=0;                                        //开关4开启
                                break;
                           case 0x45: key5=0;                                        //开关5开启
                                break;
                           case 0x46: key6=0;                                        //开关6开启
                                break;
                           case 0x47: key7=0;                                        //开关7开启
                                break;
                           case 0x48: key8=0;                                        //开关8开启
                                break;
                           case 0x4f: P0=0;P2=0;
                                    break;
                           case 0x3f: temp1=P0;
                                      temp2=P2;
                                                  temp=temp2;
                                                  temp<<=8;
                                                  temp=temp|temp1;
                                                  check=1;
                                                break;
                       default:flag=1;                                                  //其他指令定义为错误操作
                                break;                                                   //置位错误操作位为1
          }
          }
        else
        {       
        if((CommandBuf[0]=='s')&&(CommandBuf[1]=='h')&&(CommandBuf[2]=='u')&&(CommandBuf[3]=='t'))        //判断指令是否为关闭电器指令
             {
                 
                    switch(CommandBuf[4])
               {
                 case 0x31: realy0=1;                  //关闭继电器1
                           break;
                     case 0x32: realy1=1;                 //关闭继电器2
                           break;
                     case 0x33: realy2=1;                 //关闭继电器3
                          break;                       
                     case 0x34: realy3=1;                //关闭继电器4
                          break;
                     case 0x35: realy4=1;                //关闭继电器5
                           break;
                     case 0x36: realy5=1;                //关闭继电器6
                          break;
                     case 0x37: realy6=1;             //关闭继电器7
                           break;
                     case 0x38: realy7=1;                 //关闭继电器8
                          break;
                         case 0x41: key1=1;                                        //开关1关闭
                          break;
                         case 0x42: key2=1;                                        //开关2关闭
                              break;
                         case 0x43: key3=1;                                        //开关3关闭
                          break;
                         case 0x44: key4=1;                                        //开关4关闭
                          break;
                         case 0x45: key5=1;                                        //开关5关闭
                          break;
                         case 0x46: key6=1;                                        //开关6关闭
                          break;
                         case 0x47: key7=1;                                        //开关7关闭
                          break;
                         case 0x48: key8=1;                                        //开关8关闭
                          break;
                          case 0x53:P0=0xff;P2=0xff;
                              break;
                     default:flag=1;                                //其他指令定义为错误操作
                          break;                                         //置位错误操作位为1
          }
          }
         else {flag=1;}                                                //如果发送的指令既不是open也不是shut就定义为错误操作
        }
}
/******************************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////函数  void readstate;实现功能:将P0,P2口的状态转化为数组,////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/******************************************************************************************************************/
void readstate(void)
{  
   uint bitcnt,i,j;
   for(bitcnt=0,i=0;bitcnt<16,i<16;bitcnt++,i++)
   {
       if((temp<<bitcnt)&0x8000){state1=0x30;}
           else state1=0x31;
           }
        for(j=15,i=0;j>=0,i<16;j--,i++)
        {
          state[j]=state1;
          }
   
           }

/******************************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////函数  void delete_message;实现功能:删除读短信指令,////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/******************************************************************************************************************/
  void delete_message(void)
{
   uchar i;
   Delay_ms(1000);
   Delay_ms(1000);
   Delay_ms(5000);
   for(i=0;i<8;i++)
        {
        AT_delete=AT_CMGD;
        }
   for(i=8;i<11;i++)
   {
        AT_delete=numberbuf[i-8];                                  
        }
        for(Rx=0;Rx<RxIn;Rx++)
                {
                        SystemBuf[Rx]=0x00;   
                }
                Rx=0;  
   sendstring(AT_delete);                                                   //发送AT+CMGR=?,?代表短信储存所在位置
   
}
/******************************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////函数 void sendmessage(void);实现功能:发送回复短信指令,////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/******************************************************************************************************************/  
void sendmessage(void)
{
  uchar i;
        for(i=0;i<8;i++)
                        {
                                AT_SendNumber=AT_CMGS;
                        }
         for(i=8;i<24;i++)
                        {
                                AT_SendNumber=SystemBuf[14+i];                //将对方号码提取用来回复给对方
                        }
         
       
        sendstring(AT_SendNumber);
        Delay_ms(400);
        if(flag==0){ if(check==1){sendstring(state);}                 //如果查询位置1时,发送状态信息
    sendstring(successfully);
        check=0;
        }
        else{
        sendstring(fail);
        }
        Delay_ms(30);
        sendchar(0X1A);
        }
/******************************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////函数  void main();实现功能:主函数,////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/******************************************************************************************************************/  
void main()
  {       
   Start_GSM();                                //开启TC35
   Delay_ms(10000);                        //延时大约10秒 ,等待模块联网/
   UART_init();                                 //串口初始化/
   GSM_INIT();                                 //对tc35模块进行初始化
  while(1)
  {
   receive_ready();
   if(receiveready==1)
   {
     
           read_message();
         receiveready=0;
         sendready=1;
    }
     Delay_ms(300);
     message_read();
     if(send==1)
  {   
     Delay_ms(2000);
         readcommend();
         readstate();
     sendmessage();
         Delay_ms(1000);
         delete_message();
         flag=0;
         for(Rx=0;Rx<RxIn;Rx++)                                                  //每一次操作完成后对接收数组清零//
                {
                        SystemBuf[Rx]=0x00;   
                }
                Rx=0;  
        send=0;
        }
}
}

出0入0汤圆

 楼主| 发表于 2012-1-29 20:06:36 | 显示全部楼层
回复【1楼】dzwangyu  
-----------------------------------------------------------------------
谢谢,兄台发的程序我看了,我也试验啦,可是还是不行,我不知道我应该在控制短信里写什么??我发的短信是“open0x34”,可是提示我"Operate failed,try again!";        我怎么办??
我用串口工具做了测试,发送AT+CMGR=1(假设只有一条短信),收到的是【
+CMGR: "REC READ","+8613199659621",,"12/01/29,15:19:56+32"
open0x31

OK
】我数了下,数到open的o时是第61个字符,是不是得把程序中
                           CommandBuf=SystemBuf[64+i]; 中的64进行修改????
求指点,先谢谢您啦···

出0入0汤圆

发表于 2012-1-30 10:42:57 | 显示全部楼层
呵呵!发“open1”是开1号继电器!发“shut1”是关1号继电器

出0入0汤圆

发表于 2012-1-30 11:37:00 | 显示全部楼层
标记。

出0入0汤圆

 楼主| 发表于 2012-1-30 12:17:22 | 显示全部楼层
回复【3楼】dzwangyu  
-----------------------------------------------------------------------

好的,我试试····

出0入0汤圆

 楼主| 发表于 2012-1-30 13:12:05 | 显示全部楼层
感谢 dzwangyu,谢谢,谢谢您的支持,希望大家共同学习,共同进步···

出0入0汤圆

发表于 2012-1-30 13:34:51 | 显示全部楼层
mk

出0入0汤圆

发表于 2012-1-30 14:35:10 | 显示全部楼层
mk

出0入0汤圆

发表于 2012-1-30 15:44:50 | 显示全部楼层
做一个记号,马上可能就要用这个了.

出0入0汤圆

 楼主| 发表于 2012-2-2 11:45:07 | 显示全部楼层
回复【3楼】dzwangyu  
-----------------------------------------------------------------------

想控制开关1到开关8,发送短信的内容是什么??嘿嘿,打扰啦···

出0入0汤圆

发表于 2012-2-5 09:14:14 | 显示全部楼层
open12345678

出0入0汤圆

发表于 2012-2-5 11:16:16 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2012-2-8 18:52:59 | 显示全部楼层
回复【12楼】dzwangyu  
-----------------------------------------------------------------------

open1是开继电器的,开关怎么办??不是16路么?求解···谢谢,嘿嘿···

出0入0汤圆

发表于 2012-7-23 12:14:09 | 显示全部楼层
dzwangyu 发表于 2012-1-29 10:54
恩!这些代码是发收短信的,没有控制报警部分啊!我贴给你点可以发短信控制继电器的,这个我在用的了!
#in ...

你好、程序中有好多不太明白的地方,能给个联系方式吗?

出0入0汤圆

发表于 2012-9-24 12:51:02 | 显示全部楼层
学习中,正在调试tc35.一直都在疑惑中。

出0入0汤圆

发表于 2012-9-27 08:53:02 | 显示全部楼层
有人用飞信调通的么?

出0入0汤圆

发表于 2012-11-11 19:09:02 | 显示全部楼层
上面的程序有人调通么,我遇到点问题

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-8-26 08:31

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

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