📄 gsm_co.c
字号:
#include <cheshi.h>
uchar data int_case; //中断标志
#define MAX_TM 90 //80一个号码暂时定为(12手机号码)*6=72+(ALARM2T:05)*2=20=92
#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;
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;
}
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 + -