![]() |
unsigned int Time; //16位溫度值 unsigned char Time_H; //高8位 unsigned char Time_L; //低8位 bit negative=0; float Time_F;//換算后的浮點變量 if(Time&0x8000) { negative=1; //負號標志 Temp=~temp; //取反加1 Temp +=1; } Time_H=Time>>8; Time_L=Time; Time_F=(Time_H*256+Time_L)/10; |
xxpp2011 發表于 2020-4-15 09:30 我參考下 |
wjj11 發表于 2020-4-15 10:08 下面是DHT11的程序,我是想改成DHT22的,有幾個問題不理解 問題1:DHT22的溫度是溫度的(高7位的數值*256+低8位的數值) /10。高8位的首 位為符號位。濕度的讀取同理,但是濕度沒有符號位。 問題2:溫度是負數的時候改怎么定義函數 /******************************************************** 函數名稱:uchar DHT11_receive(void) 函數作用:接收DHT11傳回來的數據 參數說明:返回接收到的八位數據 ********************************************************/ uchar DHT11_receive(void) { uchar i,Data; for(i=0;i<8;i++) //接收8位數據 { DHT11_num=2; //重置超時變量 while(!DHT11_DB&&DHT11_num++);//等待DHT11變為高電平 Delay_us(35);//延時35us Data<<=1; //數據向左移動一位 if(DHT11_DB) //如果DHT11為高電平,表示接收的數據為1 Data|=1; //存入數據 DHT11_num=2; //重置超時變量 while(DHT11_DB&&DHT11_num++);//等待DHT11變為低電平 } return Data; //返回接收到的數據 } /******************************************************** 函數名稱:void DHT11_read(void) 函數作用:讀取DHT11溫濕度 參數說明: ********************************************************/ void DHT11_read(void) { DHT11_DB=0; //拉低DHT11信號線 Delay_ms(20); //延時20ms DHT11_DB=1; //拉高DHT11信號線 Delay_us(60); //延時60us if(!DHT11_DB) //等待DHT11拉高響應 { DHT11_num=2; //重置超時變量 while(!DHT11_DB&&DHT11_num++);//等待DHT11變為高電平 DHT11_num=2; //重置超時變量 while(DHT11_DB&&DHT11_num++); //等待DHT11變為低電平 Humi_H=DHT11_receive(); //接收濕度整數位 Humi_L=DHT11_receive(); //接收濕度小數位 Temp_H=DHT11_receive(); //接收溫度整數位 Temp_L=DHT11_receive(); //接收溫度小數位 Check_data=DHT11_receive(); //接收數據校驗位 DHT11_DB=1; //拉高DHT11信號,結束本次數據讀取 } } |
高八位 與80 ,得到結果為1為負數,反之為證 |
不太清楚你想要的效果,是想計算結果不受正負值的影響嗎? 如果是這樣的話符號位可以與上一個0 |
這個是DS18b20的溫度轉換,可以參考一下 /************************************* 函數名:ReadTemp 函數功能:溫度轉換 參數:無 返回:無 備注:無 *************************************/ void ReadTemp(void) { unsigned char a=0; unsigned char b=0; unsigned char t=0; dqinit(); wr1820b(0xCC); // 跳過讀序號列號的操作 wr1820b(0x44); // 啟動溫度轉換 delaydq(100); dqinit(); wr1820b(0xCC); //跳過讀序號列號的操作 wr1820b(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度 delaydq(100); a=re1820b(); //讀取溫度值低位 b=re1820b(); //讀取溫度值高位 if(b>127) { b=(256-b);a=(256-a);fflag=1; //負溫度求補碼 temp_value=b<<4; temp_value+=(a&0xf0)>>4; temp2=a&0x0f; //小數的值 } else { fflag=0; temp_value=b<<4; temp_value+=(a&0xf0)>>4; temp2=a&0x0f; //小數的值 } xs=temp2*0.0625*10; //小數位,若為0.5則算為5來顯示 xs小數 } |