DHT11是一款温湿度传感器,也是使用一根总线来驱动,使用方法和ds18b20温度传感器很类似。

  • 供电电压 3.3~5.5V DC
  • 测量范围 湿度5% ~ 95%RH, 温度-20℃ ~ +60℃
  • 测量精度 湿度±5%RH, 温度±2℃
  • 分 辨 率 湿度1%RH, 温度0.1℃

实物图如下所示

引脚顺序从左到右,依次为1、2、3、4,引脚功能如下:

1 Vcc 供电引脚 供电范围 3.5V to 5.5V
2 Data 通过单总线输出温度和湿度值
3 NC 没有使用,使用时悬空就行。
4 Ground 接地

典型应用电路如下:

  由于单总线在通信时空闲状态下,电平为高电平,所以外部在2脚上要接一个上拉电阻电阻,这样当总线上没有数据传输时,就会被外部上拉电阻将数据引脚的电平强制设置为高电平。

通过单总线读取数据时,分为三个步骤:

  1. 主机发送请求指令
  2. 从机返回相应指令
  3. 主机开始从从机读取数据

1.请求指令:
 主机发送求请求指令时,需要将总线至少拉低18ms,然后再释放总线40us。
2.响应指令
 当传感器检测到主机的请求指令后,它会给主机发送一个响应指令,告诉主机,通信已经成功了。传感器返回的响应指令为 54us低电平,80us高电平。


3.读取数据
 当传感器发送完响应指令后,会紧跟着发送40bit的数据,8个bit为一位数据,总共五个数据,包含当前的温度和湿度数据。前两个数据是湿度数据的整数部分和小数部分。紧跟着的两个数据是温度数据的整数部分和小数部分。最后一个数据是前面四个数据的校验和。

数据的整体格式为“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和”

在数据传输的时候,通过高低电平的时间长短来代表发送的数据是“0”还是“1”。

         Bit ‘0’ : ~54uS 低电平 和 ~24uS 高电平

         Bit ‘1’ : ~54uS 低电平 和 ~70uS 高电平


结束标志:

当数据传输完成后,传感器会将总线拉低54us,然后释放总线,代表数据传输结束,此时传感器进入睡眠模式,等待下一次的请求信号才会重新唤醒。

完整的一次读取数据时序图如下所示:

首先MCU发送请求命令,然后等待传感器的响应,传感器响应完成后,会紧跟着发送40bit的数据,然后发送结束标志。然后就自动进入睡眠模式,等待MCU的下一次唤醒。
时序搞清楚之后,下面就可以开始编写代码了。

  代码如下:

#include "dht11.h"
#include "stm8s103f3p.h"
#include "delay.h"
//IO口操作
_Bool  DHT11_DQ_OUT @PD_ODR:3;
_Bool  DHT11_DQ_IN  @PD_IDR:3;
//PD3 方向设置
void DHT11_IO_IN(void)
{PD_DDR&=~(1<<3);    //输入 PD3PD_CR1|=(1<<3);     //
}
void DHT11_IO_OUT(void)
{PD_DDR|=(1<<3);     //输出 PD3PD_CR1|=(1<<3);     //
}
//发送起始信号 低电平18ms
void DHT11_Rst(void)
{DHT11_IO_OUT(); //设置为输出    DHT11_DQ_OUT=0; //拉低DQdelay_ms(20);   //拉低至少18msDHT11_DQ_OUT=1; //置高DQdelay_us(30);   //主机拉高20--40us
}
//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
unsigned char DHT11_Check(void)
{//DHT输出80us低电平,作为应答信号//DHT输出80us高电平,通知处理器准备接收数据unsigned char retry=0;DHT11_IO_IN();//SET INPUT   while (!DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us{retry++;delay_us(1);};    if(retry>=100)return 1;else retry=0;while (DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us{retry++;delay_us(1);};if(retry>=100)return 1;       return 0;
}
//从DHT11读取一个位
//返回值:1/0
unsigned char DHT11_Read_Bit(void)
{//数据为“0”格式:50us的低电平 + 26-28us的高电平
//数据为“1”格式:50us的低电平 + 70us的高电平unsigned char retry=0;while(DHT11_DQ_IN && retry<100)//若为高电平说明上一位数据传输还未结束,等待变为低电平{retry++;delay_us(1);}retry=0;while(!DHT11_DQ_IN && retry<100)//若为低电平,说明还未开始传输数据,等待变高电平{retry++;delay_us(1);}delay_us(40);//等待40us     0为 50us低电平 26--28us高电平    1为 50us低电平 70us高电平if(DHT11_DQ_IN) return 1;else  return 0;
}
//从DHT11读取一个字节
//返回值:读到的数据
unsigned char DHT11_Read_Byte(void)
{unsigned char i,dat;dat=0;for(i=0;i<8;i++){dat<<=1;dat|=DHT11_Read_Bit();}return dat;
}
//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
unsigned char DHT11_Read_Data(unsigned char *temp,unsigned char *humi)
{unsigned char buf[5];unsigned char i;DHT11_Rst();if(DHT11_Check()==0)    //读取40位数据{for(i=0;i<5;i++){buf[i]=DHT11_Read_Byte();}if(buf[0]+buf[1]+buf[2]+buf[3]==buf[4])//湿度整数 湿度小数 温度整数 温度小数 校验和{*humi=buf[0];     *temp=buf[2];}}else return 1;return 0;
}
//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在
unsigned char DHT11_Init(void)
{DHT11_IO_OUT();DHT11_DQ_OUT=1;DHT11_Rst();return DHT11_Check();
}

  读取温度时,直接在主函数中调用

#include "stm8s103f3p.h"
#include "delay.h"
#include "dht11.h"//时钟配置 16Mhz
void CLK_Init(void)
{CLK_SWR=0xe1;              //HSI为主时钟源  16MHz CPU时钟频率CLK_CKDIVR=0x00;     //CPU时钟0分频,系统时钟0分频
}
//读取温度湿度数据
void read_tem_hum(void)
{unsigned char temperature[2]={0};unsigned char humidity[2]={0};DHT11_Read_Data(temperature,humidity);
}
main()
{_asm("sim");         //关全部中断CLK_Init();delay_init(16);_asm("rim");         //开全部中断while (1){read_tem_hum();}
}

通过单片机的IO口输出高低电平来模拟单总线的时序,这样就可以将温度和湿度的数据读出来了。

STM8单片机读取DHT11温湿度传感器相关推荐

  1. ESP32 开发笔记(三)源码示例 8_DHT11_RMT 使用RMT实现读取DHT11温湿度传感器

    开发板购买链接 https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111deb2Ij1As&ft=t&id=62636 ...

  2. 51单片机控制DHT11温湿度传感器,并使用OLED屏幕显示

    目录 前言 一.MCU主控选型 二.DHT11温湿度传感器 1.模块介绍 2.软件实现 DHT11.c DHT11.h 三.OLED显示屏 1.模块介绍 2.软件实现 OLED.c OLED.h OL ...

  3. MicroPython ESP32 读取DHT11温湿度传感器数据

    MicroPython ESP32 读取DHT11温湿度传感器数据 DHT11温湿度传感器 接线说明 ESP32 ----- DHT11 3.3V ----- VCC GND ----- GND GP ...

  4. python温湿度传感器源代码_在树莓派上读取DHT11温湿度传感器-python代码实现及常见问题(全面简单易懂)...

    最近由于自己的课题需要,想要用在树莓派上使用DHT11温湿度传感器来读取空气中温湿度,遇到了几个问题,解决之后也对之前的知识进行了回顾,总结,特整理如下,希望能给也在学习树莓派的小伙伴们带来一些帮助. ...

  5. STC15W4K系列单片机读取DHT11温湿度数据发送到串口

    为了方便大家调试,点击进入程序下载地址 已经配置好了UART1和UART3两个串口,直接在main函数中改写     PrintString1("湿度:");     PrintS ...

  6. python温湿度传感器源代码_在树莓派上读取DHT11温湿度传感器python代码实现及常见问题(全面简单易懂)...

    最近由于自己的课题需要,想要用在树莓派上使用DHT11温湿度传感器来读取空气中温湿度,遇到了几个问题,解决之后也对之前的知识进行了回顾,总结,特整理如下,希望能给也在学习树莓派的小伙伴们带来一些帮助. ...

  7. STC89C52RC 单片机读取DHT22温湿度传感器串口显示程序调试经验总结

    DHT22例程获取到的途径很多,某宝商家那里,本站也可以.附件下载例程代码 例程如下: //****************************************************** ...

  8. DHT11温湿度传感器初识

    目录 一.产品概述 1.接线方式 2.特点 3.数据传送逻辑 二.发送时序检测模块是否存在 1.C51单片机(主机)时序分析 2.编写代码检测模块是否存在 3.读取DHT11数据的时序分析 三.温湿度 ...

  9. Arduino+DHT11温湿度传感器+12864oled显示温湿度

            本文利用arduino uno时时读取DHT11温湿度传感器的温度和湿度值,并将读取到的数值显示在OLED12864上. 元器件: arduino板 OLED12864显示屏 DHT1 ...

最新文章

  1. win10 应用程序 快捷启动
  2. c/c++素数距离问题
  3. org.springframework.http.converter.HttpMessageNotReadableException: Required request body is(亲测)
  4. C#.NET中的base关键字在派生类里的应用
  5. 电脑显示连接了网络但是不能上网_为什么电脑插上网线显示已连接却上不了网...
  6. 如何完成一次Apache的版本发布
  7. 字节跳动的敌人只有时间
  8. Oracle创建一个用户并赋予其他用户表的访问权限
  9. 揭秘React同构应用
  10. insert rows into heap/clustered table
  11. Linux安装nginx做端口映射
  12. 汇编语言程序设计---期末复习大纲知识点总结(王爽第二版)
  13. 智能合约语言 Solidity 教程系列5 - 数组介绍
  14. 结算清单html模板,结算清单样本.xls
  15. android 色彩搭配,设计学堂:关于APP配色的一些常用色彩搭配技巧
  16. 「快闪群」批量成交攻略
  17. Attack Lab
  18. VirtualBox 虚拟机里网络很慢的解决方法
  19. 这苦日子B站熬出头了?
  20. 全国计算机程序员等级,计算机等级考试程序员级考试之四大经验

热门文章

  1. C# 读取机器CPU信息,硬盘信息,网卡信息(转载)
  2. PL/SQL程序设计(七)—— 触发器
  3. 报错信息:NoReverseMatch at / 'blog' is not a registered namespace
  4. 查询语句的练习45道题
  5. HttpClient上传下载文件
  6. Cognos访问权限之让拒绝更友善
  7. 定时关机 v1.0(autoshut v1.0)
  8. 【LeetCode】——根据前序和中序遍历构建二叉树
  9. Lock(ReentrantLock)实现线程同步,线程安全
  10. SQL Server多实例环境搭建与连接