DS18B20数字温度传感器概述及控制时序

一. 概述
ds18b20数字温度传感器提供9-bit到12-bit的摄氏温度测量精度和一个用户可编程的非易失性且具有过温和低温触发报警的报警功能。 ds18b20采用的1-wire通信即仅采用一个数据线(以及地)与微控制器进行通信,采集数据的精度为12bit。
该传感器的温度检测范围为-55℃至+125℃,并且在温度范围超过-10℃至85℃之外时还具有+-0.5℃的精度。 此外,ds18b20可以直接由数据线供电而不需要外部电源供电。
二. 电气参数
1.特点
供电电压:3.0v-5.5v。测量温度范围:-55~+125℃精度:±0.5℃数据传输:“一线总线”的数字方式传输采集精度:可以由用户自定义为9-bits至12-bits。2.引脚说明
3.参考电路图
ds18b20供电一般采用外部供电方式,并且在数据线上并联一个4.7k的上拉电阻,以增强数据的抗干扰能力。
三. 控制时序
1.初始化时序
与ds18b20所有的通信都是由初始化时序开始的,该时序包括从主设备发出的复位脉冲及从ds18b20响应的存在脉冲组成。 如图所示。
当ds18b20响应复位信号的存在脉冲后,则其向主设备表明其在该总线上,并且已经做好操作命令。
/******************************************************************************** 函 数 名 : ds18b20init* 函数功能 : 初始化* 输 入 : 无* 输 出 : 初始化成功返回1,失败返回0*******************************************************************************/uchar ds18b20init(){ unsigned char x=0; dsport = 1; //dq复位 delay_ds18b20(8); //稍做延时 dsport = 0; //单片机将dq拉低 delay_ds18b20(80); //精确延时,大于480us dsport = 1; //拉高总线 delay_ds18b20(14); x = dsport; //稍做return x;//初始化成功}2.读时序
写时段有两种情况:“写1”时段和“写0”时段。 主设备通过写1时段来向ds18b20中写入逻辑1以及通过写0时段来向ds18b20中写入逻辑0。 每个写时段最小必须有60us的持续时间且独立的写时段间至少有1us的恢复时间。 两个写时段都是由主设备通过将1-wire总线拉低来进行初始化,如图。
根据以上读0及1的时序,便可实现读取一个完整字节的函数,如下:
/******************************************************************************** 函 数 名 : ds18b20readbyte* 函数功能 : 读取一个字节* 输 入 : 无* 输 出 : dat*******************************************************************************/uchar ds18b20readbyte(){ unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { dsport = 0; // 给脉冲信号 dat>>=1; dsport = 1; // 给脉冲信号 if(dsport) dat|=0x80; delay_ds18b20(4); } return(dat);}3.写时序
仅在读时段期间ds18b20才能向主设备传送数据。 因此,主设备在执行完读暂存寄存器[beh]或读取供电模式[b4h]后,必须及时地生成读时段,这样ds18b20才能提供所需的数据。 此外,主设备可以在执行完转换温度[指令:44h]或拷贝eeprom[指令:b8h]命令后生成读时段,以便获得在“ds18b20功能命令”表中提到的操作信息。 时序如图:
根据以上写0及1的时序,便可实现写入一个完整字节的函数,如下:
/******************************************************************************** 函 数 名 : ds18b20writebyte* 函数功能 : 向18b20写入一个字节* 输 入 : com* 输 出 : 无*******************************************************************************/void ds18b20writebyte(uchar dat){ unsigned char i=0; for (i=8; i>0; i--) { dsport = 0; dsport = dat&0x01; delay_ds18b20(5); dsport = 1; dat>>=1; }}四. 控制程序
1.读取温度流程
要读取一个完整的温度值,需要根据以上流程进行操作。 先对ds18b20进行复位操作,再发送开始转换指令(指令值:0x44),再发送复位操作,等待ds18b20应答后,发送读取温度指令,最后就可以读取16位的数据(有限位最大为12位)。
2.读取温度程序
/******************************************************************************** 函 数 名 : ds18b20changtemp* 函数功能 : 让18b20开始转换温度* 输 入 : 无* 输 出 : 无*******************************************************************************/void ds18b20changtemp(){ ds18b20init(); delay1ms(1); ds18b20writebyte(0xcc); //跳过rom操作命令 ds18b20writebyte(0x44); //温度转换命令// delay1ms(100); //等待转换成功,而如果你是一直刷着的话,就不用这个延时了}/******************************************************************************** 函 数 名 : ds18b20readtempcom* 函数功能 : 发送读取温度命令* 输 入 : 无* 输 出 : 无*******************************************************************************/void ds18b20readtempcom(){ ds18b20init(); delay1ms(1); ds18b20writebyte(0xcc); //跳过rom操作命令 ds18b20writebyte(0xbe); //发送读取温度命令}/******************************************************************************** 函 数 名 : ds18b20readtemp* 函数功能 : 读取温度* 输 入 : 无* 输 出 : 温度值*******************************************************************************/int ds18b20readtemp(){ int temp = 0; uchar tmh, tml; ds18b20changtemp(); //先写入转换命令 ds18b20readtempcom(); //然后等待转换完后发送读取温度命令 tml = ds18b20readbyte(); //读取温度值共16位,先读低字节 tmh = ds18b20readbyte(); //再读高字节 temp = tmh; temp <<= 8; temp |= tml; return temp;}/******************************************************************************** 函 数 名 : gettemp* 函数功能 : 串口输出温度值* 输 入 : 无* 输 出 : 无*******************************************************************************/void gettemp(void){ int temp; float tp; et0 = 0; temp = ds18b20readtemp(); et0 = 1; if(temp<= 0) //当温度值为负数 {// temp=temp-1;// temp=~temp;// tp=temp;// temp=tp*0.0625*100+0.5; uart_sendstring(overrate!\\r\\n); //超过量程 } else { tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量 //如果温度是正的那么,那么正数的原码就是补码它本身 temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为c语言浮点数转换为整型的时候把小数点 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 //算加上0.5,还是在小数点后面。 } uart_sendstring(the current temperature is: ); uart_sendbyte((temp% 10000 / 1000) + 0x30); uart_sendbyte((temp% 1000 / 100) + 0x30); uart_sendbyte('.'); uart_sendbyte((temp% 100 / 10) + 0x30); uart_sendbyte((temp% 10) + 0x30); uart_sendstring(℃\\r\\n); }

Bose QuietComfort 45消噪耳机固件升级通知
哈弗M6能否再创辉煌,超越哈弗H6呢?
魅族将在中国宣布Flyme 9用户界面
输电线路的保护方式_输电线路的继电保护
双声道F类音频功率放大器LTK5208参数特性介绍
DS18B20数字温度传感器概述及控制时序
深度剖析国六后处理到底有着什么样的秘密
常用的嵌入式操作系统你都了解了吗
电容的识别方法以及应用电路的解析
iPhone X开启了OLED屏幕普及的热潮 京东方有望抱苹果大腿
TI消费电子应用及设计研讨会(华南专场)将在深圳举行
磁栅尺有几种常见故障?
国产PCB厂商五株科技继续开启创业板上市审核
晶体管的诞生史
联发科技与英特尔共同打造5G数据卡解决方案
凯迪正大中置柜无线高压核相仪、无线核相器使用说明
新版Google操作系统的某些功能已开始以更加可靠的方式泄漏
半导体产业未来10年的机会在哪里?
一体化防爆气象仪的功能特点是怎样的
面对物联网(IoT),半导体产业遇到瓶颈?不,是新常态!