ds18b20温度转换指令_DS18B20温度传感器(附代码并浅谈与或运算)
DS18B20使用的是一種比較特殊的傳輸協議,僅需一個接線口就能實現通信
前言
DS18B20獨特的單線接口僅需一個端口引腳進行通訊,這讓每一個學習到這里的人都感到很神奇。在這篇文章中我們將通過學習18B20的數據傳輸方式來為IIC協議做下鋪墊。
提示:以下是本篇文章正文內容,下面案例可供參考
一、DS18B20是什么?
達拉斯DS18B20
半導體可編程分辨率的單總線?數字溫度計
DS18B20 數字溫度計提供9-12 位攝氏溫度測量而且有一個由高低電平觸發的可編程的不因電源消失而改變的報警功能。DS18B20通過一個單線接口發送或接受信息,因此在中央處理器和DS18B20 之間僅需一條連接線(加上地線)。它的測溫范圍為-55~+125℃,并且在-10~+85℃精度為±5℃。除此之外,DS18B20能直接從單線通訊線上汲取能量,除去了對外部電源的需求。每個 DS18B20 都有一個獨特的64 位序列號,從而允許多只DS18B20 同時連在一根單線總線上;因此,很簡單就可以用一個微控制器去控制很多覆蓋在一大片區域的DS18B20。這一特性在HVAC 環境控制、探測建筑物、儀器或機器的溫度以及過程監測和控制等方面非常有用。清翔51開發板接口:
這里值得注意的是,就算將18B20的接口接反也不會使該模塊燒壞,但是會特別特別燙,不能正常工作。冬日亂手神器
二、使用步驟
1.單總線時序
DS18B20采用1-wire Bus所有數據都在一條線上傳輸,因此單總線協議對時序要求非常嚴格以確保數據的完整性。
單總線信號類型:復位脈沖、存在脈沖、寫0、寫1、讀0、讀1。所有這些信號除存在脈沖由DS18B20發出的以外其他信號都由總線控制器發出。數據傳輸總是從最低有效位開始。
(1).初始化時序
初始化時序里面包含了復位DS18B20和接收DS18B20返回的存在信號。
主機和DS18B20做任何通訊前都需要對其初始化。初始化期間,總線控制器拉低總線并保持480us以上掛在總線上的器件將被復位,然后釋放總線,等到15-60us,此時18B20將返回一個60-240us之間的低電平存在信號。
(2).寫時序
寫時序分為寫0時序和寫1時序。
總線控制器通過控制單總線高低電平持續時間從而把邏輯1或0寫DS18B20中。
總線控制器要產生一個寫時序,必須將總線拉低最少1us,產生寫0時序時總線必須保持低電平60~120us之間,然后釋放總線,產生寫1時序時在總線產生寫時序后的15us內允許把總線拉高。注意:2次寫周期之間至少間隔1us
(3).讀時序
讀時序分為讀0時序和讀1時序。
總線控制器通過讀取由DS18B20控制的總線高低電平接收DS18B20數據。
總線控制器要產生一個讀時序,必須將總線拉低至少1us,然后釋放總線,在讀信號開始后15us內總線控制器采樣總線數據,讀一位數據至少保持在60us以上。注意:2次讀周期之間至少間隔1us
(4).DS18B20暫存器
根據暫存器我們可以看出,一般僅僅測量溫度時,我們只需要讀取byte0和1就行了,用到溫度報警的話,可以繼續讀取后面的數據。溫度寄存器的位置一開始默認為85攝氏度。下面是溫度寄存器圖表
溫度寄存器舉例:
(5).單總線訪問協議及其部分ROM指令表
忽略ROM指令(CCh)這條指令允許總線控制器不用提供64 位ROM 編碼就使用功能指令。例如,總線控制器可以先發出一條忽略ROM 指令,然后發出溫度轉換指令[44h],從而完成溫度轉換操作。在單點總線情況下使用該命令,器件無需發回64 位ROM 編碼,從而節省了時間。如果總線上有不止一只從機,若發出忽略ROM指令,由于多只從機同時傳送信號,總線上就會發生數據沖突。
(6).DS18B20功能指令表
溫度轉換指令(44h)
讀暫存器指令(BEh)
2.代碼示例
DS18B20初始化函數:
uchar DS18b20_Init(){ bit i; DQ = 1; Delay_us(1);//6.5us DQ = 0; Delay500us(); DQ = 1; Delay_us(4);//26us i = DQ; Delay_us(20);//130us DQ = 1; Delay_us(1);//6.5us return i;}不難看到這里的延時數字并不對應,原因是在11.0592MHz的環境下,執行每條指令的時間有區別。可以在調試界面自己調試,也可以用STC下載器自動生成
DS18B20寫數據函數
void DS18b20_Write(uchar dat){ uchar i; for(i=0;i<8;i++) { DQ = 0; _nop_(); DQ = dat & 0x01; Delay_us(13);//84.5us DQ = 1; _nop_(); dat >>=1; }}這里用到了一個比較重要的與運算,將一個數與上“0x01”,這一句話的意思其實是這樣
整個與運算符合這個思路“0&1=0”“1&1=1”“0&0=0”,dat通過右移,在最高位補0,防止與運算時高位出錯。就這樣重復8次就分離出了0和1發送出去了。也就是說,一般發送數據時,可以用到“dat & 0x01”DS18B20讀取函數
uchar DS18b20_Red(){ uchar i,dat,j; for(i=0;i<8;i++) { DQ = 0; _nop_(); DQ = 1; _nop_(); j = DQ; Delay_us(13);//84.5us dat = (j<<7)|(dat>>1); DQ = 1; _nop_; } return dat;}這里用到了另外一個比較重要的運算——或運算
或運算的運算思路:“0|0=0”“0|1=1”“1|1=1”,先將總線上的數據賦予給j,然后j左移7位放在最高位上,dat向右移1位使最高位騰出位置。將j和dat進行一次或運算,則達到讓DQ的數據放在dat的最高位的目的,而低位與0進行或運算,數據不變。
DS18B20調用函數
float DS18b20(){ int i; uchar L,M; DS18b20_Init();//初始化 DS18b20_Write(0xcc);//跳過ROM,因為只用到了一個DS18B20,不需要操作 DS18b20_Write(0x44);//0x44,溫度轉換指令 DS18b20_Init();//根據協議,再次初始化 DS18b20_Write(0xcc); DS18b20_Write(0xbe);//讀取暫存器 L = DS18b20_Red();//將暫存器的值賦予給L M = DS18b20_Red();//將暫存器的值賦予給L i = M; i <<= 8;//意思是將M放在高8位 i |= L;//這樣就是16位,高八位是M,低八位是L i = i * 0.0625 * 10 +0.5;//這里*10+0.5的目的是為了取整,所以這里的i其實是真實溫度的十倍return i;}這里是我用的延時函數
void Delay500us() //@11.0592MHz{ unsigned char i; _nop_(); i = 497; while (--i);}void Delay_us(uchar i) //@11.0592MHz{ while(i--);//一次6.5us}想調用DS18B20,可以直接這樣完成
int y;y=DS18b20();或者
unsigned char XXX函數(int x){ ...}int main(void){ XXX函數(DS18b20());}總結
以上就是DS18B20的運用,通過這個模塊的學習,不僅了解到了該傳感器,還簡單的了解到了或運算與運算,以及傳輸協議時序圖
總結
以上是生活随笔為你收集整理的ds18b20温度转换指令_DS18B20温度传感器(附代码并浅谈与或运算)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ssh长时间不操作便断开_不懂Excel
- 下一篇: tcs标准编写软件_【通知】关于举办20