蓝桥杯嵌入式扩展板模块之温度传感器
硬件介绍
蓝桥杯嵌入式拓展版提供的温度传感器是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;
}