目录
DHT11 温湿度传感器
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,应用领域:暖通 空调;汽车;消费品;气象站;湿度调节器;除湿器;家电;医疗;自动控制
特点
相对湿度和温度测量
全部校准,数字输出
长期稳定性
超长的信号传输距离:20米
超低能耗:休眠 4
引脚安装:可以买封装好的
完全互换 : 直接出结果,不用转化
数据传送逻辑
只有一根数据线DATA,发送序列指令给DHT11模块,模块一次完整的数据传输为40bit,高位先出 数据格式
8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和
检测模块是否存在:
根据如下时序图,做通信初始化,并检测模块是否存在,功能是否正常
- 拉高总线(a点):主机(如单片机)首先将DATA总线拉高,表示开始信号的开始。
- 拉低总线至少18ms(b点):随后,主机将DATA总线拉低至少18毫秒,以确保DHT11能够检测到起始信号。这个时间长度是DHT11正常响应的关键。
- 拉高总线(c点):在拉低总线后,主机再将DATA总线拉高,等待DHT11的响应。
- 检测响应信号(d点):在c点拉高总线后,主机等待一小段时间(例如60微秒),然后检测DATA总线的电平。如果此时DATA总线为低电平(被DHT11拉低),则表示DHT11存在且响应了主机的开始信号。
a : dht = 1
b :dht = 0
延时30ms
c:dht = 1
在60us后读d点,如果d点是低电平(被模块拉低),说明模块存在!
使用LED检测DHT11模块是否接在设备上:
sbit ledOne = P3^7
sbit dht = P3^3
读取温湿度数据:
a : dht = 1
b :dht = 0
延时30ms
c: dht = 1
卡d点;while(dht1); 卡e点 while(!dht) 卡f点:while(dht) 卡g点:while(!dht) 有效数据都是高电 平,持续时间不一样,50us读,低电平0 高电平
每一位数据的传输都由一个持续50us的低电平信号开始,随后是一个持续26-28us的高电平信号,高电平信号的持续时间不同表示不同的数据(长代表1,短代表0)。
定义了一个字符数组datas
,用于存储从DHT11读取的40位数据(包括湿度整数、湿度小数、温度整数、温度小数和校验和)。
DHT11_Start()
这个函数用于向DHT11发送开始信号。
- 将
dht
设置为高电平。 - 将
dht
设置为低电平。 - 延时30毫秒。
- 将
dht
设置为高电平。 - 等待DHT11的响应。
Read_Data_From_DHT()
这个函数从DHT11读取数据。
- 调用
DHT11_Start()
开始通信。 - 循环5次,每次读取8位数据(总共40位)。
- 等待DHT11的低电平(卡g点)。
- 延时60微秒(用于检测接下来的高电平时间)。
- 根据高电平的持续时间设置
flag
。 - 将
flag
左移并存储到tmp
中。 - 将
tmp
的值存储到datas
数组中。
将 tmp 的值向左移动一位。通过这个操作,tmp 的原来的最低位被丢弃,而最高位补零。
tmp |= flag; 这一行将 flag的值添加到 tmp 的最低位。如果 flag是 1,则最低位设置为 1;如果 flag是 0,则最低位保持不变。
这两行代码的目的是按位添加到 tmp 的低端,并将 tmp 向左移动一位。这个过程可以将 flag 的每一位添加到 tmp 的低端,从而构建一个完整的字节。