基于C51的DHT11(温湿度传感器)编程(详解)

这篇具有很好参考价值的文章主要介绍了基于C51的DHT11(温湿度传感器)编程(详解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言
当你点进看这篇博客时,相信对DHT11产品的概述与特性没有任何兴趣,所以跳过那部分,直接上技术活。
1、温湿度如何采集
根据产品说明文档:用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集, 用户可选择读取部分数据.在模式下,DHT11接收到开始信号触发一次温湿度采集, 如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。所以从中我们能提取出三个主要点:

  • 主机开始信号结束后,才会有数据发出,并触发一次信号采集。
  • 发出的是一次40bit数据:
    8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和
  • 读取数据。
    2、时序分析

基于C51的DHT11(温湿度传感器)编程(详解)

  • 如何在代码层面表示出开始信号从发出到结束,开始传送数据
    如图所示:在a处dht=1,在b处dht=0,根据时序图所示,主机至少拉低18ms,我们可以在这里考虑用个延时,比如延时个30ms。然后到C处,dht=1。接下来就是DHT发送响应信号在D处,那我们如何判断到了D处。很明显,上图并没有给显示时间多久到D处,但有一个点我们可以注意到,D处是低电平0。所以我们可以考虑卡个临界点while(dht);同理如何表明进入E处,卡个临界点while(!dht);进入F处卡个临界点
    while(dht);数据开始发送。代码如下:
void DHT11_Start()
{
	dht=1;
	dht=0;
	//延时30ms
	Delay30ms();
	dht = 1;
	while(dht);
	while(!dht);
	while(dht);
}
  • 如何从DHT11读取数据
    高电平表示有效数据,而高电平的长短定了数据位是0或1:
    基于C51的DHT11(温湿度传感器)编程(详解)

DHT发送响应信号后,输出40bit数据,由5部分组成,每一部分为8bit。所以可以从主体上想到用两个for循环。并定义一个临时的tmp变量,用于存储每8bit数据,再将它存入一个数组。
编码如下:

void Read_Data_From_DHT()
{
	int i;
	int j;
	char tmp;
	char flag;
	DHT11_start();
	for(i=0;i<5;i++){
		for(j=0;j<8;j++){
			while(!dht);//有效数据都是高电平
			Delay40us();
			if(dht == 1){
				flag=1; //数据位是1
				while(dht);//数据位是1,持续70us,所以卡个临界点
			}else{
				flag = 0;//数据位是0
			}
			tmp = tmp << 1;//左移一位
			tmp |= flag; //将一位数据位0或1存入tmp
		}
		datas[i] = tmp;
	}
}

补充说明左移运算符<< 左移会让最高位溢出(也就是把最高位抛弃),向低位补0.
3、代码实现
功能:读取温湿度数据

#include "reg52.h"
#include "intrins.h"
sbit dht = P1^0;
char datas[5];
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 Delay60us()		//@11.0592MHz
{
	unsigned char i;
	i = 25;
	while (--i);
}
void Delay30ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 54;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}
void DHT11_Start()
{
	dht=1;
	dht=0;
	//延时30ms
	Delay30ms();
	dht = 1;
	while(dht);
	while(!dht);
	while(dht);
}
void Read_Data_From_DHT()
{
	int i;
	int j;
	char tmp;
	char flag;
	DHT11_Start();
	for(i=0;i<5;i++){
		//有效数据都是高电平,持续时间不一样,50us读
		for(j=0;j<8;j++){
			while(!dht);
			Delay40us();
			if(dht ==1){
				flag = 1; //模式0或1
				while(dht);
			}else{
				flag = 0;
			}
			tmp = tmp <<1;
			tmp |= flag;
		}
		datas[i] = tmp;
	}
}
void main()
{
	Delay1000ms();
	Delay1000ms();
	while(1){
		Delay1000ms();
		Read_Data_From_DHT();	
	}
}

最后,上述代码运行后,并不会看到结果来验证代码是否正确,可以加上串口代码在电脑端显示,也可以在单片机上加上蓝牙模块或LCD1602模块显示数据。有关方面的代码请参考前面的博客,自行整理一下即可。有问题欢迎留言讨论!文章来源地址https://www.toymoban.com/news/detail-489847.html

到了这里,关于基于C51的DHT11(温湿度传感器)编程(详解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【mcuclub】温湿度传感器DHT11

    为什么接上拉电阻: 因为DHT11的数据口是漏极开路,如果不接上拉电阻,则只能输出低电平和高阻态,不能输出高电平,因此需要外接上拉电阻,否则无法输出1。DHT11的工作电流约为1mA,VCC一般为5V,则电阻R=5V/1mA=5KΩ。一般3.3k~10k都可以。 DHT11 数字温湿度传感器是一款含有已

    2024年02月06日
    浏览(40)
  • FPGA—DHT11数字温湿度传感器

    目录 1. 理论学习 2.实操 2.1 顶层模块 2.1.1 整体模块框图 2.1.2 顶层代码 2.2 DHT11 控制模块 2.2.1 模块框图 2.2.2 状态转换图绘制 2.2.3 波形图绘制 2.2.4 RTL代码 2.3 上板验证 3. 总结 DHT11简介        DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应

    2024年02月06日
    浏览(31)
  • STM32+DHT11温湿度传感器

    DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次 通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数 部分用于以后扩展,现读出为零.操作流程如下: 一次完整的数据传输为40bit,高位先出。 数据格式:8bit湿度整数数据+8bit湿度小数数据

    2023年04月13日
    浏览(30)
  • STM32—DHT11温湿度传感器

    (1).下图一是DHT11总的时序图。 (2).图二对应图一的左边黑色部分,图三对应图一的绿色部分,图四的左部分图对应图一的红色部分,图四的右部分对应图一的黄色部分。 (3).首先图二部分是单片机向DHT11发送我要开始的信号,此时单片机IO口处于输出模式,输出低电平至少18MS,

    2024年02月19日
    浏览(33)
  • STM32--DHT11温湿度传感器

    本文介绍基于STM32F103实现的DHT11温湿度传感器数据采集及显示,完整代码见文末链接 一、DHT11传感器简介 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期

    2024年02月16日
    浏览(33)
  • CC2530——温湿度传感器DHT11

    DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度±5%RH,温度±2℃,量程湿度5~95%RH,温度-20~+60℃。  1、用户主机(单片机)发送一次开始信号后,DHT11从低功耗模式转换到高速模式。 2、到主机开始信号结束后,DHT11发送响应信号。 3、DHT11并送出40bit(5个字节)

    2024年02月04日
    浏览(27)
  • FPGA project : dht11 温湿度传感器

    没有硬件,过几天上板测试。        其他模块都是之前的,就不发了。    

    2024年02月08日
    浏览(38)
  • FPGA读取DHT11数字温湿度传感器

    最近在做一个DHT11相关的东西,写了一个DHT11控制模块。参考了正点原子和野火电子的文档资料后总觉得又乱又杂,所以自己跟着数据手册写了一遍,当然了也很感谢正点原子和野火文档的帮助。 DHT11是一种数字温湿度传感器,有4个引脚但只有三个有效引脚,分别是VDD,DATA和

    2024年02月05日
    浏览(30)
  • stm32读取DHT11温湿度传感器

    我们知道DHT11是单总线协议,只有一根数据线。 且内部有个上拉电路(下图)。那么数据线默认就是高电平那接下来就可以讲解主机如何和DHT11通讯的 读取DHT11的芯片手册,可以知道,DHT11一次完成的数据输出是40bit,高位先出。 格式:8bit湿度整数数据+8bit湿度小数数据 +8bi温

    2024年02月09日
    浏览(31)
  • DHT11温湿度传感器(配合树莓派使用)

    DHT11是一种数字温湿度传感器,可以测量周围环境的温度和相对湿度。该传感器使用单个数字信号线与微控制器通信,具有较高的可靠性和稳定性。它适用于许多应用领域,如气象观测、室内环境监测、工业控制等。 DHT11传感器使用的基本原理是通过感应元件测量周围环境的

    2024年02月06日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包