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-02-25 20:26

51单片机温控风扇
1.本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用,可任选)单片机 2.采用DS18B20温度传感器测温,74HC573驱动数码管显示温度和风扇的档位。 3.共3个按键:设置、加、减。按一下设置可以设置上限,再按下设置下限,均可以按键加减调整。 4.利用PWM调速,当温度低于下限时,风扇不转动,当温度处于上、下限之间时1档转动(50%的转速),当温度超过上限时,全速转动。 使用说明: 一共3个按键:设置、加、减 按下设置键的时候才可以加减。 按一下设置键,是设置温度的上限,再按下设置键,是设置温度的下限,再按下设置键是退出并保存。 元件清单: 1)7*9万用板 2)风扇 3)STC89C
[单片机]
<font color='red'>51单片机</font>温控风扇
89C51单片机有几种低功耗方式
  单片机内部有一个电源管理寄存器PCON,这个寄存器的最低两位,IDL和PD这两位分别用来设定是否使单片机进入空闲模式和掉电模式。   1. 空闲模式   当单片机进入空闲模式时,除CPU处于休眠状态外,其余硬件全部处于活动状态,芯片中程序未涉及到的数据存储器和特殊功能寄存器中的数据在空闲模式期间都将保持原值。但假若定时器正在运行,那么计数器寄存器中的值还将会增加。单片机在空闲模式下可由任一个中断或硬件复位唤醒,需要注意的是,使用中断唤醒单片机时,程序从原来停止处继续运行,当使用硬件复位唤醒单片机时,程序将从头开始执行。   让单片机进入空闲模式的目的通常是为了降低系统的功耗,举个很简单的例子,大家都用过数字万用表,在正
[单片机]
8051单片机指令定义详解——ADD A,(2)
8051单片机指令定义详解 (ADD A, src-byte ) ADD A, src-byte 功能:加法。 说明:ADD指令可用于完成把src-byte所示的源操作数和累加器A的当前值相加。并将结果置于累加器A中。根据运算结果,若第7位有进位则置进位标志为1,否则清零;若第3位有进位则置辅助进位标志为1,否则清零。如果是无符号整数相加则进位置位,显示当前运算结果发生溢出。 如果第6位有进位生成而第7位没有,或第7位有进位生成而第6位没有,则置OV为1,否则OV被清零。在进位有符号整数的相加运算的时候,OV置位表示两个正整数之和为一负数,或是两个负整数之和为一正数。 本类指令的源操作数可接受4种
[单片机]
c51单片机第二课笔记
1震荡周期:就是晶振震荡一次所用的时间。也叫做时钟周期 机器周期:单片机完成一次独立的操作需要的时间。是震荡周期的12倍。 指令周期:cpu完成一次完整的操作需要的所有时间,有单周期指令,双周期指令等。 2 用循环左移,循环右移指令 实现流水灯。 int temp; temp=0xfe; P1=temp; temp=_crol_(temp,1); 有关循环指令包含在intrins.h头文件中。 3 对蜂鸣器的操作,类似与对led的操作,对相应端口输出第电平。关于蜂鸣器的数据有待补充。 4 共阴极led显示器16进制编码表 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77
[单片机]
关于51单片机学习的一些小建议
相信有不少老铁对如何入门51单片机一直找不到适合自己的方法,通常是看看网上的课程,然后利用开发板进行相关实验观察现象。然后通过一步一步学习最后成功入门。但这只是能够使你能够尽快对单片机有一定的认识。如果想完完全全地学懂单片机还是要懂一些基本的,基础的知识。 比如学单片机分为两个部分:一是硬件部分,二是软件部分。无论你是做硬件方面,还是软件方面。你都需要学习这两方面,只是有所侧重而已。最好的做法就是将两部分结合起来,综合学习。就我本人而言,我是做软件方面的的,除了编写程序外还要利用基本的硬件知识结合C语言来进行更深层次的学习。举一个例子,编写程序来点亮一个LED灯。 程序如下: #include reg51.h
[单片机]
基于51单片机的智能营养秤系统设计与实现
一、项目背景 随着人们生活水平和健康意识的提高,越来越多的人开始注重自己的饮食健康。在此背景下,智能营养秤系统应运而生,成为了一种非常实用的工具。本项目基于51单片机设计和实现一种智能营养秤系统,通过该系统可准确地测量食物的重量并计算其热量、蛋白质、脂肪、碳水化合物等营养成分含量。 当前系统采用了STC89C52单片机作为主控芯片,预置了多种食材的营养成分数据。用户只需要使用矩阵键盘输入食材编号,将需要称重的食材放置在重力传感器上进行依次称重,系统就可以自动计算出所有食材的各类营养含量总值,并通过液晶屏显示出来。同时,系统根据预设的营养指标,对不达标或超标的食材进行对应的声光提示,提醒用户注意饮食健康。 当前系统还配备了无
[单片机]
基于<font color='red'>51单片机</font>的智能营养秤系统设计与实现
51单片机I/O模拟I2C 程序
/ 此程序是I2C操作平台(主方式的软件平台)的底层的C子程序,如发送数据 及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,它很方便的 与用户程序连接并扩展..... 经过本人验,绝对好用! / bit ack; /*应答标志位*/ /* 起动总线函数 函数原型: void Start_I2c(); 功能: 启动I2C总线,即发送I2C起始条件. / void Start_I2c() { SDA=1; /*发送起始条件的数据信号*/ _Nop(); SCL=1; _Nop(); /*起始条件建立时间大于4.7u
[单片机]
51单片机-独立按键控制LED灯
1.硬件设计 轻触按键:相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开;原理图如下: 2.软件设计 2.1.独立按键控制LED闪烁 功能需求:按下按键,LED点亮;松开按键,LED熄灭;可单个按键控制,也可多个按键控制 程序设计:分析原理图,确定要通过控制哪个按键去决定LED亮灭;单个按键K1,控制LED亮灭的程序如下: #include REGX52.H void main() { while(1) { if(P3_1==0)//通过控制K1按键,去控制LED闪烁 //P3_0==0,即是控制K2 { P2_0=
[单片机]
<font color='red'>51单片机</font>-独立按键控制LED灯

推荐帖子

JTAG连接线
大家有没有什么好的办法解决jtag连接线不稳定的问题,在线调试的时候轻轻一碰就断了,我的jtag14pin转10pin,感觉就是Jtag的插线头松动,这种插线头好不稳定,严重影响效率。JTAG连接线换了新的插头,做了个新的14pin转10pin,问题解决,连接稳定。看来还是连接不稳定的问题!已解决解决了就好呵呵回复沙发独孤求败2030的帖子
独孤求败2030 微控制器 MCU
?编写WINCE5.0下摄像头应用程序
?编写WINCE5.0下摄像头应用程序路过不知LZ是什么意思说出具体问题来啊是不是像我这样的问题阿?《编写WINCE5.0下摄像头应用程序》http://topic.eeworld.net/u/20090324/08/6d13fa10-a840-4f53-8b63-3b58bd5ddbbd.html?seed=3165588加放DLL修改BIB及REG文件编译神贴了。。。什么都没说。。。驱动写好把视频文件弄出来。然后跑跑就知道了。
gl417270208 WindowsCE
弱弱地问一下,大家用vivado吗?体验如何,习惯不?
以前一直用ISE,vivado真心用不习惯啊\0\0\0eeworldpostqq弱弱地问一下,大家用vivado吗?体验如何,习惯不?ise已经是最后一个版本了。以后不再更新尽量熟悉熟悉吧
xiefei FPGA/CPLD
CMTI参数对于隔离驱动器选型的重要性
什么是CMTI?CMTI,Commonmodetransientimmunity,是隔离产品(包括iCouplerdigitalisolators和optocouplers)最重要的指标之一。CMTI共模瞬变抗扰度,指是指瞬态穿过隔离层以破坏驱动器输出状态所需的最低上升或下降dV/dt(kV/sorV/ns),如图:图1.CMTI定义CMTI分为静态和动态。静态是指把输入引脚连逻辑高电平或者低电平,然后模拟施加共模瞬变,理论上在CMTI规格以内的冲击都
alan000345 TI技术论坛
计算机并口与STC89C51连接 之间需要什么保护或者电平转换吗?
计算机并口与STC89C51连接之间需要什么保护或者电平转换吗?如果需要和串口中的MAX232意义一样吗?只是保护还是需要电平转换??计算机并口与STC89C51连接之间需要什么保护或者电平转换吗?你用并口和单片机相连干什么呢?查查并口的电平吧一般应该加个74ls245之类的双向总线收发器~!可以保护计算机的并口!加个244或245做下驱动和隔离就可以。244是单向的;245是双向的;这样就可以保护2端的设备。非常感谢大家作保护,不是电平转换,可以加电阻,便宜
fjzhangchengyao 嵌入式系统
【正点原子RV1126 AI Linux开发板】 GPIO输出测试
学习下测试RV1126的GPIO输出测试,点亮LED灯。一、硬件电路测试使用GPIO0_A1端口核心板部分GPIO0_A1端口电平电路端口输出电平是1.8V,为了方便测试常用的3.3V外设,加入电平转换电路二、程序2.1、gpio_out.c/***************************************************************Copyright©ALIE
TL-LED 国产芯片交流
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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