1.首先我们知道DS18B20是单总线协议,只有一根数据线。所以Data数据线即使发送端又是接收端,同时DS18B20内部接了弱上拉电阻(如图一所示),数据线默认为高电平。有了这些概念,我们就能进行下一步。

 图一(截取DS18B20芯片手册)

2.初始化DS18B20

看图二可知,首先我们将总线从高拉低,保持480us左右,然后释放总线(没人拉低,默认高电平),此时总线上为高电平。然后等待15-60us,等待DS18B20模块将总线拉低。(如果拉低则说明DS18B20响应成功),DS18B20拉低60-240us后,释放总线。初始化完成。

  图二

 3.向DS18B20写入数据。

3.1 向DS18B20写0。

首先将总线由高拉低,低电平保持15us到60us,然后释放总线。写入0完成。

3.2 向DS18B20写1。

将总线由高拉低,低电平保持1-15us(看图三可知,低电平时间要低于15us),再释放总线。

图三

4.读取DS18B20寄存器中数据

4.1 读数据0

将总线由高拉低,保持1-15us。如果DS18B20中数据是0,则会将总线拉低。此时,总线上为低电平。我们要在60us以内读取数据(图四可知,60us以内DS18B20会释放总线)。否则可能会读到错误数据。

4.2 读数据1

将总线由高拉低,保持1-15us,如果数据是1,DS18B20会释放总线,总线上为高电平。然后在15us以后读取数据。

图四

5.DS18B20一些命令

5.1 0xCC→跳过ROM 

5.2 其他命令

0x44→开始温度转换指令 ,0xBE→读取数据寄存器指令

图五

6.DS18B20数据寄存器

这里也比较关键,所以拎出来讲一下。

首先DS18B20的数据寄存器是16位,其中寄存器高字节的高5位的S表示符号位,其余3位才是表示数据。这里就浅讲一下,后面结合代码来解析一下。

图六 

 7.代码实例

声明:首先这里面的延时都是按照经验值,就是通过实践,得出比较准确的延时。

注:这里使用的是12M频率的单片机,如果是1M可以把for循环去掉

延时函数如下:

  sbit DQ=P1^4;
//我这里是P1^4连接了DS18B20的数据线。
//你们根据自己的单片机原理图查询
void Delay_OneWire(unsigned int t)
{unsigned char i;while(t--){for(i=0;i<12;i++);}
}

7.1 DS18B20初始化

bit init_ds18b20(void)
{bit initflag = 0;DQ = 1;  Delay_OneWire(12);DQ = 0;  //拉低总线Delay_OneWire(80);DQ = 1;Delay_OneWire(10); //等待DS18B20拉低initflag = DQ;     //获取总线数据Delay_OneWire(5);return initflag;
}

7.2 向DS18B20写入一字节数据

void Write_DS18B20(unsigned char dat)
{unsigned char i;for(i=0;i<8;i++){DQ = 0;  //拉低DQ = dat&0x01; //获取dat最后一位数据Delay_OneWire(5);//写入数据DQ = 1;         //释放总线dat >>= 1;      //dat右移一位}Delay_OneWire(5);
}

7.3 读取DS18B20数据寄存器的值

unsigned char Read_DS18B20(void)
{unsigned char i;unsigned char dat;//循环8次,读一个字节for(i=0;i<8;i++){DQ = 0;  //拉低dat >>= 1; DQ = 1;  //释放总线if(DQ)  // 因为dat>>1位默认是0 ,如果DQ为0,就不需要赋0了{dat |= 0x80; //给dat赋1}       Delay_OneWire(5);}return dat;
}

7.4 读取温度

unsigned int  get_temp()
{ unsigned int result;float i;unsigned char low,high;init_ds18b20();Write_DS18B20(0xcc);//跳过romWrite_DS18B20(0x44);//开始转换init_ds18b20();Write_DS18B20(0xcc);//跳过romWrite_DS18B20(0xbe);//开始转换low=Read_DS18B20(); //先读取低字节high=Read_DS18B20();//再读取高字节result =high&0x0f;  //获取高字节低4位数据(1位符号位,3位数据位)result<<=8;         //左移8位result=result|low;  //或上低字节,拼成16位数据。i=result*0.0625;    //为什么乘0.0625,下面讲result=i*100;       //温度值扩大100倍,方便数码管显示return result;      //返回温度值
}

这里为什么最后的结果result需要乘以*0.0625。我们上面讲过DS18B20的数据寄存器,其实高字节的低3位才是数据位。 如高字节的最后一位本来是 2^4,假如有这个数据。则数据寄存器这个位为1,因为我们已经左移了8位,则变成了2^8.则实际上扩大了2^8/2^4=2^4=16,比实际结果扩大了16倍,所以我们需要乘以0.0625,缩小16倍。这样才能得到真实值。

所以整体原因是因为result左移8位,导致数据扩大了16倍,所以result需要乘以0.0625缩小16倍!

8.结语

这次也是通过DS18B20的芯片手册来讲解如何读取DS18B20的数据,以及最后转化为真实温度。   最后也是用代码实例来巩固理论,以及验证理论。

51单片机读取DS18B20温度传感器相关推荐

  1. 51单片机读取DS18b20温度传感器LCD1602显示例程

    很久前测试过没问题,应该绝大部分来源于网络,供大家参考,后面会发简单的可以直接拿来用的自己瞎写的一看就明白的ds18b20库 #include <reg52.h> #include < ...

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

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

  3. 51单片机读取DS18B20(单总线)

    一.DS18B20简介 DS18B20是一种常见的数字温度传感器,其控制命令和数据都是以数字信号的方式输入输出,相比较于模拟温度传感器,具有功能强大.硬件简单.易扩展.抗干扰性强等特点 测温范围: - ...

  4. 基于51单片机及DS18B20温度传感器数码管显示程序

    #include<reg52.h> #include<intrins.h> sbit DQ=P1^4;//温度采集 sbit latch1=P2^2;//段锁存 sbit la ...

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

    一. DS18B20 介绍 1.温范围-55℃-+125℃,在-10-+85℃时精度为±0.5℃. 2.可编程的分辨率为 9-12 位,对应的可分辨温度分别为 0.5℃.0.25℃. 0.125℃ 和 ...

  6. 基于51单片机的DS18B20温度控制加热降温系统设计

    基于51单片机的DS18B20温度控制加热降温系统设计 1 开发环境 2 功能说明介绍 3 仿真图 4 程序 5 原理图 6 视频讲解 7 设计报告 7.1 设计目的 7.2 概述 7.3 国内外研究 ...

  7. 51单片机_13-2 DS18B20温度报警器

    文章目录 要求 效果 资源 main函数 要求 1.利用总线OneWire与DS18B20通信 2.从DS18B20中将温度读出并显示在LCD上 3.显示温度警报界限,并在温度超过界限时,在LCD右上 ...

  8. 51单片机+oled+ds18b20检测并显示温度第三篇:配置温度检测ds18b20

    51单片机+oled+ds18b20检测并显示温度第一篇:配置温度检测ds18b20 前提: DS18B20是一线总线(单总线)"接口的温度传感器.其引脚只有三个vcc,gnd和dq vcc ...

  9. 【001】基于51单片机的DS18B20温度检测与报警装置的proteus仿真设计

    一.设计资料内容(私信获取) 1. 包含proteus仿真一份: 2. keil源代码一份: 3. 包含基于51单片机的DS18B20温度监测与报警的proteus仿真设计课程报告一份: 4. 包含基 ...

最新文章

  1. CMake一次失败应用
  2. python详细安装教程3.8-python3.8下载及安装步骤详解
  3. 开发函数计算的正确姿势——运行 Selenium Java
  4. whoosh mysql_使用WhooshAlchemy报错'function' object has no attribute 'config'
  5. WindowsAPI中W和A的区别
  6. 忽然感觉公司的工作环境有污染,墙壁和地面会散发异味,时间长了会头疼。...
  7. LeetCode 285. Inorder Successor in BST
  8. Windows下后台运行cmd启动的程序
  9. IAR下STM32工程建立基本步骤
  10. Tapestry5之国际化
  11. 我的中兴五年:加班为何成了底层员工心中永远的痛
  12. ORACLE SPA and RAT
  13. 企业为什么需要BI报表工具?
  14. 请查收!顶会AAAI 2020录用论文之自然语言处理篇
  15. OTN / SONET / SDH
  16. 中文词性标注学习笔记(三)---词性标注
  17. 项目管理的完整流程是怎样的?
  18. 我们年轻时,为什么要辛苦赚钱,这是我听过的最好回答!
  19. linux 修改xt_recent参数 ip_list_tot ip_pkt_list_tot
  20. 计蒜客 - 硬币翻转

热门文章

  1. 留美学生最便宜机票大全 [转+整理+总结]
  2. jedis连接redis哨兵
  3. VUE 2.0 插件库
  4. Java Web程序结构
  5. 真的,我发誓,永远都不会在代码中使用“User”这个单词! - Js中文网
  6. 批量获取PDF里的数据,并转换成excel表格
  7. 【RPA之家转载】一页纸说明RPA
  8. Day 21-30 :Web前端概述
  9. Latex——向下取整,向下取整
  10. 捣鼓PlantUML(二、组件图)