51单片机实现ESP8266云端通信

51单片机实现远程数据上传与控制

总结经验:要先手动配置AP+STA模式,再连入WiFi,然后波特率要同步,再接入51单片机,配置连接服务器和发送长度,最后在主程序里面发送字符串
一.通过AT指令集配置ESP8266模块

使用USB转串口驱动,没有的小伙伴可以用USB转TTL代替,接线时,ESP8266的RX和TX与TTL转接口的交叉,即

只要接四根先,其他的不用接

打开串口助手工具,打开目标串口,注意输入指令的时候在结尾回车发送

1. AT+RST    
2. AT+UART=9600,8,1,0,0   //波特率设为9600
3. AT+CWMODE=3              //即可作为服务器,也可作为客户端
4. AT+CWJAP="ESP8266","12345678"     //接入本地WiFi
5. AT+CIPSTART="UDP","xx.xxx.xx.xxx",xxxx  //连接服务器,方式可以为UDP或TCP

二.配置完成后,连接51单片机,RX和TX也一定要交叉连接

#include <reg52.h>
#define uchar unsigned char    //声明数据类型
#define uint  unsigned int
bit uart_busy = 0;    //串口返回消息
sbit D1 = P2^1;       //控制设备可以为LED或风扇甚至是电磁炮
sbit D2 = P2^2;
sbit D3 = P2^3;
char flag;            //串口中断控制标志

void delay5ms() {
    unsigned char a,b;
    for(b=201;b>0;b--)
        for(a=247;a>0;a--);
}

void Init_uart(void) {      //串口波特率要设为9600
	TMOD = TMOD | 0x20;    
	SCON = SCON | 0x50;    
	TH1 = 0xFd;        
	TL1 = TH1;  
	TR1 = 1;              
	EA =1;                
	ES =1;               
}
//串口一个个发送字符
void Uart_SendByteData(unsigned char msg){
	while(uart_busy); 
	SBUF=msg;		          //发送到缓冲数据流
	uart_busy = 1;	
}
//串口发送字符串
void Uart_SendStrData(unsigned char *msg){
	while(*msg){
		Uart_SendByteData(*msg++);
	}
}

//初始化配置8266,指定服务器
void Init_ESP01S(){             
    //先将8266与服务器建立UDP连接
	Uart_SendStrData("AT+CIPSTART=\"UDP\",\"xx.xxx.xx.xxx\",xxxx\r\n");   
	delay5ms();  
	Uart_SendStrData("AT+CIPSEND=8\r\n");	    //这里的8是指发送的长度
	delay5ms();
}

void main(){
    unsigned char i;
    unsigned char *msg="12345678";
    D1 = 0;
	Init_uart();
	Init_ESP01S();
	delay5ms();
	Uart_SendStrData("%s\r\n",msg);    //通过串口发送字符串给8266,发送到云端
    delay5ms();
    Uart_SendStrData("AT+CIPSEND=0,100\r\n");    //发送数据长度在0-100之内
    if(flag == 1){
        for(i=200;i>0;i--){
            D1 = !D1;                  //接收远程控制命令
            delay5ms();
        }
    }
}

void UART_Interrupt(void) interrupt 4 {
	uchar temp;
	if(RI){
        D2 = 0;
        D3 = 0;                  //设置初始状态
		temp = SBUF;             //接收的字节流
		RI = 0;
        //或者可以对数据流进行校验,解决通信安全的问题
        if(temp == 1){           //根据指令控制设备
            flag=1;              //控制主函数里的操作
            ES=1;                //重新开启串口中断
        }
        switch(temp){            //根据不同指令控制不同设备
            case 0x31: D2=~D2;break;
            case 0x32: D3=~D3;break;
        }
	}
	
	if(TI){        //发送中断标志位清零
		TI = 0;
		uart_busy = 0;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_37504771/article/details/112136172