|
uchar dht11ReadDat()
{
uchar i, tmp = 0, WAIT_FLAG = 0, checkOut = 0;
P0DIR |= 0x01; // 设置为输出模式
DHT11_SDA = 0;
halMcuWaitMs(19); // 总线拉低时间大于18ms为起始信号
DHT11_SDA = 1;
P0DIR &= ~0x01; // 设置为输入模式
halMcuWaitUs(40); // 延时等待20~40us,等待从机响应信号
if (!DHT11_SDA) {
WAIT_FLAG = 2;
while ((!DHT11_SDA) && WAIT_FLAG++); // 等待高电平信号结束,开始接收数据
if (WAIT_FLAG == 1) return 0; // 等待超时,退出本次操作
WAIT_FLAG = 2;
while (DHT11_SDA && WAIT_FLAG++);
for (i=0; i<40; i++) {
WAIT_FLAG = 2;
while ((!DHT11_SDA) && WAIT_FLAG++); // 等待下一位数据开始发送
halMcuWaitUs(30);
tmp = 0;
if(DHT11_SDA) tmp = 1; // 延时30us后仍为高电平,则为数据1
WAIT_FLAG = 2;
while (DHT11_SDA && WAIT_FLAG++); // 等待高电平结束
if(WAIT_FLAG == 1) break; // 等待超时,退出本次操作
datBuf[i/8] <<= 1;
datBuf[i/8] |= tmp;
}
P0DIR |= 0x01; // 设置为输出模式
DHT11_SDA = 1;
for (i=0; i<4; i++) {
checkOut += datBuf;
}
if (checkOut == datBuf[4]) {
return 1; // 数据校验正确
}
else
return 0;
}
else
return 0;
}
参考别人的代码,想先改改试试的 |
|