蓝桥杯嵌入式扩展板模块之DS18b20(温度传感器)

蓝桥杯嵌入式扩展板模块之温度传感器

硬件介绍

蓝桥杯嵌入式拓展版提供的温度传感器是DS18B20。关于他的驱动文件比赛的的时候是提供的,但是以防万一,自己还是要会写读写文件。

DS18B20

float ds18b20_read(void)
{
  	u8 val[2],s=0;
  	u8 i = 0;
	s16 x = 0;	
	float Temp = 0;
	
  	ow_reset();
  	ow_byte_wr(OW_SKIP_ROM);
  	ow_byte_wr(DS18B20_CONVERT);
  	delay_us(750000);
  	ow_reset();
  	ow_byte_wr( OW_SKIP_ROM );
  	ow_byte_wr ( DS18B20_READ );

  	for ( i=0 ;i<2; i++) {
    	val[i] = ow_byte_rd();
  	}
  		
	if(val[1] >7)
	{
		val[0] = ~val[0];
		val[1] = ~val[1];
		s = 0;
	}
	else 
		s = 1;

	x = val[1];
	x <<= 8;   
	x |= val[0];
	
	Temp = (float)x*0.0625;	
	
	
	if(s)	return Temp;
	else return -Temp;
}

我把这个函数改了一下,在最后三行我讲解一下。

首先DS18B20采集到的温度是16位的,如果说高5位都是1则是负温度,需要对采集到的数值进行取反并且加一才是真实温度,但是我相信比赛的时候是不可能存在这个现象的。如果是0,则直接将16进制转换为10进制就可以了。因此在这里我是直接进行与操作0x07ff默认它是零上温度。

然后后面进行除以16这里可不是进制转换,而是测量值到实际温度的转换,DS18B20的精度为0.0625度,即读回数据的最低位代表0.0625度,实际测量值t×0.0625就转换为实际温度值。

比如 读回的数据为: 0000 0001 1001 0000,十六进制为0x190,十进制400,乘以0.0625后得25,即实际温度是25度。

读取的数值偶尔有问题

在读取ds18b20的时候必须要关闭总中断,否则会影响他的时序,所以会读取的有时候有问题。

float ds18b20_read(void)
{
  	u8 val[2],s=0;
  	u8 i = 0;
	s16 x = 0;	
	float Temp = 0;
	
	__disable_irq(); 	//关闭总中断

  	ow_reset();
  	ow_byte_wr(OW_SKIP_ROM);
  	ow_byte_wr(DS18B20_CONVERT);
  	delay_us(750000);
  	ow_reset();
  	ow_byte_wr( OW_SKIP_ROM );
  	ow_byte_wr ( DS18B20_READ );

  	for ( i=0 ;i<2; i++) {
    	val[i] = ow_byte_rd();
  	}
	__enable_irq();		//开启总中断
	
	if(val[1] >7)
	{
		val[0] = ~val[0];
		val[1] = ~val[1];
		s = 0;
	}
	else 
		s = 1;

	x = val[1];
	x <<= 8;   
	x |= val[0];
	
	Temp = (float)x*0.0625;	
	
	
	if(s)	return Temp;
	else return -Temp;
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值