📄 cheshi.#3
字号:
#include <cheshi.h>
uchar data int_case; //中断标志
#define MAX_TM 100 //一个号码暂时定为(12手机号码)*6=72+(ALARM2T:05)*2=20=92
uchar xdata uart_buff[MAX_TM]; //通信程序中的缓冲
uchar data send_count,receive_count;
data uchar AT_Command_Type; //当前发送的命令类型
data uchar AT_Command_Status; //命令发出以后的返回参数
//uchar string_temp[20];
uchar idata para_temp[MAX_TM];
//uchar idata key_temp[MAX_TM];
uchar data read_tmp; ///读电话本号参数
uchar num_tmp1; ///读短信号码参数
uchar TMP_BUF; // 万用 值
uchar sms_tmp; ///参数代码
uchar batt_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_10S_cnt;
uchar data timer_S_cnt;
uchar data timer_led1_cnt; //第一个灯闪计数器
uchar data timer_led2_cnt; //第二个灯闪计数器
uchar data ring_cnt;
uchar data eer_int; //收到TC35模块来的错识代码计数器
//uchar data sync_count; //用于TC35控制的计数器
//uchar data Pick_count ;
//uchar data Ring_count;
#define _Nop() _nop_()
//位变量
bit hsk1_pin_flag;
bit ring_pin_flag;//振铃脚状态
bit ring_bit ; // 电话呼入 2
bit pickup_pin_flag; //摘机脚状态
bit txd_rxd_bit;
bit INT_TMP1;
bit INT_TMP2;
bit at_send_bit;
bit tel1_bit; //指定呼入程序开启与取消
bit sms_tmp_bit; //:发短信 QXA 可立即取消10的受控设置。但不影响***的运行
bit p2_stop_bit;
// 中断 IO 模拟脚
bit io_p01_bit;
bit io_p02_bit;
bit io_p03_bit;
bit io_p04_bit;
bit io_p05_bit;
bit io_p06_bit;
bit io_p07_bit;
// IO设置开启与关闭
bit io_p01_on;
bit io_p02_on;
bit io_p03_on;
bit io_p04_on;
bit io_p05_on;
bit io_p06_on;
bit io_p07_on;
uchar Read_Call_ID(void);
//bit Hookoff_bit;
//bit Hookoff_bit1;
void int_p01() // p1口设置
{ uchar i;
io_p01_on=1;
// if(!IO_P01==0) return;
LED_S2=0;
for(i=0;i<6;i++) //灯闪三下
{ timercount=0;
while(timercount<1) ;
LED_INT=~LED_INT;
}
ring_bit=0;
timercount=0;
ES=1; //设置发送指针
receive_count=0;
send_count=0xff;
RI=0 ;
while(timercount<120) //2分钟
{ if(ring_bit)
{ if(Read_Call_ID()) //读来电显示
{ para_temp[0]=0x31; para_temp[1]=',';
Send_AT_Command(PHONE_WRITE);
Send_AT_Command(HOOKOFF);
// timer_S_cnt=0;timer_1S_cnt=0;
//while(timer_S_cnt<1&&(AT_Command_Status==COMMAND_WAIT)) ;
io_p01_bit=0;
return;
}
ring_bit=0;
}
}
}
void int_p02() // p2口设置
{ // uchar i=;
if(tel1_bit) return; //测试是关闭返回
// if(!IO_P02==0) return;
if(p2_stop_bit) return;
LED_S2=0;
if(ring_bit)
{ Read_Call_ID(); //读来电显示
}
tel_diat();
}
ring_auto() //自动监听
{ uchar i=0,j;
ring_bit=0;
ring_cnt=1;
timercount=0;
while(timercount<30) //2分钟
{
if(ring_cnt>=4)
{ if(Read_Call_ID()) //读来电显示
{ //if(strsearch("para_temp"))
read_tmp=0x31;
Send_AT_Command(PHONE_READ); //读电话号码
for(j=7;j<12;j++)
{
if(uart_buff[j]=='\x22') break;
}
i=2 ;
j++ ;
for(;j<25;j++)
{ if(uart_buff[j]=='\x22') break;
if(uart_buff[j]!=para_temp[i++]) break;
}
if(uart_buff[j]!='\x22')
{ ring_bit=0; ring_cnt=0;
Send_AT_Command(HOOKOFF);
return;}
Send_AT_Command(PICK_UP);
timercount=0;
while(timercount<10&&(AT_Command_Status==COMMAND_WAIT)) system_sleep;
Send_AT_Command(HOOKOFF);
ring_bit=0;
ring_cnt=0;
return;
}
}
}
}
void int_p04() // p4口设置
{
// if(tel1_bit) return; //测试是关闭返回
// if(!IO_P01==0) return;
io_p04_on=1;
timercount=0;
while(timercount<30) io_p04_bit=~io_p04_bit; //2分钟
if(io_p04_on) return;
tel_diat();
}
void tel_diat2();
void int_p07() // p4口设置
{
// if(tel1_bit) return; //测试是关闭返回
// if(!IO_P01==0) return;
io_p07_on=1;
timercount=0;
// while(timercount<10) io_p07_bit=~io_p07_bit; //2分钟
// if(io_p07_on) return;
tel_diat2();
}
void Int_Timer0(void) interrupt 1 using 3
{
#if CPU_TYPE2==PLC900
if(eer_int<=9)
{
EA = 0; //关闭中断
WFEED1 = 0xA5; //执行清零第一部分
WFEED2 = 0x5A; //执行清零第二部分
EA = 1; //开中断
TH0 = 0x27; //7.373
TL0 = 0xFF;
}
#elif CPU_TYPE2==C8051F330
TH0 = 0x9e;
TL0 = 0x38;
#endif
// timercount++;
timer_1S_cnt++;
timer_led2_cnt++;
timer_led1_cnt++;
if(timer_1S_cnt==40) //25×40=1000MS =1S
{ timer_10S_cnt++;
timer_1S_cnt=0;
timer_S_cnt++;
}
if(timer_10S_cnt==16) //10S
{ //timer_S_cnt++;
//LED_INT=~LED_INT;
timer_10S_cnt=0;
timercount++;
}
//-------------------------------------
IO_P01=1;
if((io_p01_bit!=IO_P01))
{
if(IO_P01==0)
{
//int_case|=INT_RINGOFF;
//int_case&=~INT_RING;
io_p01_on=0;
//system_server=SYS_RING;
}
//else { system_server=SYS_SMSR; io_p01_on=1; }
io_p01_bit=IO_P01;
}
//---------------------------------------------------
IO_P02=1;
if((io_p02_bit!=IO_P02))
{
if(IO_P02==0)
{
//int_case|=INT_RINGOFF;
//int_case&=~INT_RING;
io_p02_on=0;
//system_server=SYS_RING;
}
else { system_server=SYS_SMSR; io_p02_on=1; }
io_p02_bit=IO_P02;
}
//---------------------------------------------
IO_P03=1;
if((io_p03_bit!=IO_P03))
{
if(IO_P03==0)
{
//int_case|=INT_RINGOFF;
//int_case&=~INT_RING;
io_p03_on=0;
//system_server=SYS_RING;
}
else { system_server=SYS_SMSR; io_p03_on=1; }
io_p03_bit=IO_P03;
}
//--------------------------------------------------
IO_P04=1;
if((io_p04_bit!=IO_P04))
{
if(IO_P04==0)
{
//int_case|=INT_RINGOFF;
//int_case&=~INT_RING;
io_p04_on=0;
//system_server=SYS_RING;
}
io_p04_bit=IO_P04;
}
//-----------------------------------------------------------------
IO_P07=1;
if((io_p07_bit!=IO_P07))
{
if(IO_P07==0)
{
//int_case|=INT_RINGOFF;
//int_case&=~INT_RING;
io_p07_on=0;
//system_server=SYS_RING;
}
//else { system_server=SYS_SMSR; io_p04_on=1; }
io_p07_bit=IO_P07;
}
//-------------------------------------------------------
}
/*****************************************************************************
* 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-2))//没有发送时才能进行接收
{ //所有的命令返回都是处于 0x0A [Result] 0x0D 之间,其他命令,不会出现这种情况
uart_buff[receive_count++]=SBUF;
}
else
{
//ACC=SBUF;
return;
}
if(receive_count>=MAX_TM-2)
{ 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')
{
AT_Command_Status=COMMAND_OK; //txd_rxd_bit=1;
}
if(uart_buff[0]=='2')
{ 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')
{ 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;
// 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<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,t,j,r;
for(r=1;r<20;r++)
{
if(system_server==SYS_RING) return;
num_tmp1=r;
if(READ_TEL(r)!=1) //读一个短信 at+cmgr=1-19 读指令
{ //timer_S_cnt=0;timer_1S_cnt=0;
//while(timer_S_cnt<15) system_sleep;
if(system_server==SYS_RING) return;
timer_S_cnt=0;timer_1S_cnt=0; while(timer_S_cnt<10) system_sleep;
if(!io_p03_on) p2_stop_bit=1; //P3如为低电平即可马上取消2的设置
else if(!io_p01_on) int_p01();
else if(!io_p02_on) int_p02();
else if(!io_p04_on) int_p04();
else if(!io_p07_on) int_p07();
else { if(ring_bit) ring_auto();
else ring_bit=0; }
//+CMTI: "SM",1
if(strsearch("+CMTI:")) return;
io_p01_bit=0;
io_p02_bit =0;
io_p04_bit=0;
if(r==16)
{//timer_S_cnt=0;timer_1S_cnt=0; while(timer_S_cnt<1&&(AT_Command_Status==COMMAND_WAIT)) system_sleep;
// Send_AT_Command(SMSS_ID);
// timer_S_cnt=0;timer_1S_cnt=0; while(timer_S_cnt<1&&(AT_Command_Status==COMMAND_WAIT)) system_sleep;
}
continue;
}
//---------------手机号码设置-------------
if((i=strsearch("HS"))) // 发短信 HSP 13*********(A者);发短信 HSD 13*********(B者)
{
if(!io_p07_on) goto DELTER; //**当P7口为低电平时,可使9开始受控,
if(sms_tmp_bit) goto DELTER; //可立即取消10的受控设置
tel_tmp1=i-1;
i=i+1;t=0; j=2;
if((uart_buff[i]=='P'))
{
para_temp[0]=0x31;
}
else if((uart_buff[i]=='D'))
{ para_temp[0]=0x32;
}
else goto DELTER;
//短信发送的手机号码在存在SIM卡中的是4,5,6位置
//要存的手机号码位置如果是1那在SIM卡中的位置就是4
i=i+1;
tel_tmp=i; //手机号码的起始位置
system_server=SYS_TEL;
}
//----- ---设维护,进行设备人工关闭 ------------------
else if(i=strsearch("QXP2")) //控制关闭系统
{
// sms_tmp=0;
//system_server=SYS_RING;
tel1_bit=1; //短信取消P2口线设置:发送短信 QXP2 即可取消2的设置.
goto DELTER;
//continue;
}
else if(i=strsearch("QXA")) // 发短信 QXA 可立即取消10的受控设置。但不影响***的运行。
{
sms_tmp_bit=1;
goto DELTER;
}
else if(i=strsearch("XHT")) // P5口将变为低电平
{
IO_P05=0; //短信取消P2口线设置:发送短信 QXP2 即可取消2的设置.
goto DELTER;
}
else if(i=strsearch("GYT")) //发短信 GYT P5口将变为高电平
{
IO_P05=1; //短信取消P2口线设置:发送短信 QXP2 即可取消2的设置.
goto DELTER;
}
//--------------------------设备从新启--------------------------
else if(i=strsearch("START")) //控制系统开启
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -