单片机基础模块学习——DS18B20温度传感器芯片

news/2025/2/2 2:31:58/

不知道该往哪走的时候,就往前走。 

一、DS18B20芯片原理图

该芯片共有三个引脚,分别为

  1. GND——接地引脚
  2. DQ——数据通信引脚
  3. VDD——正电源

数据通信用到的是1-Wier协议

  • 优点:占用端口少,电路设计方便
  •  同时该协议要求通过上拉电阻上拉到正电源
  • 该协议是总线协议,可以挂载一个以上的元件

总线协议每一个元件都有一个地址,根据地址就可以获得对应传感器的内部信息


DS18B20温度传感器在开发板上的位置如下图

 二、访问DS18B20步骤

  1. 初始化
  2. 发送地址(当总线上只有一个元件,就可以直接面向所有的传感器进行通信就可以了例如:局域网的广播)
  3. 功能性命令(触发温度采集,读取相关命令等)

    功能性命令表格

  • 第一行触发温度转换,地址是0x44
  • 第二行读取温度,地址是0xBE
  • 下面的功能是进行更深入的开发会用到,这里暂不解释

DS18B20温度存储格式

 

共有16位数据结构,S=SIGN 代表一个符号

  • 如果温度是正的,11~15位都是0;
  • 如果温度是负的,11~15位都是1;

0~3是小数位,4~10是整数位,最高到。温度传感器的精度是12bit

读取的话由于是16位的数据,可以用unsigned int类型变量存储


但真正的unsigned int类型和这个是有差别的

由上图可以发现,对应的两个数之间相差倍,因此在读取之后,想要获得真正的值就要除以16

三、模块代码

由于占用两个字节,所以用两个变量存储高八位和低八位的数,最后并在一起返回一个数

#include "onewire.h"
//
void Delay_OneWire(unsigned int t)  
{unsigned char i;while(t--){for(i=0;i<12;i++);}
}//
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;
}unsigned int read_temperature(void)
{unsigned char low,high;init_ds18b20();//初始化Write_DS18B20(0xCC);//对所有元件进行通信Write_DS18B20(0x44);//触发温度转换init_ds18b20();//初始化Write_DS18B20(0xCC);//对所有元件进行通信Write_DS18B20(0xBE);//读取温度low=Read_DS18B20();//返回数据high=Read_DS18B20();return (high<<8|low);
}

四、主函数代码

这里别忘记要将数据除以16才是真实数据,由于传回的是整数类型,所以要除以16.0,最后的结果才可以保留两位小数


想让数码管的后四位不显示,不要忘记敲四个空格

#include "seg.h"
#include "tim.h"
#include "led.h"
#include "init.h"
#include "onewire.h"
//Seg
unsigned char pucSeg_Buf[12],pucSeg_Code[9],pucSeg_Pos=0;//字符数组以/0结尾,所以要有9位
void Seg_Proc(void);//Timer
unsigned long ulms =0;
unsigned int uiSeg_Dly=0;
//Temperature
unsigned int uiTemp=0;
void main(void)
{Cls_Peripheral();Timer0Init();EA=1;while(1){Seg_Proc();}}void Seg_Proc(void)
{if(uiSeg_Dly<200)return;uiSeg_Dly =0;uiTemp = read_temperature();sprintf(pucSeg_Buf,"%.2f    ",uiTemp/16.0);//将指定的内容打印到字符数组里Seg_Tran(pucSeg_Buf,pucSeg_Code);
}void Time_0(void) interrupt 1
{ulms++;uiSeg_Dly++;if(ulms % 2==0){pucSeg_Pos=(pucSeg_Pos+1)%8;//实现pucSeg_Pos从0-7循环的操作Seg_Disp(pucSeg_Code,pucSeg_Pos);}
}

 

 


http://www.ppmy.cn/news/1568574.html

相关文章

第P7周-Pytorch实现马铃薯病害识别(VGG16复现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标 马铃薯病害数据集&#xff0c;该数据集包含表现出各种疾病的马铃薯植物的高分辨率图像&#xff0c;包括早期疫病、晚期疫病和健康叶子。它旨在帮助开发和…

SAP SD学习笔记27 - 请求计划(开票计划)之1 - 定期请求(定期开票)

上两章讲了贩卖契约&#xff08;框架协议&#xff09;的概要&#xff0c;以及贩卖契约中最为常用的 基本契约 - 数量契约和金额契约。 SAP SD学习笔记26 - 贩卖契约(框架协议)的概要&#xff0c;基本契约 - 数量契约_sap 框架协议-CSDN博客 SAP SD学习笔记27 - 贩卖契约(框架…

什么是波士顿矩阵,怎么制作?AI工具一键生成战略分析图!

当今商业环境瞬息万变&#xff0c;每个企业都面临着越来越多的挑战与机遇。如何科学合理地进行战略管理&#xff0c;成为了每个企业决策者必须直面的重要课题。 在众多战略管理框架中&#xff0c;波士顿矩阵作为一种经典的战略管理工具&#xff0c;因其简洁明了的分析方式而广…

Springboot如何使用面向切面编程AOP?

Springboot如何使用面向切面编程AOP? 在 Spring Boot 中使用面向切面编程&#xff08;AOP&#xff09;非常简单&#xff0c;Spring Boot 提供了对 AOP 的自动配置支持。以下是详细的步骤和示例&#xff0c;帮助你快速上手 Spring Boot 中的 AOP。 1. 添加依赖 首先&#xff…

Elasticsearch:如何搜索含有复合词的语言

作者&#xff1a;来自 Elastic Peter Straer 复合词在文本分析和标记过程中给搜索引擎带来挑战&#xff0c;因为它们会掩盖词语成分之间的有意义的联系。连字分解器标记过滤器等工具可以通过解构复合词来帮助解决这些问题。 德语以其长复合词而闻名&#xff1a;Rindfleischetik…

deepseek无辅助损失的负载均衡策略

无辅助损失的负载均衡策略 是一种用于解决深度学习中专家混合系统(MoE)负载不均衡问题的方法,它不依赖额外的辅助损失函数来实现负载均衡,而是通过直接调整专家接收输入的概率来平衡各个专家的负载,以下是具体介绍及举例: 策略原理 动态调整接收概率:系统会根据每个专…

lightgbm做分类

python import pandas as pd#导入csv文件的库 import numpy as np#进行矩阵运算的库 import json#用于读取和写入json数据格式#model lgb分类模型,日志评估,早停防止过拟合 from lightgbm import LGBMClassifier,log_evaluation,early_stopping #metric from sklearn.metrics …

2006-2021年 省级数字经济与实体经济融合水平计算代码及原始数据-社科数据

省级数字经济与实体经济融合水平计算代码及原始数据2006-2021年-社科数据https://download.csdn.net/download/paofuluolijiang/90028609 https://download.csdn.net/download/paofuluolijiang/90028609 数字经济与实体经济的融合是推动现代经济发展的关键力量。从2006年至20…