C51 - DS18B20
Thermometer
- 1> 实验概述
- 2> 硬件设计
- 3> DS18B20
- 3.1> 原理框图
- 3.2> 数据格式
- 4> 单总线(1-Wire)通讯协议
- 4.1> 初始化(复位)时序
- 4.2> 写-DS18B20时序
- 4.3> 读-DS18B20时序
- 4.4> 命令
- 5> 程序设计
- 5.1> 编程思路
- 5.2> 代码实现
- 6> 联调测试
1> 实验概述
实现51单片机,读写单个DS18B20,并将温度值通过串口输出;
2> 硬件设计
DQ引脚必须有上拉电阻;
3> DS18B20
3.1> 原理框图
DS18B20 内部自带温度传感器,能将温度值转为2Byte的数据,提供单总线接口(1-Wire);
主控制器可以通过简单命令进行读写,从而获取温度值;
自己理解:类似于DS18B20的这种功能模块,
他们如同大学食堂的每个窗口,你不需要了内部加工过程,只需简单的,说“老板,刀削面来一碗”这样的命令;
3.2> 数据格式
温度分辨率:9~12位可选, 默认12位(0.0625°);
温度测量范围:-55°~+125°;
0b’11111010000 = 2000;
2000 * 0.0625 = 125°
4> 单总线(1-Wire)通讯协议
读DS18B20步骤:
Step 1: 初始化;
Step 2:发送ROM指令; // 确定主控制器与总线DQ上,挂的哪个DS18B20通讯;
Step 3:发送功能指令; // 具体执行动作;
4.1> 初始化(复位)时序
初始化DS18B20, 确定DS18B20准备好;
空闲态: DQ保持高电平;
复位脉冲:主控制器将DQ拉低>=480us后,释放;
延时:DQ保持高电平,15~60us;
存在脉冲:DS18B20将DQ拉低60~240us,释放; // 表示准备好;
4.2> 写-DS18B20时序
主控制器对DS18B20 : 写‘0’
写0:将总线DQ拉低60~120us;
主控制器对DS18B20 : 写‘1’
第1步:将DQ拉低0~15us;
第2步:将DQ拉高,释放总线;
!注意:写0与写1之间,需要间隔1us;
4.3> 读-DS18B20时序
读‘0’
第1步:主控制器将DQ拉低>=1us;
第2步:主控制器将DQ拉高,释放总线;
第3步:DS18B20将DQ拉低,14us内释放总线;完成写0;
注意: 主控制器要读,只能在DS18B20拉低期间去采样;
读‘1’
第1步:主控制器将DQ拉低>=1us;
第2步:主控制器将DQ拉高,释放总线;
第3步:DS18B20将DQ拉高,14us内释放总线;完成写1;
注意: 主控制器要读,只能在DS18B20拉高期间去采样;
!注意:读DS18B20,采样时间段都是在前15us;
为什么后45us无效呢,DS18B20这么设计,可能是为了降低功耗;
4.4> 命令
命令或数据,都是从最低有效位开始发送;
All data and commands are transmitted least significant bit(LSB) first over the 1-Wire bus.
5> 程序设计
5.1> 编程思路
5.2> 代码实现
#include "bsp.h"//----------------------------------------------------------------------------//
// Hardware timing Level function //
//----------------------------------------------------------------------------///*** @brief DS18B20 initialization sequence* @param None* @retval state*/
uchar8_t DS18B20_Init(void)
{uchar8_t i = 0;TEMP_DQ = 1; // Keep DQ idle stateTEMP_DQ = 0; Delay_10us(90); // >=480us TEMP_DQ = 1; // Release the TEMP_DQ /* Detect DS18B20*/while (TEMP_DQ) {i++;if (i > 5) {return 1; // failed}Delay_10us(2); }return 0; // successful
}/*** @brief MCU write 1Byte data to DS18B20 * @param dat 1byte data* @retval*/
void DS18B20_WriteByte(uchar8_t DataByte)
{uchar8_t i = 0;for (i = 0; i < 8; i++) {TEMP_DQ = 0; Delay_10us(1); // 1~15usTEMP_DQ = DataByte & 0x01; // LSB first over the TEMP_DQ bus;Delay_10us(8); // 60~120USTEMP_DQ = 1; // Relase TEMP_DQ bus;DataByte >>= 1; // _nop_();}
}/*** @brief MCU Read 1Byte data from DS18B20* @param None* @retval*/
uchar8_t DS18B20_ReadByte(void)
{uchar8_t val = 0;uchar8_t temp = 0;uchar8_t i = 0;for (i= 0; i < 8; i++) {TEMP_DQ = 0; // pulling the TEMP_DQ bus low for 1us; _nop_();TEMP_DQ = 1; // Relase TEMP_DQ bus;_nop_();_nop_(); temp = TEMP_DQ; // LSB first over the TEMP_DQ bus; 1001 1101val = (val >> 1) | (temp << 7); Delay_10us(6); // 45us} return val;
}void DS18B20_ChangTemp(void)
{DS18B20_Init();Delay_ms(1);DS18B20_WriteByte(0xcc); // SKIP ROM DS18B20_WriteByte(0x44); // CONVERT TDelay_ms(800);
}void DS18B20_ReadTemp(void)
{ DS18B20_Init();Delay_ms(1);DS18B20_WriteByte(0xcc); // SKIP ROM DS18B20_WriteByte(0xbe); // READ SCRATCHPAD
}//----------------------------------------------------------------------------//
// BSP Level function //
//----------------------------------------------------------------------------//float TEMP_Read(void)
{uchar8_t temp_H, temp_L;uchar8_t val = 0;unsigned int temp = 0;float t = 0;DS18B20_ChangTemp(); DS18B20_ReadTemp(); temp_L = DS18B20_ReadByte(); temp_H = DS18B20_ReadByte(); temp = temp_L | (temp_H << 8);t = temp * 0.0625; printf("temp = %g °C\n\r", t); // Debugreturn t;
}
6> 联调测试
设计一个,随时可以调用,并准确的定时器,思考这个问题;
目前程序的延时都是,估算;
测量波形时,捕捉us级别脉冲边沿时,可以先把示波器时间轴设置大,方便测量;
相关文章:

C51 - DS18B20
Thermometer 1> 实验概述2> 硬件设计3> DS18B203.1> 原理框图3.2> 数据格式 4> 单总线(1-Wire)通讯协议4.1> 初始化(复位)时序4.2> 写-DS18B20时序4.3> 读-DS18B20时序4.4> 命令 5> 程序设计5.1…...

手把手教你使用vue2搭建微前端micro-app
简述 本文主要讲述新手小白怎么搭建micro-app,几乎是每一步都有截图说明。上手应该很简单。 研究背景 这段时间在网上找了很多有关微前端相关的知识,起初本来是想着先搭建一个single-spa,但是奈何网上能找到的内容都是千篇一律。我也是…...

DDR3(MIG核配置官方demoFPGA代码实现及仿真)
由于直接对 DDR3 进行控制很复杂,因此一般使用 MIG IP 来实现,同时为了更简单地使用 MIG IP,我们采用 AXI4 总线协议进行控制。下面首先介绍 MIG IP 的配置,然后看看官方 demo (里面包含一个仿真要用到的 DDR3 模型&am…...

传奇人物《周兴和》书连载之67 不辱神圣的使命
不辱神圣的使命 这里,先前还是一个十分神秘的地方。 外人和车辆要想进入这片区域,那是绝对不允许的。这片区域隐于群山之中,且戒备森严,外人若想进入,那是要经过好几道政治审查和随身检查的。近年来,随着…...

Spring框架中的单例Beans是线程安全的么?
在Spring框架中,单例Beans默认是线程安全的。 当你在Spring框架中声明一个单例Bean并配置为默认的单例作用域时,Spring会确保对该Bean的并发访问是线程安全的。以下是一个简单的代码演示: 假设我们有一个名为 SingletonBean 的单例 Bean 类…...
AI脚本插件开发-链接图自动建立档名-插件制作源码-illustrator插件开发
文章目录 1.illustrator1.1.app.activeDocument1.2.selection2.模块分析3.源码工程4.功能描述5.作者答疑本文主要分析一款插件的源码,链接图自动建立档名,代码一般较长,读者耐心阅读,对于学习插件开发具有不小的帮助。先介绍了一下基础资料,如有不懂的地方,就去这些资料里…...
rust智能指针
智能指针 智能指针虽然也号称指针,但是它是一个复杂的家伙:通过比引用更复杂的数据结构,包含比引用更多的信息,例如元数据,当前长度,最大可用长度等。引用和智能指针的另一个不同在于前者仅仅是借用了数据…...
Git、Gitee、Github、Gitlab区别与联系
Git:本地软件,无需联网即可使用,实现本地代码的管理。 分布式版本控制系统,是一种工具,用于代码的存储和版本控制。 将本地文件通过一定的操作将其同步上传到Github或Gitee Gitee:是一家中…...

接口优化的策略
1.批处理 批量思想:批量操作数据库,这个很好理解,我们在循环插入场景的接口中,可以在批处理执行完成后一次性插入或更新数据库,避免多次IO。 //批量入库 batchInsert();List的安全操作有以下几种方式: 使…...

android 隐藏底部虚拟按键
方法一 滑动屏幕 可重新显示出来 protected void hideBottomUIMenu() { //隐藏虚拟按键,并且全屏 if (Build.VERSION.SDK_INT <11 && Build.VERSION.SDK_INT < 19) { // lower api View v this.getWindow().getDecorView(); v.setSyst…...

基于电流控制的并网逆变器(Simulink)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

learn_C_deep_9 (汇编角度理解return的含义、const 的各种应用场景)
return 关键字 不知道我们大家是否有一个疑惑:我们下载一个大型游戏软件(王者荣耀),都要花几个小时去下载,但是一旦我们游戏连输,想要删除这个软件的时候,它仅仅只需要十几秒,这是为…...
基于深度学习的OCR技术
随着数字化时代的到来,图片识别技术越来越受到人们的关注。其中,OCR技术作为图片处理的一个重要分支,可以将扫描的图片进行自动识别和分类,极大地提高了工作效率。本文将介绍有道实况OCR技术的相关内容,帮助读者更好地…...

『python爬虫』09. bs4实战之下载精美壁纸(保姆级图文)
目录 爬取思路代码思路1.拿到主页面的源代码. 然后提取到子页面的链接地址, href2.通过href拿到子页面的内容. 从子页面中找到图片的下载地址 img -> src3.下载图片 3. 完整实现代码总结 欢迎关注 『python爬虫』 专栏,持续更新中 欢迎关注 『python爬虫』 专栏&…...

【Linux学习】多线程——线程控制 | 线程TCB
🐱作者:一只大喵咪1201 🐱专栏:《Linux学习》 🔥格言:你只管努力,剩下的交给时间! 线程控制 | 线程TCB 🧰线程控制🎴线程创建🎴线程结束…...

Node 10 接口
接口 简介 接口是什么 接口是 前后端通信的桥梁 简单理解:一个接口就是 服务中的一个路由规则 ,根据请求响应结果 接口的英文单词是 API (Application Program Interface),所以有时也称之为 API 接口 这里的接口指的是『数据接口』&#…...

大型互联网企业大流量高并发电商领域核心项目已上线(完整流程+项目白皮书)
说在前面的话 面对近年来网络的飞速发展,大家已经都习惯了网络购物,从而出现了一些衍生品例如:某宝/某东/拼夕夕等大型网站以及购物APP~ 并且从而导致很多大型互联网企业以及中小厂都需要有完整的项目经验,以及优秀处理超大流量…...

汇编语言学习笔记六
flag 寄存器 CF:进位标志位,产生进位CF1,否则为0 PF:奇偶位,如010101b,则该数的1有3个,则PF0,如果该数的1的个数为偶数,则PF1。0也是偶数 ZF:在相关指令执行后(运算和逻辑指令,传送指…...

多商户商城系统-v2.2.3版本发布
likeshop多商户商城系统-v2.2.3版本发布了!主要更新内容如下 新增 1.用户端退出账号功能 优化 1.平台添加营业执照保存异常问题 2.平台端分销商品优化-只显示参与分销的商品 3.优化订单详情显示营销价格标签 4.平台交易设置增加默认值 5.种草社区评论调整&a…...

科研人必看入门攻略(收藏版)
来源:投稿 作者:小灰灰 编辑:学姐 本文主要以如何做科研,日常内功修炼,常见科研误区,整理日常‘好论文’四个部分做以介绍,方便刚入门的科研者进行很好的规划。 1.如何做科研 1.1 选方向 当我…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...