52单片机,晶振11.0592MHZ,按时序图写的程序,为什么dht11读取不到程序呢,请帮忙看一下。仿真可以实现,实物读取不到
/*********************************************************/
// 读取DHT11单总线上的一个字节
/*********************************************************/
uchar DhtReadByte(void)
{
bit bit_i;
uchar j;
uchar dat=0;
for(j=0;j<8;j++)
{
while(!DHT11_P); // 等待低电平结束
Delay10us(); // 延时
Delay10us();
Delay10us();
if(DHT11_P==1) // 判断数据线是高电平还是低电平
{
bit_i=1;
while(DHT11_P);
}
else
{
bit_i=0;
}
dat<<=1; // 将该位移位保存到dat变量中
dat|=bit_i;
}
return(dat);
}
/*********************************************************/
// 读取DHT11的一帧数据,湿高、湿低(0)、温高、温低(0)、校验码
/*********************************************************/
void ReadDhtData()
{
uchar HumiHig; // 湿度高检测值
uchar HumiLow; // 湿度低检测值
uchar TemHig; // 温度高检测值
uchar TemLow; // 温度低检测值
uchar check; // 校验字节
DHT11_P=0; // 主机拉低
DelayMs(20); // 保持20毫秒
DHT11_P=1; // DATA总线由上拉电阻拉高
Delay10us(); // 延时等待30us
Delay10us();
Delay10us();
while(!DHT11_P); // 等待DHT的低电平结束
while(DHT11_P); // 等待DHT的高电平结束
//进入数据接收状态
HumiHig = DhtReadByte(); // 湿度高8位
HumiLow = DhtReadByte(); // 湿度低8为,总为0
TemHig = DhtReadByte(); // 温度高8位
TemLow = DhtReadByte(); // 温度低8为,总为0
check = DhtReadByte(); // 8位校验码,其值等于读出的四个字节相加之和的低8位
DHT11_P=1; // 拉高总线
if(check==HumiHig + HumiLow + TemHig + TemLow) // 如果收到的数据无误
{
temp=TemHig; // 将温度的检测结果赋值给全局变量temp
humi=HumiHig; // 将湿度的检测结果赋值给全局变量humi
}
}
关于这个问题,可能是因为DHT11连接不正确或连接质量不好导致的。
可以检查一下电路连接是否正确、焊接质量是否良好。另外,也可以尝试更换一下DHT11传感器,看看是否能够读取到数据。
同时,建议在实物调试时,可以使用示波器等工具来观察数据线上的信号变化情况,以帮助确定问题出在哪里。
检查连接:确保DHT11与单片机的连接正确,数据线、电源线和地线都接好。
电源问题:检查电源是否稳定,是否达到DHT11的工作电压要求(通常为3.3V或5V)。
编程问题:检查程序是否正确,包括引入正确的库文件、配置IO口、发送读取命令等。
延时问题:DHT11读取数据需要一定的延时时间,如果延时时间不足,可能会导致读取失败。可以尝试增加延时时间,或者使用延时函数来确保足够的延时时间。
环境问题:DHT11对环境温度和湿度比较敏感,如果环境温度或湿度过低或过高,也容易导致读取失败。可以更换环境或调整环境条件重新测试。
DHT11本身问题:如果以上几个方面都排除了,那么可能是DHT11本身出现了问题,可以尝试更换一个新的DHT11进行测试。