72M
us延时是经过示波器掐出来的。每次读取都对,校验和也对。湿度好像差不多,可温度总是比室温大20多度,大家帮我看看问题是出在哪里? 本以为是DHT11的问题,特意去买了AM2302(DHT22), 可结果还是一样。
0x02 0x90 0x02 0x24 0xB8 //40Bit 数据
DHT11 OK!
********** Humidity & Temperature ***********
DHT11 Humidity = 65.6%RH
DHT11 Temperature = 54.8C
DHT11 CheckSum = 184
*********************************************
0x02 0x8E 0x02 0x24 0xB6
DHT11 OK!
********** Humidity & Temperature ***********
DHT11 Humidity = 65.4%RH
DHT11 Temperature = 54.8C
DHT11 CheckSum = 182
*********************************************
以上是串口送出的报告
程序如下:
uint8_t DHT_ReadByte(void)
{
uint8_t data = 0;
uint8_t i,count=0;
uint8_t timeout=0;
for(i=0;i<8;i++)
{
timeout=0;
while(!DHT_ReadPin() && timeout < 100) // 输出位头,低电平
{
delay_us(1);
timeout++;
}
timeout=0;
while(DHT_ReadPin() && timeout < 100)
{
delay_us(1);
timeout++;
count++;
}
if(count > 30) // 大于30uS的为 1
{
data |= 1;
}
data <<= 1;
count = 0;
}
//printf("DHT11 Reader Value = 0x%02X
",data);
return data;
}
/************************************************************************************/
uint8_t DHT_ReadData(TempHuTypeDef *temphu)
{
uint8_t SuccessFlag=0;
uint8_t timeout=0;
__disable_irq(); //关全局中断
DHT_IO_Dir(OUT); //设端口输出
DHT_PinLow(); //拉低启动DHT11
delay_ms(20); //保持18mS以上
DHT_IO_Dir(IN); //设端口输入,靠外部上拉电阻拉高电平
delay_us(30); //延时
if(!DHT_ReadPin()) //等待DHT11应答响应
{
while(!DHT_ReadPin() && timeout < 100) //等待DHT11应答结束,DHT11输出高等变高。
{
delay_us(1);
timeout++;
}
timeout=0;
while(DHT_ReadPin() && timeout < 100) // DHT11拉高之后,变低后开始输出
{
delay_us(1);
timeout++;
}
temphu->humidity_H = DHT_ReadByte();
temphu->humidity_L = DHT_ReadByte();
temphu->temperature_H = DHT_ReadByte();
temphu->temperature_L = DHT_ReadByte();
temphu->checksum = DHT_ReadByte();
if(temphu->humidity_H + temphu->humidity_L + temphu->temperature_H + temphu->temperature_L == temphu->checksum)
SuccessFlag = 1;
printf("0x%02X 0x%02X 0x%02X 0x%02X 0x%02X
",temphu->humidity_H,temphu->humidity_L,temphu->temperature_H,temphu->temperature_L,temphu->checksum);
}
__enable_irq();
return SuccessFlag;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
(1)先保证单个字节的读写是正确的;
(2)高低字节换成成结果也是正确的。
问题找到了,我犯了低级错误,ReadByte 8次循环 先赋值一位,再移位肯定不对,应该改为先移位再赋值。
另外,DTH11 是高8位表示整数,低8位表示小数,而DHT22(AM2302) 是16位表示。温度,湿度值除以10 得到。
修改后的程序:(红 {MOD}字修正前面错误)
uint8_t DHT_ReadByte(void)
{
uint8_t data = 0;
uint8_t i,count=0;
uint8_t timeout=0;
for(i=0;i<8;i++)
{
timeout=0;
while(!DHT_ReadPin() && timeout < 100) // 输出位头,低电平
{
delay_us(1);
timeout++;
}
timeout=0;
while(DHT_ReadPin() && timeout < 100)
{
delay_us(1);
timeout++;
count++;
}
data <<= 1; // 先移位
if(count > 30) // 大于30uS的为 1
{
data |= 1;
}
count = 0;
}
//printf("DHT11 Reader Value = 0x%02X ",data);
return data;
}
/************************************************************************************/
uint8_t DHT_ReadData(TempHuTypeDef *temphu)
{
uint8_t SuccessFlag=0;
uint8_t timeout=0;
__disable_irq(); //关全局中断
DHT_IO_Dir(OUT); //设端口输出
DHT_PinLow(); //拉低启动DHT11
delay_ms(20); //保持18mS以上
DHT_IO_Dir(IN); //设端口输入,靠外部上拉电阻拉高电平
delay_us(30); //延时
if(!DHT_ReadPin()) //等待DHT11应答响应
{
while(!DHT_ReadPin() && timeout < 100) //等待DHT11应答结束,DHT11输出高等变高。
{
delay_us(1);
timeout++;
}
timeout=0;
while(DHT_ReadPin() && timeout < 100) // DHT11拉高之后,变低后开始输出
{
delay_us(1);
timeout++;
}
temphu->humidity_H = DHT_ReadByte();
temphu->humidity_L = DHT_ReadByte();
temphu->temperature_H = DHT_ReadByte();
temphu->temperature_L = DHT_ReadByte();
temphu->checksum = DHT_ReadByte();
if(temphu->humidity_H + temphu->humidity_L + temphu->temperature_H + temphu->temperature_L == temphu->checksum)
SuccessFlag = 1;
printf("0x%02X 0x%02X 0x%02X 0x%02X 0x%02X ",temphu->humidity_H,temphu->humidity_L,temphu->temperature_H,temphu->temperature_L,temphu->checksum);
}
__enable_irq();
return SuccessFlag;
}
赞一个
一周热门 更多>