6.4.2 数字温度计设计

更新于 2026年10月10日 版权声明
6.4.2 数字温度计设计

1.任务要求

利用STM32F1和数字温度传感器DS18 B20设计一个数字温度计,能通过LCD1602显示温度值,精度为0.1℃。请设计电路,完成程序设计,并通过Proteus完成仿真和调试。

2.硬件设计

(1)数字温度传感器DS18 B20。

DS18B20是美国DALLAS公司生产的数字温度传感器,它的体积小、功耗低、抗干扰能力强,可直接将温度转化成数字信号传输给MCU处理,每个芯片内部有64位的光刻ROM编码,因此可在一根总线上挂接多个DS18B20,从而实现多点温度测量,其封装形式有多种,如图6.5所示。

图示

图6.5 DS18B20的封装形式

DS18 B20片内有9个字节的RAM高速缓冲区和1个E2PROM,来实现对温度的转换,其中9个字节的RAM高速缓冲区的功能如表6.9所示。

表6.9 RAM高速缓冲区的功能

图示

第1、2字节是在MCU给DS18 B20的温度转换指令发布后,经转换所得的温度值,以两字节补码形式存放其中。一般情况下,用户多使用第1字节和第2字节。MCU通过单总线可读得该数据,读取时低位在前、高位在后。

第3、4字节分别是由软件写入用户报警的上、下限值TH和TL。

第5字节为配置寄存器,可更改DS18 B20的测温分辨率。

第6、7、8字节未用,全为1。

第9字节是前面所有8个字节的CRC码,用来保证正确通信。

片内还有1个E2PROM,其为TH、TL和配置寄存器的映像。

配置寄存器各位的定义如表6.10所示。其中,TM位出厂时已被写入0,用户不能修改;低5位都为1;R1、R0位用来设置分辨率。表6.11列出了R1、R0与分辨率和最大转换时间的关系。用户可通过修改R1、R0位的编码,获得合适的分辨率。

表6.10 配置寄存器各位的定义

图示

表6.11 分辨率设置

图示

(2)DS18B20的工作时序。

DS18B20的工作时序包括初始化时序、写时序和读时序。

①初始化时序如图6.6所示。MCU将数据线电平拉低480~960μs后释放,等待15~60μs,单总线器件输出一个持续60~240μs的低电平,MCU收到此应答后便可进行操作。

②写时序如图6.7所示。当MCU将数据线电平从高拉到低时,产生写时序,有写0和写1两种时序。写时序开始后,DS18B20在15~60μs期间从数据线上采样。若采样到低电平,则向DS18B20写的是0;若采样到高电平,则向DS18B20写的是1。这两个独立时序至少需拉高总线电平1μs。

③读时序如图6.8所示。当MCU从DS18B20读取数据时,产生读时序。此时MCU将数据线电平从高拉到低,使读时序被初始化。如果在此后15μs内,MCU在数据线上采样到低电平,那么从DS18B20读的是0;如果在此后的15μs内,MCU在数据线上采样到高电平,那么从DS18B20读的是1。

图示

图6.6 初始化时序

图示

图6.7 写时序

图示

图6.8 读时序

(3)DS18 B20的指令。

对DS18 B20的操作是通过指令完成的,按照时序进行操作。DS18 B20常用指令如表6.12所示,所有指令均采用1个字节表示。

表6.12 DS18B20常用指令(https://www.daowen.com)

图示

DS18 B20内部有一个64位的ROM编码,其结构如图6.9所示。当对多个单总线上的某一个DS18 B20进行操作时,首先应将主机逐个与DS18 B20挂接,读出其序列号(0x33),再将所有的DS18 B20挂接到总线上,MCU发出匹配ROM指令(0x55),紧接着主机提供的64位序列号之后的操作就是针对该DS18 B20的。

图示

图6.9 DS18B20内部的64位ROM编码结构

如果主机只对一个DS18 B20进行操作,就不需要读取和匹配ROM编码,只要跳过ROM(0xCC)指令,然后发送指令启动温度转换(0x44)即可,发送读取寄存器中的温度数据指令(0xBE)完成温度值的读取。

(4)温度转换。

DS18 B20温度的转换结果存放在高低温字节RAM中,存储格式如表6.13所示。其中,S表示符号位。例如,+125℃、+85℃、+10.125℃、0℃、-10.125℃、-55℃的温度值与对应的二进制和十六进制数关系如表6.14所示。

表6.13 温度存储格式

图示

注意,表中的LSB表示最低有效位(Least Significant bit),MSB表示最高有效位(Most Significant bit)。

表6.14 温度值与对应的二进制和十六进制数关系

图示

例如,当DS18B20采集的温度为+125℃时,输出为07D0H,则实际温度T=(07D0H)/16=(0×163+7×162+13×161+0×160)/16=125℃。

当DS18B20采集的温度为-55℃时,输出为FC90H,由于是补码,应先将11位数据取反加1,得0370H,注意,符号位不变,也不参加运算,则实际温度T=-(0370H)/16=-(0×163+3×162+7×161+0×160)/16=-55℃。

注意对符号位的判断。当温度为负时,符号位为1;温度为正时,符号位为0。

硬件电路中,PC0~PC10连接LCD1602,PD2接DS18B20数字温度传感器,PB8外接按键,硬件电路图如图6.10所示。

图示

图6.10 硬件电路图

3.软件设计

在STM32CubeMX中,配置PC0~PC10为推挽输出,PD2为推挽输出,PB8为上拉输入,并配置成中断方式。系统时钟采用内部HSI,时钟频率为8 MHz。生成MDK工程文件,然后编写DS18B20的驱动程序文件“DS18B20.h”和“DS18B20.c”。

头文件“DS18B20.h”的程序如下。

图示

源文件“DS18B20.c”的程序如下。

图示

图示

图示

图示

在“main.c”文件中添加温度采集、温度值显示程序和按键中断回调函数,程序如下。

图示

图示

4.仿真与调试

在Proteus中绘制仿真电路图,加载.hex可执行文件,开始仿真。当按键被按下时,采集温度值,并将测量到的DS18B20温度值显示在LCD1602上,仿真电路图和调试效果如图6.11所示。

图示

图6.11 仿真电路图和调试效果

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)