【STC单片机学习】高级外设和项目篇一:温度传感器DS18B20

【朱老师课程总结 侵删】

本节知识点:串口uart、LCD1602、DS18B20

第一部分、章节目录

2.1.1.DS18B20相关背景知识1

2.1.2.DS18B20相关背景知识2

2.1.3.原理图和数据手册1

2.1.4.原理图和数据手册2

2.1.5.原理图和数据手册3

2.1.6.原理图和数据手册4

2.1.7.原理图和数据手册5

2.1.8.DS18B20的工作流程分析

2.1.9.DS18B20的编程要点

2.1.10.DS18B20移植实验1

2.1.11.DS18B20移植实验2

2.1.12.DS18B20移植实验3


第二部分、章节介绍

2.1.1.DS18B20相关背景知识1
    本节首先总结第1季的内容,正式介绍第2季的细节规划和学习目标,最后讲了温度传感器的发展历程。
2.1.2.DS18B20相关背景知识2
    本节详细介绍DS18B20温度传感器的基本特点,这些信息来自于数据手册,目的是让大家对这个传感器有个大概认识。
2.1.3.原理图和数据手册1
    本节开始带大家读18B20的数据手册,核心是框图的理解以及温度值和读出的数字值的对应换算关系,这对后续编程很重要。    
2.1.4.原理图和数据手册2
    本节接着读数据手册,主要是报警设置、64位只读ROM等内容。
2.1.5.原理图和数据手册3    
    本节开始分析DS18B20的低层时序,主要是初始化和芯片存在探测时序的分析。并且和初始化函数源码进行了对比分析。   
2.1.6.原理图和数据手册4
    本节主要讲解18B20的低层二进制读写时序,这些时序是控制器和18B20发送接收指令数据的基础时序。
2.1.7.原理图和数据手册5
    本节结合官方实例代码中的字节读写函数源码,再次对比分析低层读写时序,加深理解。
2.1.8.DS18B20的工作流程分析
    本节对DS18B20的工作流程进行分析,其实就是高层时序的实现。并且重点讲了ROM操作指令和功能指令。
2.1.9.DS18B20的编程要点
    本节对DS18B20程序的移植要点做阐述,然后带大家一步一步去做程序移植工作
2.1.10.DS18B20移植实验1
    本节正式开始移植实验,本节主要是初始化函数的测试。
2.1.11.DS18B20移植实验2
    本节添加高层时序,并且写测试函数读取温度,移植的关键点还是在于时序中的延时。
2.1.12.DS18B20移植实验3
    本节实际测试代码,并且对读到的温度值进行加工处理,串口输出。

    
第三部分、随堂记录

2.1.1.DS18B20相关背景知识1

2.1.1.1、温度传感器
(1)测温度的方式:

  • 物理(汞柱、气压)
  • 电子(金属电性能(电阻率和导电性)随温度变化)

(2)早期:热敏电阻NTC(模拟接口):要进行AD转换,还要进行校准,很麻烦
(3)现代:专用传感器

  • 数字接口,如I2C、DS18B20的单总线(1-wire)接口等
  • 直接可以读出温度值,内部集成了AD转换芯片
    查看源图像


2.1.2.DS18B20相关背景知识2

DS18B20数据手册

2.1.2.1、DS18B20的基本特征
(1)内置集成ADC,外部数字接口DQ
(2)单总线(1-wire)数字接口,布线成本低
(3)内置唯一64位序列号存储在内部存储器中(就是DS18B20的身份证号,全球唯一,类似于网卡的MAC地址,出厂就带好了,不能更改)
(4)CPU可以单线串联无限多个DS18B20
(5)温度范围宽、精确率高(相对)
(6)数字值温度分辨率位数可软件设置(9-12位),分辨率不同,精确度不同
(7)温度采集速度快(750ms)
(8)温度阈值报警功能,且阈值可内置存储掉电不丢失(可以用EEPROM存储TH、TL实现)
(9)支持VDD供电/ 数据总线内部电容实现寄生电源供电


2.1.2.2、学习思路
(1)了解基本特征、内部结构、单总线协议、时序、如何接线、数据收发编程!
(2)学习重点和难点是单总线协议的时序编程实现


2.1.3.原理图和数据手册1

2.1.3.1、原理图和接线
(1)引脚图


(2)原理图确认

(2)接线确认

  • 一定要注意温度传感器的方向,在接口处用丝印画了一个凸起,所以只需要将温度传感器对应插入即可
  • J14对应DQ线,可以接到单片机任意一个引脚上!咱们接到P3.7上


2.1.3.2、数据手册学习
(1)内部结构框图

  • 讲一下,如何利用DQ线供电!


这几类寄存器,下面会讲,先MARK一下:

  • 两个字节的温度寄存器
  • 温度报警值寄存器(TH、TL,各八位)
  • 一个字节的配置寄存器


2.1.4.原理图和数据手册2—寄存器

2.1.4.1、温度寄存器—测温度

  • 只有发布温度转换命令(44H)后,经过AD转换的二进制数补码才会存在温度寄存器中。
  • 温度转换结束:= 1,未结束:=0;
  • 当单片机读取温度寄存器时,低位在前,高位在后! 
  • 9位:0.5℃     10位:0.25℃         11位:0.125℃          12位:0.0625摄氏度
  • MS+LS 里面存储的是格子数!实际温度 = 温度寄存器的值*分辨率

2.1.4.2、TH和TL寄存器—报警操作

  • TH和TL寄存器存放在EEPROM中,一旦自定义好报警预置值,掉电时不会丢失的
  • 每一次温度转换后,温度寄存器的值和TH、TL寄存器比较,如果高于TH或者低于TL,就会报警
  • 当S = 0时,表示温度为正,S = 1时,表示温度为负

2.1.4.3、配置寄存器—配置分辨率


  • 位7和位0-4被器件保留
  • 默认是12bit

2.1.4.4、高速暂存器

  • 由暂存SRAM和一个EEPROM组成
  • 数据通过写暂存器指令(0x4E)写入高速暂存器

2.1.5.原理图和数据手册3

2.1.5.1、单总线协议概述
(1)单点:一主一从、多点:一主多从

  • 咱们的开发板时单点系统,但是咱们会讲多点系统!

(2)DS18B20规定总线上的数据是LSB的(低位传输)
(3)单总线硬件连接要求:漏极开路式+5K欧姆的上拉电阻
(4)总线低电平超过480us,从设备将被复位


2.1.5.2、单总线协议标准执行序列
(1)主机必须按照单总线协议设定好的完整序列和DS18B20通信,每个回合包含3个步骤:

  • 初始化
  • ROM操作指令
  • 功能操作指令。

   顺序不能错也不能省略任何一个,即使不用,也会用到跳过指令!

(2)初始化就是:主设备先拉低数据总线超过480us以发出一个复位脉冲,然后释放总线(DQ = 1),从设备DS18B20收到复位脉冲后内部进行硬件复位,复位完成后回复主设备一个存在脉冲,主设备收到了存在脉冲后就认为从设备已经准备好,初始化完成。
看一下复位和存在脉冲,在“单总线信号”部分

代码:

//DSPORT就是DQ线
uchar Ds18b20Init()
{
	uchar i;
	DSPORT = 0;			 //将总线拉低480us~960us
	delay500us();
	DSPORT = 1;			//然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
	i = 0;
	while(DSPORT)	//等待DS18B20拉低总线
	{
		i++;
		if(i>5)//等待>5MS
		{
			return 0;//初始化失败
		}
		delay1ms();	
	}
	return 1;//初始化成功
}

2.1.6.原理图和数据手册4

单总线信号:
2.1.6.1、写时序

2.1.6.2、读时序


2.1.7.原理图和数据手册5

2.1.7.1、源码分析与时序图对照

读写时序官方示例:

/*******************************************************************************
* 函 数 名         : Ds18b20WriteByte
* 函数功能		   : 向18B20写入一个字节
* 输    入         : com
* 输    出         : 无
*******************************************************************************/

void Ds18b20WriteByte(uchar dat)
{
	uint i, j;

	for(j=0; j<8; j++)
	{
		DSPORT = 0;	     	  //每写入一位数据之前先把总线拉低1us
		i++;
		DSPORT = dat & 0x01;  //然后写入一个数据,从最低位开始
		i=6;
		while(i--); //延时68us,持续时间最少60us
		DSPORT = 1;	//然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
		dat >>= 1;
	}
}
/*******************************************************************************
* 函 数 名         : Ds18b20ReadByte
* 函数功能		   : 读取一个字节
* 输    入         : com
* 输    出         : 无
*******************************************************************************/


uchar Ds18b20ReadByte()
{
	uchar byte, bi;
	uint i, j;	
	for(j=8; j>0; j--)
	{
		DSPORT = 0;//先将总线拉低1us
		i++;
		DSPORT = 1;//然后释放总线
		i++;
		i++;//延时6us等待数据稳定
		bi = DSPORT;	 //读取数据,从最低位开始读取
		/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
		byte = (byte >> 1) | (bi << 7);	
		//byte |= (bi << (8-j));
		i = 4;		//读取完之后等待48us再接着读取下一个数
		while(i--);
	}				
	return byte;
}


2.1.8.DS18B20的工作流程分析

2.1.8.1、温度获取流程

(1)主控CPU发送温度转换命令—转换成AD值
     这么设计是因为温度转换本身是要耗电的,所以设计为平时待机等待温度转换命令后才去进行温度AD转换。
(2)每个周期都要“初始化—ROM操作指令—功能操作指令”三步
    主控CPU和DS18B20之间的通信是分周期的,譬如我们要让DS18B20进行温度转换就是一个周期。这个周期包含一个“初始化+N个指令的操作”。
(3)初始化过程
    主要是探测目标DS18B20是否存在,若存在将芯片初始化。每个通信周期都是和DS18B20通信!
(4)指令很重要。
    所以DS18B20是一个典型的“命令-响应”型外设:内部带有芯片,可以判断主控CPU发来的各种数据的用途,并做出响应!很多,比如wifi、蓝牙、NB-IOT……
    学习这种外设的关键是指令集。
具体流程图!

2.1.8.2、ROM操作指令—选择从设备
     多点系统会用到,单点系统用不到!

  • DS18B20支持多个芯片串联在一根总线上,也就是所谓的单总线协议,所以必须要主控CPU要能够区分总线上多个18B20,因此有个ROM操作指令来完成这个任务。
  • 一旦系统中单总线上有多个18B20,那么我们必须借助ROM操作指令来区分多个18B20,而且这个区分过程可能需要多条ROM指令来完成。
  • ROM操作指令和温度采集一点关系都没有,所以当我们总线上只有一个DS18B20的时候ROM操作指令我们不需要去管。就用一条skip rom命令(0xCC)就可以跳过这个阶段。

2.1.8.3、DS18B20 功能指令—获取温度
(1)ROM操作指令目的是为了在单总线上多个18B20中挑选到那个当前我们要操作的18B20,而功能指令是为了和选定的18B20通信从而获取温度。
常用的就是温度转换指令(0x44)和读暂存器(0xBE)

 


2.1.9.DS18B20的编程要点

2.1.9.1、几种工作思路
(1)参考文档自己编写代码(一般设备原厂的人这么做)
(2)参考示例代码移植(大部分做开发的人这样做)

2.1.9.2、DS18B20移植关键点
(1)注意延时函数的本地实现

  • 所有涉及到时间的地方都要重写
  • 要注意自己单片机晶振频率

(2)注意引脚配置

  • 看原理图,有的引脚默认是接好了

(3)注意时序

  • 别人的代码时序一般不需要修改

(4)先通过初始化来检测芯片是否能通再做其他的

  • 复位脉冲和存在脉冲

(5)注意读到的温度值是否会变

  • 先打印到串口调试,再考虑放在数码管/LCD屏


2.1.9.3、代码实践
(1)建立工程
(2)移植初始化函数

  •    根据数据手册的时序图,修改时间相关设置!

(3)移植串口函数作为调试

  • 先看一下串口有没有问题

(4)移植LCD显示功能

  • 看一下LCD显示是否正常


2.1.10.DS18B20移植实验1

2.1.10.1、main函数编写

2.1.10.2、测试与调试
测试ds18b20是否可以通信:用DS_init();


2.1.11.DS18B20移植实验2

2.1.11.1、低层时序读写byte函数的移植

  • 根据时序图改下时间

2.1.11.2、高层时序的移植
(1)温度转换
(2)温度读取
(3)串口调试输出---改造之前send_vol()函数
(4)LCD1602显示---显示可以和串口一样


2.1.12.DS18B20移植实验3

2.1.12.1、温度数据的后续处理
(1)数字量转为温度值
(2)调试输出

换算:tml:0x99, tmh:0x01,意味着,温度数字值:0x0199,就等于409,
当前默认精度是12位的,每一个数字值对应0.0625摄氏度,
所以,计算出来的温度值应该是: 409*0.0625=25.56摄氏度

在单片机中,应该尽量避免进行小数运算。小数运算一般转成整数运算。
tp = 409;
temp=tp*0.0625*100+0.5;    

  • 留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  • 后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  • 算加上0.5,还是在小数点后面。



 

本节课程序下载链接:ds18b20

本节课结束!

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
DS18B20温度传感器的原理流程图如下所示: 1. 初始化:首先,通过单线接口连接DS18B20温度传感器单片机。然后,单片机发送初始化信号给DS18B20,包括复位脉冲和读取ROM指令。 2. 读取ROM:DS18B20将其唯一的64位ROM代码发送给单片机,用于区分不同的传感器。 3. 温度转换单片机发送启动温度转换指令给DS18B20,传感器开始测量环境温度。在转换过程中,传感器会将温度转换为数字信号。 4. 等待转换完成:在温度转换期间,单片机需要等待一段时间,直到传感器完成温度转换。 5. 读取温度:单片机发送读取温度指令给DS18B20,传感器将转换后的温度值发送给单片机。 6. 解析温度:单片机接收到温度值后,对其进行解析和处理。根据DS18B20的特性,温度值通常以16位二进制补码的形式传输。 7. 显示温度:最后,单片机将解析后的温度值通过LED数码管或其他显示设备显示出来。 总结而言,DS18B20温度传感器的原理流程图包括初始化、读取ROM、温度转换、等待转换完成、读取温度、解析温度和显示温度等步骤。通过这些步骤,可以实现从环境中测量温度并将其显示出来的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [DS18B20流程图(1).doc](https://download.csdn.net/download/qq_43966957/87294742)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [DS18B20温度传感器程序设计](https://download.csdn.net/download/weixin_38571759/14031492)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [基于汇编语言的DS18B20温度传感器设计](https://blog.csdn.net/koreyoshi1108/article/details/119719295)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搞IC的小冯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值