📄 51
字号:
for(i=0;i<12;i++)
{
if(Send_AT_Command(CHECK_PIN)) //如有收到回应进行分析收到的信息,//检查当前是否要输入PIN码
{
uart_buff[receive_count]=0; //receive_count接收 数组指针
if(strsearch("READY")!=0)
{
chping=1; //准备好
break;
}
}
timer_S_cnt=0; //秒计数变量清零
}
if(i>=11)
{
chping=0; //准备标志位清0
at_eer:
Send_AT_Command(RESET_TC35); //复位TC35
timer_S_cnt=0; //秒计数变量清零
Send_AT_Command(SMSS_ID); //TC35i模块专用设置
}
Send_AT_Command(SIM_ID); //读出SIM卡设置
Send_AT_Command(AT_IPR); //设置TC35的波特率
Send_AT_Command(REQUEST_MOD); //请求模式
timer_S_cnt=0; //秒计数变量清零
}
void Sys_Init(void) //话机启动的初始化程序,包含定时器,串口等
{
TI=0; //清串行接收发送中断标志位
RI=0;
TH0 = 0xB8; //20ms的时钟基准
TL0 = 0x00;
TH1=0xfd; //波特率为9600
TL1=0xfd;
TMOD=0x21; //定时器0 模式1 定时器1 模式2
SCON=0x50; //串口通信选用方式1 允许接收
PCON=0x00; //不倍频,倍频0x80
IE = 0x92; // EA XX ET2 ES ET1 EX1 ET0 EX0 1001 0010
IP=0x02; //定时器0优先级高
TR1=1; //使能定时器1
TR0=1; //使能定时器0
timer_20ms_cnt=0; //20ms计数变量清0 0~49
receive_count=0; //接收数组指针清0
send_count=0xff; //发送数组指针,表示禁止发送,可以接收
}
void start(void) //指示灯指示
{
uchar k;
if(chinit==1&&chping==1) //准备好 初始化完成
LED=0; //初始化成功 LED亮
else //初始化失败LED闪烁4次
{
for(k=0;k<4;k++)
{
LED=0;
delay1ms(1000);
LED=1;
delay1ms(1000);
}
}
}
void delay1ms(uchar x) //延时约1ms程序
{
uchar Time,Time1;
for(Time=0;Time<x;Time++)
for(Time1=0;Time1<120;Time1++);
}
/*********************************************************************
* C51中字符串函数的扩充 *
*********************************************************************/
uchar strsearch(uchar *ptr2) //查字符串*ptr2在*ptr1中的位置
//本函数是用来检查字符串*ptr2是否完全包含在*ptr1中
//返回: 0 没有找到
//1-255 从第N个字符开始相同
{
uchar i,j,k; //i源地址,j小的地址 k中间变量
if(ptr2[0]==0) //空 不需比较 返回
return(0);
for(i=0,j=0;i<MAX_TM-2;i++) //MAX_TM为号码存储器
{
if(uart_buff[i]==ptr2[j]) //第一个字符相同
{
for(k=i;k<MAX_TM-2;k++,j++)
{
if(ptr2[j]==0) //遇到空格 比较正确
return(i+1); //返回值是整数,不含0 从第i+1个字符开始相同
if(uart_buff[k]!=ptr2[j]) //后面的字符不相等 退出内层循环 再往后查找
break;
}
j=0; //指向第1个字符
}
}
return(0); //没有找到返回:0
}
void Int_Timer0(void) interrupt 1 using 3 //定时器0 中断服务程序
{
TH0 = 0xB8;
TL0 = 0x00; //20ms的时钟基准
timer_20ms_cnt++; //20ms计数变量加1 0~49
if(timer_20ms_cnt==50) //20ms计数变量 0~49
{
timer_20ms_cnt=0; //20ms计数变量 0~49
timer_S_cnt++; //秒计数变量 1个数1s
}
}
/*****************************************************************************
* TC35 的命令列表,与中断服务程序 *
*****************************************************************************/
void Int_Uart(void) interrupt 4 using 3 //串口的中断程序
{
uchar F=0; //F 存对方号码数组指针
if(TI) //如果为发送中断
{ //数据模式与命令方式共用
TI=0; //清发送中断标志位
if(send_count>=MAX_TM-5) //发送数组指针>5
send_count=0; //发送数组指针清零,不再超过最大值
if((uart_buff[send_count]==0)) //空
{ //应该检测命令结束代码,检测到时结束通信
at_send_bit=1; //发送完成标志 接收允许
send_count=0xff; //发送指针 达到是大值
for(F=0;F<20;F++) //数组指针
{
uart_buff[F]=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; //发送完成标志1 接收允许
send_count=0xff; //发送数组指针为0xff
for(F=0;F<20;F++)
{
uart_buff[F]=0; //清除接收缓冲区
}
receive_count=0; //接收 数组指针清零
return;
}
}
receive_count=0; //接收 数组指针清零
}
if(RI) //接收中断
{ //命令方式
RI=0; //清接收中断标志位
if(at_send_bit==0) //如果在发送时,不能接收
return;
if((send_count==0xff)&&(receive_count<MAX_TM-5))//发送数组指针 接收数据指针
{//没有发送时才能进行接收 所有的命令返回都是处于 0x0A [Result] 0x0D 之间,其他命令,不会出现这种情况
uart_buff[receive_count++]=SBUF;
}
else
{//ACC=SBUF;
return;
}
if(receive_count>=MAX_TM-5) //接收 数组指针
{
if(AT_Command_Type==SMS_CMGR) //读一个短信
receive_count=0; //接收数组指针清零
else if(AT_Command_Type==SMONC_ID) //当前发送的命令类型
{
AT_Command_Status=COMMAND_OK; //命令发送正确.
return;
}
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') //电话呼入
{
AT_Command_Status=COMMAND_OK; //命令发送正确.
//txd_rxd_bit=1;
ES=1; //串口中断使能
receive_count=0; //接收 数组指针清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]=='>'))
{ //SMS 短信发送或AT 命令 第二个地址数据位>
AT_Command_Status=COMMAND_OK; //命令发送正确.
txd_rxd_bit=1; //接收正确的指令标志
return;
}
}
}
//======================================================================
//========================进行SIM卡中的1到20条短信号码的读==============================================
//======================================================================
/* uchar READ_TEL(uchar r) //进行SIM卡中的1到20条短信号码的读
{ //读短信号码1-20个
uchar i;
para_temp[0]=(r/10)+0x30; //第几条短信的十位
para_temp[1]=(r%10)+0x30; //第几条短信的个位
para_temp[2]=0x0d; //回车
for(i=3;i<=11;i++) //3~10为空
para_temp[i]=0x00;
Send_AT_Command(SMS_CMGR); //读一个短信
timer_S_cnt=0; //秒计数变量清0
send_count=0; //发送数组指针清0
if(strsearch("CMGR: 0,,0")) //+CMGR: 0,,0 没有短信返回
{
ES=1; //串口中断使能
receive_count=0; //接收 数组指针清0
send_count=0xff; //发送数组指针为0xff 不能发送
RI=0 ; //接收标志位清零
return(FALSE); //返回 FALSE 0
}
else if(uart_buff[1]==0x0d&&uart_buff[0]==0x34)//号码保存 回车???
{
return(FALSE); //返回 FALSE 0
}
else
{
if(AT_Command_Status==COMMAND_ERROR) //命令发送错误
return(FALSE); //返回 FALSE 0
else
return(TRUE); //返回 TRUE 1
}
}
*/
//============================================
//========== 读写短信程序
//====================================================
/* void read_sms(void) //读写短信程序
{
uchar i,r,j,t;
for(r=1;r<20;r++) //读第1~19个短信
{
num_tmp1=r; //读短信号码参数
if(READ_TEL(r)!=1) //读第r个短信 at+cmgr=1~19 读指令
{
if(strsearch("+CMTI:")) //是否有新短信
return;
continue;
}//TEL_temp[18] 读出对方号码
t=2;
i=0;
for(j=15;j<25;j++)
{
if((uart_buff[j]==0x22)&&(uart_buff[j+1]==',')&&(uart_buff[j+2]==0x22)) // ","
break;
}
j=j+3;
if(uart_buff[j]=='+')
j=j+3;
for(;j<40;j++)
{
if(uart_buff[j]==0x22) // "
break;
para_temp[t++]=uart_buff[j]; //读取号码
TEL_temp[i++]=uart_buff[j]; //暂存在对方号码区域
}
TEL_temp[i++]=0x0d ; //换行 空格
TEL_temp[i++]=0x00 ;
para_temp[t++]=0x0d; //换行 空2格
para_temp[t++]=0x00;
para_temp[t++]=0x00;
//---------------手机号码设置-------------
if((i=strsearch("CHN")))
{
system_server=SYS_ALARM; //处于报警时间设置系统状态
return;
}
else if((i=strsearch("RED")))
{
system_server=SYS_NUMSAVE; //系统状态 号码保存
return;
}
else if((i=strsearch("GRE")))
{
system_server=SYS_FEE; //系统状态
return;
}
else
{
para_temp[0]=(num_tmp1/10)+0x30; //暂存的第几条短信号十位 ///num_tmp1读短信号码参数
para_temp[1]=(num_tmp1%10)+0x30; //暂存的第几条短信号个位
para_temp[2]=0x0d; //回车
para_temp[3]=0x00; //空格
Send_AT_Command(SMS_CMGD); //删除没有用的短信
timer_S_cnt=0; //秒计数变量清0
for(i=10;i<=MAX_TM-3;i++)
{
uart_buff[i]=0; //清零
}
Send_AT_Command(SIM_ID); //合体组合 ATE0 ATV0 AT+CMGF=1 AT+CNMI=2,1
return;
}
}
} */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -