📄 西门子无线手机模块通信at命令.c
字号:
/*******************
短信电压检测仪通信程序(省公司及天津)
完成于2002年11月
修改于2003年08月 By Xiayc
*******************/
#include<reg52.h>
#include<intrins.h>
#include<math.h>
#include<ctype.h>
#define uchar unsigned char
#define uint unsigned int
sbit L1=P1^0;
sbit L2=P1^1;
sbit L3=P1^2;
sbit IGT=P1^3;
sbit A3=P1^4;
sbit A2=P1^5;
sbit A1=P1^6;
sbit A0=P1^7;
sbit in0=P3^2;
sbit MCU_XOF=P3^3;
sbit POWER_DOWN=P3^4;
sbit WD=P3^5;
bit Recv_bit;
bit No_bit;
bit Statu_Bit;
bit Error_bit;
uchar idata Station;
uchar idata Short_Center_Code[5];
uchar idata Contral_Center_Code[5];
uchar idata Rating[2];
uchar idata Up_Rating;
uchar idata Down_Rating;
uchar idata Timeout_Set;
uchar idata Power_Lost_Code[5];
uchar idata R_S_Data[114];
uchar idata Recv[12];
uchar idata Send[7];
uchar idata Chk_Code;
uchar idata Zn;
uint idata Day,DB,Month;
uint idata Message_Capability; //新信息记录号,短信息容量
uchar idata Address_H,Address_L;
uchar idata Sta_No;
uchar idata Message_No;
uchar idata Message_NoB;
//uchar idata Message_NoC;
bit Send_Message();
void Clear_R_S(void);
/************************/
void ini()
{
SCON=0x50;
TMOD=0x20;
TH1=0xfd;
TR1=1; //定时器1开始工作
ET1=0; //定时器1中断使能
IT0=1; //电平由高到底跳变时触发中断0
EX0=0;
ES=0; //串行口中断使能
EA=1; // CPU开中断
}
/*************************/
void Delay_2000ms()
{
int i,j;
for(j=0;j<20;j++)
for(i=0;i<20000;i++)
{
WD=0;
WD=1;
}
}
void Delay_1000ms()
{
int i,j;
for(j=0;j<20;j++)
for(i=0;i<10000;i++)
{
WD=0;
WD=1;
}
}
void Delay_100ms()
{
int i,j;
for(j=0;j<20;j++)
for(i=0;i<1500;i++);
{
WD=0;
WD=1;
}
}
/************************/
void Send_Char(unsigned char c)
{
TI=0;
SBUF=c;
while(TI==0);
}
/***********************
unsigned char Recv_Char()
{
unsigned char c;
RI=0;
while(RI==0);
c=SBUF;
return(c);
}
***********************/
unsigned char Recv_Data()
{
unsigned char c;
unsigned long i;
Recv_bit=0;
RI=0;
for(i=0;i<200000;i++)
{
WD=0;
WD=1;
if(RI==1)
{
Recv_bit=1;
c=SBUF;
return(c);
}
else
{
Recv_bit=0;
}
}
}
/***********************/
bit Power_Lost_Set()//写停电报警号码0xa2
{
uchar Buf[8];
uchar c;
uint i,j;
for(i=0;i<5;i++)
{
Power_Lost_Code[i]=R_S_Data[i+3];
}
for(i=0;i<5;i++)
{
Buf[i]=Power_Lost_Code[i];
}
for(i=0;i<3;i++)
{
Buf[i+5]=0xff;
}
j=0;
Zn=0x30;
Chk_Code=0x0f;
Send[0]=0x7a;
Send[1]=0x55;
Send[3]=0x1f;
Send[4]=0xf0;
Send[5]=5;
Send[6]=0xff;
Lab1:
Send[2]=Zn;
for(i=0;i<7;i++)
{
Send_Char(Send[i]);
}
c=Send[0];
for(i=1;i<7;i++)
{
c=c^Send[i];
}
c=0x0f&c;
Chk_Code=Chk_Code&0xf0;
Chk_Code=Chk_Code|c;
Send_Char(Chk_Code);
//准备接收
for(i=0;i<12;i++)
{
c=Recv_Data();
if(Recv_bit==0)return(0);
Recv[i]=c;
}
c=Recv[11]&0xf0;
if(c!=0x10)goto Lab1;
Zn=Recv[2];
c=Recv[0];
for(i=1;i<11;i++)
{
c=c^Recv[i];
}
if((c&0x0f)!=(Recv[11]&0x0f))
{
Chk_Code=0x2f;
goto Lab1;
}
Chk_Code=0x1f;
Zn=(Zn&0x0f)+1;
for(i=0;i<4;i++)
{
Send[i+3]=Buf[j++];
}
if(Zn<3)goto Lab1;
return(1);
}
/********************/
bit Write_Station_Information()//写站点初始化信息0xa1
{
uchar Buf[16];
uchar c;
uint i,j;
Station=R_S_Data[3];
Rating[0]=R_S_Data[4];
Rating[1]=R_S_Data[5];
Up_Rating=R_S_Data[6];
Down_Rating=R_S_Data[7];
//Timeout_Set=0xc1;
for(i=0;i<5;i++)
{
Short_Center_Code[i]=R_S_Data[i+8];
}
for(i=0;i<5;i++)
{
Contral_Center_Code[i]=R_S_Data[i+13];
}
Buf[0]=Station;
Buf[1]=Rating[0];
Buf[2]=Rating[1];
Buf[3]=Up_Rating;
Buf[4]=Down_Rating;
Buf[5]=Timeout_Set;
for(i=0;i<5;i++)
{
Buf[i+6]=Short_Center_Code[i];
}
for(i=0;i<5;i++)
{
Buf[i+11]=Contral_Center_Code[i];
}
Buf[16]=0xff;
j=0;
Zn=0x50;
Chk_Code=0x0f;
Send[0]=0x7a;
Send[1]=0x55;
Send[3]=0x1f;
Send[4]=0xe0;
Send[5]=16;
Send[6]=0xff;
Lab1:
Send[2]=Zn;
for(i=0;i<7;i++)
{
Send_Char(Send[i]);
}
c=Send[0];
for(i=1;i<7;i++)
{
c=c^Send[i];
}
c=0x0f&c;
Chk_Code=Chk_Code&0xf0;
Chk_Code=Chk_Code|c;
Send_Char(Chk_Code);
//准备接收
for(i=0;i<12;i++)
{
c=Recv_Data();
if(Recv_bit==0)return(0);
Recv[i]=c;
}
c=Recv[11]&0xf0;
if(c!=0x10)goto Lab1;
Zn=Recv[2];
c=Recv[0];
for(i=1;i<11;i++)
{
c=c^Recv[i];
}
if((c&0x0f)!=(Recv[11]&0x0f))
{
Chk_Code=0x2f;
goto Lab1;
}
Chk_Code=0x1f;
Zn=(Zn&0x0f)+1;
for(i=0;i<4;i++)
{
Send[i+3]=Buf[j++];
}
if(Zn<5)goto Lab1;
c=0;
return(1);
}
/*********************************/
bit Timeout_Setup()//写定时上传方式0xa3
{
uchar c;
uint i;
Timeout_Set=R_S_Data[3];
Zn=0x20;
Send[0]=0x7a;
Send[1]=0x55;
Send[3]=0x1f;
Send[4]=0xe5;
Send[5]=1;
Send[6]=0xff;
Chk_Code=0x0f;
Lab1:
Send[2]=Zn;
for(i=0;i<7;i++)
{
Send_Char(Send[i]);
}
c=Send[0];
for(i=1;i<7;i++)
{
c=c^Send[i];
}
c=0x0f&c;
Chk_Code=Chk_Code&0xf0;
Chk_Code=Chk_Code|c;
Send_Char(Chk_Code);
//准备接收
for(i=0;i<12;i++)
{
c=Recv_Data();
if(Recv_bit==0)return(0);
Recv[i]=c;
}
c=Recv[11]&0xf0;
if(c!=0x10)goto Lab1;
Zn=Recv[2];
c=Recv[0];
for(i=1;i<11;i++)
{
c=c^Recv[i];
}
if((c&0x0f)!=(Recv[11]&0x0f))
{
Chk_Code=0x2f;
goto Lab1;
}
Chk_Code=0x1f;
Zn=(Zn&0x0f)+1;
Send[3]=Timeout_Set;
Send[4]=0x01;
Send[5]=0x01;
Send[6]=0x01;
if(Zn<2)goto Lab1;
return(1);
}
/**************************/
bit DingShiShangChuan_OneDay(uchar High_Addr,uchar Low_Addr)
{
uchar c;
uint i,j,c1=0;
j=3;
R_S_Data[0]=0x8a;
R_S_Data[1]=0xc1;
R_S_Data[2]=110;
Zn=0x01;
Chk_Code=0x0f;
Send[0]=0x7a;
Send[1]=0x5a;
Send[3]=High_Addr;
Send[4]=Low_Addr;
Send[5]=110;
Send[6]=0xff;
Lab1:
Send[2]=Zn;
for(i=0;i<7;i++)
{
Send_Char(Send[i]);
}
c=Send[0];
for(i=1;i<7;i++)
{
c=c^Send[i];
}
c=0x0f&c;
Chk_Code=Chk_Code&0xf0;
Chk_Code=Chk_Code|c;
Send_Char(Chk_Code);
//准备接收
for(i=0;i<12;i++)
{
c=Recv_Data();
if(Recv_bit==0)return(0);
Recv[i]=c;
}
c=Recv[11]&0xf0;
if(c==0x20)goto Lab1;
Zn=Recv[2];
c=Recv[0];
for(i=1;i<11;i++)
{
c=c^Recv[i];
}
if((c&0x0f)!=(Recv[11]&0x0f))
{
Chk_Code=0x2f;
goto Lab1;
}
Chk_Code=0x1f;
for(i=0;i<8;i++)
{
R_S_Data[j++]=Recv[i+3];
}
c1++;
if(c1<14)goto Lab1;
return(1);
}
/**************************/
bit DingShiShangChuan_OneMonth(uchar High_Addr,uchar Low_Addr)//定时上传一月统计信息
{
uchar idata c,c1=0;
uint idata i,j;
j=3;
R_S_Data[0]=0x8a;
R_S_Data[1]=0xc2;
R_S_Data[2]=16;
Chk_Code=0x0f;
Zn=0x30;
Send[0]=0x7a;
Send[1]=0x5a;
Send[3]=High_Addr;
Send[4]=Low_Addr;
Send[5]=16;
Send[6]=0xff;
Lab1:
Send[2]=Zn;
for(i=0;i<7;i++)
{
Send_Char(Send[i]);
}
c=Send[0];
for(i=1;i<7;i++)
{
c=c^Send[i];
}
c=0x0f&c;
Chk_Code=Chk_Code&0xf0;
Chk_Code=Chk_Code|c;
Send_Char(Chk_Code);
//准备接收
for(i=0;i<12;i++)
{
c=Recv_Data();
if(Recv_bit==0)return(0);
Recv[i]=c;
}
c=Recv[11]&0xf0;
if(c!=0x10)goto Lab1;
Zn=Recv[2];
c=Recv[0];
for(i=1;i<11;i++)
{
c=c^Recv[i];
}
if((c&0x0f)!=(Recv[11]&0x0f))
{
Chk_Code=0x2f;
goto Lab1;
}
Chk_Code=0x1f;
for(i=0;i<8;i++)
{
R_S_Data[j++]=Recv[i+3];
}
c1++;
if(c1<2)goto Lab1;
return(1);
}
/**************************/
bit ShangChuanLaiTingDian_OneMonth()//定时上传一月来停电信息
{
uchar c;
uint i,j,c1=0;
j=3;
R_S_Data[0]=0x8a;
R_S_Data[1]=0xc3;
R_S_Data[2]=112;
Zn=0x01;
Chk_Code=0x0f;
Send[0]=0x7a;
Send[1]=0x5a;
Send[3]=0x1f;
Send[4]=0x00;
Send[5]=112;
Send[6]=0xff;
Lab1:
Send[2]=Zn;
for(i=0;i<7;i++)
{
Send_Char(Send[i]);
}
c=Send[0];
for(i=1;i<7;i++)
{
c=c^Send[i];
}
c=0x0f&c;
Chk_Code=Chk_Code&0xf0;
Chk_Code=Chk_Code|c;
Send_Char(Chk_Code);
//准备接收
for(i=0;i<12;i++)
{
c=Recv_Data();
if(Recv_bit==0)return(0);
Recv[i]=c;
}
c=Recv[11]&0xf0;
if(c==0x20)goto Lab1;
Zn=Recv[2];
c=Recv[0];
for(i=1;i<11;i++)
{
c=c^Recv[i];
}
if((c&0x0f)!=(Recv[11]&0x0f))
{
Chk_Code=0x2f;
goto Lab1;
}
Chk_Code=0x1f;
for(i=0;i<8;i++)
{
R_S_Data[j++]=Recv[i+3];
}
c1++;
if(c1<14)goto Lab1;
return(1);
}
/**************************/
bit ShangChuanStationinformation() //读取站点信息
{
uchar idata c,c1=0;
uint idata i,j;
j=0;
Chk_Code=0x0f;
Zn=0x30;
Send[0]=0x7a;
Send[1]=0x5a;
Send[3]=0x1f;
Send[4]=0xe0;
Send[5]=21;
Send[6]=0xff;
Lab1:
Send[2]=Zn;
for(i=0;i<7;i++)
{
Send_Char(Send[i]);
}
c=Send[0];
for(i=1;i<7;i++)
{
c=c^Send[i];
}
c=0x0f&c;
Chk_Code=Chk_Code&0xf0;
Chk_Code=Chk_Code|c;
Send_Char(Chk_Code);
//准备接收
for(i=0;i<12;i++)
{
c=Recv_Data();
if(Recv_bit==0)return(0);
Recv[i]=c;
}
c=Recv[11]&0xf0;
if(c!=0x10)goto Lab1;
Zn=Recv[2];
c=Recv[0];
for(i=1;i<11;i++)
{
c=c^Recv[i];
}
if((c&0x0f)!=(Recv[11]&0x0f))
{
Chk_Code=0x2f;
goto Lab1;
}
Chk_Code=0x1f;
for(i=0;i<8;i++)
{
R_S_Data[j++]=Recv[i+3];
}
c1++;
if(c1<3)goto Lab1;
Station=R_S_Data[0]; //站号
Sta_No=R_S_Data[0]; //站号
Rating[0]=R_S_Data[1]; //电压等级
Rating[1]=R_S_Data[2]; //电压等级
Up_Rating=R_S_Data[3]; //上限
Down_Rating=R_S_Data[4]; //下限
Timeout_Set=R_S_Data[5];
for(i=0;i<5;i++)
{
Short_Center_Code[i]=R_S_Data[i+6]; //短信中心号码
}
for(i=0;i<5;i++)
{
Contral_Center_Code[i]=R_S_Data[i+11]; //控制中心号码
}
for(i=0;i<5;i++)
{
Power_Lost_Code[i]=R_S_Data[i+16]; //停电报警号码
}
return(1);
}
bit Recv_CPU_Data()//来自cpu的定时报警
{
uchar c;
uint i;
c=Recv_Data();
if(Recv_bit==0)return(0);
if(c!=0x7a)return(0);
c=Recv_Data();
if(Recv_bit==0)return(0);
c=Recv_Data();
if(Recv_bit==0)return(0);
Recv[0]=c;
c=Recv_Data();
if(Recv_bit==0)return(0);
Recv[1]=c;
for(i=0;i<7;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -