ESP8266 AT指令开发篇(三)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Dream_cc/article/details/54813253

通过51单片机、Arduino等实现AT指令配置8266模块,主要是通过串口通信实现的,博主学校的时候用的是51单片机给8266配置,arduino等原理相同,但是通过这种方法配置8266不是很稳定,会出现莫名重启等错误,也有可能是我外围电路没有去设计的原因。

本次主要涉及到的AT指令如下

//ATE0  关闭回显
uchar code closeBack[6]={0x41,0x54,0x45,0x30,0x0D,0x0A};

//AT+UART=9600,0,0,0  设置UART串口模式
uchar code setUART[20]={0x41,0x54,0x2B,0x55,0x41,0x52,0x54,0x3D,0x39,0x36,0x30,0x30,0x2C,0x30,0x2C,0x30,0x2C,0x30,0x0D,0x0A};

//AT+CWMODE=1  设置成Station模式
uchar code setStationMode[13]={0x41,0x54,0x2B,0x43,0x57,0x4D,0x4F,0x44,0x45,0x3D,0x31,0x0D,0x0A};

//AT+CWJAP="ccc","455455455"  连接WIFI
uchar code linkWifi[28]={0x41,0x54,0x2B,0x43,0x57,0x4A,0x41,0x50,0x3D,0x22,0x63,0x63,0x63,0x22,0x2C,0x22,0x34,0x35,0x35,0x34,0x35,0x35,0x34,0x35,0x35,0x22,0x0D,0x0A};

//AT+CIPMUX=0  设置单路连接模式
uchar code setSingleLinkMode[13]={0x41,0x54,0x2B,0x43,0x49,0x50,0x4D,0x55,0x58,0x3D,0x30,0x0D,0x0A};

//AT+RST  重启
uchar code RST[8]={0x41,0x54,0x2B,0x52,0x53,0x54,0x0D,0x0A};

//AT+CIPSTART="TCP","192.168.199.134",8080  连接TCP服务器
uchar code linkTCPServe[42]={0x41,0x54,0x2B,0x43,0x49,0x50,0x53,0x54,0x41,0x52,0x54,0x3D,0x22,0x54,0x43,0x50,0x22,0x2C,0x22,0x31,0x39,0x32,0x2E,0x31,0x36,0x38,0x2E,0x31,0x39,0x39,0x2E,0x31,0x33,0x34,0x22,0x2C,0x38,0x30,0x38,0x30,0x0D,0x0A};

//AT+CIPSEND=  发送数据
uchar code sendDate[11]={0x41,0x54,0x2B,0x43,0x49,0x50,0x53,0x45,0x4E,0x44,0x3D};


当然你也可以使用如下方式表示变量

//ATE0  关闭回显
uchar code closeBack[]="ATE0\r\n";

//AT+UART=9600,0,0,0  设置UART串口模式
uchar code setUART[]="AT+UART=9600,0,0,0\r\n";

//AT+CWMODE=1  设置成Station模式
uchar code setStationMode[]="AT+CWMODE=1\r\n";

//AT+CWJAP="ccc","455455455"  连接WIFI
uchar code linkWifi[]="AT+CWJAP=\"ccc\",\"455455455\"\r\n";

//AT+CIPMUX=0  设置单路连接模式
uchar code setSingleLinkMode[]="AT+CIPMUX=0";

//AT+RST  重启
uchar code RST[]="AT+RST";

//AT+CIPSTART="TCP","192.168.199.134",8080  连接TCP服务器
uchar code linkTCPServe[]="AT+CIPSTART=\"TCP\",\"192.168.199.134\",8080";

//AT+CIPSEND=  发送数据
uchar code sendDate[]="AT+CIPSEND=";
以上第一种方法要写个循环一个一个发,而第二种比较方便,可以直接使用printf()函数发送。

所用主要是模块作为station连接tcp服务器的一个过程,下面附上我学习时候写的代码,可能有比较多附加的东西,方便我当时调试执行到哪部了。

#include <reg52.h>
#include <stdio.h>

#define uchar unsigned char
#define uint unsigned int

/******************本地变量声明******************/
uchar Buffer;  //接收串口数据

/******************端口引脚定义******************/
sbit K1=P3^4;  //正转按键
sbit K2=P3^5;  //反转按键
sbit K3=P3^6;  //停止按键
sbit LED1=P1^0;  //正转灯
sbit LED2=P1^1;  //反转灯
sbit LED3=P1^2;  //停止灯
sbit LED4=P1^3;  //连接服务器成功
sbit sig=P2^1;
sbit led=P2^0;

/******************电机相序表定义******************/
uchar code CW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};    //电机正时钟旋转相序表
uchar code CCW[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};   //电机逆时钟旋转相序表

/**********************ESP8266指令定义***********************
//ATE0  关闭回显
uchar code closeBack[6]={0x41,0x54,0x45,0x30,0x0D,0x0A};

//AT+UART=9600,0,0,0  设置UART串口模式
uchar code setUART[20]={0x41,0x54,0x2B,0x55,0x41,0x52,0x54,0x3D,0x39,0x36,0x30,0x30,0x2C,0x30,0x2C,0x30,0x2C,0x30,0x0D,0x0A};

//AT+CWMODE=1  设置成Station模式
uchar code setStationMode[13]={0x41,0x54,0x2B,0x43,0x57,0x4D,0x4F,0x44,0x45,0x3D,0x31,0x0D,0x0A};

//AT+CWJAP="ccc","455455455"  连接WIFI
uchar code linkWifi[28]={0x41,0x54,0x2B,0x43,0x57,0x4A,0x41,0x50,0x3D,0x22,0x63,0x63,0x63,0x22,0x2C,0x22,0x34,0x35,0x35,0x34,0x35,0x35,0x34,0x35,0x35,0x22,0x0D,0x0A};

//AT+CIPMUX=0  设置单路连接模式
uchar code setSingleLinkMode[13]={0x41,0x54,0x2B,0x43,0x49,0x50,0x4D,0x55,0x58,0x3D,0x30,0x0D,0x0A};

//AT+RST  重启
uchar code RST[8]={0x41,0x54,0x2B,0x52,0x53,0x54,0x0D,0x0A};

//AT+CIPSTART="TCP","192.168.199.134",8080  连接TCP服务器
uchar code linkTCPServe[42]={0x41,0x54,0x2B,0x43,0x49,0x50,0x53,0x54,0x41,0x52,0x54,0x3D,0x22,0x54,0x43,0x50,0x22,0x2C,0x22,0x31,0x39,0x32,0x2E,0x31,0x36,0x38,0x2E,0x31,0x39,0x39,0x2E,0x31,0x33,0x34,0x22,0x2C,0x38,0x30,0x38,0x30,0x0D,0x0A};

//AT+CIPSEND=  发送数据
uchar code sendDate[11]={0x41,0x54,0x2B,0x43,0x49,0x50,0x53,0x45,0x4E,0x44,0x3D};
********************ESP8266指令定义结束*********************/

/**********************ESP8266 AT指令定义***********************
//ATE0  关闭回显
uchar code closeBack[]="ATE0\r\n";

//AT+UART=9600,0,0,0  设置UART串口模式
uchar code setUART[]="AT+UART=9600,0,0,0\r\n";

//AT+CWMODE=1  设置成Station模式
uchar code setStationMode[]="AT+CWMODE=1\r\n";

//AT+CWJAP="ccc","455455455"  连接WIFI
uchar code linkWifi[]="AT+CWJAP=\"ccc\",\"455455455\"\r\n";

//AT+CIPMUX=0  设置单路连接模式
uchar code setSingleLinkMode[]="AT+CIPMUX=0";

//AT+RST  重启
uchar code RST[]="AT+RST";

//AT+CIPSTART="TCP","192.168.199.134",8080  连接TCP服务器
uchar code linkTCPServe[]="AT+CIPSTART=\"TCP\",\"192.168.199.134\",8080";

//AT+CIPSEND=  发送数据
uchar code sendDate[]="AT+CIPSEND=";
/********************ESP8266 AT指令定义结束*********************/


/******************延时函数******************/	
void delay(uint x)  	   
{
	uint i,j;
	for(i=0;i<x;i++)
		for(j=0;j<110;j++);
}
/******************延时函数完毕******************/

/******************电机转动函数*******************/
int CW_motor()  //内部齿轮正转一圈
{
	uint i,j,flag=0;  //flag为停止标识  1为停止  初始为0
	for(i=0;i<8;i++)
	{
		for(j=0;j<8;j++)
		{
			if(K3==0||Buffer=='t')
			{
				flag=1;
				break;			
			}
			P1=CW[j];
			delay(10);  //延时
		}
		if(flag==1)
			break;
	}
	if(flag)
		return 0;
	else
		return 1;
}
int CCW_motor()  //内部齿轮反转一圈
{
	uint i,j,flag=0;  //flag为停止标识  1为停止  初始为0
	for(i=0;i<8;i++)
	{		
		for(j=0;j<8;j++)
		{
			if(K3==0||Buffer=='t')
			{
				flag=1;
				break;
			}
			P1=CCW[j];
			delay(10);  //延时
		}
		if(flag==1)
			break;
	}
	if(flag)
		return 0;
	else
		return 1;
}
/******************电机转动函数完毕******************/

/******************串口初始化******************/
void INIT() 
{
	 TMOD = 0x20;  //设置定时器1工作在模式2
	 PCON = 0x00;
	 SCON = 0x50;			
	 TL1 = 0xfd;
	 TH1 = 0xfd;  //设置波特率 9600
	 TR1 = 1;     //启动定时器1
	 ES = 1;      //开串口中断
	 EA = 1;      //开总中断
	 TI=1;        //printf()需TI=1	
}
/******************串口初始化完毕******************/

/******************8266初始化******************/
void send_message(char *x)  //初始化8266 发送AT指令
{
	uint a;
	uint b,c,d,e;
	b=c=d=e=1;	
	do
	{
		for (a = 0; a<5000; a++);	
		printf("%s",x);
		do {
			if (RI) {    //查询是否有数据接收
				Buffer = SBUF;  //数据暂存于变量中
				RI = 0;
				if (Buffer == 'K')
				{
					b = 0;
					d = 0;
				}
				c++;
				if (c == 1000)  //重新发送
				{
					c = 1;
					d = 0;
				}
			}
		} while (d);
	} while (b);
}
void INIT_8266()  //初始化8266
{
	delay(2000);
	send_message("ATE0\r\n");
	delay(3000);
	send_message("AT+UART=9600,0,0,0\r\n");
	delay(3000);
	send_message("AT+CWMODE=1\r\n");	
	delay(3000);
	send_message("AT+CWJAP=\"ccc\",\"455455455\"\r\n");	
	delay(3000);
	send_message("AT+CIPMUX=0\r\n");
	delay(3000);	
	send_message("AT+RST\r\n");
	delay(5000);		
}
/******************8266初始化完毕******************/

/*
void Com_Int() interrupt 4	
{	
	if(RI == 1)   			//当硬件接收到一个数据时,RI会置位
	{
		RI = 0; 
		Buffer=SBUF;		
	}
}
*/
void main()
{
	uint N=64;  //28BYJ-48 5V DC 4线程步进电机 减速比为1:64
				//及内部齿轮转64圈,最外部齿轮转1圈	
	uint i;
	uint flag_motor=0;  //是否转动
	LED1=LED2=1;
	LED3=0;
	LED4=1;
	INIT();
	//INIT_8266();
	//led=1;
	while(1)
	{
		/*if(K1==0)
		{
			while(K1==0);
			send_message("AT+CIPSTART=\"TCP\",\"172.28.151.1\",8080");
			LED4=0;
		}
		if(K2==0)
		{
			while(K2==0);
			send_message("AT+CIPSEND=15\r\n");
			while(K3!=0);
			send_message("I can hear you!");
		}*/
		if(K1==0||Buffer=='z'||sig==1)
		{
			//while(K1==0);
			/*send_message("zheng zhuang zhong...\n");
			LED1=0;
			LED3=1;*/
			for(i=0;i<N;i++)
			{
				if(!CW_motor())
					break;
			}
			//LED1=1;
			//LED3=0;
		}
		if(K2==0||Buffer=='f')
		{
			/*send_message("fan zhuang zhong...\n");
			while(K2==0);
			LED2=0;
			LED3=1;*/
			for(i=0;i<N;i++)
			{
				if(!CCW_motor())
					break;
			}
			//LED2=1;
			//LED3=0;
		}
		Buffer=0;  //清空Buffer的值  至下一次串行中断再获取指令值
	}		
}


最后说几点,我用的是STC89C52RC的51单片机芯片,晶振是12MHz,非常坑...根本配不出9600的波特率,误差太大,所以AT指令发送各种鬼畜,当时也是图便宜买的8266-01的模块,模块的稳定性也可能有比较大的问题,而且刚买的8266模块的波特率不是9600,也忘记是多少了,所以不是十分推荐用这种方式,下次有空会更新固件开发的文章,希望可以帮到刚入的师弟师妹或者开发者。

猜你喜欢

转载自blog.csdn.net/Dream_cc/article/details/54813253