11.DHT11UART

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控制下位机灯的亮灭。

编译说明

  1. 使用Keil C51编译器
  2. 确保晶振频率设置为11.0592MHz
  3. 编译生成HEX文件
  4. 下载到51单片机

技术参数

串口配置

  • 波特率:9600
  • 数据位:8
  • 停止位:1
  • 校验位:无

DHT11传感器

  • 工作电压:3.3V-5.5V
  • 测量范围:
    • 温度:0-50℃(±2℃)
    • 湿度:20-90%RH(±5%RH)
  • 响应时间:< 1s
  • 采样周期:2秒

注意事项

  1. DHT11传感器初始化:传感器上电后需要等待至少1秒才能进行第一次读取
  2. 采样周期:DHT11传感器的采样周期不能小于2秒
  3. 串口中断:在读取DHT11数据时,代码会临时关闭串口中断以确保时序准确
  4. 电源稳定性:确保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

相关推荐
RuoZoe2 天前
重塑WPF辉煌?基于DirectX 12的现代.NET UI框架Jalium
c语言
祈安_5 天前
C语言内存函数
c语言·后端
norlan_jame7 天前
C-PHY与D-PHY差异
c语言·开发语言
czy87874757 天前
除了结构体之外,C语言中还有哪些其他方式可以模拟C++的面向对象编程特性
c语言
m0_531237177 天前
C语言-数组练习进阶
c语言·开发语言·算法
Z9fish7 天前
sse哈工大C语言编程练习23
c语言·数据结构·算法
代码无bug抓狂人7 天前
C语言之单词方阵——深搜(很好的深搜例题)
c语言·开发语言·算法·深度优先
CodeJourney_J7 天前
从“Hello World“ 开始 C++
c语言·c++·学习
枫叶丹47 天前
【Qt开发】Qt界面优化(七)-> Qt样式表(QSS) 样式属性
c语言·开发语言·c++·qt
with-the-flow7 天前
从数学底层的底层原理来讲 random 的函数是怎么实现的
c语言·python·算法