?? cheshi.c
字號:
//LED_INT=~LED_INT;
}
if(i>=11)
{
at_eer: Send_AT_Command(RESET_TC35);
timer_S_cnt=0;while(timer_S_cnt<2) watch_dog_clear;
Send_AT_Command(SMSS_ID);
// timer_S_cnt=0; while(timer_S_cnt<2&&(AT_Command_Status==COMMAND_WAIT)) watch_dog_clear;
//eer_int=15;
timer_S_cnt=0; while(timer_S_cnt<10) watch_dog_clear;
}
BELL=0;
IO_IGT=0;
Send_AT_Command(SIM_ID);
Send_AT_Command(AT_IPR);
BELL=1;
Send_AT_Command(REQUEST_MOD);
if(strsearch("TC35\x0d\x0a")==0)
{Send_AT_Command(SMSS_ID); TC35_bit=0;}
else TC35_bit=1;
timer_S_cnt=0; while(timer_S_cnt<7) watch_dog_clear;
Send_AT_Command(SMSS_ID);
}
void Sys_Init(void)//話機啟動的初始化程序,包含鍵盤與定時器,串口等
{
//TH0=(65536-46080)/256;//重新裝入定時25mS的初值到TH0,TL0 56320
//TL0=(65536-46080)%256;
//65536-(11.0592/12)*20MS*1000=To 18432 47104
//1ms定時
//11.0592/12 = 0.9216 M (記數頻率)
//1ms記數 921.6次
//16位 2^16 - x = 922 x=64614 FC66
//定時器里不斷放fc66,不用懷疑51定時器得到的 1ms的精確性嗎
// TH0 = 0xf6;
// TL0 = 0x50;
TH0 = 0xB8;TL0 = 0x00; //20ms的時鐘基準
//串口中斷
TI=0; RI=0;
SCON=0x50; //選用方式1
TMOD=0x20;
TMOD = (TMOD & 0xf0) | 1;//MODE 1
// TH1=0xe8; //波特率為9600
// TL1=0xe8;
TH1=0xfd; //波特率為9600
TL1=0xfd;
PCON=0x00; //倍頻0x80
IE = 0xb0; // EA XX ET2 ES ET0 EX0 ET1 EX1
TR1=1; //enable TIMER1
ES=1; //開串口開斷
TR0=1; //串口接收中斷
ET0=1; //T0 中斷
ET1=0; // T1 中斷
EA=1;
P0=0xFF;
P1=0xFF;
P2=0xFF;
P3=0xFF;
// P4=0xff;
timer_1S_cnt=0;
receive_count=0;
IO_IGT=1;send_count=0xff; //表示禁止發送,可以接收
LED_INT3=1;LED_INT7=0;
io_p06_on=1;IO_IGT=0;
IO_OUT=1;
}
//======================================================
//這里為AT指令處理區,所有的AT指令都在這時對uart_buff數組進行賦值,并發送出去,
//-正常情況下,AT指令反回也會在這里接收完
//------------------------
//-----------------------
///==========================================
uchar Send_AT_Command( uchar type) //發送AT指令
//撥號時號碼放在phone.number
//其他用para_temp
{
AT_Command_Type=type;
send_count=0;
switch(type)
{
case VOICE_DIAL: //語音撥號
strcpy(uart_buff,"ATD");
strcat(uart_buff,para_temp);
// strcpy(uart_buff,"ATD10086;");
//strcat(uart_buff,";");
break;
case RESET_TC35: //復位TC35
strcpy(uart_buff,"AT+CFUN=1,1");
break;
case CHECK_PIN: //檢查當前是否要輸入PIN碼
strcpy(uart_buff,"AT+CPIN?");
break;
case TC35_INIT: //TC35初始化命令 ATE0 ATV0 合體
strcpy(uart_buff,"ATE0V0");
break;
//0D 0A 54 43 33 35 0D 0A
case REQUEST_MOD: //模塊版型號
strcpy(uart_buff,"AT+CGMM");
break;
case SIM_ID: // 也是合體組合 ATE0 ATV0 AT+CMGF=1 AT+CNMI=2,1
strcpy(uart_buff,"ATE0V0+CMGF=1+CNMI=2,1");
break;
case AT_IPR: // 波特率 9600
strcpy(uart_buff,"AT+IPR=9600"); break;
case CALL_ID: //讀來電顯示
strcpy(uart_buff,"AT+CLCC");
break;
case SMSS_ID: //TC35i模塊專用
strcpy(uart_buff,"ATE0V0^SSMSS=1+CNMI=2,1");
break;
case HOOKOFF: //掛機,停止通話
strcpy(uart_buff,"ATH");
break;
case SMS_CMGF: //SMS 接收方式,
strcpy(uart_buff,"ATE0V0+CMGF=0");
break;
case PHONE_WRITE: //存電話號碼
strcpy(uart_buff,"AT+CPBW=");
strcat(uart_buff,para_temp);
break;
case PHONE_READ: //讀電話本
strcpy(uart_buff,"AT+CPBR=");
strcat(uart_buff,&read_tmp);
uart_buff[9]=0x0d; uart_buff[10]=0x0a;
uart_buff[11]=0x00; uart_buff[12]=0x00;
break;
case SMS_CMGR: //讀一個短信
strcpy(uart_buff,"AT+CMGR=");
strcat(uart_buff,para_temp);
break;
case SMS_CMGS: //寫一個短信
strcpy(uart_buff,"AT+CMGS="); //AT+CMGS= "13818120592"
strcat(uart_buff,para_temp);
break;
case SMS_CMGD: //刪除一個短信
strcpy(uart_buff,"AT+CMGD=");
strcat(uart_buff,para_temp);
break;
case CMGS_MUB: //發報警短信內容
strcpy(uart_buff,para_temp);
break;
case AT_CPMS:
strcpy(uart_buff,"ATE0V0+CPMS=\x22SM\x22");
break; //AT_CPMS
case PICK_UP: //摘機
strcpy(uart_buff,"ATA");
case AT_COMMAND:
break;
default:
receive_count=0;
return(TRUE);
}
ES=1;
strcat(uart_buff,"\x0d\x00");//在命令后加入CR
send_count=0; //設置發送指針
receive_count=0; //設置接送指針
AT_Command_Status=COMMAND_WAIT; //設置接收成功標志
timer_S_cnt=0;
txd_rxd_bit=0;//
at_send_bit=0; //
TI=1; //開始發送數據
RI=0; //清除接收標志
// if(type==AT_COMMAND)
// {
// return(TRUE);
// }
// else
if (type==TC35_INIT )
{
while (timer_S_cnt<6)
{
if (AT_Command_Status!=COMMAND_WAIT||txd_rxd_bit==1) //等待接收回應
return(TRUE);
}
}
else if((type==SMS_CMGR))
{
while (timer_S_cnt<6)
{
if (AT_Command_Status!=COMMAND_WAIT||txd_rxd_bit==1) //等待接收回應
return(TRUE);
}
}
else if((type==CALL_ID))
{
while (timer_S_cnt<2)
{
if (AT_Command_Status!=COMMAND_WAIT||txd_rxd_bit==1) //等待接收回應
return(TRUE);
}
}
else
{
while (timer_S_cnt<6)
{
if (AT_Command_Status!=COMMAND_WAIT||txd_rxd_bit==1) //等待接收回應
{
return(TRUE); }
}
}
// eer_int++;
return(FALSE);
}
//****************************************************************
// ** 撥打電話 ***
//****************************************************************
void tel_diat() //報警時撥打前三個電話,時間設為40秒,
{ uchar ii,j,t,r=0;
t=0x01; //可以用一個電話//為沒有打通電話時做臨時存儲 0000 0111, 可以撥打3個電話,分別是1,2,3
do
{ ii=ii+1;
if(ii>=3) ii=0; // 最大值,不能起過三個電話
TMP_BUF=0;
if(t==0) return ;
if( (t>>ii-1)&0x01!=0)
{ read_tmp=0x30+ii; }
else { continue; }
j=PHONE_RD(); //讀電話號碼
r++;
if(j>5)
{ para_temp[j++]=';';para_temp[j++]=0x0d;para_temp[j++]=0x00;
if(!Send_AT_Command(VOICE_DIAL));
{ ES=1; RI=0 ; //設置發送指針
receive_count=0; send_count=0xff;
timer_S_cnt=0;
while(timer_S_cnt<40&&(AT_Command_Status==COMMAND_WAIT))
{ if(((uart_buff[0]=='0')&&(uart_buff[0]=='6'))&&uart_buff[1]==0x0d)
break;
}
}
if((((uart_buff[0]=='0')&&uart_buff[1]==0x0d))) //撥號成功
{
t&=~(1<<ii-1) ;
ES=1; //設置發送指針
receive_count=0;send_count=0xffff; RI=0 ;
timer_S_cnt=0; AT_Command_Status=COMMAND_WAIT;
while(timer_S_cnt<30&&(AT_Command_Status==COMMAND_WAIT)) ;
Send_AT_Command(HOOKOFF);
if(t==0) return ;
}
Send_AT_Command(HOOKOFF);
}else
t&=~(1<<ii-1) ;
}while(r<30);
}
void main(void)
{
Initialize_Model(); P0=1;
system_server=SYS_SMSR;
receive_count=0;
sms_tmp=0;
LED_INT7=0;
while(1)
{
//-----------查詢1到20條中的短信,只要有短信就處理------------------------------------------
if(system_server==SYS_SMSR) //讀1-20條短信
{ // Send_AT_Command(SIM_ID);
system_server=SYS_SMSR;
read_sms(); //timer_S_cnt=0;
//P0=0;
}
//----------------一些短信的發送---------------------------------------------------
else if(system_server==SYS_SMSS) //發送信息
{ send_sms();system_server=SYS_SMSR;
}
else if(system_server==SYS_START) // 硬件中斷處理 發中文
{ int_p02();
system_server=SYS_SMSR;
}
else if(system_server==SYS_SBC) // // 硬件中斷處理 //發英文
{ int_p03();
system_server=SYS_SMSR;
}
//---===============外部中斷進行 報警狀態=================================================================
else if(system_server==SYS_ALARM) // //回中文短信處理
{
sms_tmp=smss_para;//
system_server=SYS_SMSS;
}
//==========================進行電話號碼和手機號的設置===========================================================
else if(system_server==SYS_TEL) //回英文短信處理
{
sms_tmp=smss_tel;
system_server=SYS_SMSS;
}
else if(system_server==SYS_RING) //來電處理
{
ring_auto();
system_server=SYS_SMSR;
}
else if(system_server==SYS_DIAL) //打電話處理
{
tel_diat();
system_server=SYS_SMSR;
}
else system_server=SYS_SMSR;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -