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

📄 gprs.c

📁 本程序是51单片机与gprs模块进行通讯
💻 C
字号:
#include "gprs.h"


#define GPRSPWON P16 = 1;delay_10ms(100);P16 = 0;delay_10ms(4);P16 = 1;
#define STIMER 200
#define MTIMER 2000
#define LTIMER 5000

//gprs信息
xdata struct {
	uchar hip[16];	  //ip地址
	uchar hpt[8];	  //端口
	uchar phnum[3][16];	  //电话
} GprsInf;

xdata uchar InPhNum[16];  //呼入电话

bit RingFlag;			 //话铃
bit TelFlag = 0;		 //通话
bit BusyFlag = 0;		 

static bit ErFlag = 0;		//错误标志
static bit OkFlag = 0;		//正确标志
static bit NOFlag = 0;		//无载波
static bit NSIGFlag = 0;	//无信号
static bit HoldFlag = 0;	//挂断
static bit IdFlag = 0;		//电话识别码

uchar xdata AtRcvBuf[DATABUFSIZE];		//接收缓冲
uint AtRcvBufLen = 0;		//缓冲长度


/*************************************************
at命令接收处理
*************************************************/
void AtRcvPro(uchar *p, uint len) {
	uint i = 0;
	uchar flag = 0;
	TrDataSendProc(p, len);
	if(!strcmp(p, "OK")) {
		OkFlag = 1;
//		LED1 = !LED1;
	}
	else if(!strcmp(p, "ERROR")) {
		ErFlag = 1;
//		P42 = !P42;
	}		 //tcp链接打开正确

	else if(!strcmp(p, "RING")) {
		RingFlag = 1;
		TelFlag = 1;
//		LED1 = !LED1;
	}
	else if(!strcmp(p, "NO CARRIER")) { 
		HoldFlag = 1;
//		LED1 = !LED1;		
	}
	else if(!strcmp(p, "CONNECT")) { 
		OkFlag = 1;
//		LED1 = !LED1;		
	}
	else if(!strncmp(p, "+CLIP", 5)) {
		IdFlag = 1;
		i = 0;
		while(*p != '\0') {
			if(*p == '"')
				flag++;
			if((flag == 1) && (*p != '"')){
				InPhNum[i] = *p;	   //存储来电号码
				i++;
			}
			if(flag == 2)
				break;
			p++;
		}
		InPhNum[i] = '\0';
	}
}

/*************************************************
at命令发送处理
*************************************************/
uchar AtSendPro(uchar *p, uint t) {
	uint len = strlen(p);
	uint len1;
	SetCounter(&ErrCounter, 10);	//设置错误计数器
	delay_10ms(50);
	while(1) {
		while(len1 = ReadVkBuf0(AtRcvBuf)) {  //读取缓冲区长度有效
			AtRcvPro(AtRcvBuf, len1);	//处理at命令字符串
			delay_10ms(30);
		}
		if(OkFlag) {
			OkFlag = 0;
			ClrCounter(&ErrCounter);
			return 1;
		}
		if(ErFlag) {
			ErFlag = 0;
			if(Counter(&ErrCounter))
				return 0;	   //出错次数满,返回
			VkSend(p, len, GPRSPORT);
			delay_10ms(50);
		}
		WDT;
	}
	return 0;
}			  

/*************************************************
取消回显
*************************************************/
void SetEcho(void) {
	uchar code p[] = "ATE0\r";
	AtSendPro(p, STIMER);
}

void SetPhone(void) {
	uchar code p[] = "AT+CLIP=1\r";
	AtSendPro(p, STIMER);
}
	

/*************************************************
设置波特率
*************************************************/
void SetGprsBoud(void) {
	uchar code p[] = "AT+IPR=9600\r";
	AtSendPro(p, STIMER);
}

/*************************************************
设置串口
*************************************************/
void SetGprsUart(void) {
	uchar code p[] = "AT+ICF=3,3\r";
	AtSendPro(p, STIMER);
}

/*************************************************
设置接入网关
*************************************************/
void SetDcont(void) {
	uchar code p[] = "AT+CGDCONT=1,\"IP\",\"CMNET\"\r";//设置接入网关cmnet;
	AtSendPro(p, STIMER);
}

/*************************************************
设置isp
*************************************************/
void SetIsp(void) {
	uchar code p[] = "AT$APNSRV=\"CMNET\"\r";
	AtSendPro(p, STIMER);
}

/*************************************************
设置远端ip
*************************************************/
void SetHip(void) {
	uchar xdata p[64] = "AT$TCPSRV=0,\"";
	strcat(p, GprsInf.hip);
	strcat(p, "\"\r");
	AtSendPro(p, STIMER);
}

/*************************************************
设置远程端口port
*************************************************/
void SetHpt(void) {
	uchar xdata p[64] = "AT$TCPPORT=";
	strcat(p, GprsInf.hpt);
	strcat(p, "\r");
	AtSendPro(p, STIMER);
}

/*************************************************
连接gprs
*************************************************/
void ConnStart(void) {
	uchar code p[] = "AT$CONNSTART\r";
	AtSendPro(p, MTIMER);
}

/*************************************************
关闭gprs
*************************************************/
void ConnStop(void) {
	uchar *p;
	p = "AT$CONNSTOP\r";
	AtSendPro(p, MTIMER);
}

/*************************************************
建立tcp连接
************************************************/
uchar TcpOpen(void) {
	uchar code p[] = "AT$TCPOPEN\r";
	if(AtSendPro(p, MTIMER)) {
		ModeFlag = DATAMODE;	//数据模式
		return 1;
	}
	return 0;
}

/********************************************
关闭tcp链接
********************************************/
void TcpClose(void) {
	uchar code p[] = "\x03";
	ModeFlag = CMDMODE;
	AtSendPro(p, MTIMER);
}

/********************************************
话筒偏置电压
********************************************/
void SetMicb(void) {
	uchar code p[] = "AT+MICB=1\r";
	AtSendPro(p, MTIMER);
}

/********************************************
设置话筒音量
********************************************/
void SetAtxg(void) {
	uchar code p[] = "AT+ATXG=24\r";
	AtSendPro(p, MTIMER);
}

/********************************************
设置听筒音量
********************************************/
void SetArxv(void) {
	uchar code p[] = "AT+ARXV=5\r";
	AtSendPro(p, MTIMER);
}

/********************************************
忙音
********************************************/
void SetIctone(uchar n) {
	xdata uchar p[64] = "AT+ICTONE=";
	switch(n) {
		case 0: strcat(p, "0"); break;
		case 1: strcat(p, "1,1350,0,10,10"); break;
		case 2: strcat(p, "1,450,0,35,35"); break;
		default : break;
	}
	strcat(p, "\r");
	AtSendPro(p, MTIMER);
}
	
/*************************************************
初始化gprs模块
*************************************************/
void InitGprs(void) {
	GPRSPWON		 //上电
	delay_10ms(1000);
	EnVkS(GPRSPORT);
	ClrBuf(0);
	delay_10ms(2000);
	LED1 = !LED1;
	strcpy(GprsInf.hip, "210.51.191.99");
	strcpy(GprsInf.hpt, "4097");
	strcpy(GprsInf.phnum[0], "0");
	strcpy(GprsInf.phnum[1], "0");
	strcpy(GprsInf.phnum[2], "0");
	strcpy(GprsInf.phnum[0], "01062119750");
	SetGprsBoud();
	delay_10ms(200);
	SetVkBoud(0, 1);
	delay_10ms(1000);
	SetPhone();
	delay_10ms(200);
	SetArxv();
	delay_10ms(200);
	SetAtxg();
	delay_10ms(200);
	SetMicb();
	delay_10ms(200);
	while(Csq() == 0);
	delay_10ms(200);
	SetDcont();
	delay_10ms(200);
	SetIsp();
	delay_10ms(200);
	SetHip();
	delay_10ms(200);
	SetHpt();
	delay_10ms(200);
	ConnStart();
	delay_10ms(200);
}
	
/*************************************************
在线模式
*************************************************/
void Online(void) {
	uchar code p[] = "ATO\r";
	AtSendPro(p, MTIMER);
	ModeFlag = DATAMODE;	//进入数据模式,不接收响应字符串
}

/*************************************************
离线模式
*************************************************/
void Offline(void) {
	uchar code p[] = "+++";
	ModeFlag = CMDMODE;		//进入命令模式,接收响应字符
	AtSendPro(p, MTIMER);
	delay_10ms(STIMER);
}

/************************************************
保存
************************************************/
void SaveGprs(void) {
	uchar code p[] = "AT$W\r";
	AtSendPro(p, MTIMER);
}

/********************************************
呼叫号码检查,相同返回1
********************************************/
uchar CmpPhNum(void) {
	uchar i;
	for(i = 0; i < 3; i++) {
		if(!strcmp(GprsInf.phnum[i], InPhNum))
			return 1;
	}
	return 0;
}

void AnswerTel(void) {
	uchar code p[] = "ATA\r";
	NetState = 0;
	AtSendPro(p, MTIMER);
}

void HoldTel(void) {
	uchar code p[] = "ATH\r";
	AtSendPro(p, MTIMER);
	TelFlag = 0;
	
}

void NoCarrier(void) {
	NetState = 1;
	TelFlag = 0;
}

/********************************************
AT命令返回处理
********************************************/
void AtPro(void) {
	uint len;
	while(len = ReadVkBuf0(AtRcvBuf)) {
		AtRcvPro(AtRcvBuf, len);
		delay_10ms(30);
	}
	if(RingFlag) {		 //话铃标志
		RingFlag = 0;
		if(IdFlag) {
			IdFlag = 0;
			if(CmpPhNum() && !GrSendBusy) {
				SetIctone(1);
				delay_10ms(1000);
				SetIctone(0);
				AnswerTel();
			}
			else
				HoldTel();
		}
	}
	if(HoldFlag) {		//忙音标志
		HoldFlag = 0;
		SetIctone(2);
		delay_10ms(1000);
		SetIctone(0);
		NoCarrier();
	}
	if(RingInt) {		   //话铃中断
		RingInt = 0;
		StopTimer(&TmoTimer);
		Offline();
		HoldTel();
		Online();
		StartTimer(&TmoTimer);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -