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