?? 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 + -