stm32之DS18B20

2023-11-04

        DS18B20与stm32之间也是通过单总线进行数据的传输的。单总线协议在DHT11中已经介绍过。虽说这两者外设都是单总线,但时序电路却很不一样,DS18B20是更为麻烦一点的。

DS18B20

在这里插入图片描述

 举例(原码补码反码转换_原码反码补码转换_王小小鸭的博客-CSDN博客):

 将这两个字节的数值转换为温度,最低位有效,当为大于零的数时,将实际的温度值的二进制放在里面,权值为0的成为权值为2^4,所以后续乘以0.0625即可,即可得到实际值。

DS18B20的工作步骤

 初始化DS18B20

写时序

 读时序

 代码

#ifndef __DS18B20_H
#define __DS18B20_H 
#include "system.h"   

#define u8 unsigned char 

//IO方向设置,利用寄存器的方法对IO口的输入输出进行配置
#define DS18B20_IO_IN()  {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=8<<12;}
#define DS18B20_IO_OUT() {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=3<<12;}
//IO操作函数											   
#define	DS18B20_DQ_OUT PGout(11) //数据端口	PG11
#define	DS18B20_DQ_IN  PGin(11)  //数据端口	PG11 
   	
u8 DS18B20_Init(void);//初始化DS18B20
short DS18B20_Get_Temp(void);//获取温度
void DS18B20_Start(void);//开始温度转换
void DS18B20_Write_Byte(u8 dat);//写入一个字节
u8 DS18B20_Read_Byte(void);//读出一个字节
u8 DS18B20_Read_Bit(void);//读出一个位
u8 DS18B20_Check(void);//检测是否存在DS18B20
void DS18B20_Rst(void);//复位DS18B20   

#endif
#include "ds18b20.h"
#include "SysTick.h"

//复位DS18B20
void DS18B20_Rst(void)	   
{                 
	DS18B20_IO_OUT(); 	//SET PG11 OUTPUT
    DS18B20_DQ_OUT=0; 	//拉低DQ
    delay_us(750);    	//拉低750us
    DS18B20_DQ_OUT=1; 	//DQ=1 
	delay_us(15);     	//15US
}
//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
u8 DS18B20_Check(void) 	   
{   
	u8 retry=0;
	DS18B20_IO_IN();	//SET PG11 INPUT	 
    while (DS18B20_DQ_IN&&retry<200)
	{
		retry++;
		delay_us(1);
	};	 
	if(retry>=200)return 1;
	else retry=0;
    while (!DS18B20_DQ_IN&&retry<240)
	{
		retry++;
		delay_us(1);
	};
	if(retry>=240)return 1;	    
	return 0;
}
//从DS18B20读取一个位
//返回值:1/0
u8 DS18B20_Read_Bit(void) 	 
{
    u8 data;
	DS18B20_IO_OUT();	//SET PG11 OUTPUT
    DS18B20_DQ_OUT=0; 
	delay_us(5);
    DS18B20_DQ_OUT=1; 
	DS18B20_IO_IN();	//SET PG11 INPUT
	delay_us(12);
	if(DS18B20_DQ_IN)data=1;
    else data=0;	 
    delay_us(50); 
    return data;
}
//从DS18B20读取一个字节
//返回值:读到的数据
u8 DS18B20_Read_Byte(void)     
{        
    u8 i,j,dat;
    dat=0;
	for (i=1;i<=8;i++) 
	{
        j=DS18B20_Read_Bit();
        dat=(j<<7)|(dat>>1);
    }						    
    return dat;
}
//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(u8 dat)     
 {             
    u8 j;
    u8 testb;
	DS18B20_IO_OUT();	//SET PG11 OUTPUT;
    for (j=1;j<=8;j++) 
	{
        testb=dat&0x01;
        dat=dat>>1;
        if (testb) 
        {
            DS18B20_DQ_OUT=0;	// Write 1
            delay_us(10);                            
            DS18B20_DQ_OUT=1;
            delay_us(80);             
        }
        else 
        {
            DS18B20_DQ_OUT=0;	// Write 0
            delay_us(80);             
            DS18B20_DQ_OUT=1;
            delay_us(10);                          
        }
    }
}
//开始温度转换
void DS18B20_Start(void) 
{   						               
    DS18B20_Rst();	   
	DS18B20_Check();	 
    DS18B20_Write_Byte(0xcc);	// skip rom
	//delay_us(5); 
    DS18B20_Write_Byte(0x44);	// convert
} 

//初始化DS18B20的IO口 DQ 同时检测DS的存在
//返回1:不存在
//返回0:存在    	 
u8 DS18B20_Init(void)
{
 	GPIO_InitTypeDef  GPIO_InitStructure;
 	
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);	 //使能PORTG口时钟 
	
 	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;				//PORTG.11 推挽输出
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		  
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOG, &GPIO_InitStructure);

 	GPIO_SetBits(GPIOG,GPIO_Pin_11);    //输出1

	DS18B20_Rst();

	return DS18B20_Check();
}  
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250) 
short DS18B20_Get_Temp(void)
{
    u8 temp;
    u8 TL,TH;
	short tem;
    DS18B20_Start ();  			// ds1820 start convert
    DS18B20_Rst();
    DS18B20_Check();	 
    DS18B20_Write_Byte(0xcc);	// skip rom
    DS18B20_Write_Byte(0xbe);	// convert	    
    TL=DS18B20_Read_Byte(); 	// LSB   
    TH=DS18B20_Read_Byte(); 	// MSB  
	//printf("TL = %d",TL); 
	//printf("TH = %d",TH);
    if(TH>7)
    {
        TH=~TH;
        TL=~TL; 
        temp=0;					//温度为负  
    }else temp=1;				//温度为正	  	  
    tem=TH; 					//获得高八位
    tem<<=8;    
    tem+=TL;					//获得低八位
    tem=(float)tem*0.0625;		//转换  
	
	if(temp)return tem; 		//返回温度值
	else return -tem;    
}

总结:让我很困惑的是当精度为9位时候,是乘以0.0625还是0.5,后来我想通了,之所以乘以0.0625是因为为了处理小数部分,因为它将权值为2^-4的位移到了权值为2^0的位置,相当于扩大了2^4倍,所以为了还原,得除以2^4,即乘以0.0625,所以不管是几位精度,都是乘以0.0625,只是当精度为12位的时候,相邻的数字量转换得到的模拟量差值为0.0625。当精度为11位时候,最低位是不起作用的,假设为0,所以0000 0000 后面一个输出为0000 0010,两者的差值为0000 0010,乘以0.0625就是0.135,也就是精度为0.125。

附录:

数字温度传感器DS18B20简介 - 知乎 (zhihu.com)

【蓝桥杯单片机11】单总线温度传感器DS18B20的基本操作 - - 21ic电子技术开发论坛

单总线数字温度传感器DS18B20的基本原理及开发要点-小蜜蜂笔记 (xmf393.com)

【进阶强化-01】单总线温度传感器DS18B20的基本原理与应用开发-小蜜蜂笔记 (xmf393.com)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32之DS18B20 的相关文章

  • HP电脑安转虚拟机搭建ubuntu环境

    下载虚拟机vmstation 下载ubuntu iso文件 安转vmstation 进入bios打开虚拟化硬件开关 配置网络代理以及dns 使得可以上网 主要修改 etc apt apt conf文件 以及 etc resolv conf配

随机推荐

  • Pytest固件fixture用法

    fixture是pytest特有的功能 它用 pytest fixture标识 定义在函数前面 在编写测试函数的时候 可以将此函数的名称作为传入参数 pytest会以依赖注入方式将该函数的返回值作为测试函数的传入参数 fixture主要的目
  • SpringBoot整合Dubbo

    Dubbo简介 Dubbo是Alibaba开源的分布式服务框架 它最大的特点是按照分业务的架构 使用这种方式可以使各个业务之间解耦合 或者最大限度地松耦合 简单来说Dubbo 一款分布式服务框架 高性能和透明化的RPC远程服务调用方案 SO
  • nsight 初级使用指南

    1 安装 没有什么特殊设置 2 打开vs 编译生成你需要分析的 exe 在vs上方菜单 有nsight menu choose Start Graphics Debugging 3 在弹出对话框中选择 ok或connect unsecure
  • 云服务器文件传送,云服务器文件传送

    云服务器文件传送 内容精选 换一换 ISO是一种光盘映像文件 通过特定的压缩方式 将大量的数据文件统一为一个后缀名为iso的映像文件 ISO文件可以理解为从光盘中复制出来的数据文件 所以ISO文件无法直接使用 需要利用一些工具进行解压后才能
  • 熟悉数据结构(一)【JavaScript】

    文章目录 1 剑指 Offer 05 替换空格 2 剑指 Offer 06 从尾到头打印链表 3 剑指 Offer 09 用两个栈实现队列 4 剑指 Offer 20 表示数值的字符串 5 剑指 Offer 24 反转链表 1 剑指 Off
  • 114. 二叉树展开为链表-二叉树

    https leetcode cn com problems flatten binary tree to linked list 解题思路 本题观察最后链表从头至尾的顺序正好是前序遍历的结果 所以考虑将前序遍历结果进行存储然后再进行相应的
  • win10注册mysql服务_win10下搭建MySQL服务

    1 下载MySQL安装包 滑动到页面底部 官网提供了不同电脑位数 32 64位 的下载版本 我的电脑是win10 64位的 选择对应版本下载解压包 如果你没有注册登录下载页面时 官网会提示你注册一个账号进行下载 当然你也可以选择just s
  • 【MATLAB第63期】基于MATLAB的改进敏感性分析方法IPCC,拥挤距离与皮尔逊系数法结合实现回归与分类预测

    MATLAB第63期 基于MATLAB的改进敏感性分析方法IPCC 拥挤距离与皮尔逊系数法结合实现回归与分类预测 思路 考虑拥挤距离指标与PCC皮尔逊相关系数法相结合 对回归或分类数据进行降维 通过SVM支持向量机交叉验证得到平均指标 来判
  • 如何炸开(分解)CAD多重插入块

    新建一个空白文本文档 然后将下面 红色 代码复制到里面并保存 将文件名以及后缀名改成unlk lsp defun c unlk en ent setq en entsel n请选择被加密的图形 if en if cdr assoc 0 se
  • ES按资源类型统计个数

    一 目标 统计各类型资源的个数 输出详细报表 http 10 10 6 225 9200 dsideal db t resource info mapping properties RESOURCE FORMAT type text fie
  • Qt编写的遮罩层窗体

    PS 亲测有效 转 http www qtcn org bbs read htm tid 62394 html 最近接了个私活 需要在弹框的窗体背后遮罩原有主窗体 使得突出显示弹窗窗体 突然想到之前写过一个全局截屏的东东 原理一致 拿来改改
  • 转 C++输入输出文件流

    https blog csdn net qq 29924041 article details 74360461 C 学习 在C 中的文件输入和文件输出 简介 在C语言中 我们有fread和fwrite用于文件的输入和输出 在java中我们
  • Hands-On Hyperledger Fabric——Raft共识算法

    文章目录 分布式系统的Raft算法 选举阶段 选举规则与过程 选举的特殊情况 网络分区情况的处理 成员变更 数据同步阶段 日志与状态机 提交阶段的事务一致性问题 租约解决脑裂 总结 本文参考Raft算法实现动画 在fabric1 4 1的版
  • python爬虫之爬取微信公众号文章中的图片

    python爬虫之爬取微信公众号文章中的图片 实现的功能 需要用到的库 需要对html一些标签有一定的了解 代码设计思想 源代码 提示 实现的功能 输入想要爬取微信公众号文章的链接 爬取成功后会输出文件夹已经创建 代码创建位置在D test
  • H3C 三层交换机 设置俩vlan不能相互通讯,只能访问某个端口,且其中一个vlan不能上网...

    三层交换机 S5500与 路由器ER5200G2 相关配置 设定3个VLAN VLAN10 VLAN20 VLAN30 VLAN10与VLAN30相互互通 但是与VLAN20不通 项目需求三层交换机 创建三个VLAN vlan 10 192
  • matlab求系统稳定时k的范围,Matlab大作业

    一 通过举例说明运用MATLAB 判别控制系统稳定的所有方法 稳定是控制系统是否能进行工作的首要条件 一般来说 稳定性成为区分系统是否有用的标志 从实际应用的角度来看 可以认为只有稳定的系统才有用 而线性系统稳定的充分必要条件是 特征方程的
  • vscode配置远程ssh环境

    安装 Oracle VM VirtualBox 安装ubuntu ubuntu上安装ssh sever 百度搜索 ubuntu 18 04上安装ssh sever 58条消息 安装Ubuntu18 04并配置ssh服务 ubuntu18 0
  • WIN7 64位 VS2013下载

    下载网址 https msdn itellyou cn 复制到迅雷进行下载
  • SVG脚本编程介绍

    SVG脚本编程介绍 一 人气 13720 Svg脚本编程简介 一 本文主要介绍SVG的脚本编程 并分别给出放大 缩小 查询 鼠标事件等实例 一 SVG简介 SVG 全称为Scalable Vector Graphics 可伸缩矢量图形 它是
  • stm32之DS18B20

    DS18B20与stm32之间也是通过单总线进行数据的传输的 单总线协议在DHT11中已经介绍过 虽说这两者外设都是单总线 但时序电路却很不一样 DS18B20是更为麻烦一点的 DS18B20 举例 原码补码反码转换 原码反码补码转换 王小