DS18B20精度设置程序


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用作只设置一次,不需要每次都设置

  • 14
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
DS18B20是一种常用的数字温度传感,C51是一种基于51系列单片机的编程环境。要在C51中设置DS18B20读取数据时的精度为0.5°C,你需要编写特定的驱动程序并调整读数处理部分。以下是一个简化的步骤: 1. **库文件**:首先,确保已经包含了支持DS18B20的库文件,比如ds18b20.c或者ds18s20.h。 2. **初始化**:在主函数或其他适当的初始化阶段,配置DS18B20,如设置分辨率。对于DS18B20,默认分辨率为9-12位,对应大约0.5°C的精度。这通常通过寄存操作来完成,例如: ```c #pragma special function _write void writeReg(uint8_t addr, uint8_t value) { // 发送起始条件、寻址地址和数据 _write(0x48 | addr, value); delay_ms(6); // 等待应答 } void ds18b20Init() { writeReg(DS18B20_EOC, DS18B20_WRITE); // 设置为写模式 // 如果需要改变精度,可能会涉及到发送命令修改分辨率 } ``` 3. **读取数据**:获取测量值后,要根据设定的精度进行计算。由于C51浮点运算有限,你可能需要将12位二进制转换成小数形式。例如: ```c uint16_t temperatureMSB, temperatureLSB; // ...从设备读取到MSB和LSB float tempInCentigrade = ((float)(temperatureMSB << 8) + temperatureLSB) / (1 << resolutionBits) * 100.0f; // 假设分辨率bits为9(0.5°C) ``` 请注意,实际设置精度取决于DS18B20的数据手册和具体应用需求。在某些情况下,精度调整可能受限于硬件和软件交互细节。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值