使用DHt11測溫度和濕度,程式沒有報錯,但是具體溫度讀不出來,求各位大神看看是哪錯了
#include <msp430.h>
#define DHT11_OUTPUT P2DIR|=BIT0 //P2.0
#define DHT11_INPUT P2DIR&=~BIT0 //P2.0
#define DHT11_H P2OUT|=BIT0 //P2.0
#define DHT11_L P2OUT&=~BIT0 //P2.0
#define DHT11_IN (P2IN&BIT0)
unsigned char shuzi[] = {"0123456789."};
unsigned char tem[2];
///////////////DHT11輸出資料//////////////////
unsigned char DHT11T_Data_H; //溫度高8位
unsigned char DHT11T_Data_L; //溫度低8位
unsigned char DHT11RH_Data_H; //濕度高8位
unsigned char DHT11RH_Data_L; //適度低8位
/////////////函式宣告///////////////////////
unsigned char start_DHT11(void);
unsigned char DHT11_ReadChar(void);
void dht11(void);
void Delayus(int n);
////////////////////////////////////////////
//函式名稱:Delayus
//功能:延時(us),定時器查詢方法
//呼叫:無
//回傳:無
///////////////////////////////////////////
void Delayus(int n)
{
TA0CCR0 = n;
TA0CTL |= TACLR;
TA0CTL |= MC_1;
while(!(TA0CTL & BIT0)); //等待
TA0CTL &= ~MC_1; //停止計數
TA0CTL &= ~BIT0; //標志清除中斷
}
///////////主函式///////////////////
void main(void)
{
unsigned int readflag = 0;
WDTCTL = WDTPW + WDTHOLD;
TA0CTL|= TASSEL_2 + ID_3; //時鐘選擇SMCLK,1/8分頻,計數器1M頻率
unsigned char humidity=0;
unsigned char temperature = 0;
while(1)
{
readflag = start_DHT11();
if(1)
{
temperature = DHT11T_Data_H;//溫度值,沒有考慮小數
humidity = DHT11RH_Data_H; //濕度值,沒有考慮小數
tem[0]=temperature/10; //驗證是否執行到此
tem[1]=temperature%10;
}
}
}
////////////////////////////////////////////
//函式名稱:start_DHT11
//功能:DHT11初始化及讀取濕度值和溫度值
//呼叫:DHT11_ReadChar()
//回傳:無
///////////////////////////////////////////
unsigned char start_DHT11(void)
{
unsigned char TData_H_temp = 0; //溫度高8位中間變數
unsigned char TData_L_temp = 0; //溫度低8位中間變數
unsigned char RHData_H_temp =0; //濕度高8位中間變數
unsigned char RHData_L_temp = 0; //濕度低8位中間變數
unsigned char CheckData_temp = 0; //校驗位8位中間變數
char checktemp = 0; //校驗值
unsigned char flag = 0;
unsigned int count = 0;
DHT11_OUTPUT; //設定P2.0輸出 #define DHT11_OUTPUT P2DIR|=BIT0
DHT11_H; //輸出高 #define DHT11_H P2OUT|=BIT0
Delayus(10); //延時10us
DHT11_L; //輸出低 #define DHT11_L P2OUT&=~BIT0
//拉低18ms以上
Delayus(30000);
DHT11_H; //輸出高
DHT11_INPUT; //設定P2.0輸入 #define DHT11_INPUT P2DIR&=~BIT0
Delayus(60); //延時60us
if(!(DHT11_IN)) //檢測P2.O輸入電平,若為低電平
{
count=2; //計數值設定為2
while((!DHT11_IN)&&count++);
count=2;
while((DHT11_IN)&&count++);
RHData_H_temp = DHT11_ReadChar();
RHData_L_temp = DHT11_ReadChar();
TData_H_temp = DHT11_ReadChar();
TData_L_temp = DHT11_ReadChar();
CheckData_temp = DHT11_ReadChar();
DHT11_OUTPUT; //設定P2.0輸出
DHT11_H; //P2.0輸出高,釋放總線
checktemp = (RHData_H_temp + RHData_L_temp + TData_H_temp + TData_L_temp); //判斷校驗位是否正確
if (checktemp == CheckData_temp)
{
DHT11RH_Data_H = RHData_H_temp;
DHT11RH_Data_L = RHData_L_temp;
DHT11T_Data_H = TData_H_temp;
DHT11T_Data_L = TData_L_temp;
flag=1;
}
}
return flag; //回傳flag,若回傳1說明讀取正確
}
////////////////////////////////////////////
//函式名稱:DHT11_ReadChar
//功能:DHT11讀取1位元組資料
//呼叫:
//回傳:無
///////////////////////////////////////////
unsigned char DHT11_ReadChar(void)
{
unsigned char dat=0;
unsigned int count; //計數防止死等
unsigned char i;
for(i=0;i<8;i++)
{
count=2;
while((!DHT11_IN)&&count++); //等待50us低電平結束,程式進入死回圈退出 #define DHT11_IN (P2IN&BIT0)
Delayus(35);
dat <<= 1;
if(DHT11_IN) //50us低電平+28us高電平表示'0',50us低電平+70us高電平表示'1'
{
dat |= 1;
}
count=2;
while((DHT11_IN)&&count++); //程式進入死回圈退出
/*while(DHT11_IN);
if(count==1) //超時則跳出for回圈
{
break;
}*/
}
return dat;
}
uj5u.com熱心網友回復:
你可以從幾個方面改:①、接線錯誤 ②、IIC部分延時太短(單片機延時可能不準確,最好延長一些) ③、IIC讀取資料部分可能有問題uj5u.com熱心網友回復:
DHT11,單線的,哪來的I2C,這顆傳感器的例程很多,隨便都能百度到。你說的讀不出來是什么意思沒說明白轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/111371.html
標籤:單片機/工控
上一篇:求問大神有沒有做過基于飛思卡爾k60芯片的風力擺控制系統
下一篇:LCD1602如何使用
