51单片机入门 - DS18B20温度传感器

发布者:老卫最新更新时间:2022-04-22 来源: eefocus关键字:51单片机  DS18B20  温度传感器 手机看文章 扫描二维码
随时随地手机看文章

DS18B20——温度传感器,单片机可以通过 1-Wire 和 DS18B20 进行通 信,最终将温度读出。1-Wire 总线的硬件接口很简单,只需要把 18B20 的数据引脚和单片 机的一个 IO 口接上就可以通信。最高12为的温度存储值,补码形式存储。
2字节,LSB低字节,MSB高字节,-55~125


1、初始化

检测存在脉冲:总线上存在DS18B20,总线会根据时序要求返回一个低电平脉冲。单片机要拉低这个引脚,持续大概 480us到960us之间 的时间即可,我们的程序中持续了 500us。然后,单片机释放总线,就是给高电平,DS18B20 等待大概 15 到 60us 后,会主动拉低这个引脚大概是 60 到 240us,而后 DS18B20 会主动释放总线,这样 IO 口会被上拉电阻自动拉高。


2、ROM操作指令

Skip ROM(跳过ROM):0xCC。当总线上只有一个器件的时候,可以跳过 ROM,不进行ROM 检测。


3、RAM存储器操作指令

Read Scratchpad(读暂存寄存器):0xBE—— DS18B20 的温度数据是 2 个字节,我们读取数据的时候,先 读取到的是低字节的低位,读完了第一个字节后,再读高字节的低位,一直到两个字节全部 读取完毕。


Convert Temperature(启动温度转换):0x44—— 12位最大的转换时间是 750ms


4、DS18B20的位写时序

当要给 DS18B20 写入‘0’的时候,单片机直接将引脚拉低,持续时间大于 60us 小于120us 就可以了。图上显示的意思是,单片机先拉低 15us 之后,DS18B20 会在从 15us 到60us 之间的时间来读取这一位,DS18B20 最早会 15us 的时刻读取,典型值是 30us 的时刻读取,最多不会超过 60us,DS18B20 必然读取完毕,所以持续时间超过 60us 即可。

       

当要给DS18B20 写入‘1’的时候,单片机先将这个引脚拉低,拉低时间大于 1us,然后马上释放总线,即拉高引脚,并且持续时间也要大于 60us。和写‘0’类似的是,DS18B20 会在 15 到 60us 之间来读取这个‘1’。


5、DS18B20的位读时序

单片机首先要拉低这个引脚,并且至少保持1us 的时间,然后释放引脚,释放完毕后要尽快读取。从拉低这个引脚到读取引脚状态,不能超过 15us。大家从图 16-17 可以看出来,主机采样时间,也就是 MASTER SAMPLES,是 在15us 之内必须完成的。


#include

 

#include

 

typedef unsigned char uchar;

 

sbit IO_18B20 = P3 ^ 2; //DS18B20通信引脚

 

/* 软件延时函数,延时时间(t*10)us */

 

void DelayX10us(uchar t)

 

{

 

  do

 

  {

 

    _nop_();

 

    _nop_();

 

    _nop_();

 

    _nop_();

 

    _nop_();

 

    _nop_();

 

    _nop_();

 

    _nop_();

 

  }

 

  while (--t);

 

}

 

/* 复位总线,获取存在脉冲,以启动一次读写操作*/

 

bit Get18B20Ack()

 

{

 

  bit ack;

 

 

 

  EA = 0;  //禁止总中断

 

  IO_18B20 = 0;     //产生500us复位脉冲

 

  DelayX10us(50);

 

  IO_18B20 = 1;

 

  DelayX10us(6);    //延时60us

 

  ack = IO_18B20;   //读取存在脉冲

 

  while(!IO_18B20); //等待存在脉冲结束

 

  EA = 1;  //重新使能总中断

 

 

 

  return ack;

 

}

 

/* 向DS18B20写入一个字节,dat-待写入字节 */

 

void Write18B20(uchar dat)

 

{

 

  uchar mask;

 

 

 

  EA = 0;  //禁止总中断

 

  for (mask = 0x01; mask != 0; mask <<= 1) //低位在先,依次移出8个bit

 

  {

 

    IO_18B20 = 0;         //产生2us低电平脉冲

 

    _nop_();

 

    _nop_();

 

    if ((mask & dat) == 0) //输出该bit值

 

    {

 

      IO_18B20 = 0;

 

    }

 

    else

 

    {

 

      IO_18B20 = 1;

 

    }

 

    DelayX10us(6);        //延时60us

 

    IO_18B20 = 1;         //拉高通信引脚

 

  }

 

  EA = 1;  //重新使能总中断

 

}

 

/* 从DS18B20读取一个字节,返回值-读到的字节 */

 

uchar Read18B20()

 

{

 

  uchar dat;

 

  uchar mask;

 

 

 

  EA = 0;  //禁止总中断

 

  for (mask = 0x01; mask != 0; mask <<= 1) //低位在先,依次采集8个bit

 

  {

 

    IO_18B20 = 0;         //产生2us低电平脉冲

 

    _nop_();

 

    _nop_();

 

    IO_18B20 = 1;         //结束低电平脉冲,等待18B20输出数据

 

    _nop_();              //延时2us

 

    _nop_();

 

    if (!IO_18B20)        //读取通信引脚上的值

 

    {

 

      dat &= ~mask;

 

    }

 

    else

 

    {

 

      dat |= mask;

 

    }

 

    DelayX10us(6);        //再延时60us

 

  }

 

  EA = 1;  //重新使能总中断

 

 

 

  return dat;

 

}

 

/* 启动一次18B20温度转换,返回值-表示是否启动成功 */

 

bit Start18B20()

 

{

 

  bit ack;

 

 

 

  ack = Get18B20Ack();   //执行总线复位,并获取18B20应答

 

  if (ack == 0)          //如18B20正确应答,则启动一次转换

 

  {

 

    Write18B20(0xCC);  //跳过ROM操作

 

    Write18B20(0x44);  //启动一次温度转换

 

  }

 

  return ~ack;   //ack==0表示操作成功,所以返回值对其取反

 

}

 

/* 读取DS18B20转换的温度值,返回值-表示是否读取成功 */

 

bit Get18B20Temp(int *temp)

 

{

 

  bit ack;

 

  uchar LSB, MSB; //16bit温度值的低字节和高字节

 

 

 

  ack = Get18B20Ack();    //执行总线复位,并获取18B20应答

 

  if (ack == 0)           //如18B20正确应答,则读取温度值

 

  {

 

    Write18B20(0xCC);   //跳过ROM操作

 

    Write18B20(0xBE);   //发送读命令

 

    LSB = Read18B20();  //读温度值的低字节

 

    MSB = Read18B20();  //读温度值的高字节

 

    *temp = ((int)MSB << 8) + LSB; //合成为16bit整型数

 

  }

 

  return ~ack;  //ack==0表示操作应答,所以返回值为其取反值

 

}


关键字:51单片机  DS18B20  温度传感器 引用地址:51单片机入门 - DS18B20温度传感器

上一篇:51单片机入门 - IIC(I2C)总线
下一篇:51单片机入门 - SPI总线

推荐阅读最新更新时间:2024-11-11 11:54

51单片机中断系统实验
一、实验内容 INT0端接单次脉冲发生器。按一次脉冲产生一次中断,CPU使P1.0状态发生一次反转,P1.0接LED灯,以查看信号反转。 根据实验内容编写一个程序,并在实验系统上调试和验证。 二、仿真图 三、代码 C语言实现: sbit LED=P1^0; void INT0_IN(); void main() { LED=0; INT0_IN(); while(1) ; } void INT0_IN() { EA=1;//总中断打开 EX0=1;//外部中断0 打开 IT0=0;//负边沿触发 } void exter0() interrupt 0 { IE0
[单片机]
<font color='red'>51单片机</font>中断系统实验
51单片机逻辑指令编程举例
下面给出一个例子练习逻辑 指令 ,本程序可以实验板或Keil C51仿真软件上运行,注意观察程序运行结果。 MOV A,#24H MOV R0,#37H ORL A,R0 XRL A,#29H MOV 35H,#10H ORL 35H,#29H MOV R0,#35H ANL A,@R0
[单片机]
基于51单片机的直流数字电压表(0-5V)
利用串行A/D转换器TLC549对输入信号电压源进行采集转换成数字信号给 51单片机 ,经单片机进行数据处理后给1602液晶显示。 误差小于1%. #include reg52.h #include intrins.h #define uint unsigned int #define uchar unsigned char uchar LCD ; //电压数据转换成LCD1602液晶字符显示 uint Volt; sbit DO = P1^0; //时钟 sbit CS = P1^1; //片选 sbit CLK = P1^2; //数据输出 sbit RS = P2^0; //160
[单片机]
基于<font color='red'>51单片机</font>的直流数字电压表(0-5V)
51单片机头文件reg51.h学习心得
1)“文件包含”处理概念 所谓“文件包含”是指在一个文件内将另外一个文件的内容全部包含进来。因为被包含的文件中的一些定义和命令使用的频率很高,几乎每个程序中都可能要用到,为了提高编程效率,减少编程人员的重得劳动,将这些定义和命令单独组成一个文件,如reg51.h,然后用#include reg51.h 包含进来就可以了,这个就相当于工业上的标准零件,拿来直接用就可以了。 2)寄存器地址及位地址声明的原因 其实相当于为这些内存地址取个名字。reg51.h里面主要是一些特殊功能寄存器的地址声明,对可以位寻址的,还包括一些位地址的声明,如果如sfr P1=0x80; sfr IE=0xA8;sbit EA=0xAF等。
[单片机]
51单片机基础之继电器
继电器:简单的说继电器就是小电流、小电压控制大电流、大电压。这就是常见的继电器,这个是一路的。 工作参数:这里的控制端输入电压最少需要5V,最大24V,以及相应参数可见。 接线:有两种方式,一种是常开,另一种是常闭。 触发方式:有高电平触发,还有低电平触发方式。继电器上面有跳线帽,可以自己换。 注意:上面说了继电器是小电流小电压控制大电压大电流,所以就必须接两个电源,一端接的是继电器输入,另一端就是大电流大电压负载端,我们需要通过控制引脚来让负载工作或者停止工作。 如图:按照这个图连线,按照需要自己选择常开还是常闭。 说明:我使用的单片机是有多个电源的,所以我用一个单片机,实现了两个电源端。 这个是效果:
[单片机]
<font color='red'>51单片机</font>基础之继电器
ADC0809与51单片机的连接方式
模数转换器定位为单片机的外部RAM单元,因此与单片机的连接就有很多种。大体上说ADC0809在整个单片机系统中是作为外部RAM的一个单元定位的。具体到某一个连接方式,定位又有区别。adc0809与单片机典型的连接有以下三种: ADC0809与51单片机的第一种连接方式 这是数据线对数据线、地址线对地址线的标准连接方式,如图2.2所示。由于ADC0809片内没有时钟,可利用单片机提供的地址锁存信号ALE经D触发器2分频后获得,ALE引脚的频率是单片机时钟频率的1/6,如果单片机时钟频率采用6MHz,则ALE引脚的输出频率为1MHz,再经过2分频后为500kHz,恰好符合0809对时钟的要求。 由于ADC0809具有输出
[单片机]
ADC0809与<font color='red'>51单片机</font>的连接方式
基于51单片机的俄罗斯方块
一.硬件方案 本设计采用STC89C52RC单片机作为系统的芯片,实现人机交互、娱乐等功能。选用LCD12864实现俄罗斯方块游戏界面、图形显示;选用独立按键实现游戏控制。本设计实现的基本功能是:用按键控制目标方块的变换与移动;消除一行并计分,方块堆满时结束游戏等俄罗斯方块的基本功能。 硬件主要由51单片机+最小系统电路+按键电路+12864液晶显示电路设计而成。 二.设计功能 (1)主控芯片基于STC89C51/52(与AT89S51/52、AT89C51/52通用)单片机; (2)采用LCD12864液晶显示屏; (3)共有7个按键,除复位按键外,其余六个按键分别为:左移、右移、变形、下降、暂停、确定; (4)设计有0
[单片机]
基于<font color='red'>51单片机</font>的俄罗斯方块
51单片机定时器与计数器讲解
在现实生产生活中,如产品计数、转速测量、时间操控等多种场合,常常需要用到定时器和计数器的功能。8051单片机内置了两个定时器和计数器,可以用来实现定时和计数的功能,下面让我们来一起学习一下51单片机中的定时器与计数器吧! 一、定时器与计数器的结构与功能 其实单片机中的定时器和计数器其实是同一个物理的电子元件。只不过计数器记录的是单片机外部发生的事情(接受的是外部脉冲),而定时器则是由单片机自身提供的一个非常稳定的计数器,这个稳定的计数器就是单片机上连接的晶振部件,这点我们是需要与这个定时器区分一下,以免混淆了。 关于8051系列单片机有两个定时器:T0和T1,分别称为定时器和定时器T1,这两个定时器都是16位的定时器/计数器;
[单片机]
<font color='red'>51单片机</font>定时器与计数器讲解

推荐帖子

DSP定点运算函数集c语言实现
本代码通过了vc6.0编译完成了定点运算的函数实现,其中包含加减乘除和一些非线性运算,log的快速查表算法。DSP定点运算函数集c语言实现学习者
决意沧海 DSP 与 ARM 处理器
负载点DC-DC转换器解决电压精度、效率和延迟问题
问题:为什么使用DC-DC转换器应尽可能靠近负载的负载点(POL)电源?答案:效率和精度是两大优势,但实现POL转换需要特别注意稳压器设计。接近电源。这是提高电源轨的电压精度、效率和动态响应的最佳方法之一。负载点转换器是一种电源DC-DC转换器,放置在尽可能靠近负载的位置,以接近电源。因POL转换器受益的应用包括高性能CPU、SoC和FPGA它们对功率级的要求都越来越高。例如,在汽车应用中,高级驾驶员辅助系统(ADAS)例如雷达、激光雷达和视觉系统
qwqwqw2088 电源技术
功能方块图中的符号问题(开关电源电流控制问题)
如图片所示的功能框图中圆圈内一个加号是什么运算或控制逻辑?电流传感器如何控制开关电流呢?是通过控制锯齿波的频率么,是怎么控制频率呢?请知道的高手指点下小弟,谢谢!功能方块图中的符号问题(开关电源电流控制问题)那个+号,就是相加的意思。在电路实现上,对模拟电路,可以直接把它们混合即可(当然有其它更复杂的办法),电流采样后,根据电流的大小,控制锯齿波的基础电平,送往比较器后,就得到与电流大小相关的PWM波。给你个图片吧 锯齿波和直流电平经过比较器才能变成占空比不一致的方波吧(你
Gjinbiao 模拟电子
htssop-20封装
求官方出处,自己画的想校验谢谢htssop-20封装如果是TI的器件,可以利用TI的封装生成软件生成,这里提供一个ssop-28封装的,如可以建议修改为20的TI的器件,建议用这个方法,但需要下载一个软件https://bbs.eeworld.com.cn/thread-428523-1-1.htmlti网站有现成的,http://www.ti.com.cn/product/cn/LM5118/quality但是我我就是怕不标准。。想在ad自带的库中找到。结果只找到ssop
风致痕 PCB设计
数字电路学习基础
兄弟没钱了,上传点东西数字电路学习基础好东西啊,先下了学习一下吧!好东西,谢谢分享!JackKilby是为数不多的几个人之一,他可以环顾世界并对自己说‘我改变了世界’”。谢谢啊,正是需要的,下载来看看XIEXIE.........
csh0605 模拟电子
【翌创ET6001测评】初识篇
翌创ET6001开发板是一款基于ETM7F60011DPX2器件的低成本评估板,由于其配置的外设较少,其基本功能近于一个最小系统,这便为功能扩展提供了方便,从而可以免除系统资源被占用的问题。翌创ET6001开发板无论是包装还是开发板自身都采用喜庆的红色,见图1和图2所示。从器件布局看,该开发板以单面器件布局为主,各功能单元的布局见图3所示。图1外包装图2开发板图3功能布局EVB开发板在供电方面提供了2种方式,即通过Type-CU
jinglixixi 国产芯片交流
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved