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;
}
}