日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DS18B20温度换算

發(fā)布時(shí)間:2024/3/7 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DS18B20温度换算 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

大家好,我是劉士銘,今天繼續(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。