51单片机读取DS18B20温度传感器

news2024/11/19 15:35:30

1.首先我们知道DS18B20是单总线协议,只有一根数据线。所以Data数据线即使发送端又是接收端,同时DS18B20内部接了弱上拉电阻(如图一所示),数据线默认为高电平。有了这些概念,我们就能进行下一步。

                                               图一(截取DS18B20芯片手册)

2.初始化DS18B20

     看图二可知,首先我们将总线从高拉低,保持480us左右,然后释放总线(没人拉低,默认高电平),此时总线上为高电平。然后等待15-60us,等待DS18B20模块将总线拉低。(如果拉低则说明DS18B20响应成功),DS18B20拉低60-240us后,释放总线。初始化完成。

                                                              图二

 3.向DS18B20写入数据。

        3.1 向DS18B20写0。

       首先将总线由高拉低,低电平保持15us到60us,然后释放总线。写入0完成。

        3.2 向DS18B20写1。

        将总线由高拉低,低电平保持1-15us(看图三可知,低电平时间要低于15us),再释放总线。

 

                                                                 图三

4.读取DS18B20寄存器中数据

        4.1 读数据0

将总线由高拉低,保持1-15us。如果DS18B20中数据是0,则会将总线拉低。此时,总线上为低电平。我们要在60us以内读取数据(图四可知,60us以内DS18B20会释放总线)。否则可能会读到错误数据。

        4.2 读数据1

将总线由高拉低,保持1-15us,如果数据是1,DS18B20会释放总线,总线上为高电平。然后在15us以后读取数据。

   

                                                                    图四

5.DS18B20一些命令

  5.1 0xCC→跳过ROM  

 5.2 其他命令

  0x44→开始温度转换指令 ,0xBE→读取数据寄存器指令

                                                                     图五

6.DS18B20数据寄存器

 这里也比较关键,所以拎出来讲一下。

首先DS18B20的数据寄存器是16位,其中寄存器高字节的高5位的S表示符号位,其余3位才是表示数据。这里就浅讲一下,后面结合代码来解析一下。

                                                                     图六 

 7.代码实例

    声明:首先这里面的延时都是按照经验值,就是通过实践,得出比较准确的延时。

    注:这里使用的是12M频率的单片机,如果是1M可以把for循环去掉

延时函数如下:

  sbit DQ=P1^4;
//我这里是P1^4连接了DS18B20的数据线。
//你们根据自己的单片机原理图查询
void Delay_OneWire(unsigned int t)  
{
	unsigned char i;
	while(t--){
		for(i=0;i<12;i++);
	}
}

        7.1 DS18B20初始化

bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;  
  	Delay_OneWire(12);
  	DQ = 0;  //拉低总线
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(10); //等待DS18B20拉低
    initflag = DQ;     //获取总线数据
  	Delay_OneWire(5);
  	return initflag;  
}

         7.2 向DS18B20写入一字节数据

void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;  //拉低
		DQ = dat&0x01; //获取dat最后一位数据
		Delay_OneWire(5);//写入数据
		DQ = 1;         //释放总线
		dat >>= 1;      //dat右移一位
	}
	Delay_OneWire(5);
}

        7.3 读取DS18B20数据寄存器的值

unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  //循环8次,读一个字节
	for(i=0;i<8;i++)
	{
		DQ = 0;  //拉低
		dat >>= 1; 
		DQ = 1;  //释放总线
		if(DQ)  // 因为dat>>1位默认是0 ,如果DQ为0,就不需要赋0了
		{
			dat |= 0x80; //给dat赋1
		}	    
		Delay_OneWire(5);
	}
	return dat;
}

        7.4 读取温度

unsigned int  get_temp()
{ 
	unsigned int result;
    float i;
	unsigned char low,high;
    init_ds18b20();
	Write_DS18B20(0xcc);//跳过rom
    Write_DS18B20(0x44);//开始转换
	 
	init_ds18b20();
	Write_DS18B20(0xcc);//跳过rom
	Write_DS18B20(0xbe);//开始转换
	 
    low=Read_DS18B20(); //先读取低字节
	high=Read_DS18B20();//再读取高字节
	result =high&0x0f;  //获取高字节低4位数据(1位符号位,3位数据位)
	result<<=8;         //左移8位
	result=result|low;  //或上低字节,拼成16位数据。
	i=result*0.0625;    //为什么乘0.0625,下面讲
	result=i*100;       //温度值扩大100倍,方便数码管显示
	return result;      //返回温度值
}

这里为什么最后的结果result需要乘以*0.0625。我们上面讲过DS18B20的数据寄存器,其实高字节的低3位才是数据位。 如高字节的最后一位本来是 2^4,假如有这个数据。则数据寄存器这个位为1,因为我们已经左移了8位,则变成了2^8.则实际上扩大了2^8/2^4=2^4=16,比实际结果扩大了16倍,所以我们需要乘以0.0625,缩小16倍。这样才能得到真实值。

所以整体原因是因为result左移8位,导致数据扩大了16倍,所以result需要乘以0.0625缩小16倍!

8.结语 

 这次也是通过DS18B20的芯片手册来讲解如何读取DS18B20的数据,以及最后转化为真实温度。   最后也是用代码实例来巩固理论,以及验证理论。

        

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

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

相关文章

1738_创建自己的simulink模块库

全部学习汇总&#xff1a; GreyZhang/g_matlab: MATLAB once used to be my daily tool. After many years when I go back and read my old learning notes I felt maybe I still need it in the future. So, start this repo to keep some of my old learning notes servral …

随着网络犯罪策略的转变,暗网威胁瞄准能源行业

根据 Searchlight Cyber 的一份报告&#xff0c;能源行业越来越多地通过暗网上的活动成为恶意行为者和威胁组织的目标。 该报告详细介绍了威胁行为者出售全球能源组织初始访问权的众多实例。 其中包括美国、加拿大、英国、法国、意大利和印度尼西亚的流行暗网论坛&#xff08…

使用AIGC工具巧用Linux系统

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

【Python爬虫开发基础③】Python基础(文件操作方法汇总)

友情提示&#xff1a;由于本专栏的文章偏向于爬虫&#xff0c;所以对于python的介绍不可能面面俱到&#xff0c;在这里只讲重点。 如果大家觉得有没讲到的地方&#xff0c;欢迎补充~ 往期推荐&#xff1a; 【Python爬虫开发基础①】Python基础&#xff08;变量及其命名规范&…

黑马Redis视频教程高级篇(三:最佳实践)

目录 一、Redis键值设计 1.1、优雅的key结构 1.2、拒绝BigKey 1.2.1、BigKey的危害 1.2.2、如何发现BigKey 1.2.3、如何删除BigKey 1.3、恰当的数据类型 例1&#xff1a;比如存储一个User对象&#xff0c;我们有三种存储方式&#xff1a; 例2&#xff1a;假如有hash类…

5.部署LVS-DR群集

文章目录 部署LVS-DR群集LVS-DR数据包流向分析LVS-DR中的ARP问题问题一问题二 LVS-DR部署调度器配置节点服务器配置NFS服务器配置 ipvsadm 部署LVS-DR群集 LVS-DR数据包流向分析 为方便进行原理分析&#xff0c;将Client与群集机器放在同一网络中&#xff0c;数据包流经的路线…

2000-2019年280多个地级市就业人数数据(全市)/城市就业数据

2000-2019年280多个地级市就业人数数据&#xff08;全市&#xff09; 1、时间范围&#xff1a;2000-2019年 2、范围&#xff1a;包括280多个地级市 3、来源&#xff1a;城市NJ 4、统计口径&#xff1a;全市 5、单位&#xff1a;万人 6、缺失情况&#xff1a;与城市年鉴缺失情况…

python学习笔记20230611

python语言的特点 python是脚本语言&#xff0c; 采用解释方式执行。 解释是将源代码逐条转换成目标代码同时逐条运行目标代码的过程。执行解释的计算机程序就是解释器。 解释执行方式是逐条运行用户编写的代码&#xff0c;执行性能略低&#xff0c;但他支持跨硬件或操作系统…

HNU计算机图形学-作业二

HNU计算机图形学-作业二 作业二&#xff1a;纹理和照明前言介绍实施详细信息任务1&#xff1a;加载复杂对象任务2&#xff1a;纹理映射和照明任务3&#xff1a;互动活动和动画额外任务&#xff1a;增强场景的视觉效果&#xff08;最高20%&#xff09; 最终实现效果 作业二&…

【Protobuf速成指南】oneof关键字的使用

文章目录 2.3 oneof 字段一、基本认识二、 3.2 oneof相关函数三、Contact2.3 改写 2.3 oneof 字段 本系列文章将通过对通讯录项目的不断完善&#xff0c;带大家由浅入深的学习Protobuf的使用。这是Contacts的2.3版本&#xff0c;在这篇文章中将带大家学习Protobuf的 oneof 语关…

LVS负载均衡集群-NAT模式

目录 前言一、企业群集应用概述1. 群集的含义1.1 群集的特点1.2 扩展服务器的方式 2. 群集的类型2.1 负载均衡群集&#xff08;Load Balance Cluster&#xff09;2.2 高可用群集&#xff08;High Availability Cluster&#xff09;2.3 高性能运算群集&#xff08;High Performa…

STL——stack容器、queue容器、list容器

初识STL **stack容器****stack容器——基本概念****stack容器——常用接口** **queue容器****queue容器——基本概念****queue容器——常用接口** **list容器****list容器基本概念****list容器——构造函数****list容器——赋值和交换****List容器——大小操作****list容器——…

碳排放预测模型 | Python实现基于机器回归分析的碳排放预测模型——数据可视化和探索

文章目录 效果一览文章概述研究内容环境准备源码设计学习总结参考资料效果一览 文章概述 碳排放预测模型 | Python实现基于机器回归分析的碳排放预测模型——数据可视化和探索 目标是测试所选特征对分析的重要性,检测异常值的存在并准备数据以供进一步分析。 </

PCA主成分分析

PCA降维算法 目前图像特征的提取主要有两种方法&#xff1a;传统图像特征提取方法 和 深度学习方法。 传统的特征提取方法&#xff1a;基于图像本身的特征进行提取&#xff08;PCA&#xff09;&#xff1b;深度学习方法&#xff1a;基于样本自动训练出区分图像的特征分类器&a…

【算法与数据结构】19、LeetCode删除链表的倒数第 N 个结点

文章目录 一、题目二、双指针法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、双指针法 思路分析&#xff1a;这道题使用双指针一次遍历就能删除目标节点。快慢指针同一位置出发&#xff08;虚节点&#x…

博采众长!我全都要!Allen AI推出集成主流大语言模型的LLM-BLENDER框架

深度学习自然语言处理 原创作者&#xff1a;wkk 随着大语言模型(LLM)的迅速发展&#xff0c;众多开源的LLM性能参差不齐。今天分享的是由Allen AI实验室联合南加大和浙江大学的最新研究论文&#xff0c;发表在ACL上。本文提出了一个集成框架(LLM-BLENDER)&#xff0c;旨在通过利…

6.11下周黄金行情分析及开盘多空交易策略

近期有哪些消息面影响黄金走势&#xff1f;下周黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;金价周五(6月8日)收低&#xff0c;但在美元整体走软的支撑下&#xff0c;本周录得连续第二周上升。美市尾盘&#xff0c;现货黄金收报1960.83美元/盎司&#xff0c;…

分布式项目 16 购物车系统,dubbo框架(重点是拦截器),优化userId,配合拦截器

01.创建jt-cart项目 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a; 在pom.xml文件中添加jt-common的依赖&#xff0c;如图所示&#xff1a; 第五步&#xff1a; 添加插件 <build> <plugins> <!--跳过测试类打包 --> <…

支撑臂爬楼履带车实现爬楼梯功能

1. 功能说明 本文示例将实现R018a支撑臂爬楼履带车爬楼梯的功能。 2. 结构说明 支撑臂爬楼履带车主要是由 小型平行履带底盘 和2个 舵机关节模组 组成。 3. 电子硬件 在这个示例中&#xff0c;我们采用了以下硬件&#xff0c;请大家参考&#xff1a; 主控板 Basra主控板&#…

MIT 6.S081 (BOOK-RISCV-REV1)教材第二章内容

MIT 6.S081 第二章内容 引言操作系统架构抽象系统资源用户态&#xff0c;核心态&#xff0c;以及系统调用内核组织代码&#xff08;XV6架构篇&#xff09;进程概述代码&#xff08;启动XV6和第一个进程&#xff09;真实世界 引言 MIT 6.S081 2020 操作系统 本文为MIT 6.S081课…