久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13984|回復: 31
收起左側

DS18B20怎樣配置寄存器?寫測溫精度的R1 R0位

  [復制鏈接]
ID:382454 發表于 2018-10-29 16:49 | 顯示全部樓層 |閱讀模式
DS18B20默認是12位精度的,就是*0.0625,時間太長的,我想改與0.5精度的,就是9位數。開發板原程序是沒有問題的,我摸了幾天我怎改也不行。
下面是百度找的。bbs.elecfans點com/jishu_1532799_1_1.html
第二:高速暫存RAM及RAM操作指令
1、高速暫存RAM
在執行完ROM操作命令后,我們需要進行的就是RAM操作命令,我們先來認識一下高速暫存RAM。暫存器由9個字節組成。

第1第2兩個字節包含測得溫度信息,溫度傳感器(溫度靈敏元件)測得的溫度值被存儲到高速暫存器的這兩個字節(溫度寄存器)。
以12位精度存儲溫度,最高位為符號位,負溫度S=1,正溫度S=0。將存儲器中的二進制數求補再轉換成十進制數乘以精度(0.5、0.25、0.0625)就得到被測溫度值。如0550H為+85℃,0191H為
+25.0625℃,FC90H為-55℃,上電初始為+85℃。第3和第4個字節是 TH 和 TL 的易失性拷貝(從EEPROM拷貝到高速暫存器這兩個字節),在每一次上電復位時被刷新;

第5個字節是配置寄存器,如圖,用戶可按照“溫度計精確度配置”表,來修改R1R2的值,來設定DS18B20的精度,上電默認設置R1R0=11(12位精度),配置寄存器的其他為均保留,禁止寫入;
第6、7、8字節被保留,禁止寫入;
第9個字節是只讀的,包含以上八個字節的CRC碼;
2、RAM操作指令
再看一下RAM操作指令(功能指令)
在發送ROM操作指令后,下一步需要進行RAM操作指令。這些指令允許總線控制器讀寫DS18B20的暫存器,發起溫度轉換和識別電源模式。DS18B20的功能指令詳見下文。
CONVERTT [44h] (溫度轉換指令)
這條命令用以啟動一次溫度轉換。溫度轉換指令被執行,產生的溫度轉換結果數據以2個字節的形式被存儲在高速暫存器中,而后DS18B20保持等待狀態。如果寄生電源模式下發出該命令后,在溫度轉換期間(tconv),必須在10us(最多)內給單總線一個強上拉。如果DS18B20以外部電源供電,總線控制器在發出該命令后跟著發出讀時序,DS18B20如處于轉換中,將在總線上返回 0,若溫度轉換完成,則返回 1。寄生電源模式下,總線被強上拉拉高前這樣的通訊技術不會被使用。
WRITESCRATCHPAD [4Eh] (寫暫存器指令)
這條命令向 DS18B20 的暫存器寫入數據,開始位置在 TH 寄存器(暫存器的第 2個字節),接下來寫入 TL 寄存器(暫存器的第 3 個字節),最后寫入配置寄存器(暫存器的第 4 個字節)。數據以最低有效位開始傳送。上述三個字節的寫入必須發生在總線控制器發出復位命令前,否則會中止寫入。

下面紅色的是我自己改寫加上去的,不行。
void  Ds18b20ChangTemp()
{
    Ds18b20Init();                //初始化   
    Delay1ms(1);
    Ds18b20WriteByte(0xcc);        //跳過ROM操作命令

    Ds18b20WriteByte(0x4e);        //寫暫存器指令4E
    Ds18b20WriteByte(0x4b);        //寫高速緩存器TH高溫限值75度
    Ds18b20WriteByte(0x0f);        //寫高速緩存器TL低溫限值15度
    Ds18b20WriteByte(0x1f);        //寫配置寄存器4    0001 1111 精度為0.5


    Ds18b20Init();
    Delay1ms(1);
    Ds18b20WriteByte(0xcc);        //跳過ROM操作命令     
    Ds18b20WriteByte(0x44);        //溫度轉換命令
   //Delay1ms(100);    //等待轉換成功,而如果你是一直刷著的話,就不用這個延時了
   
}


4.PNG
3.PNG
1.png
回復

使用道具 舉報

ID:382454 發表于 2018-10-29 16:57 | 顯示全部樓層
本帖最后由 univers 于 2018-10-29 17:01 編輯

不知道是不是我理解錯誤,這幾個代碼要怎樣加上去才行啊?
還有一個問題,配置4寄存器只有R1R0可供用戶寫,但我們發送了一個字節0001 1111,有沒有什么不妥?是不是ds18b20就算接收了一個字,它也只對R1 R0進行操作?謝謝!!!


5.PNG

評分

參與人數 1黑幣 +100 收起 理由
admin + 100 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:382454 發表于 2018-10-30 10:11 | 顯示全部樓層
怎么改都不行,求大師指點,原程序在開發版里精度是12位的,參數是0.0625 顯示出來的溫度正常。

現改成9位精度,是乘于0.5,我改了N次,變成210多度了,好暈。看下圖是我改的。


無標題.png
回復

使用道具 舉報

ID:382454 發表于 2018-10-30 19:27 | 顯示全部樓層
真是蛋痛,沒有一個人理我。
回復

使用道具 舉報

ID:411697 發表于 2018-10-30 23:45 來自手機 | 顯示全部樓層
配置4寄存器只有R1R0可供用戶寫,但我們發送了一個字節0001 1111,有沒有什么不妥?是不是ds18b20就算接收了一個字,它也只對R1 R0進行操作
回復

使用道具 舉報

ID:267330 發表于 2018-10-31 09:07 | 顯示全部樓層
發送了一個字節0001 1111,ds18b20就算接收了一個字,它也只對R1 R0進行操作
回復

使用道具 舉報

ID:382454 發表于 2018-10-31 10:49 | 顯示全部樓層
jiangkeqin_sy 發表于 2018-10-31 09:07
發送了一個字節0001 1111,ds18b20就算接收了一個字,它也只對R1 R0進行操作

我百度找了好久也是沒用。這里有一個說的挺全的。
https://wenku.baidu.com/view/d20114c2aa00b52acfc7cad1.html
我按他的要求改了,把換算精度改成了*0.5,出來變成了200多度了。改了好幾次,還是寫不進去,這么高溫,人都燒死了。
原程序是OK的,我是把算法改成9位的,*0.5。
看下圖:

捕獲3.PNG
捕獲2.PNG
捕獲1.PNG
回復

使用道具 舉報

ID:418526 發表于 2018-10-31 15:02 來自手機 | 顯示全部樓層
univers 發表于 2018-10-29 16:57
不知道是不是我理解錯誤,這幾個代碼要怎樣加上去才行啊?
還有一個問題,配置4寄存器只有R1R0可供用戶寫 ...

小白,是你多多指教
回復

使用道具 舉報

ID:303383 發表于 2018-10-31 18:26 | 顯示全部樓層
提示: 作者被禁止或刪除 內容自動屏蔽
回復

使用道具 舉報

ID:382454 發表于 2018-10-31 23:08 來自手機 | 顯示全部樓層
小貓貓愛吃魚 發表于 2018-10-31 18:26
你好!應該是你時序控制的不對,命令應該是正確的,
多測試吧,好事多磨,總會成功的。。。
也可以加我好 ...

有時間再研究研究,那不是要重頭寫過才行。非常感謝謝你!明天把原程上傳大家看看。
回復

使用道具 舉報

ID:382454 發表于 2018-11-1 16:55 | 顯示全部樓層
原程序。

DS18B20溫度傳感器.rar

1003.83 KB, 下載次數: 83

回復

使用道具 舉報

ID:382454 發表于 2018-11-3 18:28 | 顯示全部樓層
昨天測試了一下,初始化時序有點問題,返回不了1.之后我單單測試了初始時序,按時序圖的時間,修改了時序。可以返回1了。也就是認到了DS18B20
之后把初始化放上去,還是200多度,看來還有別的地方也要改才行,應該是在寫bate指令那里。
回復

使用道具 舉報

ID:382454 發表于 2018-11-27 10:03 | 顯示全部樓層
初始化經過測試,這樣才行的,DS18B20有嚴格的時序時間。
下面的延時是精確的才行。
/*******************************************************************************
* 函 數 名         : ds18b20Init
* 函數功能           : 初始化
* 輸    入         : 無
* 輸    出         : 初始化成功返回1,失敗返回0
*******************************************************************************/

uchar ds18b20Init()
{
    uchar i=0;
    DSPORT = 0;             //將總線拉低480us~960us
    delay520us();
    DSPORT = 1;            //然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低   
    delay22us();        //這里非常重要,測試只有10-35us才有效,超過就返回不了啦,(現在取中間值22us)while延時的話要i最低=4開始才有效while(i--)
    while(DSPORT)        //等待DS18B20拉低總線 也就是檢測DQ引腳狀態
    {
        delayms(1);
        i++;
        if(i>5)//等待>5MS
        {
            return 0;//初始化失敗
        }
   
    }
    delay520us();    //等待520us讓ds18b20釋放總線
    return 1;        //初始化成功
}
回復

使用道具 舉報

ID:457743 發表于 2018-12-29 01:12 | 顯示全部樓層
兄dei,你這個問題解決了沒有?我也遇到了 ,但是我解決了,你的問題出在轉換系數上。無論你使用哪個位數的精度,你需要乘的系數永遠都是0.0625。9位的分度是0.5攝氏度,不是說轉換系數就是0.5攝氏度。
回復

使用道具 舉報

ID:457743 發表于 2018-12-29 01:13 | 顯示全部樓層
解決了嗎?我解決了
回復

使用道具 舉報

ID:449525 發表于 2018-12-29 08:29 | 顯示全部樓層
看到了普中的板子
我是用pwm控制背光的,定時器會打斷溫度傳感器,論壇上也有這個問題
關閉中斷的話,讀溫度傳感器時間過長,造成屏幕閃爍
其實你讀取溫度傳感器要那么快么?2秒讀一次就ok了,還有就是你可以判斷溫度改變了,在更新
回復

使用道具 舉報

ID:229821 發表于 2019-4-1 12:33 | 顯示全部樓層
謝謝。我解決了。
回復

使用道具 舉報

ID:504495 發表于 2019-4-3 22:34 | 顯示全部樓層
非常感謝樓主,用了樓主的方法解決了精度的問題,感謝感謝!!
回復

使用道具 舉報

ID:504495 發表于 2019-4-3 22:35 | 顯示全部樓層
我還特意注冊了論壇賬號
回復

使用道具 舉報

ID:382454 發表于 2019-4-5 23:19 來自手機 | 顯示全部樓層
changyuan1724 發表于 2018-12-29 01:12
兄dei,你這個問題解決了沒有?我也遇到了 ,但是我解決了,你的問題出在轉換系數上。無論你使用哪個位數的 ...

是這樣嘛,今天才看到,非常感謝兄弟,我有時間試試!可能是我理解錯誤吧!
回復

使用道具 舉報

ID:382454 發表于 2019-4-6 16:34 | 顯示全部樓層
如果碰到DS18B20問題的兄弟,都可以發表出來啊,大家一起學習。
回復

使用道具 舉報

ID:488996 發表于 2019-4-19 09:54 | 顯示全部樓層
univers 發表于 2018-10-31 10:49
我百度找了好久也是沒用。這里有一個說的挺全的。
https://wenku.baidu.com/view/d20114c2aa00b52acfc7c ...

你應該還是乘以 0.0625 因為即使你設置的精度是0.5,你讀出來的值 二進制 仍然有4位 表示的是小數,乘以0.0625 是因為數據整體往左移了4位
回復

使用道具 舉報

ID:565874 發表于 2019-6-18 16:31 | 顯示全部樓層
univers 發表于 2019-4-6 16:34
如果碰到DS18B20問題的兄弟,都可以發表出來啊,大家一起學習。

配置精度不成功,我把暫存寄存器的值讀出來,高溫限和低溫限和我配置的一樣,就分辨率那里寫不進去,一直是0x7f,只是哪里出問題了
回復

使用道具 舉報

ID:382454 發表于 2019-7-1 17:41 | 顯示全部樓層
本帖最后由 univers 于 2019-7-1 19:15 編輯
ssscholar 發表于 2019-6-18 16:31
配置精度不成功,我把暫存寄存器的值讀出來,高溫限和低溫限和我配置的一樣,就分辨率那里寫不進去,一直 ...

按照百度文庫的來就行了,我也試了。看付件PDF
上面的兄弟回復我也試了,是在開機通電的時候先設置DS18B20的工作模式,只要設一次就可以了!記住只要設置好一次即可。后面的就是發出溫度轉換指令,再發出讀取指令,這樣循環下去。
下面的代碼是有兩個DS18B20器件的, 一個1和一個2。 大至的原理就是這樣了
  1. /*******************************************************************************
  2. * 函 數 名        : DS18B20_12Setworkmode
  3. * 函數功能      : 兩個DS18B20初始化復位 之后寫暫存器R1R2為00轉換時間為9-bit/93.57ms 默認是R1=1R2=1 12-bit轉換時間為750ms
  4. * 輸    入         : 無
  5. * 輸    出         :
  6. *******************************************************************************/

  7. void DS18B20_12Setworkmode(void)
  8. {               
  9.         
  10.                 //發出第一個命令
  11.                 DS18B20_Reset1();                //設備1復位
  12.         
  13.     DS18B20_WriteByte1(0xcc);        //跳過ROM命令
  14.     DS18B20_WriteByte1(0x4e);        //寫暫存器指令
  15.                 DS18B20_WriteByte1(0x5f);        //寫高速緩存器2        TH高溫限值95度
  16.                 DS18B20_WriteByte1(0x00);        //寫高速緩存器3        TL低溫限值0度
  17.                 DS18B20_WriteByte1(0x1f);                                 //寫配置寄存器4  0001 1111 (R1=0 R2=0 12-bit)轉換時間為750ms精度為0.5
  18.                 DS18B20_Reset1();                //設備復位
  19.         
  20.                 //發出第二個命令
  21.                 DS18B20_Reset2();                //設備2復位
  22.         
  23.     DS18B20_WriteByte2(0xcc);        //跳過ROM命令
  24.     DS18B20_WriteByte2(0x4e);        //寫暫存器指令
  25.                 DS18B20_WriteByte2(0x5f);        //寫高速緩存器2        TH高溫限值95度
  26.                 DS18B20_WriteByte2(0x00);        //寫高速緩存器3        TL低溫限值0度
  27.                 DS18B20_WriteByte2(0x1f);                                 //寫配置寄存器4  0001 1111 (R1=0 R2=0 12-bit)轉換時間為750ms精度為0.5
  28.                 DS18B20_Reset2();                //設備復位
  29. }
復制代碼



2.PNG
1.PNG

DS18B20溫度傳感器.7z

9.8 MB, 下載次數: 81

回復

使用道具 舉報

ID:601671 發表于 2019-8-19 18:15 | 顯示全部樓層
我的就是設置 9bit分辨率設置不成功,現在讀溫度就是太慢了,750ms 才能轉化一次,想改成95ms  轉化一次  但按上面的設置了 也是不 成功??  不知道什么原因???求大神指導
回復

使用道具 舉報

ID:601671 發表于 2019-8-19 18:16 | 顯示全部樓層
我的就是設置 9bit分辨率設置不成功,現在讀溫度就是太慢了,750ms 才能轉化一次,想改成95ms  轉化一次  但按上面的設置了 也是不 成功??  不知道什么原因???求大神指導
回復

使用道具 舉報

ID:20672 發表于 2020-1-9 21:30 | 顯示全部樓層
樓主能否把9位分辨率的程序分享一下啊~謝謝
回復

使用道具 舉報

ID:382454 發表于 2020-11-6 12:06 | 顯示全部樓層
24#說的很清楚了。你可以先試試。
回復

使用道具 舉報

ID:520027 發表于 2020-11-9 16:43 | 顯示全部樓層
我是這樣的。把精度配置9位的,即0x1f寫入暫存器,再發考命令0x48,1820就把那3字節保存到非易失存儲器上。9位精度的是*0.5+0.5 即可顯示正常。把它們放到main中while循環之前初始化
回復

使用道具 舉報

ID:520027 發表于 2020-11-9 16:58 | 顯示全部樓層
設置成9位精度的,把0x1f寫人暫存器,再發個copy0x48命令,1820把3字節放到非易失存儲器。9位精度是*0.5+0.5的。把它們放到main()中while循環之前初始化。9位精度也是3字節,數據類型是一樣的。這樣即可顯示正常。
回復

使用道具 舉報

ID:382454 發表于 2020-11-9 17:20 | 顯示全部樓層
ssman 發表于 2020-11-9 16:43
我是這樣的。把精度配置9位的,即0x1f寫入暫存器,再發考命令0x48,1820就把那3字節保存到非易失存儲器上。 ...

這樣也可以。我是開機初始化的時候就寫。
回復

使用道具 舉報

ID:654797 發表于 2021-12-14 22:05 | 顯示全部樓層
jiangkeqin_sy 發表于 2018-10-31 09:07
發送了一個字節0001 1111,ds18b20就算接收了一個字,它也只對R1 R0進行操作

我讀取到的這個參數是01111100,不是01111111,手冊上說是01111111
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产在线二区 | 91在线区 | 欧美一级二级视频 | 午夜激情影院 | 日本久草 | 国产婷婷精品av在线 | www久久国产 | 操皮视频| 免费成人高清在线视频 | 亚洲精品一区二区三区中文字幕 | 天天欧美 | 日韩成人免费av | 日韩精品亚洲专区在线观看 | av一级久久| 天天插天天狠天天透 | av一二三四 | 99av成人精品国语自产拍 | 国产91视频播放 | 自拍偷拍第一页 | 国产激情自拍视频 | 欧洲一级黄 | 婷婷久久五月 | 亚洲 日本 欧美 中文幕 | 男女视频免费 | 台湾佬久久 | 91精品国产91久久久久久最新 | 天堂一区二区三区 | 欧美极品在线观看 | 国产黄色一级电影 | 一级做a爰片性色毛片16 | 久久伊| 小视频你懂得 | 精品视频一区二区 | 激情欧美日韩一区二区 | h视频在线播放 | 91精品久久久久久久久久小网站 | 国产精品视频在线观看 | 成人黄在线观看 | av二区三区| 精品网站999 | 成人在线观看免费观看 |