?? fangdao.c
字號:
#include <fangdao.h>
uchar data int_case; //中斷標(biāo)志
#define MAX_TM 97 //一個號碼暫時定為(12手機(jī)號碼)*6=72+(ALARM2T:05)*2=20=92
uchar idata uart_buff[MAX_TM]; //通信程序中的緩沖
uchar data send_count,receive_count;
data uchar AT_Command_Type; //當(dāng)前發(fā)送的命令類型
data uchar AT_Command_Status; //命令發(fā)出以后的返回參數(shù)
uchar idata para_temp[MAX_TM-2];
//uchar idata key_temp[MAX_TM];
uchar data read_tmp; ///讀電話本號參數(shù)
//uchar num_tmp; ///寫電話本號參數(shù)
uchar num_tmp1; ///讀短信號碼參數(shù)
//uchar PHONE_TMP;
uchar TMP_BUF; // 萬用 值
uchar sms_tmp; ///參數(shù)代碼
uchar tel_tmp;
uchar tel_tmp1; ///讀電話碼地址
data uchar system_tep ; ///報(bào)警功能開啟與關(guān)閉參數(shù)
uchar data system_server ; //系統(tǒng)狀態(tài)
uint data timercount; //50MS定時器,
uchar data timer_1S_cnt;
uchar data timer_100S_cnt;
uchar data timer_200S_cnt;
uchar data sync_count; //用于TC35控制的計(jì)數(shù)器
//uchar data Pick_count ;
//uchar data Ring_count;
#define _Nop() _nop_()
//位變量
bit ring_pin_flag; //振鈴腳狀態(tài)
bit pickup_pin_flag; //摘機(jī)腳狀態(tài)
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的時鐘基準(zhǔn)
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.摘掛機(jī)事件
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 的命令列表,與中斷服務(wù)程序 *
*****************************************************************************/
void Int_Uart(void) interrupt 4 using 3 //串口的中斷程序
{
if(TI)//數(shù)據(jù)模式與命令方式共用
{
TI=0;
if(send_count>=MAX_TM-1) send_count=0;
if((uart_buff[send_count]==0)) //應(yīng)該檢測命令結(jié)束代碼,檢測到時結(jié)束通信
{
at_send_bit=1;
send_count=0xff;
uart_buff[0]=0; //清除接收緩沖區(qū)
receive_count=0; return;
}
else
{ if(uart_buff[send_count]<=0xB0)
SBUF=uart_buff[send_count++];
if((uart_buff[send_count]==0)) //應(yīng)該檢測命令結(jié)束代碼,檢測到時結(jié)束通信
{ at_send_bit=1;
send_count=0xff;
uart_buff[0]=0; //清除接收緩沖區(qū)
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))//沒有發(fā)送時才能進(jìn)行接收
{ //所有的命令返回都是處于 0x0A [Result] 0x0D 之間,其他命令,不會出現(xiàn)這種情況
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))//沒有包含為其他信息的命令返回
{ //接收到一個命令回應(yīng),可能為,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中字符串函數(shù)的擴(kuò)充 *
*********************************************************************/
uchar strsearch(uchar *ptr2)//查字符串*ptr2在*ptr1中的位置
//本函數(shù)是用來檢查字符串*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); //返回值是整數(shù),不含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")) //控制系統(tǒng)開啟
{
system_tep=1;
system_server=SYS_START; return;
}
//--------------------//參數(shù)查詢命令--為三個語音\三個短信\二個定時時長---------------------------------------------
else if(i=strsearch("PASST")) //參數(shù)查詢命令
{
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() //發(fā)送短信
{ 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;
//根據(jù)不同的方式發(fā)送短消息內(nèi)容
switch(sms_tmp)
{
//======================發(fā)送收到設(shè)備開啟指令================================================
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; //設(shè)置接收成功標(biāo)志
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 " 巳打開報(bào)警功能
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;
//==============發(fā)送設(shè)備參數(shù)查詢返回值=========================================
case smss_para: //參數(shù)查詢 記三個可撥號電話,三個可發(fā)短信手機(jī)號碼,兩個報(bào)警延時時長,
//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;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -