http://www.itjxue.com  1970-01-01 08:00  来源:  点击次数: 

stm32代码编写dht11是和按键代码写一块吗

stm32代码编写dht11是和按键代码写一块。根据查询相关资料信息,dht11和按键代码是同一类代码,在stm32代码编写中不会运行错误可以一起编写。

毫无反映的DHT11代码,是不是我理解的太简单了,请大神看看

//这是我当时写的,你自己看看吧。

//????FILE:?dht11.cpp

//?VERSION:?0.4.1

//?PURPOSE:?DHT11?Temperature??Humidity?Sensor?library?for?Arduino

//?LICENSE:?GPL?v3?()

//

//?DATASHEET:?

//

//?HISTORY:

//?George?Hadjikyriacou?-?Original?version?(??)

//?Mod?by?SimKard?-?Version?0.2?(24/11/2010)

//?Mod?by?Rob?Tillaart?-?Version?0.3?(28/03/2011)

//?+?added?comments

//?+?removed?all?non?DHT11?specific?code

//?+?added?references

//?Mod?by?Rob?Tillaart?-?Version?0.4?(17/03/2012)

//?+?added?1.0?support

//?Mod?by?Rob?Tillaart?-?Version?0.4.1?(19/05/2012)

//?+?added?error?codes

//

#include?"dht11.h"

//?Return?values:

//?DHTLIB_OK

//?DHTLIB_ERROR_CHECKSUM

//?DHTLIB_ERROR_TIMEOUT

int?dht11::read(int?pin)

{

//?BUFFER?TO?RECEIVE

uint8_t?bits[5];

uint8_t?cnt?=?7;

uint8_t?idx?=?0;

//?EMPTY?BUFFER

for?(int?i=0;?i?5;?i++)?bits[i]?=?0;

//?REQUEST?SAMPLE

pinMode(pin,?OUTPUT);

digitalWrite(pin,?LOW);

delay(18);

digitalWrite(pin,?HIGH);

delayMicroseconds(40);

pinMode(pin,?INPUT);

//?ACKNOWLEDGE?or?TIMEOUT

unsigned?int?loopCnt?=?10000;

while(digitalRead(pin)?==?LOW)

if?(loopCnt--?==?0)?return?DHTLIB_ERROR_TIMEOUT;

loopCnt?=?10000;

while(digitalRead(pin)?==?HIGH)

if?(loopCnt--?==?0)?return?DHTLIB_ERROR_TIMEOUT;

//?READ?OUTPUT?-?40?BITS?=?5?BYTES?or?TIMEOUT

for?(int?i=0;?i40;?i++)

{

loopCnt?=?10000;

while(digitalRead(pin)?==?LOW)

if?(loopCnt--?==?0)?return?DHTLIB_ERROR_TIMEOUT;

unsigned?long?t?=?micros();

loopCnt?=?10000;

while(digitalRead(pin)?==?HIGH)

if?(loopCnt--?==?0)?return?DHTLIB_ERROR_TIMEOUT;

if?((micros()?-?t)??40)?bits[idx]?|=?(1??cnt);

if?(cnt?==?0)???//?next?byte?

{

cnt?=?7;????//?restart?at?MSB

idx++;??????//?next?byte!

}

else?cnt--;

}

//?WRITE?TO?RIGHT?VARS

????????//?as?bits[1]?and?bits[3]?are?allways?zero?they?are?omitted?in?formulas.

humidity????=?bits[0];?

temperature?=?bits[2];?

uint8_t?sum?=?bits[0]?+?bits[2];??

if?(bits[4]?!=?sum)?return?DHTLIB_ERROR_CHECKSUM;

return?DHTLIB_OK;

}

//

//?END?OF?FILE

//

DHT11详细介绍(内含基于51和STM32平台的驱动代码)

DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,内部由一个 8 位单片机控制一个电阻式感湿元件和一个 NTC 测温元件。DHT11 虽然也是采用单总线协议,但是该协议与 DS18B20 的单总线协议稍微有些不同之处。

相比于 DS18B20 只能测量温度,DHT11 既能检测温度又能检测湿度,不过 DHT11 的精度和测量范围都要低于 DS18B20,其温度测量范围为 0~50℃,误差在±2℃;湿度的测量范围为 20%~90%RH(Relative Humidity 相对湿度—指空气中水汽压与饱和水汽压的百分比),误差在±5%RH。DHT11 电路很简单,只需要将 Dout 引脚连接单片机的一个 I/O 即可,不过该引脚需要上拉一个 ==5K== 的电阻,DHT11 的供电电压为 ==3~5.5V==

DHT11 采用单总线协议与单片机通信,单片机发送一次复位信号后,DHT11 从低功耗模式转换到高速模式,等待主机复位结束后,DHT11 发送响应信号,并拉高总线准备传输数据。==一次完整的数据为 40bit,按照高位在前,低位在后的顺序传输==

数据格式为:==8bit 湿度整数数据+8bit 湿度小数数据+8bit 温度整数数据+8bit 温度小数数据+8bit 校验和==,一共 5 字节(40bit)数据。由于 DHT11 分辨率只能精确到个位,所以小数部分是数据全为 0。校验和为前 4 个字节数据相加,校验的目的是为了保证数据传输的准确性。

==DHT11 只有在接收到开始信号后才触发一次温湿度采集==,如果没有接收到==主机发送复位信号==,DHT11 不主动进行温湿度采集。当数据采集完毕且无开始信号后,DHT11 自动切换到低速模式。

font color=red 注意:由于 DHT11 时序要求非常严格,所以在操作时序的时候,为了防止中断干扰总线时序,先关闭总中断,操作完毕后再打开总中断。

1、 主机发送复位信号

DHT11 的初始化过程同样分为==复位信号和响应信号。==

首先主机拉低总线至少 18ms,然后再拉高总线,延时 20~40us,取中间值 30us,此时复位信号发送完毕。

2、DHT11 发送响应信号

DHT11 检测到复位信号后,触发一次采样,并拉低总线 80us 表示响应信号,告诉主机数据已经准备好了;然后 DHT11 拉高总线 80us,之后开始传输数据。如果检测到响应信号为高电平,则 DHT11 初始化失败,请检查线路是否连接正常。

当复位信号发送完毕后,如果检测到总线被拉低,就每隔 1us 计数一次,直至总线拉高,计算低电平时间;当总线被拉高后重新计数检测 80us 的高电平。如果检测到响应信号之后的80us 高电平,就准备开始接收数据。实际上 DHT11 的响应时间并不是标准的 80us,往往存在误差,当响应时间处于 ==20~100us== 之间时就可以认定响应成功。

3、数据传输

DHT11 在拉高总线 80us 后开始传输数据。每 1bit 数据都以 50us 低电平时隙开始,告诉主机开始传输一位数据了。DHT11 以高电平的长短定义数据位是 0 还是 1,当 50us 低电平时隙过后拉高总线,==高电平持续 26~28us 表示数据“0”==;==持续 70us 表示数据“1”。==

当 最后 1bit 数据传送完毕后,DHT11 拉低总线 50us,表示数据传输完毕,随后总线由上拉电阻拉高进入空闲状态。

4、区分数据0/1的巧法

还是像检测响应时间那样计算高电平持续时间那就太麻烦了!!!

数据“0”的高电平持续 26~28us,数据“1”的高电平持续70us,每一位数据前都有 50us 的起始时隙。如果我们取一个中间值 40us 来区分数据“0”和数据“1”的时隙。

当数据位之前的 50us 低电平时隙过后,总线肯定会拉高,此时延时 40us 后检测总线状态,如果为高,说明此时处于 70us 的时隙,则数据为“1”;如果为低,说明此时处于下一位数据 50us 的开始时隙,那么上一位数据肯定是“0”。

为什么延时 40us?

由于误差的原因,数据“0”时隙并不是准确 26~28us,可能比这短,也可能比这长。

当数据“0”时隙大于 26~28us 时,

如果延时太短,无法判断当前处于数据“0”的时隙还是数据“1”的时隙;

如果延时太长,则会错过下一位数据前的开始时隙,导致检测不到后面的数据

51对应的

dht11.c

dht11.h

STM32对应的

dht11.c

dht11.h

(责任编辑:IT教学网)

更多
上一篇:没有了

推荐CMS技巧文章