当前位置: 首页 > news >正文

蓝桥杯----DS18B20温度传感器

(二)、温度传感器

1、One-Wire总线

 One-Wire总线利用一根线实现双向通信。因此其协议对时序的要求较严格,如应答等时序都有明确的时间要求。基本的时序包括复位及应答时序、写一位时序读一位时序。单总线即只有一根数据线,系统中的数据交换、控制都由这根线完成。设备(主机或从机)通过一个漏极开路或三态端口连至该数据线,以允许设备在不发送数据时能够释放总线,而让其他设备使用总线。由于它们是主从结构,只有主机呼叫从机时,从机才能应答,因此主机访问One-Wire器件都必须严格遵循单总线命令序列,即初始化、ROM命令、功能命令

对于蓝桥杯的同学,One-Wire协议官方会提供,不需要大家自己写。DS18B20的通信过程较为简单。图 五为蓝桥杯DS18B20原理图,DQ即用于通信的单总线,需要在函数开始定义该引脚sbit DQ = P1^4;

DS18B20的通信过程:初始化总线---写ROM指令(跳过ROM指令0xcc)---写RAM指令(开始温度转换0x44)---重新初始化---ROM指令(跳过ROM指令0xcc)---写RAM指令(开始温度读取0xbe)---接收数据(先低位再高位)---分析处理数据。(如图 六

                         图 五DS18B20原理图

                         图 六 DS18B20通信过程

 

2、代码解读(图 七)(数据处理分析)

数据处理: High<<8 高八位数据以二进制的形式左移八位就变成了unsigned int 类型数据,后八位数据全为0,此时用 | Low 运算符来获取后八位数据,则((High<<8)|Low)就是获取到了初步的温度数据,float(对象)就是强制转换括号中数据为float数据类型,但温度高五位是符号位(图 八),当这五个全是0时温度为正值,全为1则为负值。后四位是小数位,此时要*0.0625或者/16.0来获取到适合的温度区间,例如0000 0000 0000 0011表示十进制数据3,最后一位精度为0.0625,3*0.0625即为温度数据。

                     图 七 DS18B20代码解读

                     图 八 DS18B20数据存储位

 

附相关代码(注意蓝桥杯官方会给初始化、写入、读取等底层)

#include <STC15F2K60S2.H>
#include <INTRINS.h>sbit DQ = P1^4;void Delay_OneWire(unsigned int t)  
{unsigned char i;while(t--){for(i=0;i<12;i++);}
}//仿真用这个延时
//void Delay_OneWire(unsigned int t)  
//{
//	while(t--);
//}//
void Write_DS18B20(unsigned char dat)
{unsigned char i;for(i=0;i<8;i++){DQ = 0;DQ = dat&0x01;Delay_OneWire(5);DQ = 1;dat >>= 1;}Delay_OneWire(5);
}//
unsigned char Read_DS18B20(void)
{unsigned char i;unsigned char dat;for(i=0;i<8;i++){DQ = 0;dat >>= 1;DQ = 1;if(DQ){dat |= 0x80;}	    Delay_OneWire(5);}return dat;
}//
bit init_ds18b20(void)
{bit initflag = 0;DQ = 1;Delay_OneWire(12);DQ = 0;Delay_OneWire(80);DQ = 1;Delay_OneWire(10); initflag = DQ;     Delay_OneWire(5);return initflag;
}/*
DS18B20的通信过程:初始化总线写ROM指令(跳过ROM指令0xcc)写RAM指令(开始温度转换0x44)重新初始化ROM指令(跳过ROM指令0xcc)写RAM指令(开始温度读取0xbe)接收数据(先低位再高位)分析处理数据
*/float Temperature_Read(void)
{unsigned char Low,High;init_ds18b20();       //初始化总线Write_DS18B20(0xcc);  //跳过ROM指令Write_DS18B20(0x44);  //开始温度转换Delay_OneWire(200);init_ds18b20();       //重新初始化Write_DS18B20(0xcc);  //跳过ROM指令Write_DS18B20(0xbe);  //开始读取温度(低位优先)Low = Read_DS18B20();   //接收数据(先低位再高位)High = Read_DS18B20();return (float)((High<<8)|Low)/16.0;  //分析处理数据
}

 

 

 

http://www.dtcms.com/a/308176.html

相关文章:

  • vue3+arcgisAPI4示例:轨迹点模拟移动(附源码下载)
  • InfluxDB 与 Python 框架结合:Django 应用案例(二)
  • ASIC芯片简介
  • LangGraph认知篇-Send机制
  • TypeScript 基础介绍(二)
  • QT6 Python UI文件转换PY文件的方法
  • 如何为C#加入EPPlus 包
  • 【Flask基础②】 | 路由、响应与异常处理
  • 微服务快速集成 TraceId
  • 企业智脑1.3.2版本发布,设备管理+智能体OS双核驱动,重构数字生产力边界
  • 【车联网kafka】Kafka核心架构与实战经验(第二篇)
  • 网络与信息安全有哪些岗位:(4)应急响应工程师
  • 【MySQL集群架构与实践3】使用Dcoker实现读写分离
  • VuePress 使用详解
  • 安卓基础布局核心知识点整理
  • 基于UDP的SNMP协议
  • Svelte 5 完全指南:从入门到跨端应用开发
  • 【Keras学习笔记】开发环境搭建
  • MATLAB 实现 SRCNN 图像超分辨率重建
  • toFixed()方法的报错注意
  • C++11原子操作实现公平自旋锁
  • 【IQA技术专题】DISTS代码讲解
  • 深入剖析:C++ 手写实现 unordered_map 与 unordered_set 全流程指南
  • Qt 如何从 .ts 文件提取所有源文
  • 2024年SEVC SCI2区,一致性虚拟领航者跟踪群集算法GDRRT*-PSO+多无人机路径规划,深度解析+性能实测
  • TDengine 中 TDgp 中添加算法模型(异常检测)
  • 【生活篇】Ubuntu22.04安装网易云客户端
  • 河南萌新联赛2025第(三)场:河南理工大学(补题)
  • .NET 10 中的新增功能系列文章3—— .NET MAUI 中的新增功能
  • gen_compile_commands.sh