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

相关推荐
YJlio7 小时前
1.7 通过 Sysinternals Live 在线运行工具:不下载也能用的“云端工具箱”
c语言·网络·python·数码相机·ios·django·iphone
Lbs_gemini060313 小时前
01-01-01 C++编程知识 C++入门 工具安装
c语言·开发语言·c++·学习·算法
环能jvav大师13 小时前
在Proteus中仿真PLD元器件(WinCupl及WinSim基础使用)
硬件架构·proteus·fpga
shihui200315 小时前
两个8*8点阵流水屏
c语言·51单片机·proteus
ghx_echo15 小时前
c/c++结构体对齐,extern “C”与关键字const
c语言·c++
IvanCodes16 小时前
五、C语言数组
c语言·开发语言
雪域迷影18 小时前
MacOS下源码安装SDL3并运行hello.c示例程序
c语言·开发语言·macos·sdl3
坏柠19 小时前
ESP32 的 NVS,并不是你以为的“Flash 存数据”
c语言
BackCatK Chen20 小时前
14.2【保姆级C语言入门】 标准I/O实战宝典:6大模块手把手教你搞定文件操作,新手直接上手!
c语言·开发语言·fopen·fclose·标准i/o·getc·putc
IvanCodes21 小时前
六、C语言字符串与字符
c语言·开发语言