?? cheshi.c
字號:
#include <cheshi.h>
uchar data int_case; //中斷標志
#define MAX_TM 90 // AT指收發數組最大緩沖
#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_6 ///蜂鳴器
uchar data system_server ; //系統狀態
//多用值一般不用于多級
uchar tmp_i,tmp_j ;
//---定時用-----------
uint data timercount; //50MS定時器,
uchar data timer_1S_cnt;
uchar data timer_10S_cnt;
uchar data timer_S_cnt;
//--------------------
uchar idata LED_P0;
uchar data ring_cnt; //振鈴用
uchar idata PT2272_BUF;//存儲用
uchar bdata PT2272_TMP; //無線控制
sbit PT2272_D0= PT2272_TMP^0;
sbit PT2272_D1= PT2272_TMP^1;
sbit PT2272_D2= PT2272_TMP^2;
sbit PT2272_D3= PT2272_TMP^3;
sbit PT2272_VT= PT2272_TMP^4;
//位變量
bit TC35_bit ;
bit ring_bit ; // 電話呼入 2
bit PT2272_BIT; //315M-是否連結到設備上
bit txd_rxd_bit; //接收正確的指令中斷
bit at_send_bit; //發送允許
// 中斷 IO 模擬腳
bit io_p00_bit;
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_p00_on;
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);
//硬件處理
void int_p02() // 發短中文短信前設置。 P0.2燈閃,同時蜂鳴器長叫一聲
{
LED_INT2=1; BELL=0;
for(tmp_i=0;tmp_i<8;tmp_i++) //燈閃三下
{ timercount=0; while(timercount<10) watch_dog_clear;
LED_INT2=~LED_INT2;
}
BELL=1; LED_INT2=0; io_p02_on=1;
read_tmp=0x31; TMP_BUF=0; //讀電話本1
PHONE_RD(); para_temp[TMP_BUF++]=0x0d;para_temp[TMP_BUF++]=0x00;
TMP_BUF=0; // 將讀出的電話號碼轉存起來,做發送對方號碼
do{
TEL_temp[TMP_BUF]=para_temp[TMP_BUF]; TMP_BUF++;
}while( TMP_BUF<=18);
sms_tmp=smss_para; //回中文短信
send_sms(); //調用發短信
}
//硬件處理
void int_p03() // 發短中文短信前設置。 P0.2燈閃,同時蜂鳴器長叫一聲
{
LED_INT2=1; BELL=0;
for(tmp_i=0;tmp_i<8;tmp_i++) //燈閃三下
{ timercount=0; while(timercount<10) watch_dog_clear;
LED_INT2=~LED_INT2;
}
BELL=1; LED_INT2=0; io_p02_on=1;
read_tmp=0x31; TMP_BUF=0; //讀電話本1
PHONE_RD(); para_temp[TMP_BUF++]=0x0d;para_temp[TMP_BUF++]=0x00;
TMP_BUF=0; // 將讀出的電話號碼轉存起來,做發送對方號碼
do{
TEL_temp[TMP_BUF]=para_temp[TMP_BUF]; TMP_BUF++;
}while( TMP_BUF<=18);
sms_tmp=smss_tel;//英文短信回
send_sms(); // //調用發短信
}
//------------------------
//----------------------
//--定時器中斷位,是整個程序的心跳,如果停止,程序會死機
void Int_Timer0(void) interrupt 1 using 3
{
TH0 = 0xB8;
TL0 = 0x00; //20ms的時鐘基準
watch_dog_clear;
timer_1S_cnt++; timercount++;
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;
}
//---------硬件中斷處理---------------------------------------------------------------------
//-------P2.7-D0,P2.6-D1,P2.5-D2,P2.4-D3, P2.3-VT-315M有信號中斷,----------------------------
//如果有PT2272接入 P2接入口會為低,P2.3-P2.7=0;
P2=0xff;
PT2272_BUF= P2&0x0F; //加VT就是0xf1
if(PT2272_BUF==0) //狀態檢測
{ PT2272_BIT=1; //可以進行中斷
}
else if(((PT2272_BUF>0)&&((PT2272_BUF&0x0f)!=0x0f))&&PT2272_BIT==1) //這種方法只用于PT2272-M4的芯片
{ PT2272_TMP= PT2272_BUF;
PT2272_BIT=0;
}
//---------------------------
IO_P25=1; //外部中斷 P25口
if((io_p00_bit!=IO_P25))
{
if(IO_P25==0)
{ io_p00_on=0;
}
io_p00_bit=IO_P25;
}
IO_P24=1; //外部中斷 P24口
if((io_p02_bit!=IO_P24))
{
if(IO_P24==0)
{ io_p02_on=0;
}
io_p02_bit=IO_P24;
}
IO_P35=1; //外部中斷 P35口
if((io_p03_bit!=IO_P35))
{
if(IO_P35==0)
{ io_p03_on=0;
}
io_p03_bit=IO_P35;
}
//---------------------------------------------------------------------------------
}
/*****************************************************************************
* 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; return;
}
}
receive_count=0;
}
else
if(RI) //命令方式
{
RI=0;
if(at_send_bit==0) return; //如果在發送時,不能接收
if((send_count==0xff)&&(receive_count<MAX_TM-3))//沒有發送時才能進行接收
{ //所有的命令返回都是處于 0x0A [Result] 0x0D 之間,其他命令,不會出現這種情況
uart_buff[receive_count++]=SBUF;
}
else
{ receive_count=0;
return;
}
if(receive_count>=MAX_TM-3)
{
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
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; //receive_count=2 ;
return;
}
else if(((receive_count>=3)
&&uart_buff[receive_count-1]==0x0d)
&&(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;
}
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);
}
//=============================================================================
// 話機被叫程序
//=============================================================================
//=============================================================================
// 話機被叫程序
//=============================================================================
uchar Read_Call_ID(void)//讀出來電顯示的號碼
//正確 TRUE
//錯誤 FALSE
//號碼 string_temp[0..16],最多顯示前16位
//呼叫方式 stringt_temp[20]
{
uchar i,j,r;
Send_AT_Command(CALL_ID);//+CLCC:1,1,4,0,0,"02138950224",129
// 語音呼入
//string_temp[0]=0;
//string_temp[20]=0; //讀來電顯示出錯時設為1
if(receive_count<15) return(FALSE);
uart_buff[receive_count]=0;
ring_bit=0;
ES=1; //設置發送指針
receive_count=0;
send_count=0xff;
RI=0 ;
j=0;
// i=strsearch(uart_buff,"CLCC");//查第一個CLCC
i=strsearch("CLCC");//查第一個CLCC
if(i==0) return(FALSE);
j=j+i;
for(r=0;r<9;r++)
{
if(uart_buff[j]==',') break;
else j=j+1;
}
if(r>=9) return(FALSE);
j=j+1;
for(r=0;r<4;r++)
{
if(uart_buff[j]==',') break;
else j=j+1;
}
if(r>=4) return(FALSE);
j=j+1;
//檢查是否為來話呼叫
if(uart_buff[j]!='4') return(FALSE);
for(r=0;r<4;r++)
{
if(uart_buff[j]==',') break;
else j=j+1;
}
if(r>=4) return(FALSE);
j=j+1;
// string_temp[20]=uart_buff[j];//讀出呼叫類型
//只要能讀出呼叫類型就認為正確
// i=strsearch(&uart_buff[j],"\x22");//查第一個"號
for(r=0;r<6;r++)
{
if(uart_buff[j]=='\x22') break;
else j=j+1;
}
if(r>=6)
return(FALSE);
j=j+1;
i=j;
// i=strsearch(&uart_buff[j],"\x22");//查第二個"號
for(r=0;r<20;r++)
{
if(uart_buff[j]=='\x22') break;
else j=j+1;
}
if(i<=2) return(FALSE);//沒有來電號碼
for(r=0;r<22;r++)
{
para_temp[r+2]=uart_buff[i++];
if(uart_buff[i]=='\x22')
{ para_temp[r+3]=0x0d;para_temp[r+4]=0x00;uart_buff[i++]=0x0d;uart_buff[i++]=0; break;}
}
uart_buff[i++]=0;uart_buff[i++]=0;
return(TRUE);
}
void ring_auto() //自動監聽 當有電話呼入,只有車主電話可以監聽,別的電話會自動掛機
{ uchar i=0;
ring_bit=0;
ring_cnt=1;
LED_INT6=0;
timercount=0;
i=0;
if(Read_Call_ID()) //讀來電顯示
{ ring_cnt=0;
timer_S_cnt=0; while(timer_S_cnt<6) watch_dog_clear;
if(ring_cnt>=1)
{ ring_cnt=0; Send_AT_Command(PICK_UP);
ES=1; //設置發送指針
receive_count=0;
send_count=0xff;
uart_buff[0]=0;
RI=0 ;
AT_Command_Status=COMMAND_WAIT; //設置接收成功標志
while((AT_Command_Status==COMMAND_WAIT)) watch_dog_clear;
}
Send_AT_Command(HOOKOFF);
ring_bit=0;
ring_cnt=0;
LED_INT6=1;
return;
}
else { LED_INT6=1; return; }
LED_INT6=1;
}
//----------------------------------------------
//---------這里進行中斷查詢如果有中斷馬上處理----------------------
uchar P2_INIT()
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -