DS18B20单线数字温度传感器,支持“一线总线”接口,测量温度范围为-55摄氏度到+125摄氏度,精度为±0.5摄氏度。大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量。支持3V~5.5V的电压范围。

DS18B20中的温度传感器完成对温度的测量,用16位二进制形式提供,形式表达,其中S为符号位。

由此可见,0~3Bit是温度小数部分,4~10Bit是温度整数部分,11~15Bit是符号位。

例如:

+125℃的数字输出07D0H

(正温度直接把16进制数转成10进制即得到温度值 )

-55℃的数字输出为 FC90H。

(负温度把得到的16进制数取反后加1 再转成10进制数)

DS18B20的工作时序:

初始化时序

主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上无器件应答。

做为从器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。

bit Init_DS18B20(void)
{bit flag; //DS18B20是否存在的标志位,0代表存在DQ = 1; //先拉高,准备后面的复位脉冲 for(time=0;time<2;time++) ;//稍微延时一下DQ = 0; //发出一个480~960us的低电平脉冲for(time=0;time<200;time++); // 延时大概600usDQ = 1; //释放总线为高电平for(time=0;time<10;time++);//延时约30us,释放总线后需要等待15~60us让DS18B20输出存在脉冲flag=DQ; //单片机检测是否存在脉冲,DQ为0即存在for(time=0;time<200;time++); //延时足够的时间,等待脉冲输出return (flag); //返回检测结果
}

写时序

由图可知,数据线从高电平拉至低电平,产生写起始信号。15us之内将所需要写的位送到数据线上,准备好数据就好。总线从高到低电平后15us后开始写入,如果要写1就在15us~60us后拉高总线,如果是0就维持低电平。

void WriteOneChar(unsigned char dat)
{unsigned char i=0;for (i=0; i<8; i++){DQ =1; // 先将数据线拉高_nop_(); //稍微等待一下DQ=0; //将数据线从高拉低启动写时序DQ=dat&0x01; // 利用与运算取出要写的一位二进制数据//送到数据线上等待DS18B20采样for(time=0;time<10;time++);//延时约30us,确保后面取样正确DQ=1; //释放数据线for(time=0;time<1;time++);// 延时3us,两个写时序间需要反应时间dat>>=1; //开始下一位二进制数据}for(time=0;time<4;time++); //稍作延时,给硬件一些反应时间
}

读时序

主机数据线先从高拉至低电平 1us 以上,再使数据线升为高电平,从而产生读信号。随后在15us内进行读取就可以。

unsigned char ReadOneChar(void)
{unsigned char i=0;unsigned char dat; //储存读取的数据for (i=0;i<8;i++){DQ =1; // 先将总线拉高_nop_(); //稍微延时一下,一个机器周期DQ = 0; //从高拉低1us以上_nop_(); //持续1us以上DQ = 1; //再使数据线升为高电平,这时产生了读信号for(time=0;time<2;time++); //延时一段时间,等待数据线上出现一位数据dat>>=1; //数据是从高到低传送if(DQ==1)dat|=0x80; //存数据位1在高位elsedat|=0x00;//存数据位0在高位for(time=0;time<8;time++); //将两个读过程隔开一段时间}return(dat); //返回读取的数据
}

DS18B20单线通信

DS18B20 单线通信功能是分时完成的,他有严格的时隙概念,如果出现序列混乱, 1-WIRE 器件将不响应主机,因此读写时序很重要。系统对 DS18B20 的各种操作必须按协议进行。根据 DS18B20 的协议规定,微控制器控制 DS18B20 完成温度的转换必须经过以下 3个步骤 :

(1)每次读写前对 DS18B20 进行复位初始化。复位要求主 CPU 将数据线下拉 500us ,然后释放, DS18B20 收到信号后等待 16us~60us 左右,然后发出60us~240us 的存在低脉冲,主 CPU 收到此信号后表示复位成功。

(2)发送一条 ROM 指令

(3)发送存储器指令

现在我们要做的是让DS18B20进行一次温度的转换,那具体的操作就是:

1、主机先作个复位操作,

2、主机再写跳过ROM的操作(CCH)命令,

3、然后主机接着写个转换温度的操作命令,后面释放总线至少一秒,让DS18B20完成转换的操作。在这里要注意的是每个命令字节在写的时候都是低字节先写,例如CCH的二进制为11001100,在写到总线上时要从低位开始写,写的顺序是“零、零、壹、壹、零、零、壹、壹”。

读取RAM内的温度数据。同样,这个操作也要接照三个步骤。

1、主机发出复位操作并接收DS18B20的应答(存在)脉冲。

2、主机发出跳过对ROM操作的命令(CCH)。

3、主机发出读取RAM的命令(BEH),随后主机依次读取DS18B20发出的从第0一第8,共九个字节的数据。如果只想读取温度数据,那在读完第0和第1个数据后就不再理会后面DS18B20发出的数据即可。同样读取数据也是低位在前的。

/*****************************************************做好读取温度的准备
***************************************************/
void ReadyReadTemp(void)
{Init_DS18B20(); // 将DS18B20初始化WriteOneChar(0xCC); // 跳过读序列号的操作WriteOneChar(0x44); // 启动温度转换for(time=0;time<100;time++); //转换一次需要时间Init_DS18B20(); // 再初始化一次WriteOneChar(0xCC); // 跳过读序列号的操作WriteOneChar(0xBE); // 读取温度寄存器,前两个依次是温度的低位高位数据
}/*****************************************************读温度函数,转换数据
***************************************************/
void dwend(void)
{ float tp; //存储转换温度十进制uchar TL; // 储存温度低位uchar TH; //储存温度高位TL=ReadOneChar(); //先读到的是温度的低位TH=ReadOneChar(); //然后是温度的高位temp = TH << 8 | TL; //对两个温度数据进行整合if(temp<0) {  //displaydata[0] = '-'; //添加一个-号 temp = temp-1;temp =~temp; //对负温度数据取补码tp = temp;temp = tp*0.0625*100+0.5; //温度转换为十进制} else  //温度为正值 {//displaydata[0] = ' '; //正温度不用添加符号tp = temp;temp = tp*0.0625*100+0.5;//直接对温度进行转换,转换后的温度是一个四位数,前两位是温度十进制整数部分,后两位是小数部分,例如如果是2034,温度就是20.34度}
}

DS18B20使用详解相关推荐

  1. 51单片机DS18B20温度传感器详解

    DS18B20是一种单总线数字温度传感器,测试温度范围-55℃-125℃,具有体积小,硬件开销低,抗干扰能力强,精度高的特点.单总线,意味着没有时钟线,只有一根通信线.单总线读写数据是靠控制起始时间和 ...

  2. DS18B20温度传感器原理详解及例程代码、漏极开路

    [常用传感器]DS18B20温度传感器原理详解及例程代码_Z小旋的博客-CSDN博客_ds18b20温度传感器 传感器引脚及原理图 DS18B20传感器的引脚及封装图如下: DS18B20一共有三个引 ...

  3. DS18B20 1-WIRE ROM搜索算法详解

    转自:http://blog.sina.com.cn/s/blog_57ad1bd20102uxxw.html 1-WIRE搜索算法详解(1) 0前言 美信公司(http://www.maximint ...

  4. 基于DS18B20的多点测温方案详解

    1.DS18B20多点测温方案概述 DS18B20 单线数字温度传感器,多个 DS18B20 可以并联在惟一的单线上,实现多点测温.具体方案主要是以下步骤: 写一个获取DS18B20的64位序列号的k ...

  5. 51单片机DS18B20温度传感器使用及数码管温度计、LCD1602温度显示代码详解

    温馨提示:读者若要彻底理解并会灵活使用DS18B20温度传感器,请详细阅读中文手册,并且对照代码注释充分分析代码.请不要觉得中文手册内容繁多!如能静心分析,定能深有体会,获益匪浅! 一.DS18B20 ...

  6. fpga供电电压偏低会怎样_正点原子【FPGA-开拓者】第三章 硬件资源详解

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 本章,我们将向大家详细介绍ALIENTEK开拓者FPGA ...

  7. Arduino温度传感器全系列使用详解

    原文地址:https://arduino.nxez.com/2017/03/26/arduino-sensor-series-of-temperature-measurement.html Ardui ...

  8. 阿里云安全增强计算型c6t云服务器参数详解

    阿里云服务器安全增强计算型实例规格族c6t实例,依托TPM芯片从底层服务器硬件到GuestOS的启动链均进行度量和验证,实现可信启动,InstanceTypes分享阿里云全增强计算型c6t实例CPU. ...

  9. 阿里云AMD服务器计算型实例规格族c6a实例CPU网络收发包云盘IOPS详解

    查看全文 http://www.taodudu.cc/news/show-4527620.html 相关文章: 如何区别阿里云服务器ECS计算型c6和c6e? 阿里云安全增强计算型c6t云服务器参数详 ...

最新文章

  1. 难忘的一天——装操作系统(二)
  2. 「Python基础知识」Python的split方法如何使用
  3. python2.7手机版下载_Python 2.7 64位2.7.13 安装版 下载 - 51下载网
  4. Momenta 陈凯:从人才角度看 L4 无人驾驶的实现 | AI 研习社职播间第 4 期(附 Momenta 招聘解读)...
  5. 【生信进阶练习1000days】day8-OrganismDb.dplyr包
  6. 温习一下嵌入式老鸟 (火哥) 的面试指南
  7. php制作多媒体课件,网络自主学习型多媒体课件设计与制作PPT.ppt
  8. Java项目:SSM网上超市购物商城管理系统
  9. 【PICkit3】PICkit3 Programmer烧写教程
  10. 计算机路由器无线级联配置,不同品牌无线路由器 无线级联 配置案例
  11. 运算放大器之开环增益
  12. 百度搜索结果左侧图片设置方法
  13. 关于java WEb怎么调用matlab(二)
  14. 一元函数对象、一元谓词、二元函数对象、二元谓词
  15. KNN算法及KNN的优化算法-加权KNN
  16. 官网下载最新版本Spring
  17. 电脑自动关机是什么原因?为什么电脑会自动关机?轻松弄懂
  18. 基于java springboot mysql百度地图的信息标注系统--桌面端的设计与实现
  19. 区块链让公益更透明安心 | FinTechathon 上园村小红果团队
  20. 【MATLAB图像处理】计算机视觉基础MATLAB实现读取磁盘中的图像,实现图像转化显示、像素点8-邻域标记、显示两个像素点的像素变化情况

热门文章

  1. 启迪环境半年亏损39亿融资陷停滞 计提资产减值准备超34亿元
  2. 【模板】ACwing算法基础课模板小全
  3. windows命令行指令
  4. 2017年双色球中奖号码
  5. linux获取u盘厂商名称,根据/proc/partitions获取插入的U盘设备名称
  6. 二手房政策(by quqi99)
  7. 《人人都是产品经理》总结
  8. 【unity本站最全系列】Unity基础不动山不摇回顾篇
  9. Flask 消息闪现
  10. load 和 loads的区别