作者:GWD 时间:2019.6.30
一、 学习要点:
1、问:读操作中为何还要赋值后再移位操作,而不直接对DQ移位?
答:bit类型变量不可以移位操作,只有char,int这类才可以移位操作;
2、问:多点检测试验时有一个18b20的ROM序列号产生了9个字节的地址序列怎么办?
答:设备生产时的bug,对比正常的序列码后删除掉一个序列后试验(0x0d)正确;
3、问:手册中给出精度分辨率为0.0625如何转换成现实中需要的温度?
答:精度分辨率为0.0625的意思就是,传感器检测值每增1,十进制时候大0.0625所以检测值*0.0625就是需要的数值了,再乘以100后,百分位的小数就算到整数的各位和十位中了,方便打印数据;
4、问:18B20单点采集流程?
答:第一步:发送起始信号
第二步:发送rom指令 0xcc(跳过rom命令);
第三步:发送功能命令0x44(开始转换温度指令);
第四步:发送起始信号;
第五步:发送rom指令 0xcc(跳过rom命令);
第六步:发送功能指令0xbe (读取暂存器指令);
第七步:两次读取18B20的值,然后转换就可以了;
注:起始信号+rom命令+功能指令为一组,不论什么时候只要操作18B20就要这三组一起不拆开。
5、问:18B20多点采集流程
答: 第一步:发送起始信号
第二步:发送rom指令 0x33(读取rom命令),读取到8字节的数值,把这8个char变量在串口助手hex模式下打印出来后,存入char[8]数组即可,以此方式可以知道新加入总线的18b20的rom值;
第三步:发送功能命令0x44(开始转换温度指令)
第四步:发送起始信号
第五步:发送rom指令 0x55(匹配rom命令),发送此命令后紧跟着8字节的rom地址,要读取哪个18b20就紧跟着哪个器件的地址码;
第六步:发送功能指令0xbe (读取暂存器指令)
第七步:两次读取18B20的值,然后转换就可以了。
6、问:hex输出功能的适用场合?
答:调时程序时需要知道程序运行到某处时的数值,hex打印出来的是16进制数值,比如在18B20查看rom地址时就应该用hex输出模式。
二、手册分析
1、传感器特性操作流程:
2、仅需要一个管脚来通信。每个设备的内部 ROM 上都烧写了一个独一无二的 64 位序列号,温度可测量范围为: -55℃至+125℃(-67℉至+257℉)。内部温度采集精度可以由用户自定义为9-Bits 至 12-Bits;
3、引脚定义:
3、内部框图:
1)、内部64位ROM存储第一无二的序号;
2)、在1—Wire总线系统中,微控制器(主设备)通过每个设备的 64 位序列号来识别该总线上的设备。因为每个设备都有一个独一无二的序列号,挂在一个总线上的设备理论上是可以无限个的;
4、DS18B20的另外一个特性就是可以无需外部电源供电。当数据线 DQ 为高的时候由其为设备供电。 总线拉高的时候为内部电容 (Spp) 充电, 当总线拉低是由该电容向设备供电。 这种由 1-Wire总线为设备供电的方式称为“寄生电源”。
5、DS18B20的核心功能是直接温度 -数字测量。其温度转换可由用户自定义为 9、 10、 11、 12 位精度分别为 0.5℃、 0.25℃、 0.125℃、 0.0625℃分辨率。值得注意的是,上电默认为 12 位转换精度。 DS18B20 上电后工作在低功耗闲置状态下。主设备必须向 DS18B20 发送温度转换命令 [44h]才能开始温度转换。
7. 温度数据以一个 16 位标志扩展二进制补码数的形式存储在温度寄存器中(图2-3)。符号标志位(S)温度的正负极性:正数则 S=0,负数则 S=1。如果 DS18B20 被定义