<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[51单片机+ESP8266连接mqtt的智能火灾报警系统设计与实现]]></title><description><![CDATA[<p dir="auto">&lt;p&gt;声明：本项目为自研，（前端是小伙伴帮忙做的）开发不易，大家点点赞支持一下主播吧（目前网上没有看到基于51的mqtt相关项目，感觉51搞这些太容易超内存了，并且大佬都在搞32）&lt;/p&gt;&lt;p&gt;本博客不包含emqx的搭建教程，不会搭建emqx的可以先看这个博主的视频： &lt;span&gt;&lt;a href="http:// <a href="https://b23.tv/fuq6wbk" rel="nofollow ugc">https://b23.tv/fuq6wbk</a>" target="_blank" rel="noopener noreferrer"&gt;<a href="https://b23.tv/fuq6wbk" rel="nofollow ugc">https://b23.tv/fuq6wbk</a>&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;结尾附网盘链接&lt;/p&gt;&lt;h2&gt;项目概述&lt;/h2&gt;&lt;p&gt;本项目基于STC89C52RC单片机，结合ESP8266  WiFi模块、DHT11温湿度传感器、MQ-2气体传感器等硬件，设计并实现了一个智能火灾报警系统。系统能够实时监测环境温湿度和可燃气体浓度，通过MQTT协议将数据上传到云平台，并支持远程报警和阈值设置。&lt;/p&gt;&lt;p&gt;</p>
<p dir="auto">&lt;span&gt;​&lt;img src="/assets/uploads/files/1785077888776-image.png" alt="image.png" data-size="large" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;系统架构&lt;/h2&gt;&lt;h3&gt;硬件组成&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;主控芯片&lt;/strong&gt;：STC89C52RC单片机&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;通信模块&lt;/strong&gt;：ESP8266 WiFi模块（ESP-01S）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;传感器&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;DHT11温湿度传感器&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;MQ-2气体浓度传感器&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;AD/DA转换模块&lt;/strong&gt;：PCF8591转换模块&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;显示模块&lt;/strong&gt;：LCD1602液晶显示屏&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;报警模块&lt;/strong&gt;：蜂鸣器、LED报警灯&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;软件架构&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;开发环境&lt;/strong&gt;：Keil C51&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;通信协议&lt;/strong&gt;：MQTT&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;数据格式&lt;/strong&gt;：JSON&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;&lt;strong&gt;PCB设计&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;1.原理图&lt;/p&gt;&lt;p&gt;&lt;img src="/assets/uploads/files/1785077910964-image.png" alt="image.png" data-size="large" /&gt;&lt;/p&gt;&lt;p&gt;2.PCB&lt;/p&gt;&lt;p&gt;&lt;img src="/assets/uploads/files/1785078011677-image.png" alt="image.png" data-size="large" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;核心功能实现&lt;/h2&gt;&lt;h3&gt;1. 传感器数据采集&lt;/h3&gt;&lt;p&gt;1.mq2烟雾传感器&lt;/p&gt;<br />
&lt;blockquote&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span&gt;#include "mq2.h''&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;span&gt;&lt;strong&gt;#include "i2c.h"&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;#define PCF8591_ADDR  0x90&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// PCF8591 I2C地址&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;// 读取PCF8591指定通道的模拟值（MQ2接通道0）&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;unsigned char MQ2_ReadByte(unsigned char Channel)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unsigned char Data;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;I2C_Start();&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;I2C_SendByte(PCF8591_ADDR);&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/strong&gt;&lt;span&gt;&lt;strong&gt;// &lt;/strong&gt;&lt;strong&gt;写地址&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;<br />
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;2.dht11温湿度传感器&lt;/p&gt;<br />
&lt;pre&gt;&lt;code&gt;&lt;span&gt;#&lt;span&gt;include&lt;/span&gt; &lt;span&gt;"dht11.h"&lt;/span&gt;&lt;/span&gt;<br />
&lt;span&gt;#&lt;span&gt;include&lt;/span&gt; &lt;span&gt;&lt;intrins.h&gt;&lt;/span&gt;&lt;/span&gt;</p>
<p dir="auto">&lt;span&gt;// 30us延时&lt;/span&gt;<br />
&lt;span&gt;&lt;span&gt;void&lt;/span&gt; &lt;span&gt;DHT11_Delay30us&lt;/span&gt;&lt;span&gt;(&lt;span&gt;void&lt;/span&gt;)&lt;/span&gt;<br />
&lt;/span&gt;{<br />
&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; i;<br />
i = &lt;span&gt;12&lt;/span&gt;;<br />
&lt;span&gt;while&lt;/span&gt; (--i);<br />
}</p>
<p dir="auto">&lt;span&gt;// 40us延时&lt;/span&gt;<br />
&lt;span&gt;&lt;span&gt;void&lt;/span&gt; &lt;span&gt;DHT11_Delay40us&lt;/span&gt;&lt;span&gt;(&lt;span&gt;void&lt;/span&gt;)&lt;/span&gt;<br />
&lt;/span&gt;{<br />
&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; i;<br />
i = &lt;span&gt;17&lt;/span&gt;;<br />
&lt;span&gt;while&lt;/span&gt; (--i);<br />
}</p>
<p dir="auto">&lt;span&gt;&lt;span&gt;uint8_t&lt;/span&gt; &lt;span&gt;DHT11_Init&lt;/span&gt;&lt;span&gt;(&lt;span&gt;void&lt;/span&gt;)&lt;/span&gt;<br />
&lt;/span&gt;{<br />
DHT11_DQ = &lt;span&gt;1&lt;/span&gt;;<br />
DHT11_DQ = &lt;span&gt;0&lt;/span&gt;;<br />
&lt;span&gt;Delay_xms&lt;/span&gt;(&lt;span&gt;20&lt;/span&gt;);  &lt;span&gt;// 至少给18ms&lt;/span&gt;<br />
DHT11_DQ = &lt;span&gt;1&lt;/span&gt;;<br />
&lt;span&gt;DHT11_Delay30us&lt;/span&gt;();</p>
<pre><code>&lt;span&gt;if&lt;/span&gt;(DHT11_DQ == &lt;span&gt;0&lt;/span&gt;)
{
	&lt;span&gt;while&lt;/span&gt;(DHT11_DQ == &lt;span&gt;0&lt;/span&gt;);
	&lt;span&gt;while&lt;/span&gt;(DHT11_DQ == &lt;span&gt;1&lt;/span&gt;);
	&lt;span&gt;return&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;;
}
&lt;span&gt;return&lt;/span&gt; &lt;span&gt;1&lt;/span&gt;;
</code></pre>
<p dir="auto">}</p>
<p dir="auto">&lt;span&gt;&lt;span&gt;uint8_t&lt;/span&gt; &lt;span&gt;DHT11_ReceiveByte&lt;/span&gt;&lt;span&gt;(&lt;span&gt;void&lt;/span&gt;)&lt;/span&gt;<br />
&lt;/span&gt;{<br />
&lt;span&gt;uint8_t&lt;/span&gt; i, Byte = &lt;span&gt;0x00&lt;/span&gt;;<br />
&lt;span&gt;for&lt;/span&gt;(i=&lt;span&gt;0&lt;/span&gt;; i&lt;&lt;span&gt;8&lt;/span&gt;; i++)<br />
{<br />
Byte &lt;&lt;= &lt;span&gt;1&lt;/span&gt;;<br />
&lt;span&gt;while&lt;/span&gt;(DHT11_DQ == &lt;span&gt;0&lt;/span&gt;);<br />
&lt;span&gt;DHT11_Delay40us&lt;/span&gt;();<br />
&lt;span&gt;if&lt;/span&gt;(DHT11_DQ == &lt;span&gt;1&lt;/span&gt;) Byte |= &lt;span&gt;0x01&lt;/span&gt;;<br />
&lt;span&gt;while&lt;/span&gt;(DHT11_DQ == &lt;span&gt;1&lt;/span&gt;);<br />
}<br />
&lt;span&gt;return&lt;/span&gt; Byte;<br />
}</p>
<p dir="auto">&lt;span&gt;&lt;span&gt;uint8_t&lt;/span&gt; &lt;span&gt;DHT11_GetData&lt;/span&gt;&lt;span&gt;(&lt;span&gt;uint8_t&lt;/span&gt; *Humi_H, &lt;span&gt;uint8_t&lt;/span&gt; *Humi_L, &lt;span&gt;uint8_t&lt;/span&gt; *Temp_H, &lt;span&gt;uint8_t&lt;/span&gt; *Temp_L)&lt;/span&gt;<br />
&lt;/span&gt;{<br />
&lt;span&gt;uint8_t&lt;/span&gt; i, Buffer[&lt;span&gt;5&lt;/span&gt;];<br />
&lt;span&gt;if&lt;/span&gt;(&lt;span&gt;DHT11_Init&lt;/span&gt;() == &lt;span&gt;0&lt;/span&gt;)<br />
{<br />
&lt;span&gt;for&lt;/span&gt;(i=&lt;span&gt;0&lt;/span&gt;; i&lt;&lt;span&gt;5&lt;/span&gt;; i++) Buffer[i] = &lt;span&gt;DHT11_ReceiveByte&lt;/span&gt;();</p>
<pre><code>	&lt;span&gt;if&lt;/span&gt;(Buffer[&lt;span&gt;0&lt;/span&gt;] + Buffer[&lt;span&gt;1&lt;/span&gt;] + Buffer[&lt;span&gt;2&lt;/span&gt;] + Buffer[&lt;span&gt;3&lt;/span&gt;] == Buffer[&lt;span&gt;4&lt;/span&gt;])
	{
		*Humi_H = Buffer[&lt;span&gt;0&lt;/span&gt;];
		*Humi_L = Buffer[&lt;span&gt;1&lt;/span&gt;];
		*Temp_H = Buffer[&lt;span&gt;2&lt;/span&gt;];
		*Temp_L = Buffer[&lt;span&gt;3&lt;/span&gt;];
		&lt;span&gt;return&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;;
	}
}
&lt;span&gt;return&lt;/span&gt; &lt;span&gt;1&lt;/span&gt;;
</code></pre>
<p dir="auto">}<br />
&lt;/code&gt;&lt;/pre&gt;<br />
&lt;p&gt;&lt;span&gt;&lt;/span&gt;<br />
&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;#&lt;span&gt;ifndef&lt;/span&gt; <strong>DHT11_H</strong>&lt;/span&gt;<br />
&lt;span&gt;#&lt;span&gt;define&lt;/span&gt; <strong>DHT11_H</strong>&lt;/span&gt;</p>
<p dir="auto">&lt;span&gt;#&lt;span&gt;include&lt;/span&gt; &lt;span&gt;&lt;reg52.h&gt;&lt;/span&gt;&lt;/span&gt;<br />
&lt;span&gt;#&lt;span&gt;include&lt;/span&gt; &lt;span&gt;"delay.h"&lt;/span&gt;&lt;/span&gt;</p>
<p dir="auto">&lt;span&gt;typedef&lt;/span&gt; &lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; &lt;span&gt;uint8_t&lt;/span&gt;;</p>
<p dir="auto">sbit DHT11_DQ = P2^&lt;span&gt;0&lt;/span&gt;;	&lt;span&gt;// 引脚设置&lt;/span&gt;</p>
<p dir="auto">&lt;span&gt;&lt;span&gt;uint8_t&lt;/span&gt; &lt;span&gt;DHT11_Init&lt;/span&gt;&lt;span&gt;(&lt;span&gt;void&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;;<br />
&lt;span&gt;&lt;span&gt;uint8_t&lt;/span&gt; &lt;span&gt;DHT11_ReceiveByte&lt;/span&gt;&lt;span&gt;(&lt;span&gt;void&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;;<br />
&lt;span&gt;&lt;span&gt;uint8_t&lt;/span&gt; &lt;span&gt;DHT11_GetData&lt;/span&gt;&lt;span&gt;(&lt;span&gt;uint8_t&lt;/span&gt; *Humi_H, &lt;span&gt;uint8_t&lt;/span&gt; *Humi_L, &lt;span&gt;uint8_t&lt;/span&gt; *Temp_H, &lt;span&gt;uint8_t&lt;/span&gt; *Temp_L)&lt;/span&gt;&lt;/span&gt;;</p>
<p dir="auto">&lt;span&gt;#&lt;span&gt;endif&lt;/span&gt;&lt;/span&gt;<br />
&lt;/code&gt;&lt;/pre&gt;<br />
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;2. ESP8266 MQTT通信&lt;/h3&gt;&lt;p&gt;注意：客户端ID随意但是必须唯一，用户名称和密码就是自己在emqx上设置的&lt;/p&gt;&lt;p&gt;</p>
<p dir="auto">&lt;span&gt;​&lt;img src="/assets/uploads/files/1785078045468-image.png" alt="image.png" data-size="large" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;注意：mqtt的IP地址用ipconfig查看不了，可以用网络调试助手等软件看，不知道是哪个可以先用串口调试ESP8266，发送AT指令连接尝试：（串口发送AT指令记得末尾加上换行）&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;AT+CWMODE=1&lt;/p&gt;&lt;p&gt;AT+CWJAP="WiFi名","WiFi密码"&lt;/p&gt;&lt;p&gt;AT+MQTTUSERCFG=0,1,"客户端ID","用户名","密码",0,0,""&lt;/p&gt;&lt;p&gt;AT+MQTTCONN=0,"mqtt的IP地址",1883,0&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;网络调试助手：&lt;/p&gt;&lt;p&gt;&lt;img src="/assets/uploads/files/1785078101073-image.png" alt="image.png" data-size="large" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;&lt;p&gt;esp8266.c&lt;/p&gt;<br />
&lt;pre&gt;&lt;code&gt;&lt;span&gt;#&lt;span&gt;include&lt;/span&gt; &lt;span&gt;"esp8266.h"&lt;/span&gt;&lt;/span&gt;<br />
&lt;span&gt;#&lt;span&gt;include&lt;/span&gt; &lt;span&gt;&lt;reg52.h&gt;&lt;/span&gt;&lt;/span&gt;<br />
&lt;span&gt;#&lt;span&gt;include&lt;/span&gt; &lt;span&gt;"lcd1602.h"&lt;/span&gt;&lt;/span&gt;<br />
&lt;span&gt;#&lt;span&gt;include&lt;/span&gt; &lt;span&gt;"usart.h"&lt;/span&gt;&lt;/span&gt;<br />
&lt;span&gt;#&lt;span&gt;include&lt;/span&gt; &lt;span&gt;"delay.h"&lt;/span&gt;&lt;/span&gt;<br />
&lt;span&gt;#&lt;span&gt;include&lt;/span&gt; &lt;span&gt;"time.h"&lt;/span&gt;&lt;/span&gt;</p>
<p dir="auto">&lt;span&gt;// 硬件引脚定义&lt;/span&gt;<br />
sbit WIFI_RST = P1^&lt;span&gt;7&lt;/span&gt;;	&lt;span&gt;// ESP8266复位&lt;/span&gt;<br />
sbit Bee      = P1^&lt;span&gt;6&lt;/span&gt;;	&lt;span&gt;// 蜂鸣器&lt;/span&gt;<br />
sbit ALARM_LED= P1^&lt;span&gt;5&lt;/span&gt;;	&lt;span&gt;// 报警灯&lt;/span&gt;</p>
<p dir="auto">&lt;span&gt;// 全局变量：传感器数据&lt;/span&gt;<br />
&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; Humi_H, Temp_H, Gas;<br />
&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; Threshold = &lt;span&gt;29&lt;/span&gt;;	&lt;span&gt;// 温度报警阈值&lt;/span&gt;</p>
<p dir="auto">&lt;span&gt;// ESP8266初始化连接MQTT（使用AT指令）&lt;/span&gt;<br />
&lt;span&gt;&lt;span&gt;void&lt;/span&gt; &lt;span&gt;ESP_conect_sev&lt;/span&gt;&lt;span&gt;(&lt;span&gt;void&lt;/span&gt;)&lt;/span&gt;<br />
&lt;/span&gt;{<br />
&lt;span&gt;// ESP8266复位&lt;/span&gt;<br />
WIFI_RST = &lt;span&gt;0&lt;/span&gt;;<br />
&lt;span&gt;Delay_xms&lt;/span&gt;(&lt;span&gt;1000&lt;/span&gt;);<br />
WIFI_RST = &lt;span&gt;1&lt;/span&gt;;<br />
&lt;span&gt;Delay_xms&lt;/span&gt;(&lt;span&gt;1000&lt;/span&gt;);</p>
<pre><code>&lt;span&gt;// 本地MQTT AT指令配置&lt;/span&gt;
&lt;span&gt;uart1_sendstring&lt;/span&gt;(&lt;span&gt;"AT+CWMODE=1\r\n"&lt;/span&gt;);
&lt;span&gt;Delay_xms&lt;/span&gt;(&lt;span&gt;1000&lt;/span&gt;);
&lt;span&gt;uart1_sendstring&lt;/span&gt;(&lt;span&gt;"AT+CWJAP=\"WiFi名\",\"密码\"\r\n"&lt;/span&gt;);	&lt;span&gt;// 连接WiFi&lt;/span&gt;
&lt;span&gt;Delay_xms&lt;/span&gt;(&lt;span&gt;2000&lt;/span&gt;);
&lt;span&gt;uart1_sendstring&lt;/span&gt;(&lt;span&gt;"AT+MQTTUSERCFG=0,1,\"客户端ID\",\"用户名\",\"密码\",0,0,\"\"\r\n"&lt;/span&gt;);	&lt;span&gt;// MQTT用户配置&lt;/span&gt;
&lt;span&gt;Delay_xms&lt;/span&gt;(&lt;span&gt;1000&lt;/span&gt;);
&lt;span&gt;uart1_sendstring&lt;/span&gt;(&lt;span&gt;"AT+MQTTCONN=0,\"IP地址\",1883,0\r\n"&lt;/span&gt;);	&lt;span&gt;// 连接MQTT服务器&lt;/span&gt;
&lt;span&gt;Delay_xms&lt;/span&gt;(&lt;span&gt;2000&lt;/span&gt;);
</code></pre>
<p dir="auto">}</p>
<p dir="auto">&lt;span&gt;// 数字转字符串（发送数据用）&lt;/span&gt;<br />
&lt;span&gt;&lt;span&gt;void&lt;/span&gt; &lt;span&gt;num_to_str&lt;/span&gt;&lt;span&gt;(&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; num, &lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; *num_str1)&lt;/span&gt;<br />
&lt;/span&gt;{<br />
&lt;span&gt;if&lt;/span&gt;(num != &lt;span&gt;0&lt;/span&gt;)<br />
{<br />
&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; num_temp = num;<br />
&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; cnt = &lt;span&gt;0&lt;/span&gt;;<br />
&lt;span&gt;while&lt;/span&gt;(num_temp)<br />
{<br />
cnt++;<br />
num_temp /= &lt;span&gt;10&lt;/span&gt;;<br />
}<br />
num_temp = num;<br />
&lt;span&gt;while&lt;/span&gt;(cnt)<br />
{<br />
cnt--;<br />
num_str1[cnt] = (num_temp % &lt;span&gt;10&lt;/span&gt;) + &lt;span&gt;48&lt;/span&gt;;<br />
num_temp /= &lt;span&gt;10&lt;/span&gt;;<br />
}<br />
}<br />
&lt;span&gt;else&lt;/span&gt;<br />
{<br />
num_str1[&lt;span&gt;0&lt;/span&gt;] = &lt;span&gt;'0'&lt;/span&gt;;<br />
}<br />
}</p>
<p dir="auto">&lt;span&gt;// 发送第一个传感器数据（湿度）&lt;/span&gt;<br />
&lt;span&gt;&lt;span&gt;void&lt;/span&gt; &lt;span&gt;first_data&lt;/span&gt;&lt;span&gt;(&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; *str2, &lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; num)&lt;/span&gt;<br />
&lt;/span&gt;{<br />
&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; str1[&lt;span&gt;3&lt;/span&gt;] = {&lt;span&gt;0&lt;/span&gt;};<br />
&lt;span&gt;// MQTT发布主题：testtopic/1，保留JSON数据格式&lt;/span&gt;<br />
&lt;span&gt;uart1_sendstring&lt;/span&gt;(&lt;span&gt;"AT+MQTTPUB=0,"testtopic/1","{\""&lt;/span&gt;);<br />
&lt;span&gt;uart1_sendstring&lt;/span&gt;(str2);<br />
&lt;span&gt;uart1_sendstring&lt;/span&gt;(&lt;span&gt;"\":"&lt;/span&gt;);<br />
&lt;span&gt;num_to_str&lt;/span&gt;(num, str1);<br />
&lt;span&gt;uart1_sendstring&lt;/span&gt;(str1);<br />
}</p>
<p dir="auto">&lt;span&gt;// 追加传感器数据（温度、气体浓度）&lt;/span&gt;<br />
&lt;span&gt;&lt;span&gt;void&lt;/span&gt; &lt;span&gt;add_data&lt;/span&gt;&lt;span&gt;(&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; *str2, &lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; num)&lt;/span&gt;<br />
&lt;/span&gt;{<br />
&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; str1[&lt;span&gt;3&lt;/span&gt;] = {&lt;span&gt;0&lt;/span&gt;};<br />
&lt;span&gt;uart1_sendstring&lt;/span&gt;(&lt;span&gt;"\,\""&lt;/span&gt;);<br />
&lt;span&gt;uart1_sendstring&lt;/span&gt;(str2);<br />
&lt;span&gt;uart1_sendstring&lt;/span&gt;(&lt;span&gt;"\":"&lt;/span&gt;);<br />
&lt;span&gt;num_to_str&lt;/span&gt;(num, str1);<br />
&lt;span&gt;uart1_sendstring&lt;/span&gt;(str1);<br />
}</p>
<p dir="auto">&lt;span&gt;// 每秒发送传感器数据到MQTT&lt;/span&gt;<br />
&lt;span&gt;&lt;span&gt;void&lt;/span&gt; &lt;span&gt;ESP_send_data&lt;/span&gt;&lt;span&gt;(&lt;span&gt;void&lt;/span&gt;)&lt;/span&gt;<br />
&lt;/span&gt;{<br />
&lt;span&gt;if&lt;/span&gt;(time0_ms &gt; &lt;span&gt;1000&lt;/span&gt;)	&lt;span&gt;// 1秒发送一次&lt;/span&gt;<br />
{<br />
&lt;span&gt;first_data&lt;/span&gt;(APP_Humi, Humi_H);	&lt;span&gt;// 湿度&lt;/span&gt;<br />
&lt;span&gt;add_data&lt;/span&gt;(APP_Temp, Temp_H);		&lt;span&gt;// 温度&lt;/span&gt;<br />
&lt;span&gt;add_data&lt;/span&gt;(APP_Gas, Gas);			&lt;span&gt;// 气体浓度&lt;/span&gt;<br />
&lt;span&gt;uart1_sendstring&lt;/span&gt;(&lt;span&gt;"}",0,0\r\n"&lt;/span&gt;);<br />
&lt;span&gt;Delay_xms&lt;/span&gt;(&lt;span&gt;200&lt;/span&gt;);<br />
&lt;span&gt;uart1_sendstring&lt;/span&gt;(&lt;span&gt;"AT+MQTTPUB=0,"订阅主题名",""&lt;/span&gt;);<br />
&lt;span&gt;if&lt;/span&gt;(Gas &gt; &lt;span&gt;50&lt;/span&gt; || Temp_H &gt; Threshold)<br />
{<br />
&lt;span&gt;uart1_sendstring&lt;/span&gt;(&lt;span&gt;"fire"&lt;/span&gt;);  &lt;span&gt;// 报警发送fire&lt;/span&gt;<br />
}<br />
&lt;span&gt;else&lt;/span&gt;<br />
{<br />
&lt;span&gt;uart1_sendstring&lt;/span&gt;(&lt;span&gt;"normal"&lt;/span&gt;);&lt;span&gt;// 正常发送normal&lt;/span&gt;<br />
}<br />
&lt;span&gt;uart1_sendstring&lt;/span&gt;(&lt;span&gt;"",0,0\r\n"&lt;/span&gt;);<br />
&lt;span&gt;Delay_xms&lt;/span&gt;(&lt;span&gt;200&lt;/span&gt;);<br />
time0_ms = &lt;span&gt;0&lt;/span&gt;;					&lt;span&gt;// 重置定时器&lt;/span&gt;<br />
}<br />
}</p>
<p dir="auto">&lt;span&gt;// 字符串比较&lt;/span&gt;<br />
&lt;span&gt;bit &lt;span&gt;str_cmp&lt;/span&gt;&lt;span&gt;(&lt;span&gt;char&lt;/span&gt; *str1, &lt;span&gt;char&lt;/span&gt; *str2, &lt;span&gt;char&lt;/span&gt; len)&lt;/span&gt;<br />
&lt;/span&gt;{<br />
&lt;span&gt;char&lt;/span&gt; *str3 = str1;<br />
&lt;span&gt;char&lt;/span&gt; *str4 = str2;<br />
&lt;span&gt;while&lt;/span&gt;(len)<br />
{<br />
&lt;span&gt;if&lt;/span&gt;(*str3 != *str4) &lt;span&gt;return&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;;<br />
len--;<br />
str3++;<br />
str4++;<br />
}<br />
&lt;span&gt;return&lt;/span&gt; &lt;span&gt;1&lt;/span&gt;;<br />
}</p>
<p dir="auto">&lt;span&gt;// 字符串转数字&lt;/span&gt;<br />
&lt;span&gt;&lt;span&gt;int&lt;/span&gt; &lt;span&gt;str_to_num&lt;/span&gt;&lt;span&gt;(&lt;span&gt;char&lt;/span&gt; *str1)&lt;/span&gt;<br />
&lt;/span&gt;{<br />
&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; num = &lt;span&gt;0&lt;/span&gt;;<br />
&lt;span&gt;while&lt;/span&gt;(*str1 &gt;= &lt;span&gt;'0'&lt;/span&gt; &amp;&amp; *str1 &lt;= &lt;span&gt;'9'&lt;/span&gt;)<br />
{<br />
num += (*str1) - &lt;span&gt;48&lt;/span&gt;;<br />
str1++;<br />
&lt;span&gt;if&lt;/span&gt;(!(*str1 &gt;= &lt;span&gt;'0'&lt;/span&gt; &amp;&amp; *str1 &lt;= &lt;span&gt;'9'&lt;/span&gt;)) &lt;span&gt;break&lt;/span&gt;;<br />
num *= &lt;span&gt;10&lt;/span&gt;;<br />
}<br />
&lt;span&gt;return&lt;/span&gt; num;<br />
}</p>
<p dir="auto">&lt;span&gt;// 处理本地MQTT下发指令&lt;/span&gt;<br />
&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; Deliver_num;<br />
&lt;span&gt;&lt;span&gt;void&lt;/span&gt; &lt;span&gt;Proces_distribut_data&lt;/span&gt;&lt;span&gt;(&lt;span&gt;void&lt;/span&gt;)&lt;/span&gt;<br />
&lt;/span&gt;{<br />
&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; i; &lt;span&gt;// C89：提前声明循环变量，修复语法错误&lt;/span&gt;<br />
&lt;span&gt;if&lt;/span&gt;(RX_ok)	&lt;span&gt;// 接收完成&lt;/span&gt;<br />
{<br />
Deliver_num = &lt;span&gt;str_to_num&lt;/span&gt;(Deliver_data);	&lt;span&gt;// 解析指令数值&lt;/span&gt;<br />
&lt;span&gt;// 仅保留温度阈值修改逻辑（可扩展其他本地指令）&lt;/span&gt;<br />
&lt;span&gt;if&lt;/span&gt;(&lt;span&gt;str_cmp&lt;/span&gt;(Deliver_identifier, APP_Threshold, &lt;span&gt;8&lt;/span&gt;))<br />
{<br />
Threshold = Deliver_num;<br />
}</p>
<pre><code>	&lt;span&gt;// 清空接收缓存&lt;/span&gt;
	&lt;span&gt;for&lt;/span&gt;(i=&lt;span&gt;0&lt;/span&gt;; i&amp;lt;&lt;span&gt;6&lt;/span&gt;; i++) 
	{
		Deliver_identifier[i] = &lt;span&gt;0&lt;/span&gt;;
	}
	&lt;span&gt;for&lt;/span&gt;(i=&lt;span&gt;0&lt;/span&gt;; i&amp;lt;&lt;span&gt;4&lt;/span&gt;; i++) 
	{
		Deliver_data[i] = &lt;span&gt;0&lt;/span&gt;;
	}
	Deliver_cnt = &lt;span&gt;0&lt;/span&gt;;
	Deliver_data_cnt = &lt;span&gt;0&lt;/span&gt;;
	RX_ok = &lt;span&gt;0&lt;/span&gt;;
}
</code></pre>
<p dir="auto">}</p>
<p dir="auto">&lt;span&gt;// 传感器报警逻辑（气体浓度/温度过高）&lt;/span&gt;<br />
&lt;span&gt;&lt;span&gt;void&lt;/span&gt; &lt;span&gt;Alarm_Check&lt;/span&gt;&lt;span&gt;(&lt;span&gt;void&lt;/span&gt;)&lt;/span&gt;<br />
&lt;/span&gt;{<br />
&lt;span&gt;if&lt;/span&gt;(Gas &gt; &lt;span&gt;50&lt;/span&gt; || Temp_H &gt; Threshold)	&lt;span&gt;// 气体浓度&gt;阈值 或 温度&gt;阈值&lt;/span&gt;<br />
{<br />
&lt;span&gt;LCD_ShowString&lt;/span&gt;(&lt;span&gt;2&lt;/span&gt;, &lt;span&gt;7&lt;/span&gt;, &lt;span&gt;"fire!"&lt;/span&gt;);<br />
Bee = &lt;span&gt;0&lt;/span&gt;;			&lt;span&gt;// 蜂鸣器响&lt;/span&gt;<br />
ALARM_LED = &lt;span&gt;1&lt;/span&gt;;		&lt;span&gt;// 报警灯亮&lt;/span&gt;<br />
}<br />
&lt;span&gt;else&lt;/span&gt;<br />
{<br />
&lt;span&gt;LCD_ShowString&lt;/span&gt;(&lt;span&gt;2&lt;/span&gt;, &lt;span&gt;7&lt;/span&gt;, &lt;span&gt;"     "&lt;/span&gt;);<br />
Bee = &lt;span&gt;1&lt;/span&gt;;			&lt;span&gt;// 蜂鸣器关&lt;/span&gt;<br />
ALARM_LED = &lt;span&gt;0&lt;/span&gt;;		&lt;span&gt;// 报警灯灭&lt;/span&gt;<br />
}<br />
}<br />
&lt;/code&gt;&lt;/pre&gt;<br />
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;esp8266.h&lt;/p&gt;<br />
&lt;pre&gt;&lt;code&gt;&lt;span&gt;#&lt;span&gt;ifndef&lt;/span&gt; <em>ESP8266_H</em>&lt;/span&gt;<br />
&lt;span&gt;#&lt;span&gt;define&lt;/span&gt; <em>ESP8266_H</em>&lt;/span&gt;</p>
<p dir="auto">&lt;span&gt;#&lt;span&gt;include&lt;/span&gt; &lt;span&gt;&lt;reg52.h&gt;&lt;/span&gt;&lt;/span&gt;<br />
&lt;span&gt;#&lt;span&gt;include&lt;/span&gt; &lt;span&gt;"usart.h"&lt;/span&gt;&lt;/span&gt;<br />
&lt;span&gt;#&lt;span&gt;include&lt;/span&gt; &lt;span&gt;"time.h"&lt;/span&gt;&lt;/span&gt;</p>
<p dir="auto">&lt;span&gt;// 传感器数据宏定义&lt;/span&gt;<br />
&lt;span&gt;#&lt;span&gt;define&lt;/span&gt; APP_Humi      &lt;span&gt;"Humi"&lt;/span&gt;    &lt;span&gt;// 湿度&lt;/span&gt;&lt;/span&gt;<br />
&lt;span&gt;#&lt;span&gt;define&lt;/span&gt; APP_Temp      &lt;span&gt;"Temp"&lt;/span&gt;    &lt;span&gt;// 温度&lt;/span&gt;&lt;/span&gt;<br />
&lt;span&gt;#&lt;span&gt;define&lt;/span&gt; APP_Gas       &lt;span&gt;"Gas"&lt;/span&gt;     &lt;span&gt;// 气体浓度&lt;/span&gt;&lt;/span&gt;<br />
&lt;span&gt;#&lt;span&gt;define&lt;/span&gt; APP_Threshold &lt;span&gt;"Threshold"&lt;/span&gt; &lt;span&gt;// 温度阈值&lt;/span&gt;&lt;/span&gt;</p>
<p dir="auto">&lt;span&gt;extern&lt;/span&gt; &lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; Humi_H, Temp_H, Gas;<br />
&lt;span&gt;extern&lt;/span&gt; &lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; Threshold;</p>
<p dir="auto">&lt;span&gt;&lt;span&gt;void&lt;/span&gt; &lt;span&gt;ESP_conect_sev&lt;/span&gt;&lt;span&gt;(&lt;span&gt;void&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;;<br />
&lt;span&gt;&lt;span&gt;void&lt;/span&gt; &lt;span&gt;ESP_send_data&lt;/span&gt;&lt;span&gt;(&lt;span&gt;void&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;;<br />
&lt;span&gt;&lt;span&gt;void&lt;/span&gt; &lt;span&gt;num_to_str&lt;/span&gt;&lt;span&gt;(&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; num, &lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; *num_str1)&lt;/span&gt;&lt;/span&gt;;<br />
&lt;span&gt;bit &lt;span&gt;str_cmp&lt;/span&gt;&lt;span&gt;(&lt;span&gt;char&lt;/span&gt; *str1, &lt;span&gt;char&lt;/span&gt; *str2, &lt;span&gt;char&lt;/span&gt; len)&lt;/span&gt;&lt;/span&gt;;<br />
&lt;span&gt;&lt;span&gt;int&lt;/span&gt; &lt;span&gt;str_to_num&lt;/span&gt;&lt;span&gt;(&lt;span&gt;char&lt;/span&gt; *str1)&lt;/span&gt;&lt;/span&gt;;<br />
&lt;span&gt;&lt;span&gt;void&lt;/span&gt; &lt;span&gt;Proces_distribut_data&lt;/span&gt;&lt;span&gt;(&lt;span&gt;void&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;;<br />
&lt;span&gt;&lt;span&gt;void&lt;/span&gt; &lt;span&gt;Alarm_Check&lt;/span&gt;&lt;span&gt;(&lt;span&gt;void&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;;<br />
&lt;span&gt;&lt;span&gt;void&lt;/span&gt; &lt;span&gt;first_data&lt;/span&gt;&lt;span&gt;(&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; *str2, &lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; num)&lt;/span&gt;&lt;/span&gt;;<br />
&lt;span&gt;&lt;span&gt;void&lt;/span&gt; &lt;span&gt;add_data&lt;/span&gt;&lt;span&gt;(&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; *str2, &lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; num)&lt;/span&gt;&lt;/span&gt;;</p>
<p dir="auto">&lt;span&gt;#&lt;span&gt;endif&lt;/span&gt;&lt;/span&gt;<br />
&lt;/code&gt;&lt;/pre&gt;<br />
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;关键技术点&lt;/h2&gt;&lt;h3&gt;1. 数据格式转换&lt;/h3&gt;&lt;p&gt;由于51的时钟频率差异（11.0592MHz相比32性能相差数十倍，所以数字转换算法必须极度优化，我在这个问题上卡了两天，后面查到一种比较好的轻量级数字转换算法&lt;/p&gt;<br />
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;void&lt;/span&gt; &lt;span&gt;num_to_str&lt;/span&gt;&lt;span&gt;(&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; num, &lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; *num_str1)&lt;/span&gt;<br />
&lt;/span&gt;{<br />
&lt;span&gt;if&lt;/span&gt;(num != &lt;span&gt;0&lt;/span&gt;)<br />
{<br />
&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; num_temp = num;<br />
&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; cnt = &lt;span&gt;0&lt;/span&gt;;<br />
&lt;span&gt;while&lt;/span&gt;(num_temp)<br />
{<br />
cnt++;<br />
num_temp /= &lt;span&gt;10&lt;/span&gt;;<br />
}<br />
num_temp = num;<br />
&lt;span&gt;while&lt;/span&gt;(cnt)<br />
{<br />
cnt--;<br />
num_str1[cnt] = (num_temp % &lt;span&gt;10&lt;/span&gt;) + &lt;span&gt;48&lt;/span&gt;;<br />
num_temp /= &lt;span&gt;10&lt;/span&gt;;<br />
}<br />
}<br />
&lt;span&gt;else&lt;/span&gt;<br />
{<br />
num_str1[&lt;span&gt;0&lt;/span&gt;] = &lt;span&gt;'0'&lt;/span&gt;;<br />
}<br />
}&lt;/code&gt;&lt;/pre&gt;<br />
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;2. JSON数据构造&lt;/h3&gt;&lt;p&gt;由于51单片机内存限制，无法使用标准库，需要采用手动构造JSON格式数据：&lt;/p&gt;<br />
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;void&lt;/span&gt; &lt;span&gt;first_data&lt;/span&gt;&lt;span&gt;(&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; *str2, &lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; num)&lt;/span&gt;<br />
&lt;/span&gt;{<br />
&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; str1[&lt;span&gt;3&lt;/span&gt;] = {&lt;span&gt;0&lt;/span&gt;};<br />
&lt;span&gt;// MQTT发布主题：testtopic/1，保留JSON数据格式&lt;/span&gt;<br />
&lt;span&gt;uart1_sendstring&lt;/span&gt;(&lt;span&gt;"AT+MQTTPUB=0,"testtopic/1","{\""&lt;/span&gt;);<br />
&lt;span&gt;uart1_sendstring&lt;/span&gt;(str2);<br />
&lt;span&gt;uart1_sendstring&lt;/span&gt;(&lt;span&gt;"\":"&lt;/span&gt;);<br />
&lt;span&gt;num_to_str&lt;/span&gt;(num, str1);<br />
&lt;span&gt;uart1_sendstring&lt;/span&gt;(str1);<br />
}&lt;/code&gt;&lt;/pre&gt;<br />
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;3. 中断处理的能力限制&lt;/h3&gt;&lt;p&gt;51单片机中断向量少，响应慢。32则有着丰富的中断源，NVIC优先级管理&lt;/p&gt;<br />
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;void&lt;/span&gt; &lt;span&gt;UART1_IRQ_Handle&lt;/span&gt;&lt;span&gt;(&lt;span&gt;void&lt;/span&gt;)&lt;/span&gt; interrupt 4 &lt;span&gt;using&lt;/span&gt; 1<br />
&lt;/span&gt;{<br />
&lt;span&gt;if&lt;/span&gt; (TI) {<br />
TI = &lt;span&gt;0&lt;/span&gt;;<br />
uart1_busy = &lt;span&gt;0&lt;/span&gt;;  &lt;span&gt;// 只做标志位操作&lt;/span&gt;<br />
}<br />
&lt;span&gt;if&lt;/span&gt; (RI) {<br />
&lt;span&gt;Pro_deliver_data&lt;/span&gt;();  &lt;span&gt;// 立即处理，不缓存&lt;/span&gt;<br />
RI = &lt;span&gt;0&lt;/span&gt;;<br />
}<br />
}&lt;/code&gt;&lt;/pre&gt;<br />
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;系统特点&lt;/h2&gt;&lt;ol&gt;<br />
&lt;li&gt;<br />
&lt;p&gt;&lt;strong&gt;实时监测&lt;/strong&gt;：持续监控环境参数&lt;/p&gt;<br />
&lt;/li&gt;<br />
&lt;li&gt;<br />
&lt;p&gt;&lt;strong&gt;双重报警&lt;/strong&gt;：本地声光报警 + 远程状态推送&lt;/p&gt;<br />
&lt;/li&gt;<br />
&lt;li&gt;<br />
&lt;p&gt;&lt;strong&gt;远程控制&lt;/strong&gt;：支持通过MQTT修改报警阈值&lt;/p&gt;<br />
&lt;/li&gt;<br />
&lt;li&gt;<br />
&lt;p&gt;&lt;strong&gt;稳定可靠&lt;/strong&gt;：采用工业级传感器和成熟的通信协议&lt;/p&gt;<br />
&lt;/li&gt;<br />
&lt;li&gt;<br />
&lt;p&gt;&lt;strong&gt;低成本&lt;/strong&gt;：基于廉价硬件组件&lt;/p&gt;<br />
&lt;/li&gt;<br />
&lt;/ol&gt;&lt;h2&gt;应用场景&lt;/h2&gt;&lt;ul&gt;<br />
&lt;li&gt;<br />
&lt;p&gt;家庭火灾预警&lt;/p&gt;<br />
&lt;/li&gt;<br />
&lt;li&gt;<br />
&lt;p&gt;仓库环境监控&lt;/p&gt;<br />
&lt;/li&gt;<br />
&lt;li&gt;<br />
&lt;p&gt;实验室安全监测&lt;/p&gt;<br />
&lt;/li&gt;<br />
&lt;li&gt;<br />
&lt;p&gt;工业生产环境监控&lt;/p&gt;<br />
&lt;/li&gt;<br />
&lt;/ul&gt;&lt;h2&gt;总结&lt;/h2&gt;&lt;p&gt;本系统成功实现了基于51单片机和ESP8266的智能火灾报警功能，展示了如何将传统单片机与现代物联网技术相结合。系统具有良好的实用性和扩展性，为小型化、低成本的智能安防系统开发提供了参考方案。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;网盘链接:&lt;/strong&gt; &lt;span&gt;&lt;a href="<a href="https://pan.baidu.com/s/1cfd2bHt5SNVlaVzUCct9XQ" rel="nofollow ugc">https://pan.baidu.com/s/1cfd2bHt5SNVlaVzUCct9XQ</a> " target="_blank" rel="noopener noreferrer"&gt;<a href="https://pan.baidu.com/s/1cfd2bHt5SNVlaVzUCct9XQ" rel="nofollow ugc">https://pan.baidu.com/s/1cfd2bHt5SNVlaVzUCct9XQ</a> &lt;/a&gt;&lt;/span&gt;提取码: sdjw&lt;br /&gt;<br />
欢迎在评论区或群留言讨论！&lt;/p&gt;</p>
]]></description><link>http://127.0.0.1:14581/topic/94/51单片机-esp8266连接mqtt的智能火灾报警系统设计与实现</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 19:32:12 GMT</lastBuildDate><atom:link href="http://127.0.0.1:14581/topic/94.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 26 Jul 2026 15:03:18 GMT</pubDate><ttl>60</ttl></channel></rss>