找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11469|回复: 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, 下载次数: 78

回复

使用道具 举报

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 单片机教程网

快速回复 返回顶部 返回列表