|
52RC单片机11.0592MHZ晶振,dht11在lcd1602上不显示数据,仿真可以显示,但是实物不行,换了别人的模块也显示不了,按时序图来的不知道哪里的问题,请教大家/*********************************************************///
读取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
}
}
|
|