#include <cheshi.h>
uchar data int_case; //中断标志
#define MAX_TM 66 //短信收到内容代码的最大值
#define MAX_T 60 //发送短信内容的最大值
uchar idata uart_buff[MAX_TM]; //通信程序中的缓冲
uchar idata send_count,receive_count; //发送与接收 数组的指针
data uchar AT_Command_Type; //当前发送的命令类型
data uchar AT_Command_Status; //命令发出以后的返回参数
uchar idata para_temp[MAX_T]; //多用临时用
uchar data read_tmp; ///读电话本号参数
uchar data num_tmp1; ///读短信号码参数
uchar data TMP_BUF; // 万用 值
uchar data sms_tmp; ///参数代码
uchar idata TEL_temp[20]; //存对方号码,
#define IO_OUT P3_5 ///继电器专用脚
uchar data system_server ; //系统状态
//---定时用-----------
uint data timercount; //50MS定时器,
uchar data timer_1S_cnt;
uchar data timer_10S_cnt;
uchar data timer_S_cnt;
uchar data timer_tmp;
//--------------------
uchar data ring_cnt; //振铃用
uchar data eer_int; //收到TC35模块来的错识代码计数器
//位变量
bit TC35_bit ;
bit ring_bit ; // 电话呼入 2
bit txd_rxd_bit; //接收正确的指令中断
bit at_send_bit; //发送允许
void Int_Timer0(void) interrupt 1 using 3
{
TH0 = 0xB8;
TL0 = 0x00; //20ms的时钟基准
watch_dog_clear;
timer_1S_cnt++; timer_tmp++;
if(timer_1S_cnt==50) //20×50=1000MS =1S
{ timer_10S_cnt++;
timer_1S_cnt=0;
timer_S_cnt++;
LED_INT0=~LED_INT0; //灯闪动
} //1秒=1000毫秒
if(timer_10S_cnt==10) //10S
{
timer_10S_cnt=0;
timercount++;
}
}
/*****************************************************************************
* TC35 的命令列表,与中断服务程序 *
*****************************************************************************/
void Int_Uart(void) interrupt 4 using 3 //串口的中断程序
{
//-----------------------------------------------------
if(TI)//数据模式与命令方式共用
{
TI=0;
if(send_count>=MAX_TM-5) send_count=0;
if((uart_buff[send_count]==0)) //应该检测命令结束代码,检测到时结束通信
{ //防止发送完后,再次发送
at_send_bit=1; //进行接收充许
send_count=0xff;
uart_buff[0]=0; //清除接收缓冲区
receive_count=0;
return;
}
else
{ if(uart_buff[send_count]<=0xB0)
SBUF=uart_buff[send_count++];
if((uart_buff[send_count]==0)) //应该检测命令结束代码,检测到时结束通信
{ at_send_bit=1; //进行接收充许
send_count=0xff;
uart_buff[0]=0; //清除接收缓冲区
receive_count=0; //接收位清0
return;
}
}
receive_count=0; //接收位清0,不充许发送时,接收
}
//-----------------------------------------------
else
if(RI) //命令方式
{
RI=0;
if(at_send_bit==0) return; //正在发送时返回
if((send_count==0xff)&&(receive_count<MAX_TM-5))//没有发送时才能进行接收
{ //所有的命令返回都是处于 0x0A [Result] 0x0D 之间,其他命令,不会出现这种情况
uart_buff[receive_count++]=SBUF;
}
else
{
//ACC=SBUF;
return;
}
if(receive_count>=MAX_TM-5) //超过数组最大值后处理
{ eer_int=0;
if(AT_Command_Type==SMS_CMGR) receive_count=0;
else
{ receive_count=0;
AT_Command_Status=COMMAND_OK;
return;
}
receive_count=0;
}
if((receive_count==2)&&(uart_buff[1]==0x0d))//没有包含为其他信息的命令返回
{ //接收到一个命令回应,可能为,0-OK 1-CONNECT 2-RING 3-NO CARRIER 4-ERROR
//只返回OK
uart_buff[receive_count]=0;
if(uart_buff[0]=='0')// 0x30 0x0d 指令回OK
{
AT_Command_Status=COMMAND_OK; //txd_rxd_bit=1;
}
if(uart_buff[0]=='2') //0x32 0x0d RING 有电话呼入
{ ring_bit=1; ring_cnt++;
AT_Command_Status=COMMAND_OK; //txd_rxd_bit=1;
ES=1; //设置发送指针
receive_count=0;
send_count=0xff;
}
else if(uart_buff[0]=='4'||uart_buff[0]=='3') // 0x34 0x0d ERR0R 指令出错 0x33 0x0d 占线或挂机
{ AT_Command_Status=COMMAND_ERROR;}
else AT_Command_Status=COMMAND_UNKNOW;
txd_rxd_bit=1;
uart_buff[receive_count]=0;
return;
}
else if((uart_buff[receive_count-1]==0x0d) //接收二行以上代码,一般都是短信的代码及查询指令的代码
&&(receive_count>=3)
&&(uart_buff[receive_count-3]==0x0a)
&&((uart_buff[receive_count-2]=='0')))
{ ///可能是包含为其他信息的命令返回
uart_buff[receive_count]=0;//RECEIV OK ANSWER, with some message
AT_Command_Status=COMMAND_OK; txd_rxd_bit=1;
eer_int=0;
}
//短信发送时用的代码回复
else if((AT_Command_Type==SMS_CMGS||AT_Command_Type==AT_COMMAND)&&uart_buff[2]=='>')
{ AT_Command_Status=COMMAND_OK; txd_rxd_bit=1;
return;
}
}//End of if(RI)
}
/*********************************************************************
* C51中字符串函数的扩充 *
*********************************************************************/
uchar strsearch(uchar *ptr2)//查字符串*ptr2在*ptr1中的位置
//本函数是用来检查字符串*ptr2是否完全包含在*ptr1中
//返回: 0 没有找到
// 1-255 从第N个字符开始相同
{
//、 uchar max_length;
uchar i,j,k;
uchar flag;
if(ptr2[0]==0) return(0);
flag=0;
for(i=0,j=0;i<MAX_TM-2;i++)
{
if(uart_buff[i]==ptr2[j])
{//第一个字符相同
for(k=i;k<MAX_TM-2;k++,j++)
{
if(ptr2[j]==0)//比较正确
return(i+1); //返回值是整数,不含0
if(uart_buff[k]!=ptr2[j]) break;
}
j=0;
}
}
return(0);
}
//============================================
//========== 读写短信程序
//====================================================
void read_sms()
{ uchar i,r,j,t;
for(r=1;r<20;r++) // PT2272_D0
{
num_tmp1=r;
if(READ_TEL(r)!=1) //读一个短信 at+cmgr=1-19 读指令
{
//+CMTI: "SM",1
if(strsearch("+CMTI:")) return;
continue; //没有短信处理
}
//-----以下是读到短信后进行处理---------------
//TEL_temp[18] 读出对方号码
//从代码中 找到对方号码并存入 TEL_temp数组中
t=2; i=0;
for(j=15;j<25;j++)
{
if((uart_buff[j]==0x22)&&(uart_buff[j+1]==',')&&uart_buff[j+2]==0x22) break;
}
j=j+3 ;
if(uart_buff[j]=='+') j=j+3 ; //如果是+86 去掉+86 再存
for(;j<40;j++) //长度不超过40
{ if(uart_buff[j]==0x22) break;
para_temp[t++]=uart_buff[j];
TEL_temp[i++]=uart_buff[j];
}
TEL_temp[i++]=0x0d ;TEL_temp[i++]=0x00 ;para_temp[t++]=0x0d;
para_temp[t++]=0x00;
//------------------------------------
//---------------手机号码设置-------------
if((i=strsearch("START"))) // 低控制 吸合继电器
{
IO_OUT=0; //吸合 继电器
system_server=SYS_TEL;//转入短信发送
return;
}
else if((i=strsearch("END"))) //
{
IO_OUT=1; //断开继电器
system_server=SYS_ALARM; ///转入短信发送
return;
}
else {
//删除 不是自己要的短信内容
para_temp[0]=(num_tmp1/10)+0x30;para_temp[1]=(num_tmp1%10)+0x30; para_temp[2]=0x0d;para_temp[3]=0x00;