📄 modembj.c
字号:
/**********该程序是被叫程序,程序复位后红灯亮,当被叫程序运行2分钟后,方可运行主叫程序。在建立链接后, 本程序设定如果接收到的数据是以qq开头,
且接收到的数据位数超过10位时,不再接收数据,绿灯亮,发挂机命令红灯灭结束。如果接收到的数据不是以qq开头,
且接收到的数据位数超过10位时,不再接收数据,黄灯亮,发挂机命令红灯灭结束,***************/
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
sbit P0_0=P0^0;
sbit P0_1=P0^1;
sbit P0_2=P0^2;
uchar connbuf[11];
uchar i,h;
unsigned long j;
uchar buf[8];
uchar idata databuf[70];
bit flag ;
bit right;
/*********初始化子程序**************/
void csh ( )
{
SCON=0x50;
TMOD=0X20;
TL1=0xF4;
TH1=0xF4;
ET1=0;
ES=1;
EA=0;
TR1=1;
RI=0;
TI=0;
P0_0=0;
}
/**********发送AT指令****************/
void atsend(uchar *commbuf)
{
uchar i,j,a,buf[8];
i=*(commbuf);
for(j=1;j<(i+1);j++)
{
TI=0;
a=*(commbuf+j);
SBUF=*(commbuf+j);
while(TI==0);
}
TI=0;
}
/**********装载AT&F***********/
void fsat( )
{
L1:
connbuf[0]=0x06;
connbuf[1]='A';
connbuf[2]='T';
connbuf[3]='&';
connbuf[4]='F';
connbuf[5]=0x0a;
connbuf[6]=0x0d;
atsend(&connbuf[0]);
/********接收发送完AT&F后的返回码*************/
for (i=0;i<8;i++)
{
while (RI==0);
buf[i]=SBUF;
RI=0;
}
/*********判断发送完AT&F后的返回码是否为OK,为OK时发送下一个AT指令ATS37=6,否则继续发送AT&F*******/
flag=0X00;
for (i=0;i<8;i++)
{
if(buf[i]==0X4f)
{
if(buf[i+1]==0x4b)
{flag=1;}
}
}
for(j=0;j<0xffff;j++);
if(!flag)
{
goto L1;
}
/***************清空buf*******************/
for (i=0;i<8;i++)
{
buf[i]=0 ;
}
/***********装载ATS37=6*********************/
L2:
connbuf[0]=0x09;
connbuf[1]='A';
connbuf[2]='T';
connbuf[3]='S';
connbuf[4]='3';
connbuf[5]='7';
connbuf[6]='=';
connbuf[7]='6';
connbuf[8]=0x0a;
connbuf[9]=0x0d;
atsend(&connbuf[0]);
/********接收发送完ATS37=6后的返回码*************/
for (i=0;i<8;i++)
{
while (RI==0);
buf[i]=SBUF;
RI=0;
}
/*********判断发送完ATS37=6后的返回码是否为OK,为OK时发送下一个AT指令AT\N0,否则继续发送ATS37=6*******/
flag=0X00;
for (i=0;i<8;i++)
{
if(buf[i]==0X4f)
{
if(buf[i+1]==0x4b)
{flag=1;}
}
}
for(j=0;j<0xffff;j++);
if(!flag)
{
goto L2;
}
/***************清空buf*******************/
for (i=0;i<8;i++)
{
buf[i]=0 ;
}
/**********装载AT\N0*******************/
L3:
connbuf[0]=0x07;
connbuf[1]='A';
connbuf[2]='T';
connbuf[3]=0X5C;
connbuf[4]='N';
connbuf[5]='0';
connbuf[5]=0x0a;
connbuf[6]=0x0d;
atsend(&connbuf[0]);
/********接收发送完AT\N0后的返回码*************/
for (i=0;i<8;i++)
{
while (RI==0);
buf[i]=SBUF;
RI=0;
}
/*********判断发送完AT\N0后的返回码是否为OK,为OK时发送下一个AT指令ATS0=1,否则继续发送AT\N0*******/
flag=0X00;
for (i=0;i<8;i++)
{
if(buf[i]==0X4f)
{
if(buf[i+1]==0x4b)
{flag=1;}
}
}
for(j=0;j<0xffff;j++);
if(!flag)
{
goto L3;
}
/***************清空buf*******************/
for (i=0;i<8;i++)
{
buf[i]=0 ;
}
/***************装载ATS0=1*************/
L4:
connbuf[0]=0x08;
connbuf[1]='A';
connbuf[2]='T';
connbuf[3]='S';
connbuf[4]='0';
connbuf[5]='=';
connbuf[6]='1';
connbuf[7]=0x0a;
connbuf[8]=0x0d;
atsend(&connbuf[0]);
/********接收发送完ATS0=1后的返回码*************/
for (i=0;i<8;i++)
{
while (RI==0);
buf[i]=SBUF;
RI=0;
}
/*********判断发送完ATS0=1后的返回码是否为OK,为OK时等待联络信号,否则继续发送ATS0=1*******/
flag=0X00;
for (i=0;i<8;i++)
{
if(buf[i]==0X4f)
{
if(buf[i+1]==0x4b)
{flag=1;}
}
}
for(j=0;j<0xffff;j++);
if(!flag)
{
goto L4;
}
/*************延时等待联接信号CONNET 2400,用中断接收**********/
L5:
RI=0;
ES=1;
EA=1;
i=0;
for(j=0;j<0xffff;j++);
EA=0;
ES=0;
/*****************判断是否建立联接,如果没有建立联接继续延时等待联接信号,建立联接后可接收数据**/
flag=0X00;
h=i;
for (i=0;i<h;i++)
{
if(databuf[i]==0X43)
{
if(databuf[i+1]==0X4f)
{flag=1;}
}
}
if (!flag)
{
goto L5;
}
}
/**************清空数据接收区,接收数据************/
void jsdata( )
{
for (i=0;i<70;i++)
{
databuf[i]=0;
}
for(j=0;j<0xfff;j++);/*****延时******/
for(j=0;j<0xfff;j++);
for(j=0;j<0xfff;j++);
/***************当接收到的数据位数大于10时不再接收数据*****/
for(i=0;i<10;i++)
{
while(RI==0);
databuf[i]=SBUF;
RI=0;
}
/*****************判断接收到的数据是否正确**********/
right=0X00;
for (i=0;i<10;i++)
{
if(databuf[i]==0X71)
{
if(databuf[i+1]==0X71)
{right=1;}
}
}
if (!right)
{
P0_2=0;
}
P0_1=0 ;
}
/******************接收完数据后发挂机命令************/
void gj( )
{
connbuf[0]=0x03;
connbuf[1]='+';
connbuf[2]='+';
connbuf[3]='+';
atsend(&connbuf[0]);
connbuf[0]=0x06;
connbuf[1]='A';
connbuf[2]='T';
connbuf[3]='H';
connbuf[4]='0';
connbuf[5]=0X0a;
connbuf[6]=0x0d;
atsend(&connbuf[0]);
P0_0=1;
while(1)
{
}
}
/***********中断服务函数,用于接收返回码**********/
void int4( ) interrupt 4
{
EA=0;
while(RI==1)
{
RI=0;
databuf[i]=SBUF;
i=i+1;
}
EA=1;
}
/**********主函数****************/
void main()
{
csh ( ) ;
fsat( ) ;
jsdata( );
gj( );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -