DS18B20使用的是一种比较特殊的传输协议,仅需一个接线口就能实现通信

前言

DS18B20独特的单线接口仅需一个端口引脚进行通讯,这让每一个学习到这里的人都感到很神奇。在这篇文章中我们将通过学习18B20的数据传输方式来为IIC协议做下铺垫。

提示:以下是本篇文章正文内容,下面案例可供参考

一、DS18B20是什么?

达拉斯DS18B20
半导体可编程分辨率的单总线®数字温度计

DS18B20 数字温度计提供9-12 位摄氏温度测量而且有一个由高低电平触发的可编程的不因电源消失而改变的报警功能。DS18B20通过一个单线接口发送或接受信息,因此在中央处理器和DS18B20 之间仅需一条连接线(加上地线)。它的测温范围为-55~+125℃,并且在-10~+85℃精度为±5℃。除此之外,DS18B20能直接从单线通讯线上汲取能量,除去了对外部电源的需求。每个 DS18B20 都有一个独特的64 位序列号,从而允许多只DS18B20 同时连在一根单线总线上;因此,很简单就可以用一个微控制器去控制很多覆盖在一大片区域的DS18B20。这一特性在HVAC 环境控制、探测建筑物、仪器或机器的温度以及过程监测和控制等方面非常有用。清翔51开发板接口:

这里值得注意的是,就算将18B20的接口接反也不会使该模块烧坏,但是会特别特别烫,不能正常工作。冬日乱手神器

二、使用步骤

1.单总线时序

DS18B20采用1-wire Bus所有数据都在一条线上传输,因此单总线协议对时序要求非常严格以确保数据的完整性。
单总线信号类型:复位脉冲、存在脉冲、写0、写1、读0、读1。所有这些信号除存在脉冲由DS18B20发出的以外其他信号都由总线控制器发出。数据传输总是从最低有效位开始。

(1).初始化时序

初始化时序里面包含了复位DS18B20和接收DS18B20返回的存在信号。
主机和DS18B20做任何通讯前都需要对其初始化。初始化期间,总线控制器拉低总线并保持480us以上挂在总线上的器件将被复位,然后释放总线,等到15-60us,此时18B20将返回一个60-240us之间的低电平存在信号。

(2).写时序

写时序分为写0时序和写1时序。
总线控制器通过控制单总线高低电平持续时间从而把逻辑1或0写DS18B20中。
总线控制器要产生一个写时序,必须将总线拉低最少1us,产生写0时序时总线必须保持低电平60~120us之间,然后释放总线,产生写1时序时在总线产生写时序后的15us内允许把总线拉高。注意:2次写周期之间至少间隔1us

(3).读时序

读时序分为读0时序和读1时序。
总线控制器通过读取由DS18B20控制的总线高低电平接收DS18B20数据。
总线控制器要产生一个读时序,必须将总线拉低至少1us,然后释放总线,在读信号开始后15us内总线控制器采样总线数据,读一位数据至少保持在60us以上。注意:2次读周期之间至少间隔1us

(4).DS18B20暂存器

根据暂存器我们可以看出,一般仅仅测量温度时,我们只需要读取byte0和1就行了,用到温度报警的话,可以继续读取后面的数据。温度寄存器的位置一开始默认为85摄氏度。下面是温度寄存器图表

温度寄存器举例:

(5).单总线访问协议及其部分ROM指令表

忽略ROM指令(CCh)这条指令允许总线控制器不用提供64 位ROM 编码就使用功能指令。例如,总线控制器可以先发出一条忽略ROM 指令,然后发出温度转换指令[44h],从而完成温度转换操作。在单点总线情况下使用该命令,器件无需发回64 位ROM 编码,从而节省了时间。如果总线上有不止一只从机,若发出忽略ROM指令,由于多只从机同时传送信号,总线上就会发生数据冲突。

(6).DS18B20功能指令表

温度转换指令(44h)

读暂存器指令(BEh)

2.代码示例

DS18B20初始化函数:

uchar DS18b20_Init(){  bit i;  DQ  =  1;  Delay_us(1);//6.5us  DQ  =  0;  Delay500us();  DQ  =  1;  Delay_us(4);//26us  i  =  DQ;  Delay_us(20);//130us  DQ  =  1;  Delay_us(1);//6.5us  return  i;}

不难看到这里的延时数字并不对应,原因是在11.0592MHz的环境下,执行每条指令的时间有区别。可以在调试界面自己调试,也可以用STC下载器自动生成

DS18B20写数据函数

void DS18b20_Write(uchar dat){  uchar i;  for(i=0;i<8;i++)  {    DQ  =  0;    _nop_();    DQ  =  dat & 0x01;    Delay_us(13);//84.5us    DQ  =  1;    _nop_();    dat  >>=1;  }}

这里用到了一个比较重要的与运算,将一个数与上“0x01”,这一句话的意思其实是这样

整个与运算符合这个思路“0&1=0”“1&1=1”“0&0=0”,dat通过右移,在最高位补0,防止与运算时高位出错。就这样重复8次就分离出了0和1发送出去了。也就是说,一般发送数据时,可以用到“dat & 0x01”DS18B20读取函数

uchar DS18b20_Red(){  uchar i,dat,j;  for(i=0;i<8;i++)  {    DQ  =  0;    _nop_();    DQ  =  1;    _nop_();    j  =  DQ;    Delay_us(13);//84.5us    dat  =  (j<<7)|(dat>>1);    DQ  =  1;    _nop_;  }  return  dat;}

这里用到了另外一个比较重要的运算——或运算

或运算的运算思路:“0|0=0”“0|1=1”“1|1=1”,先将总线上的数据赋予给j,然后j左移7位放在最高位上,dat向右移1位使最高位腾出位置。将j和dat进行一次或运算,则达到让DQ的数据放在dat的最高位的目的,而低位与0进行或运算,数据不变。

DS18B20调用函数

float DS18b20(){  int i;  uchar L,M;    DS18b20_Init();//初始化    DS18b20_Write(0xcc);//跳过ROM,因为只用到了一个DS18B20,不需要操作    DS18b20_Write(0x44);//0x44,温度转换指令    DS18b20_Init();//根据协议,再次初始化    DS18b20_Write(0xcc);    DS18b20_Write(0xbe);//读取暂存器    L  =  DS18b20_Red();//将暂存器的值赋予给L    M  =  DS18b20_Red();//将暂存器的值赋予给L    i  =  M;    i  <<=  8;//意思是将M放在高8位    i  |=  L;//这样就是16位,高八位是M,低八位是L    i  =  i  *  0.0625  *  10  +0.5;//这里*10+0.5的目的是为了取整,所以这里的i其实是真实温度的十倍return i;}

这里是我用的延时函数

void Delay500us()    //@11.0592MHz{  unsigned char i;  _nop_();  i = 497;  while (--i);}void Delay_us(uchar i)    //@11.0592MHz{  while(i--);//一次6.5us}

想调用DS18B20,可以直接这样完成

int y;y=DS18b20();

或者

unsigned char XXX函数(int x){  ...}int main(void){  XXX函数(DS18b20());}

总结

以上就是DS18B20的运用,通过这个模块的学习,不仅了解到了该传感器,还简单的了解到了或运算与运算,以及传输协议时序图

ds18b20温度转换指令_DS18B20温度传感器(附代码并浅谈与或运算)相关推荐

  1. ds18b20温度转换指令_DS18B20温度传感器使用方法以及代码

    第 7 章 DS18B20 温度传感器 7.1 温度传感器概述 温度传感器是各种传感器中最常用的一种, 早起使用的是模拟温 度传感器, 如热敏电阻, 随着环境温度的变化, 它的阻值也发生线性 变化, ...

  2. ds18b20温度转换指令_ds18b20如何读取温度?温度数据怎么换算? - 全文

    DS18B20是温度传感器,读写数据有一定的时序: 1.写操作 (1) 数据线先置低电平"0". (2) 延时确定的时间为15微秒. (3) 按从低位到高位的顺序发送字节(一次只发 ...

  3. ds18b20温度转换指令_ds18b20温度数据怎么换算? - ds18b20如何读取温度?温度数据怎么换算?...

    ds18b20温度数据怎么换算? 高五位S为符号位,分辨率为0.0625.正温度把16进制数转成10进制即可:负温度把16进制数取反后加1再转成10进制数,第一个是00FA是(15*16+10)*0. ...

  4. ds18b20温度转换指令_DS18B20传感器温度转换指令( )。

    解析: [解析题]甲骨文是哪一历史时期的代表性文字 [解析题]下列分子中含有不同长度共价键的是 [解析题]肝性脑病的诱因包括 [解析题]教学语言包括 [解析题]地球会因大气升温而灭亡. [解析题]中国 ...

  5. ds18b20温度转换指令_STM32接口DS18S20温度传感器

    关联知识 STM32 介绍 在本文中,我们将学习DS18B20温度传感器与STM32微控制器的接口. DS18B20不支持Arduino Dallas库和OneWire库. 这就是我们必须不使用库而编 ...

  6. ds18b20温度转换指令_51单片机驱动DS18B20温度传感器程序及心得

    关于DS18B20温度传感器,在没有硬件设备的辅助下,写内部程序有些困难,因为看不到实际信号波形.对于单片机,我...渐渐的有些心灰意冷..虽然掌握了1_WIRE总线,却少了很多喜悦,下雨了...它是 ...

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

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

  8. ds18b20温度转换指令_学习心得 | 温度检测工程模块划分总结与案例分析

    本文为明德扬原创文章,转载请注明出处! 很多朋友在学习FPGA的时候会发现模块划分很令人头大,今天我就通过明德扬温度检测工程来与大家分享一下本人的划分思路. 明德扬温度检测工程是基于FPGA的一个实用 ...

  9. DS18B20温度转换与显示

    单片机练习 - DS18B20温度转换与显示 最近都在学习和写单片机的程序, 今天有空又模仿DS18B20温度测量显示实验写了一个与DS18B20基于单总线通信的程序. DS18B20 数字温度传感器 ...

最新文章

  1. MyBatis第二天
  2. 发现你的身形——OpenCV图像轮廓
  3. 怎么查询交通银行卡的支付卡号?
  4. 计算机组成原理延迟时间ty,计算机组成原理之数值的机器运算培训教程方案.ppt...
  5. python实现简单小游戏_python实现简单井字棋小游戏
  6. Android RecyclerView实现九宫格效果
  7. Android Shader类简介之渲染图像示例
  8. Rainmeter后续——WIN10任务栏透明以及设置开机启动应用
  9. Springmvc提供的传递数据的方式
  10. 杭电--1009 C语言实现
  11. javaSe--integer与int
  12. 蓝桥杯 ALGO-106 算法训练 6-3判定字符位置
  13. java.util —— 工具类
  14. MOSS总弹出登陆框的问题
  15. 5个好用的搜索小技巧:搜索引擎的办法
  16. 查询今天、昨天、本周、上周、本月、上月数据
  17. Ubuntu16.04LTS +Qt+boost1.66编译错误:consuming_buffers.hpp: parse error in template argument list...
  18. Matlab使用sort进行排序---2022/04/07
  19. 央视国际节目定价发布接口规范C2
  20. 2020智能营销领域最具商业合作价值企业盘点

热门文章

  1. 吴恩达机器学习(第五章)——Logistic回归
  2. php跳转隐藏url参数,.htaccess从URL中删除index.php并隐藏参数键
  3. java如何计算时间天数差,java计算两个时间相差天数的方法汇总
  4. 在MyEclipse中导入做好的java项目出现错误The project cannot be built until build path errors are resolved
  5. C++ Primer 5th笔记(chap 13 拷贝控制)交换操作
  6. 近世代数--有限交换群--存在子群的阶是群阶的因子
  7. MySQL—不相关子查询(多行子查询)
  8. ATF(TF-A)的编译方法
  9. [architecture]-ARMV8的RAS Extension(Reliability、Availability、Serviceability)介绍
  10. 进程间通信——DLL共享节