DS18B20采集流程及利用上位机获取采集数据

DS18B20相关资料

DS1820数字温度计提供9位温度读数,指示器件的温度。
信息经过单线接口送入DS1820或从DS1820送出,因此从中央处理器到DS1820仅需连接一条线(和地)。读、写和完成温度变换所需的电源可以由数据线本身提供,而不需要外部电源。因为每一个DS1820有唯一的系列号(silicon serial number),因此多个DS1820可以存在于同一条单线总线上。这允许在许多不同的地方放置温度灵敏器件。此特性的应用范围包括HVAC环境控制,建筑物、设备或机械内的温度检测,以及过程监视和控制中的温度检测。

DS18B20复位

在这里插入图片描述
由图可以看出,在复位时,首先是将单片机其放置在"0"位(低位)480微秒——960微秒,随后将其置"1",再将DS1820放置在"0"位持续60微秒——240微秒,检测其信号,若检测到,继而再将DS1820放置在"1"位持续60微秒——240微秒,若还能检测到信号,说明可以正常使用,否则任何一个环节出现问题,均无法获得正确温度。

#define DS18B20CLR (P3 &= ~(1 << 7))
#define DS18B20SET (P3 |= (1 << 7))
#define DS18B20TST ((P3 & (1 << 7)) != 0)

int reset18b20(void)	//复位
{
	int t;
	DS18B20CLR;
	Delay10us(70);
	DS18B20SET;

	t = 0;
	while(t <= 24 && DS18B20TST)
	{
		Delay10us(1);
		t++;	
	}
	if(t > 24)
	{
		return 0;
	}
	
	t = 0;
	while(t <= 24 && !DS18B20TST)
	{
		Delay10us(1);
		t++;	
	}
	if(t > 24)
	{
		return 0;
	}
	return 1;
}

向DS18B20发送、接收数据

在这里插入图片描述
在这里插入图片描述

发送

由图可以看出,在发送数据时,“0"位需要先将温度传感器P37置0,然后等待50微秒,再置"1”;
“1"位也需要先将温度传感器P37置"0”,等待2微秒即可(只要大于1微秒),再"1",继续等待30微秒即可。

#define DS18B20CLR (P3 &= ~(1 << 7))
#define DS18B20SET (P3 |= (1 << 7))
#define DS18B20TST ((P3 & (1 << 7)) != 0)

void send_char(unsigned char n)		//写
{
	int i;
	for(i = 0;i < 8;++i)
	{
		if((n & 0x01) != 0)
		{
			DS18B20CLR;
			_nop_();
			_nop_();
			DS18B20SET;
			Delay10us(3);	
		}
		else 
		{
			DS18B20CLR;
			Delay10us(5);
			DS18B20SET;
		}
		n >>= 1;
	}
}

接收

接收数据时,我们只需要将先将P37置"0",等待2微秒,再置"1",继续等待4微秒,因为传感器发送只能发送0和1,并且是从LSB(低端)发送,我们将发送过来的每一位进行存储即可。

#define DS18B20CLR (P3 &= ~(1 << 7))
#define DS18B20SET (P3 |= (1 << 7))
#define DS18B20TST ((P3 & (1 << 7)) != 0)

unsigned char read_char(void)	//读
{
	unsigned char ret = 0;
	int i;
	for(i = 0;i < 8;++i)
	{
		DS18B20CLR;
		_nop_();
		_nop_();
		DS18B20SET;
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		ret |= DS18B20TST << i;
		Delay10us(5);		
	}
	return ret;
}

获取温度

DS18B20采集流程是:

首先进行复位
发送0xCC
发送0x44
延时
复位
发送0xCC
发送0xBE
float get_temerature(void)	//获取温度
{
	unsigned char t1,t2;
	int ret;
	reset18b20();
	send_char(0xCC);
	send_char(0x44);
	Delay10us(60000);
	reset18b20();
	send_char(0xCC);
	send_char(0xBE);
	t1 = read_char();	//接收首先接收到的是低位
	t2 = read_char();
	ret = t2 << 8 | t1;		//整合
	return ret * 0.0625;	
}

以上就是DS18B20采集的相关操作

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值