一.概述

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);   //精确延时,大于480usDSPORT = 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");
}

如需DS18B20相关资料及例程, 请关注公众号,首页回复DS18B20获取资料

DS18B20温度传感器-51单片机控制程序相关推荐

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

    目录 1 温度传感器DS18B20的工作原理 2 一线通信接口的使用(单总线) 2.1 单总线系统 2.2 执行序列 2.3 单总线信号 3 DS18B20寄存器的配置 4 根据传感器使用说明书时序图 ...

  2. 51单片机——DS18B20

    单片机--DS18B20 宗旨:技术的学习是有限的,分享的精神是无限的. DS18B20--温度传感器,单片机可以通过 1-Wire 和 DS18B20 进行通 信,最终将温度读出.1-Wire 总线 ...

  3. 基于汇编语言的DS18B20温度传感器设计

    1 概述 1.1 课题内容 利用温度传感器DS18B20与MCS-51单片机结合来测量温度,通过一根单总线连接,即可直接读出被测温度,读出或写入信息只需要一根数据线.读出的数据用LED数码管显示,显示 ...

  4. 基于51单片机的数字电子钟

    目录 摘  要 1.课程设计任务 1.1课程设计题目 1.2设计的要求 2.设计总体方案 2.1初步设计方案 2.2芯片的选型 2.2.1时钟芯片的选择 2.2.2温度传感器的选择 2.2.3显示电路 ...

  5. 51单片机温度传感器DS18B20

    51单片机温度传感器DS18B20 实现功能 插上DS18B20温度传感器,数码管显示检测的温度值 单片机型号:STC89C52 DS18B20介绍 1.DS18B20简介 DS18B20 是由 DA ...

  6. 51单片机驱动DS18B20温度传感器测量温度

    51单片机驱动DS18B20温度传感器测量温度 1.DS18B20温度传感器介绍: 2.51单片机驱动DS18B20测量温度 1.DS18B20温度传感器介绍: ①引脚定义 引脚 符号 说明 1 GN ...

  7. 51单片机~DS18B20温度传感器

    51单片机~DS18B20温度传感器 (一)简介说明: (二)接线: 1. 内部结构: 正温度前五位是0. 负温度前五位是1. 由LS,MS组成的四位十六进制数,和16位二进制数.(先MS后LS) 结 ...

  8. 51单片机 | DS18B20 温度传感器实验

    文章目录 一.DS18B20介绍 二.硬件设计 三.软件设计 1.数码管显示函数 2.DS18B20 初始化函数及温度读取函数 4.主函数 四.实验现象   这一节我们来学习精度较高的外部 DS18B ...

  9. 51单片机DS18B20温度传感器及数码管显示温度

    51单片机DS18B20温度传感器及数码管显示温度 大家好,今天给大家带来的代码及原理解释是,在51单片机在接收DS18B20温度传感器数据,并且在数码管上实时显示温度 DS18B20及数码管显示温度 ...

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

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

最新文章

  1. Linux之重定向命令
  2. upload-labs--wp(21关)
  3. java读取大txt文件_Java读取具有7000万行文本的大文本文件
  4. IIS+ASP部署相关
  5. nhibernate事务锁表的问题
  6. jQuery插件开发之windowScroll
  7. Edraw Max 9.4中文版激活教程
  8. java中三大版本javaSE、javaEE个javaME
  9. 关于ESAPI无法打印debug级别日志
  10. rxbus 源码_RxBus 这个 RxBus 稳如老狗 @codeKK Android开源站
  11. CTF Web出题感悟
  12. 【c语言】有符号机器数之间怎么比较大小?
  13. int和integer
  14. go语言字符串变量初始化以及字符串拼接
  15. 微信公众平台如何更换安全管理员(微信一)
  16. Autodesk CAD帮助文档总结三 DXF 组码
  17. dhu 4.1 队列模板简单应用算法设计:士兵队列训练
  18. 计算机考研哪些专业不考数学,考研“不用考”数学的6类专业,适合数学“学渣”报考!...
  19. AxureRP8的禁用与启用、移动
  20. 分享一个数学公式编辑器 Mathtype 6.9 最新版 附注册码

热门文章

  1. # 安卓手机启动黑阈服务
  2. Linux——基础知识及命令
  3. 好用的自媒体爆文素材采集技巧,提高爆文创作几率
  4. OpManager引领智能运维未来的发展方向
  5. 接口性能测试方案分析
  6. LeaRun.Java表单快速开发工具
  7. php的word插件,实现word在线预览 有php的写法 也有插件似
  8. vue如何集成阿里云视频服务组件(aliplayer)视频功能是使用el-dialog 弹出aliplayer播放
  9. 基于Ansible和CodeDeploy的DevOps解决方案
  10. 计算机技术数据pci是什么,pci数据捕获和信号处理控制器_PCI 数据捕获和信号处理控制器是什么?...