对DHT11的使用,就是编写时序和stm32进行通信。
DHT11和stm32是通过一根线进行通信的,双方通过这根线上的电平变化来识别各种信号。DHT11的供电电压为 3-5.5V。传感器上电后,要等待 1s 以越过不稳定状态在此
期间无需发送任何指令。
接口说明
串行接口 (单线双向)
DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一
次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数
部分用于以后扩展,现读出为零.操作流程如下:一次完整的数据传输为40bit,高位先出。
数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bit
温度整数数据+8bit温度小数数据”所得结果的末8位。
校验= byte4+ byte3+ byte2+ byte1=73(=湿度+温度)(校验正确)
时序分析
总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必
须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,
等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,
延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换到输
入模式,或者输出高电平均可, 总线由上拉电阻拉高。
总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线
拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了
数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,则DHT11没有响
应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线50us,
随后总线由上拉电阻拉高进入空闲状态。
一次通信的过程: 主机发送开始信号,DHT11回响应,等待DHT11测量,读取DHT11测量结果、结束一次通信
DATA的空闲状态是高电平 开始信号:主机把DATA拉低并且保持至少18ms后拉高DATA结束开始信号
等待DHT11响应:等待DATA被DHT11拉低 等待响应结束:等待DATA被DHT11拉高
等待DHT11测量结束后发送数据:
等待DATA被DHT11拉低 连续判断40位数据 解析数据,判断数据准确性
如何区分数据位是‘0’还是‘1’
虽然‘0’和‘1’都是高电平,但是表示‘0’的高电平时间在26us到28us之间,而表示‘1’高电平时间为70us。可以延时大于28us时间再读取引脚的状态,如果高电平则为表示‘1’,低电平为表示‘0’。
DHT11程序步骤。
1.开GPIOX时钟和AFIO时钟
GPIOX中的X为引脚的组别
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB,ENABLE);
2.释放PB3(禁止JTAG启用SW)
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
3.PB3配置为开漏输出
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_OD; //配置为开漏
GPIO_InitStruct.GPIO_Pin