一、概述:Ds18b20是最常见的数字温度传感器,有着诸多优点,比如:体积小;精度高(12位时精度可以达到0.625摄氏度,出厂默认12位);接线简单,无需外围短路;封装形式多样,能满足不同应用需求等等。但是,“鱼与熊掌不可兼得”,接线简单的同时,带来的问题便是传感器复杂的工作时序。Ds18b20工作时序十分复杂,信号传输只在微妙之间,稍有不慎(例如延时函数的使用不够恰当)就可能导致其整个传感器的工作时序混乱。因此,在写Ds18b20的控制程序时一定要弄清工作时序并使用合适的延时函数。

二、引脚图

从上图可以看出Ds18b20的接线得却十分简单,但需要注意的是,当传感器与单片机相连时,要加一个4.7K的上拉电阻(事实证明要求没那么严格,5K左右即可)。

三、工作指令

1.温度转换指令:0x44(即44H),启动Ds18b20启动转换温度

2.读暂存器指令:0xBE(即BEH),读取暂存器中的九字节数据

3.写暂存器置零:0x4E(即4EH),把数据写入暂存器的TH、TL

4.赋值暂存器:0x48(即48H),把暂存器中的TH、TL写入EEPROM中

5.读电源供电方式:0xB4(即B4H):启动Ds18b20,发送电源供电方式

6.重调EEPROM:0xB8(即B8H):把EEPROM中的TH、TL读至暂存器

四、通过单总线访问Ds18b20的时序

五、操作时序

1.复位操作

2.“读”操作

3.“写”操作

六、例程(例程均为自己编写且通过验证成功)

/*所用单片机型号为STC89C52RC,晶振为11.0592MHz*/

#include<reg52.h>

#include<intrins.h>

sbit Bus=P1^1;//数据单总线

unsigned int Ds_Result();//返回最终结果
bit DS_Init();//初始化子函数
void Ds_Write(unsigned char dat);//“写”子函数(用于向总线写命令)
unsigned char Ds_Read();//“读”子函数(用于从总线读值)
void Ds_Change();//开始转换温度
unsigned int Get_Temp();//获取温度子函数
void Delay10us(unsigned int t);//延时10*t微秒

void Delay1ms(unsigned int t);

/*ds18b20 10*t延时函数*/
void Delay10us(unsigned int t)
{
    unsigned int i;
    for(i=t;i>0;i--)
    {
        _nop_();  _nop_();
        _nop_();  _nop_();
        _nop_();  _nop_();
    }
}

/*dsb8b20 1ms延时函数*/
void Delay1ms(unsigned int t)   //误差 0us
{
    unsigned char a,b,c;
for(t;t>0;t--)
    for(c=1;c>0;c--)
        for(b=142;b>0;b--)
            for(a=2;a>0;a--);
}
/*ds18b20初始化*/
bit Ds_Init()
{
bit ack;
Bus=0;
Delay10us(60);//最小480,最大960
Bus=1;
Delay10us(6);//15-60us
while(Bus==0);
Bus=1;//让传感器释放总线,避免影响下一步
return ack;//ack为0则响应成功
}

/*ds18b20写时序*/
void Ds_Write(unsigned char dat)//一个写周期为60-120us,主机在15--45us内对信号采样
{
unsigned char mask;
for(mask=0x01;mask!=0;mask<<=1)
{

Bus=0;
_nop_();
if((mask&dat)==0)
{
Bus=0;
}
else
{
Bus=1;
}
Delay10us(6);//15-60us采样
Bus=1;
_nop_();
_nop_();
}
}

/*ds18b20读时序*/
unsigned char Ds_Read()
{
unsigned char dat=0;
unsigned char mask,fmask;
for(mask=0x01;mask!=0;mask<<=1)//一个周期需要至少60us,但采样要在15us内完成
{
Bus=0;
_nop_();
Bus=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
if(Bus==0)//读0
{
fmask=~mask;
dat=dat&fmask;
}
else
{
dat|=mask;
}
Delay10us(5);
Bus=1;

}
return dat;
}

/*转换温度子函数*/
void Ds_Change()
{
Ds_Init();
Delay1ms(1);
Ds_Write(0xCC);//跳过ROM寻址
Ds_Write(0x44);//启动一次温度转换

}

/*ds18b20获取温度子函数*/
unsigned int Get_Temp()
{
unsigned int temp=0;
unsigned char LSB,MSB;//用来储存数据的第八位与高八位
Ds_Init();
Delay1ms(1);
Ds_Write(0xCC);//跳过寻址
Ds_Write(0xBE);//发送读值命令·
LSB=Ds_Read();
MSB=Ds_Read();
temp=MSB;
temp<<=8;
temp|=LSB;
return temp;
}

/*ds18b20  返回最终结果子函数*/
unsigned int Ds_Result()
{
float tp;
unsigned int temp;
Delay1ms(10);//10ms度过不稳定期
         Ds_Change();//转换温度
        Delay1ms(1000);//延时1s等待转化
        temp=Get_Temp();
        tp=temp;
        temp=tp*0.0625;
        return temp;//最终结果为temp
}

int main()

{

unsigned int temp;

temp=Ds_Result();//该值即为结果

}

左肩理想,右肩担当。君子不怨永远不会停下脚步!

Ds18b20的使用相关推荐

  1. 使用 Elixir 开发嵌入式系统: 使用DS18B20传感器测量体温

    文本, 我会使用一个Elixir实现的模块函数去读取连接到树莓派的DS18B20温度传感器的温度数值. 文本假设你熟悉 数字电路基础 Elixir编程基础 视频演示 https://v.qq.com/ ...

  2. DS18B20 理解与操作源码

    最近研究了DS18B20 数字温度传感器,它的时序控制确实有点小烦躁,参看了很多资料. 其中http://www.cnblogs.com/fengmk2/archive/2007/03/11/6709 ...

  3. 单片机18b20c语言程序,AVR单片机控制DS18B20的示例C程序

    原标题:AVR单片机控制DS18B20的示例C程序 #include #include #include #include unsigned char data_H, data_L,wendu; un ...

  4. ds18b20温度传感器 lcd C语言,C程序控制18B20测温及LCD显示源码打包

    源代码中包括三个实验的源程序:18B20+1602LCD温度实验,18B20测温1602LCD显示,18b20测温数码管显示实验. 18b20测温数码管显示实验DS18B20的读写程序,数据脚P3.3 ...

  5. ds18b20温度转换指令_DS18B20温度传感器(附代码并浅谈与或运算)

    DS18B20使用的是一种比较特殊的传输协议,仅需一个接线口就能实现通信 前言 DS18B20独特的单线接口仅需一个端口引脚进行通讯,这让每一个学习到这里的人都感到很神奇.在这篇文章中我们将通过学习1 ...

  6. STM32F4 HAL库开发 -- 温度传感器(DS18B20)

    参看:<嵌入式-STM32开发指南>第三部分 外设篇 - 第2章 温度传感器DS18B20 这篇文章讲的非常详细了. 一.简介 1.概述 DS18B20 是 DALLAS 最新单线数字温度 ...

  7. micopython 18b20_micropython typboaed v202连接DS18B20测温小实验

    分享个简单的小实验DS18B20测温模块获取温度,各种材料某宝都有(很便宜).接下来让我们一起学习讨论吧. 实验器材 TPYBoard v202 1块 DS18B20温度传感器1个 DS18B20 扩 ...

  8. ds18b20温度转换指令_【Proteus】DS18B20简易温控器

    前言 DS18B20是单片机课设或者仿真项目中一个比较常用的数字温度传感器,因此使用DS18B20仿真一个简易的温控器,超过温度就打开风扇,低于某温度就用继电器打开加热丝.整个程序我都会附在最后,如果 ...

  9. DS18B20读数错误排除

    描述: 同时测试了好几个板子,都接了DS18B20传感器.但,有的板子读取的DS18B20温度值正确,有的读取错误. 原因查找: 以为是有的传感器坏了,但测试后发现并不是. 又以为是DS18B20需要 ...

  10. ds18b20温度传感器 lcd C语言,基于AVR单片机的18B20温度传感器及LCD显示的C语言程序设计...

    ***************************************************/ #include #include #define uchar unsigned char # ...

最新文章

  1. 只要可能,就缓存数据和页输出
  2. python 写cs程序_Python cs.cmdutils包_程序模块 - PyPI - Python中文网
  3. 深度卷积网络CNN与图像语义分割
  4. C++中函数模板template和函数参数为指针,且有返回值的结合使用
  5. 已安装的sql怎么添加功能_微信群管理工具有哪些功能?怎么在社群中添加微信小助手?...
  6. EJB3.0学习笔记---理解远程调用服务端和本地调用服务端的区别
  7. 从零开始山寨Caffe·贰:主存模型
  8. 刚刚创业的你 这几点让你的公司不断前进
  9. RK3288_Android7.1调试以太网ethernet
  10. 研究发现,近一半生产容器存在漏洞
  11. 针对小游戏中PNG、JPG压缩工具优化(nodejs)
  12. 考软考信息处理技术员之前,这些问题你要知道!
  13. 【计组】5.4 控制器设计
  14. 社区计算机基础知识,社区计算机基础知识试题及答案.doc
  15. 【工控老马】洗衣机PLC程序控制系统设计详解
  16. while循环是否加分号
  17. 微信视频号下载短视频的步骤
  18. c语言md5函数 linux,【转】MD5校验C语言实现源代码
  19. ICC2: channel自动加soft blk方法
  20. 微信小程序“奶茶屋”的设计与实现

热门文章

  1. js将人民币小写金额转换为大写
  2. Java 十大常用框架
  3. word批量转PDF怎么转
  4. 联想杀毒显示 你的计算机有风险,都在说联想电脑管家,那我们也来看看这联想杀毒是怎么一回事-电脑管家怎么样...
  5. 原生JavaScript + Canvas实现图片局部放大器
  6. [内核内存] [arm64] 内存初始化4---bootm_init
  7. 2021年安全员-B证新版试题及安全员-B证试题及解析
  8. 【非标自动化】2017年的最NB的非标自动化内容都在这了
  9. Angular Compile Error NG6002
  10. 北京理工大学计算机学院嵩天,嵩天教授做客我校信息学院