而 HJ-2G 板子上,采用了外部供電的鏈接方式,而總線必須鏈接上拉電阻。這一目的告 訴我們,一線總線在空置狀態時,都是一直處于高電平。
要求出正數的十進制值,必須將讀取到的 LSB 字節,MSB 字節進行整合處理,然后乘 以 0.0625 即可。
Eg:假設從,字節 0 讀取到 0xD0 賦值于 Temp1,而字節 1 讀取到 0x07 賦值于 Temp2, 然后求出十進制值。
在這里我們遇見了一個問題,就是如何求出負數的值呢?很遺憾的,單片機不像人腦那 樣會心算,我們必須判斷 BIT11~15 是否是 1,然后人為置一負數標志。
Eg. 假設從,字節 0 讀取到 0x90 賦值于 Temp1,而字節 1 讀取到 0xFC 賦值于 Temp2, 然后求出該值是不是負數,和轉換成十進制值。
繼續繼續,以上我們是求出沒有小數點的正數。如果我要求出小數點的值的話,那么我 應該這樣做。
Eg:假設從,字節 0 讀取到 0xA2 賦值于 Temp1,而字節 1 讀取到 0x00 賦值于 Temp2, 然后求出十進制值,要求連同小數點也求出。
如以上的例題,我們可以 先將 0.0625 乘以 10,然后再乘以整合后的 Temperature 變量 , 就可以求出后面 一個小數點的值(求出更多的小數 點,方法都是以此類推 )。得出的結 果是 101,然后再利用簡單的算法,求出每一位的值。
求出負數的思路也一樣,只不過多出人為置一負數標志,求反補一的動作而已。自己發 揮想象力吧。
BIT7 出廠的時候就已經設置為 0,用戶不建議去更改。而 R1 與 R0 位組合了四個不同 的轉換精度, 00 為 9 位轉換精度而轉換時間是 93.75ms,01 為 10 位轉換精度而轉換 時 間是 187.5ms,10 為 11 位轉換精度而轉換時間是 375ms,11 為 12 位轉換精度而轉換時 間是 750ms(默認)。該寄存器還是留默認的好,畢竟轉換精度表示了轉換的質量。
補充一下 。一般上我們都 是使用單點,也就 是說單線總線上 僅有一個 DS18B20 存在而 已。所以 我們無需刻意讀 取 ROM里邊的序 列號來,然后匹 配 那個 DS18B20?而是更 直接的,跳過 ROM 指令,然后直接執行 DS18B20 功能指令。
ROM 指令,也就是訪問,搜索,匹配,DS18B20 個別的 64 位序列號的動作。在單點情 況下,可以直接跳過 ROM 指令。而跳過 ROM 指令的字節是 0xCC。
DS18B20 功能指令有很多種,我就不一一的介紹了 ,數據手冊里有更詳細的介紹。這里 僅列出比較常用的幾個 DS18B20功能指令。
DDRA|=BIT(DQ); //DQ 為輸 出狀態 PORTA&=~BIT(DQ); //輸出 低電平Delay_1us (500); //延遲 500 微妙 PORTA|=BIT(DQ); //示范 總線 Delay_1us(60); //延遲 60 微妙 DDRA&=~BIT(DQ); //DQ 位輸 出狀態
14.10簡單歸納 實驗開始之前,簡單的歸納一些重點。單線總線高電平為閑置狀態。單片機訪問 DS18B20 必須遵守, DS18B20 復位-->執行 ROM 指令-->執行 DS18B20 功能指令。而在單點上, 可以直接跳過 ROM 指令。DS18B20 的轉換精度默認為 12 位,而分辨率是 0.0625。
實驗的要求是以 DS18B20 默認的配置,亦即 12 位的轉換精度。然而輸出的結果為兩個 小數點 xx.xx。HJ-2G 板子上設計得DS18B20 的接口和典型,沒有什么特別需要注意的。 而 DS18B20 DQ 引腳對應的鏈接是 PA5。
以上的程式只有一個注意點就是 :DS18B20 的轉啟動換頻率不要超過 750ms。其他的沒 有什么需要特別注意了。
50 KB, 下載次數: 61, 下載積分: 黑幣 -5
z
340.54 KB, 下載次數: 124, 下載積分: 黑幣 -5
z
歡迎光臨 (http://www.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |