|
最近在用DHT11測量溫濕度的時(shí)候遇到了一些問題,查詢相關(guān)資料需要在DHT11的數(shù)據(jù)口加上拉電阻,但是在仿真和實(shí)物中加上拉電阻DHT11讀數(shù)不正常,不加上拉電阻反而能使用,看仿真好像是數(shù)據(jù)口不能正常下拉。
相關(guān)代碼如下:
//DHT11相關(guān)函數(shù)
/*******************************************************************************
* 函 數(shù) 名 : rev_byte
* 函數(shù)功能 : DHT11接受字節(jié)
* 輸 入 : 無
* 輸 出 : rev_data
*******************************************************************************/
unsigned char rev_byte( )
{
unsigned char i,temp,rev_data=0;
for(i=0;i<8;i++)
{
while(dat==0); //等待50us的低電平
Delay_10us(); //延時(shí)30us
Delay_10us();
Delay_10us();
temp=0;
if(dat==1) //判斷數(shù)據(jù)為0或1
temp=1;
while(dat==1); //等待1的高電平結(jié)束
rev_data<<=1;
rev_data|=temp;
}
return rev_data;
}
/*******************************************************************************
* 函 數(shù) 名 : RH
* 函數(shù)功能 : DHT11讀取
* 輸 入 : *rh、*tem
* 輸 出 : 無
*******************************************************************************/
void RH(unsigned char *rh,unsigned char *tem)
{
unsigned char rh_h,rh_l,tem_h,tem_l,rh_ht,rh_lt,tem_ht,tem_lt,check;
dat=0; //拉低18ms
dht_Delay(180);
dat=1; //總線由上拉電阻拉高延時(shí)20us以上
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
dat=1; //dat引腳設(shè)為讀狀態(tài)
if(dat==0) //判斷是否有低電平響應(yīng)信號(hào)
{
while(dat==0); //等待 80us 的低電平響應(yīng)信號(hào)
while(dat==1); //等待80us的高電平響應(yīng)
rh_ht=rev_byte(); //接收濕度高8位
rh_lt=rev_byte(); //濕度低8位
tem_ht=rev_byte(); //溫度高8位
tem_lt=rev_byte(); //溫度低8位
check=rev_byte();
dat=1;
if(rh_ht+rh_lt+tem_ht+tem_lt==check) //數(shù)據(jù)校驗(yàn)
{
rh_h=rh_ht;
rh_l=rh_lt;
tem_h=tem_ht;
tem_l=tem_lt;
*rh=rh_h;
*tem=tem_h;
}
}
}
|
|