52单片机连接ESP8266烧入固件使用MQTT协议连接OneNET云平台

参考:
-----------------------------------------------------------------------------------------
创建一个 MQTT 协议产品:
版权声明:本文为CSDN博主「Yonas-Luo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_17351161/article/details/107716689
------------------------------------------------------------------------------------------
ESP8266固件库烧录(AT固件库与Node固件库):
版权声明:本文为CSDN博主「风铃叶雨」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jidudong0673/article/details/105222924
------------------------------------------------------------------------------------------
将c52单片机的串口设置为115200波特率:
版权声明:本文为CSDN博主「Day____Day____Up」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_37281289/article/details/80304532
-------------------------------------------------------------------------------------------
STM32单片机ESP8266发送数据到WiFi接收端代码实现:
版权声明:本文为CSDN博主「花开莫与流年错_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_17242837/article/details/72464956
--------------------------------------------------------------------------------------------
基于8266WIFI模块实现智能手机与51单片机的通信入门:
版权声明:本文为CSDN博主「IamDaodaoLi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/IamDaodaoLi/article/details/79715074
-----------------------------------------------------------------------------------------------
ESP8266MOD、刷可以使用AT指令的固件、作为客户端向贝壳云端发送固定数据:
版权声明:本文为CSDN博主「FightingBoom」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fightingboom/article/details/83315486

固件烧入

本文使用刷入 OneNET 提供的 ESP8266 固件的方法,你甚至不需要了解MQTT协议,既可实现远程控制。使用 STC89C52+ESP8266 来接入云平台。

硬件:ESP8266-01S和USB转串口模块

esp8266 模块型号为:ESP8266-01s,它的Flash 大小为 8M ,这是一个重要的参数,在刷新固件时需要使用到
esp8266有8个引脚分别做一下介绍

引脚 功能
VCC 3.3V电源
GND 接地
RX 数据接收
TX 数据发送
EN 高电平工作;低电平模块供电关掉
RST 外部Reset信号,低电平复位,高电平工作(默认高)(有的命名为CH_PD)
IO0 工作模式选择:悬空:FlashBoot,工作模式;下拉:UARTDownload,下载模式
IO2 (1)开机上电时必须为高电平,禁止硬件下拉;(2)内部默认已拉高

ESP8266和串口连接

串口模块 ESP8266模块
VCC3.3V VCC(3.3V) 和CH_PD
TX RX
RX TX
GND GND

注:烧入固件时IO0接GND才能烧写成功

ESP8266和MCU连接

MCU ESP8266模块
VCC3.3V VCC(3.3V) 和CH_PD
TX RX
RX TX
GND GND

注:这样连接MCU和ESP就可以正常通信了

固件烧入

烧入的固件使用的是:大佬分享的 https://open.iot.10086.cn/bbs/thread-25723-1-1.html
烧入固件使用的工具是:flash_download_tool
我下载后的百度云链接:链接:https://pan.baidu.com/s/1cU6NJoDb2b3bks-KPYmK1Q
提取码:8023

软件



除了COM(串口和电脑连接的端口号)
其余选择必须和图片一样
注意:esp8266-01sflash大小是8M,FLASH SIZE必须是8Mbit
比特率是115200
最后点击START等待下在完成

测试AT指令,使用的电脑串口助手和esp8266通信测试

需要注意的是
所有AT指令均需加上\r\n作为结束。
所有AT指令回复均已\r\n作为结束.
注:只介绍部分指令的工能不做过多赘述esp8266的反馈信息(想了解更多信息就参考【ESP8266-直连OneNET-内置协议】中的文件【OneNET接入固件-MQTT-AT指令说明文档-v1.1.docx】百度云链接分享中有)

AT指令 作用
AT+IOTSTATUS 查询与OneNET连接状态
AT+CIPSTATUS 查询WIFI连接状态
AT+CWJAP=ssid,password 手动链接WiFi
AT+IOTCFG=devid,proid,auth_info 连接OneNET(devid 为设备DI,proid 为产品ID,auth_info为鉴权信息)
AT+IOTSEND=a,b,c,(d) 发送数据流 【a:(0:数据是数值类型)(1:数据是字符串类型)(2:数据是gps)】【b:数据流名】【c:数据值】【d:数据值 (只有上传GPS时才会用到)】
AT+IOTSTATUS 查询OneNET连接状态
收到不合法的AT指令 +Event:ERROR Cmd

注:最好把自己使用到的指令都试一试,联网和不联网、连接onenet和不连接onenet时esp回馈信息是不一样的,建议自己尝试

程序

**我写的程序只有上传数据,没有onenet控制MCU功能,需要注意没有onenet控制MCU功能,**

使用的STC89C52单片机一般产生的波特率是9600,但是烧入这个固件ESP8266串口通信波特率是115200,为了使MCU和ESP 通信正常使用定时器2产生115200的波特率

主函数

main.c

#include "usart.h"
#include "esp8266.h"
#include "timer0.h"//sbit led1=P2^0;
//sbit led2=P2^1;
sbit led3=P2^2;void main_delayms(uint xms)
{uint i,j;for(i=0;i<xms;i++)for(j=0;j<120;j++);
}void main()
{uchar temp=20;uchar hum=40;count_m=0;//定时器0计数count_s=0;time0_flag=0;Rx_len=0;Rx_data_len=0;Timer0_Init();set52_baudrate(11.0592, 115200);//串口初始化ESP_Init();//esp8266初始化//   led1=1;
//  led2=1;led3=1;main_delayms(5000);while(1){temp ++ ;//做实验使用的所以数据是随机生成的hum ++ ;if(temp>=30)temp=20;if(hum>=95)hum=40;
//      led1=1;
//      led2=0;ESP_Send_Data(temp,hum);}
}

串口程序

usart.c

#include "usart.h"uchar idata RxBuf[70];
uchar idata TxBuf[70];uchar RIflag;
uchar TIflag;
uchar Rx_len;
uchar Rx_data_len;
/*波特率为9600*/
//void UART_init(void)
//{//    SCON = 0x50;        //串口方式1
//
//    TMOD = 0x20;        // 定时器使用方式2自动重载
//    TH1 = 0xFD;    //9600波特率对应的预设数,定时器方式2下,TH1=TL1
//    TL1 = 0xFD;
//
//    TR1 = 1;//开启定时器,开始产生波特率
//}/**自定义波特率产生函数**/
/*
frequency:晶振频率,11.0592
baudrate: 需要的波特率,115200
*/
void set52_baudrate(float frequency, long int baudrate)
{uint itmp;uchar tlow,thigh;TMOD =0x20;itmp=(int)(65536-(frequency*1000000)/(baudrate*32));thigh=itmp/256;tlow=itmp%256;SCON=0x5c;T2CON=0x30;RCAP2H=thigh;RCAP2L=tlow;TH2=thigh;TL2=tlow;TR2=1;  //set ok//REN=1;ET2=1;  //T2中断EA=1;  //总中断ES=1; //串口中断PS=1;    //
}/*发送一个字符*/
void UART_send_byte(uchar dat)
{ES=0;//关闭中断,新添加的SBUF = dat;       //把数据放到SBUF中while (TI == 0);//未发送完毕就等待TI = 0;    //发送完毕后,要把TI重新置0ES=1;//关闭中断,新添加的
}/*发送一个字符串*/
void UART_send_string(uchar *buf)
{while (*buf != '\0'){UART_send_byte(*buf++);}
}///*串口接收一个字节数据*/
//void UART_receive_string( uchar *RxBuffer )
//{//  ES=0;
//  *RxBuffer = SBUF;
//  ES=1;
//}
//
/*串口中断*/
void USART_interrupt() interrupt 4
{uchar ss;if(RI==1)//接收中断{RI=0;      ss=SBUF;if(ss!='\n')//esp返回的字符串是以\r\n为结尾的{RxBuf[Rx_len]=ss;Rx_len++;          }else{ES=0;//每次接收完成就将中断关闭RIflag=1;//一个字符串几首完成才会将此标志位置为1strcat(RxBuf,"\r\n");Rx_len=Rx_len+2;Rx_data_len=Rx_len;Rx_len=0;}}if(TI==1)//发送中断{TI=0;}
}

usart.h

#include"reg52.h"
#include"stdio.h"
#include"stdlib.h"
#include"intrins.h"
#include <string.h>#ifndef __USART__H
#define __USART__H#define uchar unsigned char
#define uint unsigned intextern uchar idata RxBuf[70] ;
extern uchar idata TxBuf[70] ;extern uchar RIflag;
extern uchar TIflag;
extern uchar Rx_len;
extern uchar Rx_data_len;#define usart_buf_size strlen(RxBuf)//void UART_init();//初始化串口
void set52_baudrate(float frequency, long int baudrate);
void UART_send_byte(uchar dat);//发送一个字节数据void UART_send_string(uchar *buf);//发送一个字符串
//void UART_receive_string( uchar *RxBuffer );//接收字符串,#endif

ESP8266程序

esp8266.c

#include"reg52.h"
#include"esp8266.h"
#include "usart.h"
#include "timer0.h"uchar idata ESP_Send_Temp[]="AT+IOTSEND=0,Temp,28\r\n";
uchar idata ESP_Send_Hum[]="AT+IOTSEND=0,Hum,54\r\n";sbit led1=P2^0;
sbit led2=P2^1;
sbit led5=P2^4;//esp指示灯,会是一闪一闪的,表示esp正常工作呢void esp_delayms(uint xms)
{uint i,j;for(i=0;i<xms;i++)for(j=0;j<120;j++);
}uchar Check_ESP_connect_onenet()//和onenet连接时返回1,没有连接时返回0
{ES=1;RIflag=0;memset(RxBuf,0,usart_buf_size);UART_send_string(AT_IOTSTATUS);//查询与OneNET连接状态esp_delayms(test_time);if(RIflag==1){RIflag=0;if(RxBuf[1]=='I' && RxBuf[2]=='O' && RxBuf[3]=='T' && RxBuf[12]=='0')//连接着onenet呢{memset(RxBuf,0,usart_buf_size);Rx_data_len=0;ES=0;return 1;}else{memset(RxBuf,0,usart_buf_size);Rx_data_len=0;ES=0;return 0;}}ES=0;return 0;
}void ESP_connect_IOTCFG()//和onenet连接
{ES=1;RIflag=0;memset(RxBuf,0,usart_buf_size);UART_send_string(AT_IOTCFG);//配置登录信息esp_delayms(test_time);if(RIflag==1){ES=0;RIflag=0;if(RxBuf[7]=='O' && RxBuf[8]=='n' && RxBuf[9]=='e' && RxBuf[14]=='L')//成功登陆onenet{memset(RxBuf,0,usart_buf_size);Rx_data_len=0;}else//没有连接WiFi时,连接不成功,没有连接成功{memset(RxBuf,0,usart_buf_size);Rx_data_len=0;}}ES=0;//没有接收到反馈信息
}/*检查esp是否接入WiFi*/
uchar ESP_AP_Check()
{led5=1;ES=1;//打开中断,esp_delayms(2);    RIflag=0;memset(RxBuf,0,usart_buf_size);UART_send_string(AT_CIPSTATUS);//发送AT指令判断是否连接WiFiesp_delayms(test_time);if(RIflag==1)//接收到esp返回信息,串口接收到数据之后产生中断,在中断中将此标志位置为1{RIflag=0;
//      UART_send_string(strcat(RxBuf,"\r\n"));//把接收到的信息返回if(RxBuf[1]=='S' && RxBuf[2]=='T' && RxBuf[3]=='A' && RxBuf[8]=='5')//WiFi连接状态,是5说明连接WiFi成功  +STATUS:5{memset(RxBuf,0,usart_buf_size);Rx_data_len=0;ES=0;//关闭中断if(Check_ESP_connect_onenet()==0)//返回值是0说明没有和onenet连接{if(time0_flag==1)//定时器时间,3分钟重新连接一次{time0_flag=0;ESP_connect_IOTCFG();//WiFi连接的时候判断是否和服务器连接着呢esp_delayms(1000);}return 1;}else//返回值是1说明和onenet连接呢{return 1;}}else//检测出来和WiFi没有连接{return 0;}}ES=0;return 0;
}void ESP_Init()
{uchar f;ES=0;memset(RxBuf,0,usart_buf_size);f = ESP_AP_Check();ESP_connect_IOTCFG();//先发送一下,就算没有连接上,连接WiFi后也会自动连接onenet
}/*MCU向ESP发送温湿度数据*/
void ESP_RX_Data(uchar temp, uchar hum)
{   ES=1;ESP_Send_Temp[18]='0'+temp/10;ESP_Send_Temp[19]='0'+temp%10;if(ESP_Send_Temp[17]!=',')ESP_Send_Temp[17]=',';    UART_send_string(ESP_Send_Temp);esp_delayms(10);memset(TxBuf,0,usart_buf_size);ESP_Send_Hum[17]='0'+hum/10;ESP_Send_Hum[18]='0'+hum%10;if(ESP_Send_Hum[16]!=',')ESP_Send_Hum[16]=','; UART_send_string(ESP_Send_Hum);esp_delayms(5);ES=0;
}void ESP_Send_Data(uchar temp, uchar hum)
{uchar esp_ap=0;led1=1;led2=0;esp_ap=ESP_AP_Check();if(esp_ap==1)//WiFi正确连接{esp_ap=0;ESP_RX_Data(temp,hum);esp_delayms(100);led1=0;led2=1;}}

esp8266.h

#include"reg52.h"#define uchar unsigned char //宏定义一个无符号的char类型
#define uint unsigned int //宏定义一个无符号的int类型#ifndef __ESP8266__H
#define __ESP8266__H#define test_time 1000/*******AT指令说明*********/
//我只是用到这几个AT命令
#define AT_CIPSTATUS "AT+CIPSTATUS\r\n"  //查询WIFI连接状态
#define AT_CIPSTATUS_Event "+STATUS:5\r\n"  //接入成功#define AT_CWJAP "AT+CWJAP=YJ8023,12345678\r\n"  //手动接入AP
#define AT_CWJAP_Event "+Event:WIFI CONNECTED\r\n"  //接入成功#define AT_IOTCFG "AT+IOTCFG=713051942,422751,0625\r\n"  //配置登录信息
#define AT_IOTCFG_Event "+Event:OneNET Link:PROID: 422751,AUIF: 0625,DEVID:713051942\r\n"  //成功登陆#define AT_IOTSTATUS "AT+IOTSTATUS\r\n"  //查询与OneNET连接状态
#define AT_IOTSTATUS_Event "+IOT:status:0\r\n"  //如还未接入路由就发送指令登录OneNET时extern uchar idata ESP_Send_Temp[];
extern uchar idata ESP_Send_Hum[];
/****************/
uchar Check_ESP_connect_onenet();
uchar ESP_AP_Check();
void ESP_connect_IOTCFG();
void ESP_Init();
void ESP_RX_Data(uchar temp, uchar hum);//是子函数
void ESP_Send_Data(uchar temp, uchar hum);//在主函数调用
#endif

定时器0

timer0.c

#include "timer0.h"uchar count_s;
uchar count_m;
uchar time0_flag;void Timer0_Init(void)
{TMOD |= 0x01;//设置定时器为工作方式1  C/T位为1的时候是计数器模式,为0的时候是定时器模式,前四位是定时器1,后四位是定时器0TL0 = (65536 - 1000)%256;    //装初值,低8位TH0 = (65536 - 1000)/256;   //高8位ET0 = 1;    //开定时器的中断TR0 = 1;    //开定时器EA = 1;     //开总中断
}void Timer0(void) interrupt 1
{TL0 = (65536 - 45872)%256;    //装初值,低8位//初值是1000即1msTH0 = (65536 - 45872)/256;   //高8位   //50ms中断一次count_s++;if(count_s == 20)//一秒钟{count_s = 0;count_m++;//60就是1分钟if(count_m==60 * 3){count_m=0;time0_flag=1;}}
}

timer0.h

#include"reg52.h"
#include"stdio.h"
#include"stdlib.h"
#include"intrins.h"#define uchar unsigned char //宏定义一个无符号的char类型
#define uint unsigned int //宏定义一个无符号的int类型#ifndef __TIMER0__H
#define __TIMER0__Hextern uchar count_s;
extern uchar count_m;
extern uchar time0_flag;void Timer0_Init(void);#endif

我写的程序不好可以优化地方很多,但是达到了我的预期,我时间紧张就没有做过多修改,分享出来是为了让时间紧凑的人不至于走太多的弯路,谢谢大家观看,有意见请提出来,评论区回复不一定会及时,但是看到会及我所能帮你解决问题。

52单片机连接ESP8266烧入固件使用MQTT协议将温湿度上传至OneNET云平台相关推荐

  1. stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭

    stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭 接触stm32已经有一年半的时间了,从最开始的stm32F103ZET ...

  2. 7天搭建物联网项目 STM32 + ESP8266 第 1 节 上传数据到云平台

    开发环境准备: 硬件平台我们需要如下设备,一个stm32开发板(STM3F103C8T6型号,使用其他型号只需要修改下软件工程配置,也可以直接买我做好的开发板哈).ESP8266 wifi 芯片.jl ...

  3. 【stm32c8t6+esp8266上传温湿度到Onenet云平台】

    stm32c8t6+esp8266上传温湿度到Onenet云平台 最近做的一个小项目中需要将获取的数据到云平台,我选择的是onenet平台,下面会根据个人学习过程分享如何使用onenet平台以及如何通 ...

  4. 使用ESP8266数据上onenet云平台

    大家好,今天给大家带来的是使用esp8266将单片机的数据上传至onenet云平台.首先说说,为什么要上云呢?将数据上传至云平台可以更好的观察到数据的变化,也可以通过云平台命令下发从而更方便管理.当然 ...

  5. arduino UNO通过AT指令控制esp8266连接WiFi及onenet云平台

    写下这篇文章是为了记录我学习使用esp8266的过程.在本文中我们会使用AT指令通过MQTT协议连接onenet云平台 开篇必看 1)关于onenet MQTT设备创建 在设备连接onenet平台中, ...

  6. [单片机]基于STM32的ONENET云平台操控系统

    目录 1 项目描述 2 项目需求 3 搭建环境 数字温湿度传感器DHT11 光敏传感器 MPU6050 wifi模块ESP8266 OLED屏 RC522 W25Q128 SR04超声波 4 技术描述 ...

  7. ESP8266通过TCP透传连接OneNet云平台实现数据互传——保姆级教程

    OneNet云平台设置 登录OneNet云平台并注册账号 进入控制台 选择全部产品服务中的多协议接入 在多协议接入中选择"TCP透传",并添加产品 在添加产品中填写产品的基本信息( ...

  8. stm32——esp8266物联网开发,连接onenet云平台(http)做智能家居(1)

    此处感谢b站up主--彼岸有光我们有船(我认为讲的和江科大老师一样好,如果习惯江科大老师的讲法的朋友们都可以看看捏) 提供的教程和最初的正点原子的源码,因为我学习的是江科大的stm32,所以进行了部分 ...

  9. FreeRTOS+STM32L+ESP8266+MQTT协议传输温湿度数据,控制继电器到阿里云物联网平台

    一.准备材料 二.设备连接 2.1 插入模块.串口线 将ESP8266模块按照图中所示插入指定位置 将串口线一端插入到STM32L的USB口,另一端插入到电脑的USB口 2.2.连接ST-Link仿真 ...

最新文章

  1. 第1章 1.9计算机网络概述--OSI参考模型和网络安全
  2. 文档上传下载 php开源,PHP文件的上传下载 - PHP开发学习门户的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. “三通一达”创始人均来自桐庐 有的村人均GDP上亿
  4. ts定义html是什么类型,TypeScript—类型定义文件(*.d.ts)
  5. TopFreeTheme精选免费模板【20130704】
  6. php 整行插入mysql_MySQL的多行插入
  7. 语义分割——语义分割数据集的笔记
  8. URL Scheme-短信、邮件、微信外网页等场景打开小程序
  9. 【浙江大学PAT真题练习乙级】1009 说反话 (20分)真题解析
  10. 使用Istio分布式跟踪应用程序
  11. 无线通信原理与应用笔记
  12. 更改我的网页默认的暴风影音播放器
  13. python求15 17 23 65 97的因数_Python练习题
  14. C51单片机 SIM900A 手机给门禁解锁 智能家居 【C程序代码已开源,更新至Ver4.0】...
  15. android指定sqlite路径_android sqlite 存储位置
  16. QT信号槽与connect的常见写法
  17. canpcb阻抗_CAN网络 其特性阻抗及终端阻抗
  18. 各种项目的源代码网站
  19. 烘焙贴图(二)——展UV
  20. 关于netfilter总结及包过滤防火墙实现

热门文章

  1. 关于人们对抖音的看法的调研报告
  2. C#---刘铁锰 C#语言入门详解 学习笔记07(P10P11P12)(操作符,操作符的本质,表达式)
  3. 【深夜思考】比较好的java开发公司
  4. Java核心基础:三元运算符,附三个案例和源码
  5. python实现电影院仿真(SimPy)
  6. Servlet图书管理系统测试报告
  7. 未来人类科技发展时间表
  8. [tyvj2054] 四叶草魔杖 (最小生成树 状压dp)
  9. mikrotik基础功能配置
  10. ElasticSearch入门与Sense插件的使用