DS18B20温度换算
大家好,我是劉士銘,今天繼續分享工作所用到的溫度傳感器DS18B20,一下文章為在網絡上搜集整理后添加自己的理解更改完善所得,如果侵權請聯系刪除,謝謝。
DSI8B20接收到溫度轉換命令后,開始啟動轉換。轉換完成后的溫度值就以16位帶符號擴展的二進制補碼形式存儲在高速暫存存儲器的0,1字節。單片機可通過單線接口讀到該數據,讀取時低位在前,高位在后,數據格式以0.062 5℃/LSB形式表示。溫度值格式如表2.2.1所示,其中“S”為標志位,對應的溫度計算:當符號位S=0時,直接將二進制位轉換為十進制,得到的溫度值即為正溫度值;當S=1時,測得的溫度是零下,DS18B20保存的是溫度的補碼值,需要對其低8位(LS Byte)取反加一變成原碼。再計算十進制值,得到的溫度值即為負溫度值。
DS18B20的核心功能是直接溫度-數字測量。其溫度轉換可由用戶自定義為9、10、11、12位精度分別為0.5℃、0.25℃、0.125℃、0.0625℃分辨率。值得注意的是,上電默認為12位轉換精度。DS18B20上電后工作在低功耗閑置狀態下。主設備必須向DS18B20發送溫度轉換命令[44h]才能開始溫度轉換。溫度轉換后,溫度轉換的值將會保存在暫存存儲器的溫度寄存器中,并且DS18B20將會恢復到閑置狀態。如果DS18B20是由外部供電,當發送完溫度轉換命令[44h]后,主設備可以執行“讀數據時序”。若此時溫度轉換正在進行DS18B20將會響應“0”,若溫度轉換完成則會響應“1”。如果DS18B20是由“寄生電源”供電,該響應的技術將不能使用,因為在整個溫度轉換期間,總線必須強制拉高。
DS18B20的溫度輸出數據時在攝氏度下校準的;若是在華氏度下應用的話,可以用查表法或者常規的數據換算。溫度數據以一個16位標志擴展二進制補碼數的形式存儲在溫度寄存器中(詳見圖2)。符號標志位(S )溫度的正負極性:正數則S=0,負數則S=1。如果DS18B20被定義為12位的轉換精度,溫度寄存器中的所有位都將包含有效數據。若為11位轉換精度,則bit 0為未。
由于DS18B20轉換后的代碼并不是實際的溫度值,所以要進行計算轉換。溫度高字節(MS Byte)高5位是用來保存溫度的正負(標志為S的bit11~bit15),高字節(MS Byte)低3位和低字節來保存溫度值(bit0 ~ bit10)。其中低字節(LS Byte)的低4位來保存溫度的小數位(bit0 ~ bit 3)。由于本程序采用的是0.0625的精度,小數部分的值,可以用后四位代表的實際數值乘以0.0625,得到真正的數值,數值可能帶幾個小數位,所以采取小數舍入,保留一位小數即可。也就說,本系統的溫度精確到了0.1度。?
?
算法核心:首先程序判斷溫度是否是零下,如果是,則DS18B20保存的是溫度的補碼值,需要對其低8位(LS Byte)取反加一變成原碼。處理過后把DS18B20的溫度Copy到單片機的RAM中,里面已經是溫度值的Hex碼了,然后轉換Hex碼到BCD碼,分別把小數位,個位,十位的BCD碼存入RAM中。
?
?
如:0550H 是+85°C ??????0191H:+25.0625°C ??FC90H是-55°C
DS18B20工作過程
(1)DS18B20控制方法(DS18B20有六條控制命令):
(2)溫度轉換 44H 啟動DS18B20進行溫度轉換
(3)讀暫存器 BEH 讀暫存器9位二進制數字
(4)寫暫存器 4EH 將數據寫入暫存器的TH、TL字節
(5)復制暫存器 48H 把暫存器的TH、TL字節寫到E2RAM中
(6)重新調E2RAM B8H 把E2RAM中的TH、TL字節寫到暫存器TH、TL字節
(7)讀電源供電方式 B4H 啟動DS18B20發送電源供電方式的信號給主CPU
Void delay_18B20(us)
{
While(us--);
}
1. 初始化
(1) 先將數據線置高電平“1”。
(2) 延時(該時間要求的不是很嚴格,但是盡可能的短一點)
(3) 數據線拉到低電平“0”。
(4) 延時750微秒(該時間的時間范圍可以從480到960微秒)。
(5) 數據線拉到高電平“1”。
(6) 延時等待(如果初始化成功則在15到60微妙時間之內產生一個由DS18B20所返回的低電平“0”。據該狀態可以來確定它的存在,但是應注意不能無限的進行等待,不然會使程序進入死循環,所以要進行超時控制)。
(7) 若CPU讀到了數據線上的低電平“0”后,還要做延時,其延時的時間從發出的高電平算起(第(5)步的時間算起)最少要480微秒。
(8) 將數據線再次拉高到高電平“1”后結束。
void ds1820rset() //ds1820復位
{
DQ = 1; //DQ復位
delay_18B20(4); //延時
DQ = 0; //DQ拉低
delay_18B20(100); //精確延時大于480us
DQ = 1; //拉高
delay_18B20(40);
}
2. 寫數據操作
(1) 數據線先置低電平“0”。
(2) 延時確定的時間為15微秒。
(3) 按從高位到低位的順序發送字節(一次只發送一位)。D7到D0的次序
(4) 延時時間為45微秒。
(5) 將數據線拉到高電平。
(6) 重復上(1)到(6)的操作直到所有的字節全部發送完為止。
(7) 最后將數據線拉高。
void ds1820wrdata(uchar wdata) /*寫數據*/
{
unsigned char I,temp=0x00;
for (i=8;i》0;i--)
{ DQ=0;
delay_18B20(15)
temp=1《《i-1;
DQ=wdata&temp;
delay_18B20(45);
DQ=1;
}
}
3. 讀數據操作
(1)將數據線拉高“1”。
(2)延時2微秒。
(3)將數據線拉低“0”。
(4)延時3微秒。
(5)將數據線拉高“1”。
(6)延時5微秒。
(7)讀數據線的狀態得到1個狀態位,并進行數據處理。
(8)延時60微秒。
讀一位二進制數
bit ds_read_bit(void)
{
bit dat;
DQ=0;
delay_18B20(2);
DQ=1;
delay_18B20(3);
dat=DQ;
delay_18B20(100);
return(dat);
}
讀一個字節,8位二進制數
uchar ds1820readdata() //讀數據
{
unsiged char i,j,value=0;
for(i=0;i《8;i++)
{
j=ds_read_bit();
value |=j《《7-i;
}
return(value);
}
DS18b20測量溫度電路圖
? ? ? ?Ds1820_Bus = 0; //產生下降沿,進入寫時序(15us內送上數據)
Ds1820_Bus = data_1820&0x01; //從低位開始送數
Delay_X15us(3);//延時45us,保證18b20采樣到數據
Ds1820_Bus = 1; //拉高電平完成送數
Delay_X15us(1);//連續送數要間隔至少1us(這里15us)
data_1820》》=1;//移位
總結
以上是生活随笔為你收集整理的DS18B20温度换算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STC15单片机-ADC获取环境温度(N
- 下一篇: fastreport 上一行_市、县人大