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