2019年3月18日更新
之前写这个博客的时候只是发现确实是这样写然后就是对的,但是今天仔细看了看DS18B20的datasheet,才知道为什么。
我们先看这一条指令介绍
是往中间寄存器的2、3、4位写入数据,然后我们再看这个寄存器都是啥。
看到,寄存器的byte2是设置最高温度,byte3是设置最低温度,而byte4是配置寄存器,那我们再来看看这个寄存器是什么鬼。
可以看到,除了bit7是0,bit4-bit都是1,中间还有bit6是R1,bit5是R0。那么这个R1和R0是设置DS18B20精度的,那么怎么设置呢?再看
哦,原来如此,到现在也就恍然大悟了,也就有了下面的代码。
写程序时,因为DS18B20上电默认12位精度,温度转换时间很长,于是刚刚研究了一会,找到了怎么设置DS18B20精度
/*******************************************************************************
* 函数名 :Start18B20
* 输入值 :none
* 返回值 :bit ~ack
* 作者 :小默haa
* 时间 :2019年2月27日
* 功能描述:启动一次18B20温度转换
* 备注 :返回值为是否启动成功
*******************************************************************************/
bit Start18B20()
{
bit ack;
static bit flag = 1;
ack = Get18B20Ack(); //执行总线复位,并获取18B20应答
if(ack == 0) //如18B20正确应答,则启动一次转换
{
DS18B20Write(0xCC); //跳过ROM操作
if(flag)
{
flag = 0;
DS18B20Write(0x4e); //写暂存器指令4E
DS18B20Write(0x4b); //写高速缓存器TH高温限值75度
DS18B20Write(0x00); //写高速缓存器TL低温限值0度
DS18B20Write(0x1f); //写配置寄存器4
//0x1f : 0.5000°C 转换时间93.75ms
//0x3f : 0.2000°C 转换时间187.5ms
//0x5f : 0.1250°C 转换时间375ms
//0x7f : 0.0625°C 转换时间750ms
}
ack = Get18B20Ack(); //重新执行总线复位,并获取18B20应答
if(ack == 0) //如18B20正确应答,则启动一次转换
{
DS18B20Write(0xCC); //跳过ROM操作
DS18B20Write(0x44); //启动一次温度转换
}
}
return ~ack; //ack == 0 表示操作成功,所以返回值对其取反
}
flag用作只设置一次,不需要每次都设置