/* * 一次完整的数据传输为40bit,高位先出 * 8bit 湿度整数 + 8bit 湿度小数 + 8bit 温度整数 + 8bit 温度小数 + 8bit 校验和 */ uint8_t Read_DHT11(DHT11_Data_TypeDef *DHT11_Data) { /*输出模式*/ DHT11_Mode_Out_PP(); /*主机拉低*/ DHT11_DATA_OUT(LOW); /*延时18ms*/ Delay_ms(18); /*总线拉高 主机延时30us*/ DHT11_DATA_OUT(HIGH); Delay_us(30); //延时30us /*主机设为输入 判断从机响应信号*/ DHT11_Mode_IPU(); /*判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行*/ if(DHT11_DATA_IN()==Bit_RESET) { /*轮询直到从机发出 的80us 低电平 响应信号结束*/ while(DHT11_DATA_IN()==Bit_RESET); /*轮询直到从机发出的 80us 高电平 标置信号结束*/ while(DHT11_DATA_IN()==Bit_SET); /*开始接收数据*/ DHT11_Data->humi_int= Read_Byte(); DHT11_Data->humi_deci= Read_Byte(); DHT11_Data->temp_int= Read_Byte(); DHT11_Data->temp_deci= Read_Byte(); DHT11_Data->check_sum= Read_Byte(); /*读取结束,引脚改为输出模式*/ DHT11_Mode_Out_PP(); /*主机拉高*/ DHT11_DATA_OUT(HIGH); /*检查读取的数据是否正确*/ 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; } }
uint8_t Read_DHT11(DHT11_Data_TypeDef *DHT11_Data) { u16 count; /*输出模式*/ DHT11_Mode_Out_PP(); /*主机拉低*/ DHT11_DATA_OUT(LOW); /*延时18ms*/ //delay_ms(18);//分成几个部分吧,不然数码管刷新的时候会闪烁 start_test=1; if(time18ms_out<2) { //time18ms_out++; return NOTREADY; } /*总线拉高 主机延时30us*/ DHT11_DATA_OUT(HIGH); delay_us(30); //延时30us /*主机设为输入 判断从机响应信号*/ DHT11_Mode_IPU(); /*判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行*/ if(DHT11_DATA_IN()==Bit_RESET) { /*轮询直到从机发出 的80us 低电平 响应信号结束*/ count=10000; while((count--)&&(DHT11_DATA_IN()==Bit_RESET)); /*轮询直到从机发出的 80us 高电平 标置信号结束*/ count=10000; while((count--)&&(DHT11_DATA_IN()==Bit_SET)); /*开始接收数据*/ DHT11_Data->humi_int= Read_Byte(); DHT11_Data->humi_deci= Read_Byte(); DHT11_Data->temp_int= Read_Byte(); DHT11_Data->temp_deci= Read_Byte(); DHT11_Data->check_sum= Read_Byte(); /*读取结束,引脚改为输出模式*/ DHT11_Mode_Out_PP(); /*主机拉高*/ DHT11_DATA_OUT(HIGH); start_test=0;//测试结束 /*检查读取的数据是否正确*/ 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 { start_test=0; return ERROR; } }