首先使用单总线驱动DS18B20有三个步骤

DS18B20
器件的初始化
ROM commond
Function Command

这里我们经常使用的是初始化和功能命令字,对于第二项,是为了区分多个单总线器件使用的,所有我们有时候,就直接选择,跳过ROM Command,这里的意思是写一个跳过的ROM COMMAND,不是直接就不写,因为规定了必须要写

ROM COMMAND

这里就写一个使用到的0xCC,一共有5个,大家可以去看一下文档

FUNCTION COMMAND


这里我们经常使用到的是第一个和第二个

  • 第一个进行启动转换,将温度的数据存储到存储器中
  • 第二个就是执行读操作,将存储器中的数据进行取出,当然可以读取的数据不止,Byte0和Byte1,也可以将剩下的也读取到。


对于有些寄存器的功能我现在我不是特别清楚,我们最经常使用的寄存器,就是Byte0和Byte1。
其中存放的内容就是对应转换的温度数据

以上图片就是关于Byte0和Byte1的位权,感觉还是很一目了然的。

时序的一些注意事项

初始化时序

  • 首先需要将总线进行拉低,维持低电平时间大于480us
  • 然后释放总线(也就是将电平拉高),维持时间大于60us
  • 然后DS18B20就会产生一个应答信号(将总线进行拉低,维持时间>60us,小于240us)
  • 这时候,我们可以进行检测总线上的值,看器件是否被初始化(当然也可以忽略)

写时序

写时序
写0时序
写1时序

写一时序

  • 首先需要先将总线进行拉低,产生一个下降沿
  • 然后在15us之内将总线进行拉高
  • 然后再维持大于45us的时间

写零时序

  • 首先将总线进行拉低,产生一个下降沿
  • 然后维持低电平60us时间
    对于要写的数据,一定要在写信号之后的15us之内,送到总线上,因为DS18B20是在15-60us之间进行采样的

读时序

  • 首先还是将总线进行拉低(大约维持时间1us)
  • 然后DS18B20就会将数据送到总线上(只有在15us之内,才能保证数据是有效的)
  • 所以我们需要在15us之内将总线上的数据进行取走

下面就是根据时序写的驱动代码

/*   *单总线驱动程序*SL: single line *单总线协议是先写入低位数据,再写入高位数据
*/#include"intrins.h"
#include"reg52.h"
sbit DQ = P1^4;void Delay5us()     //@12.000MHz
{unsigned char i;_nop_();_nop_();i = 12;while (--i);
}
void Delay20us()        //@12.000MHz
{unsigned char i;_nop_();_nop_();i = 57;while (--i);
}void Delay500us()      //@12.000MHz
{unsigned char i, j;i = 6;j = 211;do{while (--j);} while (--i);
}//初始化单总线
bit init_onewire()
{bit init_flag = 1;DQ = 1;Delay20us();DQ = 0;Delay500us();   DQ = 1; Delay500us();  //等待DS18B20进行检测init_flag = DQ;return init_flag;
}//向DS18B20写入一个byte的数据
void write_onewire(unsigned char  dat)
{unsigned char i;for(i=0; i<8; i++){DQ = 0;DQ = dat & 0x01; Delay20us();Delay20us();DQ = 1; dat >>= 1;}Delay5us();
}unsigned char read_onewire()
{unsigned char example, i;for(i=0; i<8; i++){DQ = 0;example >>=1;DQ = 1;     //模拟释放总线 if(DQ)example |= 0x80; Delay20us();Delay20us();}return example;
}
float r_temperature_f( )
{unsigned int temp1 , temp2 ;float temperature ;//init_ds18b20( );init_onewire();//Write_DS18B20( 0xcc );//Write_DS18B20( 0x44 );write_onewire(0xcc);write_onewire(0x44);Delay500us();//init_ds18b20( ) ;init_onewire();//Write_DS18B20( 0xcc ) ;//Write_DS18B20( 0xbe ) ;write_onewire(0xcc);write_onewire(0xbe);temp1 = read_onewire( ) ;temp2 = read_onewire( ) ;temp2 <<= 8 ;temp2 |= temp1 ;temperature = temp2 * 0.0625 ;return temperature ;
}

这其实只是我的个人理解,如果有错误,还请大家指出,欢迎留言

关于51单片机驱动DS18B20代码的感想相关推荐

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

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

  2. K_A11_002 基于STM32等单片机驱动DS18B20串口与OLED0.96双显示

    K_A11_002 基于STM32等单片机驱动DS18B20 串口与OLED0.96双显示 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 时序 对应程序: 四.部分代码说明 1.接 ...

  3. 51单片机驱动——LCD1602

    51单片机驱动--LCD1602 1.描述 51单片机控制LCD1602屏幕显示测量数据.固定字符串等,大家复制过去可以直接使用,相关注释我已标明. 2.子文件 LCD1602.c #include ...

  4. 使用51单片机驱动YM12232B型液晶显示屏

    这是一个使用51单片机驱动YM12232B 液晶显示器的例子,本人水平有限,仅供参考. 本实例中将使用51单片机控制YM12232B LCD分别在主窗口和副窗口中显示"科"和&qu ...

  5. 基于51单片机驱动A4988实现步进电机逆时针转动

    基于51单片机驱动A4988实现步进电机逆时针转动 一.简介 二.接线 典型接线图 实际接线 三.部分代码 引脚定义 定时器初始化 主函数 四.实验现象 五.注意事项 一.简介 A4988 是一款完全 ...

  6. 基于51单片机驱动HC-SR04超声波模块(LCD1602显示)

    基于51单片机驱动HC-SR04超声波模块(LCD1602显示) 一.基本参数 二.通信时序 三.部分代码展示 四.实际效果 总结 一.基本参数 点击图片购买 HC- SR04+是一款宽电压工作的超声 ...

  7. 基于51单片机驱动ADXL346 (LCD1602显示)

    基于51单片机驱动ADXL346 (LCD1602显示) 一.ADXL346传感器介绍 1.实物图 2.产品说明 3.电气参数 4.通信协议 二.驱动代码 1.引脚定义 2.初始化函数 3.主函数 三 ...

  8. 51单片机驱动AHT10温湿度传感器

    51单片机驱动AHT10温湿度传感器 AHT10温湿度传感器 AHT10参数 工作原理 数据转换 驱动 接线 驱动代码 实验结果 AHT10温湿度传感器 AHT10是新一代温湿度传感器,传感器输出经过 ...

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

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

最新文章

  1. Activity全屏问题
  2. 企业架构-发布【企业架构框架-TOGAF v0.1.pdf】
  3. AI玩填字游戏,赢得全国锦标赛冠军!官方:不是人,没有奖金和名次
  4. Get传递的最大长度
  5. php manager如何安装目录,宝塔面板安装OneManager-php – Onedrive的列表索引和管理程序...
  6. 【面向对象】第一单元总结——表达式求导
  7. Java机器学习库ML之三Sampling(采样)
  8. c++ 结构体构造函数使用总结 附一道经典模拟题
  9. html中div不在火狐居中,Firefox嵌套CSS中div标签居中问题解决方法
  10. sort qsort的区别
  11. [css] 当拿到一个新的项目,让你对这个项目的css做下架构设计,你该如何下手?
  12. 科兴生物董事长:两针建立免疫记忆 三针后抗体提升十倍
  13. asp.net页面事件:顺序与回传
  14. 常用位操作技巧(Golang)
  15. Lenovo E46A-Win 7_无线灯亮但无法启动(耽误3天以上您信吗.....)问题: wlan autoconfig 依赖服务或组无法启动...
  16. 窗体程序计算一元二次方程
  17. TMS320F28335 和 VS1003B 之间的通信
  18. 计算机房档案管理,机房档案管理制度
  19. Wps文档目录页码加小括号?
  20. Cookies的SameSite属性

热门文章

  1. 【学习笔记】网络安全基础知识总结
  2. 实验:ospf与BFD联动实验(EVE模拟器-Cisco)
  3. 医门凿眼----痹症勾沉
  4. Spark-Spark Streaming(4)-- 部署、监控
  5. javaSe探赜索隐IO--File
  6. Elasticsearch 摄取节点(Ingest Node)使用Pipeline预处理文档
  7. 美团java面试_2020年美团Java一面,美团面经面试流程面试题整理
  8. R语言量化:alpha值和beta值
  9. Android gatekeeper的原理介绍和代码导读
  10. C# 中使用面向切面编程(AOP)中实践代码整洁(转)