【51单片机】程序实验15.DS18B20温度传感器

主要参考学习资料:B站【普中官方】51单片机手把手教学视频

开发资料下载链接:http://www.prechin.cn/gongsixinwen/208.html

单片机套装:普中STC51单片机开发板A4标准版套餐7

目录

  • DS18B20介绍
    • 主要特性
    • 内部结构
    • 控制时序
      • 初始化时序
      • 写时序
      • 读时序
  • 硬件设计
  • 实验15 DS18B20温度传感器
    • DS18B20驱动
    • 数码管驱动
    • 主函数

DS18B20介绍

主要特性

DS18B20是达拉斯半导体公司推出的单总线接口的传感器,与传统的热敏电阻测温元件相比,它是一种新型的体积小、工作范围宽、与微处理器接口简单的数字化温度传感器,具体特点如下:

①工作电压范围为3.0V~5.5V,除了依靠电源管脚供电,也可采用寄生电源方式(DQ数据线管脚供电)。

②采用单线接口方式,与微处理器只需要一根线即可实现数据通信。

③支持多点组网功能,多个DS18B20可以同时并联在单总线上。

④不需要外围元器件,所有传感器和转换电路都集成在DS18B20中。

⑤工作温度范围为-55℃~125℃,在-10℃~85℃的精度为±0.5℃。

⑥分辨率(测量数据的细微程度)设置范围为912bit,即0.50.0625,分辨率越高,最大转换时间越慢。DS18B20默认分辨率为12bit,最大转换时间750ms。

⑦测量结果直接以数字通过DQ串行输出给CPU,同时可传输CRC校验码,具有较强的抗干扰能力。

⑧具有负压特性,GND和VDD反接时DS18B20不会因发热而烧毁,但不能正常工作。

内部结构

ROM:刻有64位序列号,可以看作是地址序列号,含有8位产品类型标号(28H)、48位DS18B20自身序列号和8位针对前56位的CRC校验码。每个DS18B20的序列号都不相同,以便实现单总线的多点组网。

高速缓存存储器:包括一个高速暂存器RAM和一个EEPROM,后者存放高/低温触发器TH、TL和结构寄存器。

高速暂存存储器:由9个字节组成:

寄存器内容字节地址
温度值低位LS Byte0
温度值高位MS Byte1
高温限值TH2
低温限值TL3
配置寄存器4
保留5
保留6
保留7
CRC校验值8

当温度转换命令44H发布后,经转换所得温度值以二进制补码形式存放在存储器MS和LS中,MS的高5位为符号位,若温度非负,则符号位均为0,将测得的数值乘以分辨率即为实际温度;温度为负时,符号位均为1,测得的数值需先取反后加一再乘以分辨率。

配置寄存器:高3位依次为TM、R1、R0,低5位均为1。TM为测试模式位,用于设置DS18B20在工作模式还是测试模式,在出厂时已被设置为1(工作模式),不宜改动。R1和R0用于设置分辨率,默认均为1,如下表所示:

R1R0精度最大转换时间
009bit93.75ms
0110bit187.5ms
1011bit375ms
1112bit750ms

控制时序

单总线器件需要严格的信号时序来保证数据的完整性,DS18B20的时序包括初始化时序、写时序、读时序。DS18B20发送命令和数据的字节均是低位在前。

初始化时序

单总线的所有通信均以初始化时序开始。①主机将总线先置高后拉低,保持480960μs。②主机释放总线,电阻上拉,等待DS18B20在1560μs后响应。③DS18B20拉低总线,保持60~240μs。④主机读取到低电平后继续延时,延时时间从释放总线算起至少480μs。

写时序

写时序包括写0和写1,所有写时序的过程至少需要60μs,且两次独立的写时序之间至少需要1μs的恢复时间。写时序均起始于主机拉低总线,若写0则延时60μs后拉高总线并继续延时2μs;若写1则延时大概2μs后拉高总线并继续延时60μs。

读时序

单总线器件仅在主机发出读时序后才向主机发送数据,所以在主机发出读取命令之后必须马上产生读时序。读时序的过程也至少需要60μs,两次独立的读时序之间至少需要1μs的恢复时间。读时序均由主机产生至少1μs的低电平发起,随后释放总线,并在其后的15μs之间采集总线状态,低电平则读0,高电平则读1。

DS18B20典型的温度读取过程:复位(初始化时序)→发动SKIP ROM命令(0XCC)→发送开始转换命令(0X44)→延时→复位→发送SKIP ROM命令(0XCC)→发送读存储器命令(0XBE)→连续读出两个字节的温度数据→结束。

硬件设计

本实验板载DS18B20传感器的数据总线绑定到P3.7IO口管脚。

实验15 DS18B20温度传感器

实现功能:插上DS18B20温度传感器,数码管显示检测的温度值。

DS18B20驱动

按照实验14中的多文件工程框架,在App>ds18b20中创建:

ds18b20.h

#ifndef _DS18B20_H
#define _DS18B20_H#include "public.h"//定义IO管脚
sbit DS18B20_PORT = P3^7;//声明主函数需要的源文件函数
u8 ds18b20_init(void);
float ds18b20_read_temperature(void);#endif

ds18b20.c

#include "ds18b20.h"
//通过intrins.h调用延时2μs需要用到的nop函数
#include "intrins.h"//复位函数
void ds18b20_reset(void)
{DS18B20_PORT = 0;delay_10us(75);DS18B20_PORT = 1;delay_10us(2);
}/*
检测DS18B20函数是否存在
若一直为高电平或低电平则不存在,返回1,否则返回0
*/
u8 ds18b20_check(void)
{//计时器变量u8 time_temp = 0;//检测低电平while(DS18B20_PORT && time_temp<20){time_temp++;delay_10us(1);}//若等待超时则返回1,否则重置计时器if(time_temp >= 20)return 1;else time_temp = 0;//检测高电平while((!DS18B20_PORT) && (time_temp<20)){time_temp++;delay_10us(1);}//若等待超时则返回1,否则返回0if(time_temp >= 20)return 1;return 0;
}//初始化同时检测存在
u8 ds18b20_init(void)
{ds18b20_reset();return ds18b20_check();
}//写字节函数
void ds18b20_write_byte(u8 dat)
{//8位输入循环控制变量u8 i = 0;//存储准备输入的位的变量u8 temp = 0;//从低到高按位输入for(i=0;i<8;i++){//和00000001进行与运算提取最低位temp = dat & 0X01;//字节右移将次低位移到最低位dat >>= 1;//根据temp写1或写0if(temp){//拉低总线DS18B20_PORT = 0;//延时2μs,nop函数延时1个机器周期,12MHz下即为1μs_nop_();_nop_();//写入1DS18B20_PORT = 1;//延时60μsdelay_10us(6);}else{//拉低总线写入0DS18B20_PORT = 0;//延时60μsdelay_10us(6);//释放总线DS18B20_PORT = 1;//延时2μs_nop_();_nop_();}}
}//读取一个位
u8 ds18b20_read_bit(void)
{//存储读取数据的变量u8 dat = 0;//拉低总线DS18B20_PORT = 0;//延时2μs_nop_();_nop_();//释放总线后读取DS18B20_PORT = 1;if(DS18B20_PORT)dat = 1;else dat = 0;delay_10us(5);return dat;
}//读取一字节
u8 ds18b20_read_byte(void)
{//8位读取循环控制变量u8 i = 0;//存储读取到的每一位的变量u8 temp = 0;//将每一位存储进字节的变量u8 dat = 0;//从低到高按位读取for(i=0;i<8;i++){//读取一位temp = ds18b20_read_bit();//字节右移一位并将新位存储到最高位dat >>= 1;//或运算防止其他位被擦除dat |= temp << 7;}return dat;
}//温度读取函数
float ds18b20_read_temperature(void)
{//存储高八位数值u8 dath = 0;//存储低八位数值u8 datl = 0;//存储完整十六位数值u16 value = 0;//存储转换得到的实际温度float temp = 0;//参照读时序介绍中的温度读取过程ds18b20_reset();ds18b20_check();ds18b20_write_byte(0XCC);ds18b20_write_byte(0X44);ds18b20_reset();ds18b20_check();ds18b20_write_byte(0XCC);ds18b20_write_byte(0XBE);//先读低八位,后读高八位datl = ds18b20_read_byte();dath = ds18b20_read_byte();//高八位移到十六位中的高八位再与低八位结合得到完整的十六位数值value = (dath << 8) + datl;//和1111100000000000与运算检测符号位if((value&&0XF800) == 0XF800){//符号位均为1则取反加一得到正值value = (~value) + 1;//计算实际温度temp = value * (-0.0625);}else temp = value * 0.0625;return temp;
}

数码管驱动

数码管驱动延用实验14,但为了数码管显示更加自定义,可以显示负号、小数点等符号,段码值转换功能将移到函数外部来完成,即参数dat直接传入段码值,以下是smg.c修改后的程序:

#include "smg.h"u8 gseg_code[16] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};void seg_display(u8 dat[], u8 pos)
{u8 i = 0;u8 pos_temp = pos - 1;for(i = pos_temp;i < 8;i++){switch(i){case 0: LSC = 1;LSB = 1;LSA = 1;break;case 1: LSC = 1;LSB = 1;LSA = 0;break;case 2: LSC = 1;LSB = 0;LSA = 1;break;case 3: LSC = 1;LSB = 0;LSA = 0;break;case 4: LSC = 0;LSB = 1;LSA = 1;break;case 5: LSC = 0;LSB = 1;LSA = 0;break;case 6: LSC = 0;LSB = 0;LSA = 1;break;case 7: LSC = 0;LSB = 0;LSA = 0;break;}//此处删去gesg_code[]SEG_A_DP_PORT = dat[i-pos_temp];delay_10us(100);SEG_A_DP_PORT = 0x00;}
}

主函数

#include "public.h"
#include "smg.h"
#include "ds18b20.h"void main()
{//读取温度间隔的延时控制变量u8 i = 0;//本实验对温度保留一位小数处理,方法为先乘十后提取整数部分,在数码管上添加小数点显示int temp_value = 0;//存储每一位供数码管显示的段码值,温度测量结果最高占用5位数码管u8 temp_buf[5];//初始化ds18b20_init();while(1){//计时器累加i++;//计时器延时50ms后读取,可自行调整if(i%50 == 0)temp_value = ds18b20_read_temperature() * 10;//判断温度正负if(temp_value < 0){//若温度为负,将温度转为正以便拆解数位,并使第一个数码管显示负号temp_value = -temp_value;temp_buf[0] = 0X40;}else//若温度为正,第一个数码管不显示temp_buf[0] = 0X00;//将温度拆解数位并转换为段码值依次存储temp_buf[1] = gseg_code[temp_value / 1000];temp_buf[2] = gseg_code[temp_value % 1000 / 100];temp_buf[3] = gseg_code[temp_value % 100 / 10] | 0X80;temp_buf[4] = gseg_code[temp_value % 10];//将温度显示在数码管后5位上seg_display(temp_buf, 4);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/73192.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ESP32芯片模组方案,设备物联网无线通信,WiFi蓝牙交互控制应用

在当下&#xff0c;物联网正以前所未有的速度席卷全球&#xff0c;从繁华都市的智能建筑&#xff0c;到宁静乡村的智慧农业&#xff0c;从人们日常使用的可穿戴设备&#xff0c;到工业领域复杂精密的自动化生产线&#xff0c;物联网的触角已深入到生活与生产的每一个角落。 而…

Linux第二次练习

1.首先在根下面创建一个名为text的目录 2.在根目录下新建一个text目录&#xff0c;然后在text目录中新建上图的一级目录、二级目录以及三级目录 3.显示/text目录下文件的树形拓扑图 4.将linux树状结构图中列出的所有文件用ll命令列出来

百鸡问题-

百鸡问题 #include<stdio.h> int main(){int n;scanf("%d",&n);int x,y,z;for(x0;x<100;x){for(y0;y<100;y){for(z0;z<100;z){if((x*15y*9z)<(3*n) && ((xyz)100)){printf("x%d,y%d,z%d\n",x,y,z);}}}}return 0; }

LVDS(Low Voltage Differential Signaling)电平详解

一、LVDS的定义与核心特性 LVDS&#xff08;低压差分信号&#xff09;是一种 低功耗、高速、抗干扰 的差分信号传输技术&#xff0c;通过一对互补的电压信号&#xff08;正负端差值&#xff09;传递数据。其核心特性包括&#xff1a; 电气特性 电压摆幅&#xff1a;差分电压约…

【OpenFeign 面试专题】

OpenFeign 面试专题 OpenFeign 的核心原理OpenFeign 如何与 Ribbon、Hystrix 集成Ribbon的负载均衡策略如何自定义 OpenFeign 的请求编码和响应解码OpenFeign 如何传递请求头&#xff08;Header&#xff09;信息OpenFeign 如何处理超时和重试OpenFeign 支持哪些 HTTP 客户端实现…

Adobe Acrobat Pro setting

防火墙断网组织弹窗 Adobe软件突然弹窗“THIS APP HAS BEEN DISABLED”&#xff1f;别慌&#xff0c;几步教你轻松解决&#xff01; 禁用代理 解决Adobe出现This unlicensed Photoshop app has been disabled.禁止使用 rules:- DOMAIN-KEYWORD,adobe,REJECT

搜索插入位置(js实现,LeetCode:35)

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入…

5. 前后端实现文件上传与解析

1. 说明 在实际开发中&#xff0c;比较常见的一个功能是需要在前端页面中选择系统中的某个文件上传到服务器中进行解析&#xff0c;解析后的文件内容可以用来在服务器中当作参数&#xff0c;或者传递给其它组件使用&#xff0c;或者需要存储到数据库中。所以本文就提供一种方式…

《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(32)万剑归宗破妖阵 - 最长递增子序列(LIS)

《灵珠觉醒:从零到算法金仙的C++修炼》卷三天劫试炼(32)万剑归宗破妖阵 - 最长递增子序列(LIS) 哪吒在数据修仙界中继续他的修炼之旅。这一次,他来到了一片神秘的万剑谷,谷中有一座巨大的万剑归宗剑阵,剑阵闪烁着神秘的光芒。谷口有一块巨大的石碑,上面刻着一行文字:…

【redis】使用redis作为缓存时所注意事项

缓存更新策略 在 Redis 缓存中&#xff0c;缓存的更新策略主要有**定期生成&#xff08;定时更新&#xff09;和实时生成&#xff08;即时更新&#xff09;**两种方式。不同的策略适用于不同的业务场景&#xff0c;涉及性能、数据一致性和系统负载等方面的权衡。 1. 定期生成&…

计算机网络:计算机网络的分类

按分布范围分类&#xff1a;广域网&#xff0c;城域网&#xff0c;局域网&#xff0c;个域网 按传输技术分类&#xff1a;广播式网络&#xff0c;点对点网络 按拓扑结构分类&#xff1a;总线型&#xff0c;环形&#xff0c;星形&#xff0c;网状 按传输介质分类&#xff1a;…

解决pip安装uv时下载速度慢

验证优化效果 方案 1&#xff1a;临时使用国内镜像源&#xff08;推荐&#xff09; pip install uv -i https://pypi.tuna.tsinghua.edu.cn/simple 速度提升&#xff1a;镜像源服务器位于国内&#xff0c;带宽充足&#xff0c;通常可达 1-10MB/s 支持源列表&#xff1a; # 清…

SpringCloud Alibaba——入门简介

一、是什么 &#xff08;1&#xff09;诞生 2018.10.31&#xff0c;Spring Cloud Alibaba 正式入驻了 Spring Cloud 官方孵化器&#xff0c;并在 Maven 中央库发布了第一个版本 &#xff08;2&#xff09;介绍 &#xff08;3&#xff09;&#xff1f;何为必须组件 二、能干嘛…

Python完全指南:从基础到实践的编程艺术

引言&#xff1a;数字时代的瑞士军刀 在人工智能与大数据浪潮中&#xff0c;Python如同编程世界的"瑞士军刀"&#xff0c;以其优雅的语法和强大的生态征服全球开发者。本文将从语言哲学到实战应用&#xff0c;为您展开Python编程的全景画卷&#xff0c;揭示这门语言…

Docker 运行 GPUStack 的详细教程

GPUStack GPUStack 是一个用于运行 AI 模型的开源 GPU 集群管理器。它具有广泛的硬件兼容性&#xff0c;支持多种品牌的 GPU&#xff0c;并能在 Apple MacBook、Windows PC 和 Linux 服务器上运行。GPUStack 支持各种 AI 模型&#xff0c;包括大型语言模型&#xff08;LLMs&am…

完整例子和调用关系qt OpenGL

项目结构 首先&#xff0c;你需要在 Qt 项目中创建一个类&#xff0c;继承自 QOpenGLWidget 来进行 OpenGL 渲染。文件结构如下&#xff1a; - main.cpp - MyOpenGLWidget.h - MyOpenGLWidget.cpp - vertex_shader.glsl - fragment_shader.glsl 1. main.cpp 这是 Qt 项目的入口…

VSCode 配置优化指南:打造极致高效的前端开发环境

VSCode 配置优化指南&#xff1a;打造极致高效的前端开发环境 一、基础环境配置&#xff1a;让开发更流畅 1. 性能优化设置 // settings.json {"files.autoSave": "afterDelay", // 自动保存&#xff08;延迟1秒&#xff09;"files.exclud…

源IP泄露后如何涅槃重生?高可用架构与自动化防御体系设计

一、架构层解决方案 1. 高防代理架构设计 推荐架构&#xff1a; 用户 → CDN&#xff08;缓存静态资源&#xff09; → 高防IP&#xff08;流量清洗&#xff09; → 源站集群&#xff08;真实IP隐藏&#xff09; ↑ Web应用防火墙&#xff08;WAF&#xff09; 实施要点&a…

【英伟达AI论文】多模态大型语言模型的高效长视频理解

摘要&#xff1a;近年来&#xff0c;基于视频的多模态大型语言模型&#xff08;Video-LLMs&#xff09;通过将视频处理为图像帧序列&#xff0c;显著提升了视频理解能力。然而&#xff0c;许多现有方法在视觉主干网络中独立处理各帧&#xff0c;缺乏显式的时序建模&#xff0c;…

无障碍阅读(Web Accessibility)NVDA打开朗读查看器后,enter键不生效的原因

用NVDA测试Web Accessibility时&#xff0c;打开朗读查看器&#xff0c;enter键会无效&#xff0c;而不打开测试器&#xff0c;就没有问题&#xff0c;很大原因是被应用的元素不是可聚焦的&#xff0c;解决方法尝试&#xff1a; 将标签改为可聚焦的语义化标签&#xff0c;如 b…