⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modemzj.c

📁 c51使用modem模块的操作示范代码.
💻 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 + -