DS18B20溫度換算

2021-10-04 07:31:58 字數 3716 閱讀 3965

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

(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() //讀資料

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溫度測量

1.ds18b20 復位。2.寫入跳過 rom 的位元組命令,0xcc。3.寫入開始轉換的功能命令,0x44。4.延遲大約 750 900 毫秒 1.ds18b20 復位。2.寫入跳過 rom 的位元組命令,0xcc。3.寫入讀暫存的功能命令,0xbe。4.讀入第 0 個位元組 ls byte,轉換...

溫度感測器 DS18B20

1.實物圖 2.64位 激 光刻唯讀儲存器 開始8位 28h 是產品型別標號,接著的48位是該ds18b20自身的序列號,最後8位是前面56位的迴圈冗餘校驗碼 光刻rom的作用是使每乙個ds18b20都各不相同,這樣就可以實現一根匯流排上掛接多個ds18b20的目的 3.溫度暫存器 高位元組的前5位...

溫度感測器DS18B20使用

因為乙個專案用到了ds18b20溫度感測器,剛開始使用之處,第一次對單線感測器進行控制,毫無經驗,也是碰了一頭灰,摔了一些坑。總結一下使用心得。ds18b20是單線數位化溫度感測器。溫度採集的控制介面為1位,通過該位可進行溫度資料的讀取,以及9 12位解析度的設定,對應的精度為0.5 c 0.016...