DHT11模块
DHT11模块介绍
DHT11模块 数据线是单线双向
一次完整的数据传输为40bit 高位先出
数据格式:8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据
+8bit校验和
数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。
1.使用推挽模式进行总线的输出
使用stm32将总线拉低等待DHT11响应,拉低时间大于18ms
保证检测到起始信号
2.使用stm32将总线拉高 延时20us~40us 这里选择30us
读取DHT11的响应信号
3.切换到输入模式
3.0 检测DHT11产生低电平
即使用读取DHT11的输入引脚,当读取到低电平的时候进入
3.1 DHT11等待主机STM32的开始信号结束完成后发送一个80us的低电平信号
while(macDHT11_Dout_IN() ==RESET);
检测引脚的输入信号,当输入信号不是低电平的时候,即响应信号结束的时候,跳出while
3.2 DHT11发送响应信号后,把总线拉高80us,准备发送数据
while(macDHT11_Dout_IN() == SET);
检测引脚的输入信号,当输入信号不是高电平的时候,即标志信号结束的时候,跳出while循环,准备发送数据
进行发送数据,STM32接收发送过来的数据
typedef struct
{
uint8_t humi_int; //湿度的整数部分
uint8_t humi_deci; //湿度的小数部分
uint8_t temp_int; //温度的整数部分
uint8_t temp_deci; //温度的小数部分
uint8_t check_sum; //校验和
} DHT11_Data_TypeDef;
DHT11的数据是MSB先行 高位先行
static uint8_t DHT11_ReadByte ( void )
{
uint8_t temp;
for(i=0;i<8;i++){
//等待输入的电平不是低电平 表示开始进行传输数据
while(macDHT11_Dout_IN()==Bit_RESET);
/*通过延时40us 进行判断当前是高电平还是低电平
当读取到高电平延时40us后,读取到的还是高电平则表示1,否则表示0并进
入下次循环,再次等待起使电平低电平的时间。*/
Delay(40);
//判断当前是低电平还是高电平
if(macDHT11_Dout_IN()==SET){
while(macDHT11_Dout_IN()==SET);//等待高电平结束
temp | =(uint8_t)(0x01<<(7-i));
}else{
temp &=(uint8_t)(0x00<<(7-i));
}
}
return temp;
}
1.使用上面的函数读取5次将DHT11里面的内容读取出来
2.转换成输出模式,将总线拉高
3.检查读取到的信息是不是正确信息
if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci)
加入校验和等于温度的整数小数和湿度的整数和小数的和则返回success
uint8_t DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef *DHT11_Data)
{
/*输出模式*/
DHT11_Mode_Out_PP();
/*主机拉低*/
macDHT11_Dout_0;
/*延时18ms*/
Delay_ms(18);
/*总线拉高 主机延时30us*/
macDHT11_Dout_1;
Delay_us(30); //延时30us
/*主机设为输入 判断从机响应信号*/
DHT11_Mode_IPU();
/*判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行*/
if(macDHT11_Dout_IN()==Bit_RESET)
{
/*轮询直到从机发出 的80us 低电平 响应信号结束*/
while(macDHT11_Dout_IN()==Bit_RESET);
/*轮询直到从机发出的 80us 高电平 标置信号结束*/
while(macDHT11_Dout_IN()==Bit_SET);
/*开始接收数据*/
DHT11_Data->humi_int= DHT11_ReadByte();
DHT11_Data->humi_deci= DHT11_ReadByte();
DHT11_Data->temp_int= DHT11_ReadByte();
DHT11_Data->temp_deci= DHT11_ReadByte();
DHT11_Data->check_sum= DHT11_ReadByte();
/*读取结束,引脚改为输出模式*/
DHT11_Mode_Out_PP();
/*主机拉高*/
macDHT11_Dout_1;
/*检查读取的数据是否正确*/
if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci)
return SUCCESS;
else
return ERROR;
}
else
return ERROR;
}