delay_ms(20)改成 delay_ms(200)
delay_us(70)改成delay_us(700)
sbit DHT11_1 = P2^4
void COM1()
{
U8 i
for(i=0i<8i++)
{
U8FLAG=2
while((!DHT11_1)&&U8FLAG++)
Delay_10us()
Delay_10us()
Delay_10us()
U8temp=0
if(DHT11_1)U8temp=1
U8FLAG=2
while((DHT11_1)&&U8FLAG++)
//超时则跳出for循环
if(U8FLAG==1)break
//判断数据位是0还是1
// 如果高电平高过预定0高电平值则数据位为 1
U8comdata<<=1
U8comdata|=U8temp //0
}//rof
}
//--------------------------------
//-----湿度读取子程序 ------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//----湿度高8位== U8RH_data_H-----
//----湿度低8位== U8RH_data_L-----
//----校验 8位 == U8checkdata-----
//----调用相关子程序如下----------
//---- Delay(), Delay_10us(),COM()
//--------------------------------
void RH1()
{
//主机拉低18ms
DHT11_1=0
Delay(180)
DHT11_1=1
//总线由上拉电阻拉高 主机延时20us
Delay_10us()
Delay_10us()
Delay_10us()
Delay_10us()
//主机设为输入 判断从机响应信号
DHT11_1=1
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!DHT11_1) //T !
{
U8FLAG=2
//判断从机是否发出 80us 的低电平响应信号是否结束
while((!DHT11_1)&&U8FLAG++)
U8FLAG=2
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while((DHT11_1)&&U8FLAG++)
//数据接收状态
COM1()
U8RH_data_H_temp=U8comdata
COM1()
U8RH_data_L_temp=U8comdata
COM1()
U8T_data_H_temp=U8comdata
COM1()
U8T_data_L_temp=U8comdata
COM1()
U8checkdata_temp=U8comdata
DHT11_1=1
//数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp)
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp
U8RH_data_L=U8RH_data_L_temp
U8T_data_H=U8T_data_H_temp
U8T_data_L=U8T_data_L_temp
U8checkdata=U8checkdata_temp
}//fi
}//fi
}
温度传感器 DHT11 的程序是从网上找的吧?那 都是为AT89C51单片机写的,即是按传统的51单片机的时序写的。你用STC12C5A60S2单片机,这可是1T单片机啦,比AT89C51单片机快12倍多呢。那时序肯定是不对啦,需要按STC12C5A60S2单片机重改写才行的。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)