📄 fangdao.c
字号:
#include <fangdao.h>
uchar data int_case; //中断标志
#define MAX_TM 97 //一个号码暂时定为(12手机号码)*6=72+(ALARM2T:05)*2=20=92
uchar idata uart_buff[MAX_TM]; //通信程序中的缓冲
uchar data send_count,receive_count;
data uchar AT_Command_Type; //当前发送的命令类型
data uchar AT_Command_Status; //命令发出以后的返回参数
uchar idata para_temp[MAX_TM-2];
//uchar idata key_temp[MAX_TM];
uchar data read_tmp; ///读电话本号参数
//uchar num_tmp; ///写电话本号参数
uchar num_tmp1; ///读短信号码参数
//uchar PHONE_TMP;
uchar TMP_BUF; // 万用 值
uchar sms_tmp; ///参数代码
uchar tel_tmp;
uchar tel_tmp1; ///读电话码地址
data uchar system_tep ; ///报警功能开启与关闭参数
uchar data system_server ; //系统状态
uint data timercount; //50MS定时器,
uchar data timer_1S_cnt;
uchar data timer_100S_cnt;
uchar data timer_200S_cnt;
uchar data sync_count; //用于TC35控制的计数器
//uchar data Pick_count ;
//uchar data Ring_count;
#define _Nop() _nop_()
//位变量
bit ring_pin_flag; //振铃脚状态
bit pickup_pin_flag; //摘机脚状态
bit txd_rxd_bit;
bit INT_TMP1;
bit INT_TMP2;
bit at_send_bit;
bit sbc_bit;
//bit Hookoff_bit;
//bit Hookoff_bit1;
void Int_Timer0(void) interrupt 1 using 3
{
TH0 = 0xB8;
TL0 = 0x00; //20ms的时钟基准
timercount++;
timer_1S_cnt++;
if(timer_1S_cnt==50) //50&200=10000S
{ timer_100S_cnt++;
timer_1S_cnt=0;
timer_200S_cnt++;//IO_SBT=~IO_SBT;
LED_INT0=~LED_INT0;
}
if(timer_100S_cnt==60)
{ //timer_200S_cnt++;
timer_100S_cnt=0;
//IO_SBT=~IO_SBT;
}
//2.摘挂机事件
IO_HKS=1;
if((pickup_pin_flag!=IO_HKS))
{
if(IO_HKS==0)
{
//int_case|=INT_HANGOFF;
//int_case&=~INT_PICKUP;
INT_TMP1=0;
system_server=SYS_RING;
}
else
{ system_server=SYS_SMSR;INT_TMP1=1;}
pickup_pin_flag=IO_HKS;
}
IO_RING=1;
if((ring_pin_flag!=IO_RING))
{
if(IO_RING==0)
{
//int_case|=INT_RINGOFF;
//int_case&=~INT_RING;
INT_TMP2=0;
system_server=SYS_RING;
}
else { system_server=SYS_SMSR; INT_TMP2=1; }
ring_pin_flag=IO_RING;
}
}
/*****************************************************************************
* TC35 的命令列表,与中断服务程序 *
*****************************************************************************/
void Int_Uart(void) interrupt 4 using 3 //串口的中断程序
{
if(TI)//数据模式与命令方式共用
{
TI=0;
if(send_count>=MAX_TM-1) 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; return;
}
}
receive_count=0;
}
else
if(RI) //命令方式
{
RI=0;
if(at_send_bit==0) return;
if((send_count==0xff)&&(receive_count<MAX_TM))//没有发送时才能进行接收
{ //所有的命令返回都是处于 0x0A [Result] 0x0D 之间,其他命令,不会出现这种情况
uart_buff[receive_count++]=SBUF;
}
else
{
//ACC=SBUF;
return;
}
if(receive_count>=MAX_TM-1)
{
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')
{
AT_Command_Status=COMMAND_OK; txd_rxd_bit=1;
}
else if(uart_buff[0]=='4'||uart_buff[0]=='3')
{ 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;
// if(uart_buff[receive_count-2]=='0')
// {AT_Command_Status=COMMAND_OK;}
// else{ AT_Command_Status=COMMAND_WAIT; receive_count=0;}
}
else if(AT_Command_Type==SMS_CMGS&&uart_buff[3]=='>')
{ 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);
//max_length=strlen(ptr)+1;
flag=0;
for(i=0,j=0;i<99;i++)
{
if(uart_buff[i]==ptr2[j])
{//第一个字符相同
for(k=i;k<70;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;
for(r=1;r<20;r++)
{
if(r<=7)
{
P0=(0x80>>r);
}
else
{P0=(0x80>>r-8);}
timer_200S_cnt=0; while(timer_200S_cnt<1) system_sleep;
if(system_server==SYS_RING) return;
num_tmp1=r;
if(READ_TEL(r)!=1) //读一个短信 at+cmgr=1-19 读指令
{
BELL=1;
if(system_server==SYS_RING) return;
timer_200S_cnt=0; while(timer_200S_cnt<2&&(AT_Command_Status==COMMAND_WAIT)) system_sleep;
if(strsearch("+CMTI:")) return;
continue;
}
BELL=1;
para_temp[3]=0x00;
if(i=strsearch("START")) //控制系统开启
{
system_tep=1;
system_server=SYS_START; return;
}
//--------------------//参数查询命令--为三个语音\三个短信\二个定时时长---------------------------------------------
else if(i=strsearch("PASST")) //参数查询命令
{
system_server=SYS_PARA;
return;
}
else
{
para_temp[0]=(num_tmp1/10)+0x30;para_temp[1]=(num_tmp1%10)+0x30; para_temp[2]=0x0d;para_temp[3]=0x00;
Send_AT_Command(SMS_CMGD);
timer_200S_cnt=0; while(timer_200S_cnt<3&&(AT_Command_Status==COMMAND_WAIT)) system_sleep;
return;
}
return;
}
}
void send_sms() //发送短信
{ uchar j=1,i=1,k;
Send_AT_Command(SIM_ID);
timer_200S_cnt=0; while(timer_200S_cnt<1&&(AT_Command_Status==COMMAND_WAIT)) system_sleep;
//根据不同的方式发送短消息内容
switch(sms_tmp)
{
//======================发送收到设备开启指令================================================
case smss_alarm: //ALARM 1
IO_OUT=0;
if(!INT_TMP2) read_tmp=0x31;
else read_tmp=0x32;
{ TMP_BUF=0;
j=PHONE_RD();
para_temp[TMP_BUF++]=0x0d;
para_temp[TMP_BUF++]=0x0a;
para_temp[TMP_BUF++]=0x00;
timer_200S_cnt=0;
Send_AT_Command(SMS_CMGS);
TMP_BUF=0;
para_temp[TMP_BUF++]='S';
para_temp[TMP_BUF++]='E';
para_temp[TMP_BUF++]='N';
para_temp[TMP_BUF++]='D';
para_temp[TMP_BUF++]=0x20;
para_temp[TMP_BUF++]='O';
para_temp[TMP_BUF++]='K';
para_temp[TMP_BUF++]=0x20;
if(!INT_TMP1) {para_temp[TMP_BUF++]=0x31; }
else if(!INT_TMP2){para_temp[TMP_BUF++]=0x32; }
para_temp[TMP_BUF++]=0x1a;
para_temp[TMP_BUF++]=0x0d;
para_temp[TMP_BUF++]=0x00;
strcpy(uart_buff,para_temp);
Send_AT_Command(AT_COMMAND);
at_send_bit=1;
send_count=0xff; //设置接收成功标志
receive_count=0;
timer_200S_cnt=0; while(timer_200S_cnt<40&&(AT_Command_Status==COMMAND_WAIT)) system_sleep;
}
IO_OUT=1;
return;
break;
//tel_tmp
////======================================================================
case smss_atart :
// num_tmp1=1;
READ_TEL(num_tmp1);
if(i=strsearch("+86"))
{
for(i=i+2;i<40;i++)
{
if(uart_buff[i]>='0'&&uart_buff[i]<='9')
para_temp[j++]=uart_buff[i];
if(uart_buff[i+1]=='"'&&uart_buff[i+2]==',')
{ para_temp[0]=0x20; para_temp[j++]=0x0d; para_temp[j]=0;break;}
}
if(i>=40) return;
}
timer_200S_cnt=0; while(timer_200S_cnt<2&&(AT_Command_Status==COMMAND_WAIT)) system_sleep;
Send_AT_Command(SMS_CMGS);
TMP_BUF=0;
para_temp[TMP_BUF++]='S';
para_temp[TMP_BUF++]='E';
para_temp[TMP_BUF++]='N';
para_temp[TMP_BUF++]='D';
para_temp[TMP_BUF++]=0x20;
//" ALARM Disable " 巳打开报警功能
if(!system_tep)
{
para_temp[TMP_BUF++]='O';
para_temp[TMP_BUF++]='F';
para_temp[TMP_BUF++]='F';
para_temp[TMP_BUF++]=0x20; }
else
//ALARM Enable
{ para_temp[TMP_BUF++]='O';
para_temp[TMP_BUF++]='N';
para_temp[TMP_BUF++]=0x20;
}
para_temp[TMP_BUF++]=0x1a;
para_temp[TMP_BUF++]=0x0d;
para_temp[TMP_BUF++]=0x00;
strcpy(uart_buff,para_temp);
Send_AT_Command(AT_COMMAND);
timer_200S_cnt=0; while(timer_200S_cnt<5&&(AT_Command_Status==COMMAND_WAIT)) system_sleep;
break;
//==============发送设备参数查询返回值=========================================
case smss_para: //参数查询 记三个可拨号电话,三个可发短信手机号码,两个报警延时时长,
//read_tmp=0x31; //第一个
timer_200S_cnt=0;while(timer_200S_cnt<2&&(AT_Command_Status==COMMAND_WAIT)) system_sleep;
TMP_BUF=0;
for(read_tmp=0x31;read_tmp<=0x34;read_tmp++)
{ k=TMP_BUF;
j=PHONE_RD();
para_temp[TMP_BUF++]=0x0d;
para_temp[TMP_BUF++]=0x0a;
i=TMP_BUF;
timer_200S_cnt=0;while(timer_200S_cnt<2&&(AT_Command_Status==COMMAND_WAIT)) system_sleep;
}
para_temp[TMP_BUF++]=0x1a;para_temp[TMP_BUF++]=0x0d;para_temp[TMP_BUF++]=0x00;
i=80; j=0;
for(k=0;k<=15;k++)
{
uart_buff[i++] =para_temp[k];
}
READ_TEL(num_tmp1);
j=0;
if(i=strsearch("+86"))
{
for(i=i+2;i<40;i++)
{
if(uart_buff[i]>='0'&&uart_buff[i]<='9')
para_temp[j++]=uart_buff[i];
if(uart_buff[i+1]=='"'&&uart_buff[i+2]==',')
{ para_temp[j++]=0x0d; para_temp[j]=0;break;}
}
if(i>=40) return;
}
timer_200S_cnt=0; while(timer_200S_cnt<2&&(AT_Command_Status==COMMAND_WAIT)) system_sleep;
Send_AT_Command(SMS_CMGS);
i=80; j=0; k=20;
for(k=0;k<=15;k++)
{
para_temp[k]=uart_buff[i++];
}
strcpy(uart_buff,para_temp);
Send_AT_Command(AT_COMMAND);
break;
default:
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -