/********************************************************** 
             GTM900-B工业模块模块测试程序1            
程序功能:远程控制两路继电器的吸合与断开\远程控制两路开关 
                  短信控制 
单片机型号:STC12C5A60S2  支持双串口  
 
晶振:11.0592M         波特率:9600bps 
 
应用软件:Keil2或Keil3                                                
                                                                                                                                         
发布时间:2011-12—10 
 
公司:汇诚科技 
 
作    者:QQ790244909  旺旺:电子开发直销            
**********************************************************/ 
#include<reg52.h> 
#include<string.h> 
 
#define Buf_Max 200 //缓存长度200 
#define Delay_Time 3000  //延时长度 
 
sbit jdq1 = P0^0; //继电器1 
sbit jdq2 = P0^1; //继电器2 
//sbit LED3 = P0^2; //状态指示灯3 
//sbit LED4 = P0^3; //状态指示灯4 
 
 
unsigned char i = 0;               //定义缓存指针 
unsigned char Rec_Buf[Buf_Max];    //定义缓存数组 
 
void Serial_Init(void);            //声明串口初始化函数 
void Send_ASCII(unsigned char *b); //声明发送字符(ASCII码)函数 
void Delay_ms(unsigned int time);  //声明延时函数 
void CLR_Buf(void);                                   //声明清除缓存内容         
void Send_Hex(unsigned char b);    //声明发送字符(十六进制)函数 
bit  Hand(unsigned char *a);       //声明判断缓存中是否含有指定的字符串函数 
 
/**********************************主函数******************************/ 
void main(void) 
{ 
            Serial_Init();         //初始化串口 
                        CLR_Buf();             //清除缓存内容 
                Delay_ms(60000);        //延时 
                        Send_ASCII("AT");    //发送联机指令  
                while(!Hand("OK"))     //判断是否握手成功,如果不成功延时一会,再发送AT握手指令 
                                { 
                                        Send_ASCII("AT"); //发送联机指令  
                                        Delay_ms(60000);   //延时 
                                } 
                        CLR_Buf();                //清除缓存内容 
                                 
                        Delay_ms(Delay_Time);     //延时 
                    Send_ASCII("AT+CPMS=\"SM\",\"SM\",\"SM\"");//所有操作都在MT(模块终端)中进行 
                        Delay_ms(Delay_Time);     //延时 
                        while(!Hand("OK"));       //等待设置成功 
                        CLR_Buf();                //清除缓存内容 
                                         
                        Delay_ms(Delay_Time);     //延时 
                        Send_ASCII("AT+CNMI=2,1");//设置当有新短信到来时提示  
                        Delay_ms(Delay_Time);     //延时 
                        while(!Hand("OK"));       //等待设置成功 
                        CLR_Buf();                //清除缓存内容 
         
                        Delay_ms(Delay_Time);     //延时 
                        Send_ASCII("AT+CMGF=1");  //文本(TEXT)模式  
                        Delay_ms(Delay_Time);     //延时 
                        while(!Hand("OK"));              //等待设置成功 
                        CLR_Buf();                //清除缓存内容 
 
                /*        Delay_ms(Delay_Time);     //延时 
                        Send_ASCII("AT+CMGD=1");  //删除第一条信息 
                        Delay_ms(Delay_Time);     //延时 
                        while(!Hand("OK"));              //等待设置成功 
                        CLR_Buf();                //清除缓存内容  */ 
 
/*                    Delay_ms(Delay_Time);     //延时 
                        Send_ASCII("AT+CSCA="shoujihao"");  //文本(TEXT)模式  
                        Delay_ms(Delay_Time);     //延时 
                        while(!Hand("OK"));              //等待设置成功 
                        CLR_Buf();                //清除缓存内容   
*/ 
                             
                        while(1) 
                                {  
                                    if(strstr(Rec_Buf,"+CMTI")!=NULL)    //若缓存字符串中含有"+CMTI"就表示有新的短信 
                                        { 
                                                        CLR_Buf();                   //清除缓存内容 
                                                        Delay_ms(Delay_Time);        //延时 
                                                        Send_ASCII("AT+CMGR=1");     //发送读取信息指令 
                                                        Delay_ms(Delay_Time);        //延时 
                                            while(!Hand("OK"));          //等待设置成功 
                                                 
                                                if(strstr(Rec_Buf,"openjdq1")!=NULL)       //如果信息内容是"open1" 
                                                    jdq1 = 0;                           //点亮LED7指示灯 
                                            else if(strstr(Rec_Buf,"closeljdq1")!=NULL) //如果信息内容是"close1" 
                                                        jdq1 = 1;                                //熄灭LED7指示灯 
                                                       else if(strstr(Rec_Buf,"openjdq2")!=NULL)  //如果信息内容是"open2" 
                                                                jdq2 = 0;                           //点亮LED8指示灯 
                                                else if(strstr(Rec_Buf,"closejdq2")!=NULL) //如果信息内容是"close2" 
                                                    jdq2 = 1;                                //熄灭LED8指示灯 
                                                        CLR_Buf();                              //清除缓存内容 
                                          
                                                        Delay_ms(Delay_Time);                   //延时 
                                                        Send_ASCII("AT+CMGD=1");                //删除读取后的信息 
                                                        Delay_ms(Delay_Time);                   //延时 
                                                        while(!Hand("OK"));                            //等待设置成功 
                                                        CLR_Buf();                              //清除缓存内容 
                                                } 
                                          if(strstr(Rec_Buf,"RING")!=NULL)                            //有电话时两路继电器吸合 
                                          { 
                                           jdq1=0; 
                                           jdq2=0; 
                                          } 
               } 
} 
 
/***************************串口初始化函数*****************************/ 
/*函数原型:void Serial_Init(void) 
/*函数功能:串口初始化 
/*输入参数:无 
/*输出参数:无 
/**********************************************************************/ 
void Serial_Init(void)//串口初始化函数 
{ 
 SCON = 0x50;//串口:方式1,允许发送和接收 
 TMOD = 0x20;//定时器1:模式2,8位自动重装模式,用于产生波特率     
 TH1 = 0xFD; //11.0592MHZ晶振,波特率为9600 
 TL1 = 0xFD;    
 TR1 = 1;    //开启定时器1    
 ES = 1;     //开启串口中断 
 EA = 1;     //开启全局中断 
} 
 
/****************************串口中断处理函数**************************/ 
/*函数原型:void Serial_Int(void) 
/*函数功能:串口中断处理 
/*输入参数:无 
/*输出参数:无 
/**********************************************************************/ 
void Serial_Int() interrupt 4  
{         
        ES = 0;         //关串口中断,防止中断嵌套 
        if(TI)         //如果是发送中断,则不做任何处理 
                { 
                        TI = 0;  //清除发送中断标志位 
                } 
        if(RI)         //如果是接送中断,则进行处理 
                { 
                        RI = 0; //清除接收中断标志位 
                        Rec_Buf = SBUF; //将接收到的字符串存到缓存中 
                        i++;               //缓存指针向后移动 
                        if(i>200)          //如果缓存满,将缓存指针指向缓存的首地址 
                                { 
                                        i = 0; 
                                } 
                } 
        ES = 1;         //开启串口中断 
} 
/****************************发送字符(ASCII)函数***********************/ 
/*函数原型:void Send_ASCII(unsigned char *b)  
/*函数功能:发送字符(ASCII码) 
/*输入参数:unsigned char *b 
/*输出参数:无 
/**********************************************************************/ 
void Send_ASCII(unsigned char *b)          
{ 
    ES = 0;                   //关串口中断 
    for (b; *b!='\0';b++) 
            { 
                SBUF = *b; 
                while(TI!=1);     //等待发送完成 
                        TI = 0;           //清除发送中断标志位 
                } 
        ES = 1;                   //开串口中断 
        Send_Hex(0x0d);           //发送回车符 
         Send_Hex(0x0a);           //发送换行符  
} 
/****************************time ms延时函数***************************/ 
/*函数原型 elay_ms(unsigned int time) 
/*函数功能:延时Time ms 
/*输入参数:time 
/*输出参数:无 
/**********************************************************************/ 
void Delay_ms(unsigned int time) 
{ 
 unsigned char j; 
 for(;time>0;time--) 
         { 
                  j = 1500; 
                  while(j--); 
         } 
} 
 
/**************************清除缓存数据函数****************************/ 
/*函数原型:void CLR_Buf(void) 
/*函数功能:清除缓存数据 
/*输入参数:无 
/*输出参数:无 
/*调用模块:无 
/**********************************************************************/ 
void CLR_Buf(void) 
{ 
        unsigned char k; 
    for(k=0;k<Buf_Max;k++)    //将缓存内容清零 
            { 
                        Rec_Buf[k] = 0; 
                } 
    i = 0;                    //接收字符串的起始存储位置 
} 
 
/*************************发送字符(十六进制)函数********************/ 
/*函数原型:void Send_Hex(unsigned char c) 
/*函数功能:发送字符(十六进制) 
/*输入参数:unsigned char c 
/*输出参数:无 
/*调用模块:无 
/******************************************************************/  
void Send_Hex(unsigned char c)          
{ 
    ES = 0;               //关串口中断 
    SBUF = c; 
    while(TI!=1);         //等待发送完成 
    TI = 0;               //清除发送中断标志位 
        ES = 1;               //开串口中断 
} 
 
/*****************判断缓存中是否含有指定的字符串函数******************/ 
/*函数原型:bit Hand(unsigned char *a) 
/*函数功能:判断缓存中是否含有指定的字符串 
/*输入参数:unsigned char *a 指定的字符串 
/*输出参数:bit 1---含有    0---不含有 
/*调用模块:无 
/*******************************************************************/ 
bit Hand(unsigned char *a) 
{  
    if(strstr(Rec_Buf,a)!=NULL) 
            return 1; 
        else 
                return 0; 
} 
 
 
 
 
 |