📄 modemzj.c
字号:
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
#define uchar unsigned char
uchar tel[5];
uchar trbuf[9];
uchar recbuf[2];
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
/****************************************************************************************
**AT命令发送子函数void atsend(unchar *commbuf) **
**commbuf[]={n,data1,data2,...} **
**n--命令字节数,data--AT命令的ASCII码 **
****************************************************************************************/
void atsend(uchar *commbuf)
{
uchar i,j,a,buf[8];
i=*(commbuf); //首地址内容为报文长度
for (j=1;j<(i+1);j++) //循环到报文结束
{
TI=0;
a=*(commbuf+j); //commbuf保存地址+j的偏移量,*读取计算结果所在地址内容
SBUF=*(commbuf+j);
while (TI==0); //等待发送完毕硬件自动把TI=1
}
TI=0;
}
/****************************************************************************************
**数据接收子函数void datarec(unchar *recbuf) **
**commbuf[]={n,data1,data2,...} **
**n--命令字节数,data--AT命令的ASCII码 **
****************************************************************************************/
void datarec(uchar *recbuf)
{
uchar i,j;
i=*(recbuf);
for (j=1;j<(i+1);j++)
{
RI=0;
while (RI==0); //等待接收完毕时系统自动把RI=1
*(recbuf+j)=SBUF; //recebuf第一格始终无内容?SBUF内容是送到recebuf+j开始的????
}
RI=0;
}
/****************************************************************************************
**MODEM链接子函数void conn() **
**数据接受数组recbuf[16];数据发送数组trbuf[16];呼叫号码tel[] **
****************************************************************************************/
void conn()
{
uchar buf[30];
uchar connbuf[18];
uchar i;
unsigned int j;
bit flag;
SCON=0x50; //0101 0000 (SM1=1, 8位UART,可变波特率, REN=1 UART接收允许)
SP=0x60; //堆栈指针地址
TMOD=0x20; //0010 0000 (T1M1=1,T1M0=0, 方式2:自动重装载的8位计数器/定时器)
TL1=0xf4;
TH1=0xf4;
ES=1; //UART/UART0中断允许位(1,允许RI/TI标志为)
EA=0; //中断总允许位(0,禁止所有中断)
TR1=1; //定时器1的计数脉冲
RI=0;
TI=0;
/*********把ATF发送, 并关掉回显**************/
L1:
connbuf[0]=6; //命令串字节数
connbuf[1]='A';
connbuf[2]='T';
connbuf[3]='F'; //设定初始值
connbuf[4]='E'; //默认参数=0 不回显
connbuf[5]=0x0a; //10换行
connbuf[6]=0x0d; //13回车 (表示结束)
atsend(&connbuf[0]);
/*******接收发送完后的返回码**************************/
for (i=0;i<8;i++)
{
while(RI==0);
buf[i]=SBUF;
RI=0;
}
/***************判断返回码是否为OK,为OK时拨电话号码,否则继续发送以上的AT命令********/
flag=0x00;
for (i=0;i<0x08;i++)
{
if(buf[i]==0x4f)//"o"
{
if(buf[i+1]==0x4b)//"k"
{flag=1;}
}
}
for (j=0;j<0xffff;j++); //循环65535 --> 2ms?
if (!flag)
{
goto L1;
}
/*****************拨电话***********/
L2:
connbuf[0]=tel[0]+0x08;
connbuf[1]='A';
connbuf[2]='T';
connbuf[3]='X'; //呼叫进程
connbuf[4]='4'; //检测忙信号和拨号音,当进行话线连接时,回码显示话线数据速率。
connbuf[5]='D'; //拨号
connbuf[6]='T'; //音频拨号
for(i=0;i<tel[0];i++)
{
connbuf[i+7]=tel[i+1];
}
connbuf[i+7]=0x0a; //10换行
connbuf[i+8]=0x0d; //13回车 (表示结束)
atsend(&connbuf[0]);
/************接收拨完号后的返回 码************/
flag=0;
for (i=0;i<17;i++)
{
while(RI==0);
buf[i]=SBUF;
RI=0;
}
/*********** 接收拨完号后的返回 码是否为CONNECT 2400 ,是,发送数据,否则再拨号 ************/
for (i=0;i<17;i++)
{
if(buf[i]==0x43)//"c"
{
if(buf[i+1]==0x4f)//"o"
{flag=1;}
}
}
for (i=0;i<0x21;i++) /*delay 30ms*/
{
for (j=0;j<0xffff;j++); //循环65535 --> 2ms?
}
if (!flag)
{
goto L2;
}
atsend(&trbuf[0]);
/*datarec(&recbuf[0]);*/
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]);
P1_2=0;
P1_1=1;
_nop_();
}
/****************************************************************************************
**实验主程序, 被叫号码“2083”,发送Yuefame字符串
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -