对DS18B20的使用作一个简单记录。
DS18B20内部组成
64位ROM
8位FAMILY CODE:DS18B20的64位ROM中的前8位统一为
28H
;48位SERIAL NUMBER:唯一序列号;
8位CRC:对ROM中前56位编码的校验码。
高速暂存存储器
字节0:存储温度值的低8位;
字节1:存储温度值的高8位;
字节2:存储报警触发的温度上限值,也可作为一般用途的存储器(EEPROM)使用;
字节3:存储报警触发的温度下限值,也可作为一般用途的存储器(EEPROM)使用;
字节4:配置寄存器;通过
R0
位和R1
位可以设置转换分辨率,默认分辨率为12位;字节5~7:保留字段;
字节8:CRC。
DS18B20温度数据
获取温度
DS18B20以16位补码的形式将温度数据存储于温度寄存器,单位为摄氏度。
从11位
到15位
为符号位,温度值为正数时,符号位均为0
;温度值为负数时,符号位均为1
。
剩下的11位当中,对于12位分辨率,所有位全部有效;对于11位分辨率,0位
无意义;对于10位分辨率,0位
和1位
无意义;对于9位分辨率,0位
、1位
和2位
无意义。
12位分辨率的精度为0.0625摄氏度;11位分辨率的精度为0.125摄氏度;10位分辨率的精度为0.25摄氏度;9位分辨率的精度为0.5摄氏度。
温度计算
当温度值为正数时,将温度寄存器从0位
到10位
的11位二进制数转换为十进制数,再与分辨率的精度相乘,即可得到实际温度值;当温度值为负数时,先将温度寄存器的11位二进制补码转换为原码,再将原码转换为十进制数,最后再与分辨率的精度相乘,即可得到实际温度值。
温度阈值
对于两个温度阈值触发寄存器(TH
和TL
),由于均为8位寄存器,因此仅能将温度寄存器4位
到11位
所表示的温度值与设定的阈值进行比较。
对于正数,7位
为0
;对于负数,7位
为1
。
DS18B20操作指令
ROM指令
当同一总线上挂载多个DS18B20时,需要通过ROM指令来控制某个DS18B20;当总线上只挂载单个DS18B20时,使用跳过ROM
指令(0xCC
)即可。
- 读ROM(
0x33
):读取DS18B20的64位ROM中的编码; - ROM匹配(
0x55
):发出此指令后,接着发出64位ROM中的编码,选中总线上与编码对应的DS18B20,为下一步对该DS18B20的读写作准备; - 搜索ROM(
0xF0
):用于确定挂载在同一总线上DS18B20的个数和识别64位ROM地址,为操作各器件作准备; - 跳过ROM(
0xCC
):忽略64位ROM地址,直接向DS18B20发送温度转换指令; - 警报搜索(
0xEC
):查找总线上温度超过阈值的DS18B20。
RAM指令
- 温度转换(
0x44
):启动DS18B20进行温度转换,转换结果存储于内部的9字节RAM中; - 读暂存器(
0xBE
):读取内部RAM中9字节的内容; - 写暂存器(
0x4E
):发出此指令向内部RAM的第3、4字节写温度上、下限的阈值,紧跟该命令之后,发送两字节的数据; - 复制暂存器(
0x48
):将内部RAM中第3、4字节的内容复制到EEPROM中; - 重调EEPROM(
0xB8
):将EEPROM中相应的内容恢复到RAM中的第3、4字节; - 读供电方式(
0xB4
):读DS18B20的供电模式;若为寄生供电,则DS18B20发送0
;若为外接电源供电,则DS18B20发送1
。
DS18B20时序
初始化DS18B20
- MCU拉低电平最少480us,产生复位脉冲,然后释放总线;
- DS18B20检测到请求后,拉低电平60~240us表示应答;
- 在DS18B20拉低电平的60~240us期间,MCU读取总线的电平,若为低电平,则表示DS18B20初始化成功;
- 在DS18B20拉低电平60~240us之后,释放总线。
写时序
- 写
0
:MCU拉低电平60~120us,然后释放总线; - 写
1
:MCU拉低电平大于1us,然后在15us内释放总线。
在写时序起始后15~60us内,DS18B20处于电平采样状态;若此时总线为高电平,则向DS18B20写1
;若此时总线为低电平,则向DS18B20写0
。
两次写周期之间最少间隔1us。
读时序
MCU拉低电平最少1us,然后释放总线;DS18B20检测到电平被拉低1us后,若发送0
,则将电平拉低直到读周期结束,若发送1
,则释放总线。读时序必须最少需要60us,且两次读时序之间最少需要间隔1us。
举个栗子
通过DS18B20采集环境温度,并在开发板的数码管模块上的左三位显示(带1位小数)。
MCU:AT89S52
#include <reg52.h> |
参考资料: