51单片机——DHT11温湿度模块

这篇具有很好参考价值的文章主要介绍了51单片机——DHT11温湿度模块。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.DHT11介绍

型号 测量范围 测湿精度 测温精度
DHT11 20-90%RH  0-50摄氏度°C 士5%RH   士2℃

51单片机 dht11,51单片机,嵌入式硬件,单片机

二.DHT11接口说明

1.建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻。

2.VCC接单片机的5v,GND接GND,DAT接单片机的IO口。

三.电源引脚

DHT11的供电电压为3-5.5V。传感器上电后,要等待1s以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF的电容,用以去耦滤波。

四.DHT11时序图

51单片机 dht11,51单片机,嵌入式硬件,单片机

51单片机 dht11,51单片机,嵌入式硬件,单片机

DHT11初始化从图2开始,一开始先给高电平,然后在给低电平(至少18ms),之后高电平持续20-40us,不确定是多少us,可以用while卡着,定义DAT为dht,dht此时是1,则卡着while(dht),直到跳过while循环以后,DHT11开始响应,此时dht为0,我们也可以卡着,while(!dht),之后过了while循环以后,变成了高电平1,dht=1,此时接着卡,while(dht),当卡过以后开始传输数据(红线部分),如果传的是1则是图4,如果是0则图5,此时只要等待红线部分过去就有数据,此时接着卡,while(!dht),之后给40us延迟,如果40us延迟以后还是高电平则是数据1,数据1一共要维持70us高电平,此时才维持40us,我们要卡着高电平等待过去到下一bit开始,所以while(dht),如果是低电平则数据0,此时不需要卡着,已经来到了下一bit开始的位置。

五.传输数据

一次完整的数据传输为40bit,高位先出。
数据格式:8bit湿度整数数据+8 bit湿度小数数据+8bi温度整数数据+8 bit温度小数数据+8bit校验和
数据传送正确时校验和数据=“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。

六.DHT11测温湿度发送到串口助手的代码

补充知识:下面代码的value=value<<1,value |= flag;在是因为DHT11传的数据高位先出,,要循环8次,所以最后一开始的第一位就到了二级制的最高位。

#include <REGX52.H>
#include <intrins.h>

sbit led4 = P2^3;	//led小灯用来判断模块是否测量
sbit dht = P1^0;	//温湿度传感器信号线
sbit AUXR=0x8E;

char datas[5]; 		//数组分别代表,湿度,湿度小数,温度,温度小数,校验

void Delay20ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 36;
	j = 217;
	do
	{
		while (--j);
	} while (--i);
}

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void Delay40us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	i = 15;
	while (--i);
}

void Uart_Init()
{
	AUXR = 0x01;
	SCON = 0x40;
	PCON &= 0x7F;
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}

void Uart_Sendchar(char Char)
{
	SBUF=Char;
	while(TI==0);
	TI=0;
}

void Uart_Sendstring(char*string)
{
	while(*string!='\0')
	{
		Uart_Sendchar(*string);
		string++;
	}
}

//初始化模块(检测模块是否存在)每次传输数据都要初始化
void DHT_Start()
{
	//根据时序进行高低电平变化
	led4 = 1;
    dht = 1;		//对应初始化时序start
    dht = 0;
    Delay20ms();
	dht=1;
    while(dht);
	while(!dht);
	while(dht);
    led4 = 0;
}

void DHT11_Read()
{
	char value = 0;
	char flag;
	char i = 0;
	char j = 0;
	DHT_Start();
	for(j = 0;j<5;j++)//分别读取五组数据
	{			
		for(i=0;i<8;i++)//每组八位分别处理
		{		
			while(!dht);		//高电平开始计时
			Delay40us();
			
			if(dht == 1)  //如果还为高则是“1”
			{		
				flag = 1;
				while(dht);
			}
			
			 else       //否则“0”
			{				
				flag = 0;
			}
			value = value << 1;		//移位
			value |= flag; 			//赋值
		}
		datas[j] = value;			//赋值
	}
}

void main()
{	
	Delay1000ms();Delay1000ms();
	Uart_Init();
	while(1)
	{
		Delay1000ms();
		DHT11_Read();
		
		Uart_Sendstring("H:");//湿度整数
		Uart_Sendchar(datas[0]/10+0x30);//十位
		Uart_Sendchar(datas[0]%10+0x30);//个位
		Uart_Sendchar('.');//湿度小数
		Uart_Sendchar(datas[1]/10+0x30);
	    Uart_Sendchar(datas[1]%10+0x30);
		Uart_Sendstring("\r\n");
		Uart_Sendstring("T:");//温度整数
		Uart_Sendchar(datas[2]/10+0x30);
		Uart_Sendchar(datas[2]%10+0x30);
		Uart_Sendchar('.');//温度小数
		Uart_Sendchar(datas[3]/10+0x30);
		Uart_Sendchar(datas[3]%10+0x30);
		Uart_Sendstring("\r\n");
	}
}

七.DHT11测温湿度发送到LCD1602上的代码

#include <REGX52.H>
#include <intrins.h>
#define LCE_Dataport P0

sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
sbit led4 = P2^3;	//led小灯用来方便判断DHT11有没有在测量
sbit dht = P1^0;	//温湿度传感器信号线
sbit AUXR=0x8E;

char datas[5]; 		//数组分别代表,湿度,湿度小数,温度,温度小数,校验

void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
}

void Delay20ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 36;
	j = 217;
	do
	{
		while (--j);
	} while (--i);
}

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void Delay40us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	i = 15;
	while (--i);
}

void LCD_WriteCommand(unsigned char Command)//写指令
{
	LCD_RS=0;
	LCD_RW=0;
	LCE_Dataport=Command;
	LCD_EN=1;
	Delay1ms();
	LCD_EN=0;
	Delay1ms();
}

void LCD_WriteData(unsigned char Data)//写数据
{
	LCD_RS=1;
	LCD_RW=0;
	LCE_Dataport=Data;
	LCD_EN=1;
	Delay1ms();
	LCD_EN=0;
	Delay1ms();
}

void LCD_Init()//初始化
{
	LCD_WriteCommand(0x38);
	LCD_WriteCommand(0x0C);
	LCD_WriteCommand(0x06);
	LCD_WriteCommand(0x01);
}

void LCD_Setcursor(unsigned char line,unsigned char column)
{
	if(line==1)//设置光标位置
	{
		//第一列是数字1,但是位置是0x00,要把数字1转换0x00,就把数字1-1就0,所以转十六进制就是0x00
		LCD_WriteCommand(0x80|(column-1));
	}
	else
	{
		//第二行的第一列是从0x40开始,第二列是0x41,相当于0x40+0x01,0x01就是与上面一致
		LCD_WriteCommand(0x80|(column-1)+0x40);
	}
}

void LCD_Showchar(unsigned char line,unsigned char column,unsigned char Char)//line行,column列,Char字符
{//显示一个字符
	LCD_Setcursor(line,column);	
	LCD_WriteData(Char);
}

void LCD_Showstring(unsigned char line,unsigned char column,unsigned char *string)//line行,column列,string字符串
{//显示字符串,字符串直接等于指针,不用数组形式等于字符串,在等于指针形式,那传给指针的就是字符串的第一个字符的地址,然后string【i】一直往下就可以知道字符串,数组是连续的,如果baby的b在第一行第一列,那a就会在第一行,第二列。
	unsigned char i;
	LCD_Setcursor(line,column);		
	for(i=0;string[i]!='\0';i++)
	{
		LCD_WriteData(string[i]);//字符串本身就是地址,所以传进来的字符串用指针string来接
	}
}

//初始化模块(检测模块是否存在)每次传输数据都要初始化
void DHT_Start()
{
	//根据时序进行高低电平变化
	  led4 = 1;	
    dht = 1;		//对应初始化时序start
    dht = 0;
    Delay20ms();
	  dht=1;
		while(dht);
		while(!dht);
		while(dht);
		led4=0;
}

void DHT11_Read()
{
	char value = 0;
	char flag;
	char i = 0;
	char j = 0;
	DHT_Start();
	for(j = 0;j<5;j++)//分别读取五组数据
	{			
		for(i=0;i<8;i++)//每组八位分别处理
		{		
			while(!dht);		//高电平开始计时
			Delay40us();
			if(dht == 1)  //如果还为高则是“1”
			{		
				flag = 1;
				while(dht);
			}
			 else       //否则“0”
			{				
				flag = 0;
			}
			value = value << 1;		//移位
			value |= flag; 			//赋值
		}
		datas[j] = value;			//赋值
	}
}

void main()
{	
	Delay1000ms();Delay1000ms();
	LCD_Init();
	while(1)
	{
		Delay1000ms();
		DHT11_Read();
		
		LCD_Showstring(1,1,"H:");//湿度整数
		LCD_Showchar(1,3,datas[0]/10+0x30);//十位
		LCD_Showchar(1,4,datas[0]%10+0x30);//个位
		LCD_Showchar(1,5,'.');//湿度小数
		LCD_Showchar(1,6,datas[1]/10+0x30);
		LCD_Showchar(1,7,datas[1]%10+0x30);
		LCD_Showstring(2,1,"T:");//温度整数
		LCD_Showchar(2,3,datas[2]/10+0x30);
		LCD_Showchar(2,4,datas[2]%10+0x30);
		LCD_Showchar(2,5,'.');//温度小数
		LCD_Showchar(2,6,datas[3]/10+0x30);
		LCD_Showchar(2,7,datas[3]%10+0x30);
	}
}

八.现象

51单片机 dht11,51单片机,嵌入式硬件,单片机

DHT11模块不要碰底下,不然会卡住不测量了,led4用来判断有没有一直在测量,闪一次就代表正测量一次 文章来源地址https://www.toymoban.com/news/detail-633813.html

到了这里,关于51单片机——DHT11温湿度模块的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机DHT11温湿度控制系统仿真设计( proteus仿真+程序+原理图+报告+讲解视频)

    51单片机DHT11温湿度控制系统仿真设计( proteus仿真+程序+原理图+报告+讲解视频) 仿真图 proteus8.9及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0044 运用所学知识,制作一个基于51单片机的温湿度控制器proteus仿真设计 1、按键调温湿度上下限数值的,温湿度不在上

    2024年02月09日
    浏览(38)
  • (STM32F103单片机)DHT11温湿度传感器

    目录   一,产品介绍 二,产品亮点 三,产品参数 四,引脚连接及通信说明  五,原理讲解 六,源码 1,DHR11.C 2.DHR11.H 3,main.c DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高

    2023年04月08日
    浏览(36)
  • STC89C52单片机利用DHT11温湿度模块以及HC-08蓝牙模块实现测量温湿度

    下面将介绍如何利用STC89C52单片机和DHT11温湿度模块以及HC-08蓝牙模块实现测量温湿度。以及各模块的使用方法。 利用DHT11温湿度模块测量温湿度,利用HC-08蓝牙模块将数据传到手机上。 1.1DHT11温湿度模块外观 1.2DHT11温湿度模块使用方法简介 1.2.1DHT11温湿度模块工作的过程 用户

    2024年02月02日
    浏览(31)
  • ESP32单片机使用DHT11温湿度传感器的实践与代码解析

    摘要:本文将介绍如何使用ESP32单片机与温湿度传感器进行连接和数据读取。通过实例代码的解析,帮助读者了解实现温湿度检测的原理和方法。 一、引言 ESP32是一款功能强大的微控制器,广泛应用于物联网、智能家居等领域。在许多应用场景中,温湿度传感器是不可或缺的

    2024年02月21日
    浏览(26)
  • 68、基于STM32单片机DHT11温湿度蓝牙控制报警器app系统设计

    毕设帮助、开题指导、技术解答(有偿)见文末。 目录 摘要 一、硬件方案 二、设计功能 三、实物图 四、原理图 五、PCB图 六、程序源码 七、资料包括 温度、湿度和人类的生产、生活有着密切的关系,同时也是工业生产中最常见最基本的工艺参数,例如机械、电子、石油、

    2024年02月08日
    浏览(41)
  • 86、基于STM32单片机的温湿度DHT11 MQ-2烟雾火灾报警器蓝牙物联网设计

    毕设帮助、开题指导、技术解答(有偿)见文末。 目录 摘要 一、硬件方案                     二、设计功能 三、实物图 四、原理图 五、硬件框图 六、流程图 七、程序源码   八、资料包括 随着社会和经济的发展,防火工作越来越重要,但是目前国内的许多研发都侧重

    2024年02月06日
    浏览(30)
  • 51单片机项目(7)——基于51单片机的温湿度测量仿真

    本次做的设计,是利用DHT11传感器,测量环境的温度以及湿度,同时具备温度报警的功能:利用两个按键,设置温度阈值的加和减,当所测温度大于温度阈值的时候,蜂鸣器就会响起,进行报警提示。 同时系统还有一个LCD1602屏幕,用于显示实时的温度湿度,还可以显示温度阈

    2024年02月10日
    浏览(27)
  • 基于STM32F103C8T6单片机的DHT11温湿度传感器与OLED显示屏实时动态数据监测系统设计

    标题: 摘要: 本文提出了一种利用STM32F103C8T6微控制器,结合DHT11数字温湿度传感器和OLED显示屏实现环境温湿度实时、直观显示的方法。该系统通过低功耗且精确的DHT11传感器获取环境温湿度信息,并借助于STM32F103C8T6强大的处理能力和I/O资源进行数据读取、解析以及控制OLE

    2024年01月19日
    浏览(45)
  • 79、基于STM32单片机DHT11温湿度无线蓝牙手机APP监控报警系统(程序+原理图+PCB图+设计资料+参考论文+开题报告+元器件清单等)

    摘 要 温湿度控制已成为当今社会研究的热门项目。是工农业生产过程中必须考虑的因素。作为最常见的被控参数。温度和湿度已经不再是相互独立的物理量,而应在系统中综合考虑。广泛应用于实验室、大棚、花圃、粮仓乃至土壤等各个领域。而传统的温湿度控制则利用湿

    2024年02月11日
    浏览(41)
  • 基于51单片机温湿度传感器

    DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,应用领域:暖通 空调;汽车;消费品;气象站;湿度调节器;除湿器;家电;医疗;自动控制 相对湿度和温度测量 全部校准,数字输出 长期稳定性 超长的信号传输距离:20米 超低能耗:休眠 4 引脚

    2023年04月10日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包