赞
踩
DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。它是由Dallas半导体公司推出的一种的一线总线(1-Wire)接口的数字温度传感器,它工作在 3v-5.5V的电压范围,其测量温度范围为-55~+125℃ ,精度为±0.5℃。该产品适用于冷冻库,粮仓,储罐,电讯机房,电力机房,电缆线槽等测温和控制领域。轴瓦,缸体,纺机,空调,等狭小空间工业设备测温和控制。汽车空调、冰箱、冷柜、以及中低温干燥箱等。供热/制冷管道热量计量,中央空调分户热能计量和工业领域测温和控制。
DS18B20传感器主要具有以下功能特性:
每个DS18B20芯片在出厂时,都固化烧录了一个唯一的64位产品序列号在其ROM中,它可以看作是该 DS18B20 的地址序列码。 64 位 ROM 的排列是:前 8 位是产品家族码,接着 48 位是DS18B20 的序列号,最后 8 位是前面 56 位的循环冗余校验码(CRC=X8+X5+X4+1)。 ROM 作用是使每一个 DS18B20 都各不相同,这样就可实现一根总线上挂接多个 DS18B20。
DS18B20的高速暂存存储器由9个字节组成。当温度转换命令(0x44)发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器前两个字节。接着单片机可以发送读暂存存储器命令(0xBH)读出存储器里的值, 存储器里的9个字节的存储结构如下图所示:
![在这里插入图片描述](https://img-blog.csdnimg.cn/c384a96b9532464a8eafc7dd9072e7c1.png
![在这里插入图片描述](https://img-blog.csdnimg.cn/1c59f9e2004a46eebce79c5ee9e945a5.png
crc=ff : 它是DS18B20采样时传输数据的CRC校验和,主要用来校验传感器将采样数据发送给CPU时是否出错;
t=20062: 后面的 20062就是采样温度值,其中20是整数部分,062为小数部分,即本次采样温度为 25.062℃。
实现简单的对文件的读取并获取温度
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <dirent.h> #include <time.h> #include <errno.h> #include <string.h> int ds18b20_gettemp(float *temp); int main(int argc,char *argv[]) { float temp; if(ds18b20_gettemp(&temp) < 0) { printf("ERROR ,ds18b20 get temp faulire"); return 1; } printf("ds18b20 get temp: %f \n",temp); } int ds18b20_gettemp(float *temp) { char path[120] = "/sys/bus/w1/devices/"; int fd; char buf[128]; DIR *dirp; struct dirent *direntp; char chip[40]; char *ptr; if((dirp = opendir(path))==NULL) { printf("FILE: %s OPEN faulire %s",path,strerror(errno)); return -1; } while((direntp=readdir(dirp))!=NULL) { printf("find file:%s\n",direntp->d_name); if(strstr(direntp->d_name,"28-")) { strcpy(chip,direntp->d_name); printf("28- file name :\n",chip); } } closedir(dirp); strncat(path,chip,sizeof(path)); printf("%s\n",chip); strncat(path,"/w1_slave",sizeof("/w1_slave")); printf("%s\n",path); if((fd=open(path,O_RDONLY))<0) { printf("OPEN temp faulire %s",strerror(errno)); return -2; } printf("%d\n",fd); if(read(fd,buf,sizeof(buf))<0) { printf("read %s error : %s\n",path,strerror(errno)); return -3; } ptr = strstr(buf,"t=") + 2; *temp=atof(ptr)/1000; return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。