DHT11 UART LED 项目
项目简介
这是一个基于51单片机的温湿度监测项目,使用DHT11传感器读取环境温度和湿度数据,通过UART串口发送到上位机,同时支持LED控制功能。
功能特性
- 读取DHT11温湿度传感器数据
- 通过UART串口发送JSON格式的温湿度数据
- 支持通过串口命令控制LED开关
- 波特率:9600
- 数据格式:
{"temp":XX,"humi":XX}
硬件连接
51单片机连接
- 晶振频率:11.0592MHz
- 串口波特率:9600
DHT11传感器连接
- VCC:接5V电源
- GND:接地
- DATA:接P2.0引脚
LED连接
- LED:接P1.0引脚
串口连接
- TXD:接P3.1引脚
- RXD:接P3.0引脚
软件说明
文件结构
main.c- 主程序文件uart.c- 串口通信驱动uart.h- 串口通信头文件dht11.c- DHT11传感器驱动dht11.h- DHT11传感器头文件
主要函数
串口通信函数
UART_Init()- 初始化串口UART_SendByte(unsigned char dat)- 发送一个字节UART_SendString(unsigned char *str)- 发送字符串
DHT11传感器函数
DHT11_Init()- 初始化DHT11传感器DHT11_receive(uchar *temp_value,uchar *humi_value)- 读取温湿度数据
数据发送函数
Send_Temperature_Humidity(unsigned char temp, unsigned char humi)- 发送温湿度数据(JSON格式)
命令处理函数
Process_Command()- 处理接收到的串口命令
使用方法
串口命令格式
- LED控制 :发送
LED0关闭LED,发送LED1打开LED
数据输出格式
每2秒发送一次温湿度数据:
{"temp":25,"humi":60}

AI生成上位机界面
请创建一个上位机HTML串口通信控制界面:1.实时显示接收的温湿度数据,温湿度配适当的icon;2.一个Toggle按钮,点击发送LED0或LED1控制下位机灯的亮灭。

编译说明
- 使用Keil C51编译器
- 确保晶振频率设置为11.0592MHz
- 编译生成HEX文件
- 下载到51单片机
技术参数
串口配置
- 波特率:9600
- 数据位:8
- 停止位:1
- 校验位:无
DHT11传感器
- 工作电压:3.3V-5.5V
- 测量范围:
- 温度:0-50℃(±2℃)
- 湿度:20-90%RH(±5%RH)
- 响应时间:< 1s
- 采样周期:2秒
注意事项
- DHT11传感器初始化:传感器上电后需要等待至少1秒才能进行第一次读取
- 采样周期:DHT11传感器的采样周期不能小于2秒
- 串口中断:在读取DHT11数据时,代码会临时关闭串口中断以确保时序准确
- 电源稳定性:确保DHT11传感器的电源稳定,避免电压波动影响测量精度
代码
main.c
#include <reg52.h>
#include "dht11.h"
#include "uart.h"
sbit LED =P1^0;
unsigned char receive_buffer[10];
unsigned char receive_index = 0;
void Send_Temperature_Humidity(unsigned char temp, unsigned char humi)
{
// 逐个发送字符
UART_SendByte('{');
UART_SendByte('"');
UART_SendByte('t');
UART_SendByte('e');
UART_SendByte('m');
UART_SendByte('p');
UART_SendByte('"');
UART_SendByte(':');
UART_SendByte(temp / 10 + '0');
UART_SendByte(temp % 10 + '0');
UART_SendByte(',');
UART_SendByte('"');
UART_SendByte('h');
UART_SendByte('u');
UART_SendByte('m');
UART_SendByte('i');
UART_SendByte('"');
UART_SendByte(':');
UART_SendByte(humi / 10 + '0');
UART_SendByte(humi % 10 + '0');
UART_SendByte('}');
UART_SendByte('\r');
UART_SendByte('\n');
}
void Process_Command()
{
if(receive_index >= 4)
{
if(receive_buffer[0] == 'L' && receive_buffer[1] == 'E' && receive_buffer[2] == 'D')
{
if(receive_buffer[3] == '0')
{
LED = 0;
}
else if(receive_buffer[3] == '1')
{
LED = 1;
}
}
receive_index = 0;
}
}
void UART_ISR() interrupt 4
{
if(RI)
{
receive_buffer[receive_index] = SBUF;
receive_index++;
if(receive_index >= 10)
{
receive_index = 0;
}
RI = 0;
}
}
void main()
{
unsigned char temperature, humidity;
UART_Init();
LED = 1;
// 发送初始化消息
UART_SendString("DHT11 UART LED Test\n");
while(1)
{
DHT11_receive(&temperature,&humidity);
Send_Temperature_Humidity(temperature, humidity);
Process_Command();
delay(1000);
}
}
dht11
-#ifndef DHT11_H
#define DHT11_H
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit io = P2^0;
void delay(int xms);
void DHT11_delay_us(uchar n);
void DHT11_delay_ms(uint z);
void DHT11_start();
void DHT11_receive(uchar *temp_value,uchar *humi_value);
#endif
#include "dht11.h"
void delay(uint xms)
{
uint i,j;
for(i=0;i<xms;i++)
for(j=0;j<110;j++);}
void DHT11_delay_us(uchar n)
{
while(--n);
}
void DHT11_delay_ms(uint z)
{
unsigned int i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void DHT11_start()
{
io=1;
DHT11_delay_us(2);
io=0;
DHT11_delay_ms(30); //延时18ms以上
io=1;
DHT11_delay_us(30);
}
uchar DHT11_rec_byte() //接收一个字节
{
unsigned char i,dat=0;
for(i=0;i<8;i++) //从高到低依次接收8位数据
{
while(!io); ////等待50us低电平过去
DHT11_delay_us(8); //延时60us,如果还为高则数据为1,否则为0
dat<<=1; //移位使正确接收8位数据,数据为0时直接移位
if(io==1) //数据为1时,使dat加1来接收数据1
dat+=1;
while(io); //等待数据线拉低
}
return dat;
}
void DHT11_receive(uchar *temp_value,uchar *humi_value) //接收40位的数据
{
unsigned char R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
DHT11_start();
if(io0)
{
while(io0); //等待拉高
DHT11_delay_us(40); //拉高后延时80us
R_H=DHT11_rec_byte(); //接收湿度高八位
R_L=DHT11_rec_byte(); //接收湿度低八位
T_H=DHT11_rec_byte(); //接收温度高八位
T_L=DHT11_rec_byte(); //接收温度低八位
revise=DHT11_rec_byte(); //接收校正位
DHT11_delay_us(25); //结束
if((R_H+R_L+T_H+T_L)==revise) //校正
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
*humi_value = RH;
*temp_value = TH;
}
}
uart
-#ifndef UART_H
#define UART_H
#include <reg52.h>
void UART_Init();
void UART_SendByte(unsigned char dat);
void UART_SendString(unsigned char *str);
unsigned char UART_ReceiveByte();
#endif
#include "uart.h"
void UART_Init()
{
TMOD = 0x20; // 定时器1工作在模式2
// 波特率9600,晶振11.0592MHz
TH1 = 0xFD;
TL1 = 0xFD;
// 如果使用12MHz晶振,波特率9600,使用以下设置
// TH1 = 0xFD;
// TL1 = 0xFD;
TR1 = 1; // 启动定时器1
SCON = 0x50; // 串口工作在模式1,允许接收
EA = 1; // 开启总中断
ES = 1; // 开启串口中断
}
void UART_SendByte(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
void UART_SendString(unsigned char *str)
{
while(*str)
{
UART_SendByte(*str++);
}
}
unsigned char UART_ReceiveByte()
{
unsigned char dat;
while(!RI);
dat = SBUF;
RI = 0;
return dat;
}
版本历史
v1.0
- 初始版本
- 实现DHT11温湿度读取
- 实现串口通信
- 实现LED控制功能
许可证
本项目仅供学习和参考使用。
作者
51单片机开发项目
更新日期
2026-02-09