一、功能需求
1,驱动DS18B20,实时读取温度值;
2,74HC595驱动数码管显示温度值;
3,蜂鸣器超温报警;
二、原理
1,DS18B20
DS18B20有着超小的体积,超低的硬件开销,抗干扰能力强,精度高,所有他非常受欢迎。
1)功能特点:
①温度范围:从-55℃到+125℃
②温度分辨率:可通过寄存器设置,支持9位到12位的分辨率
③精度:在-10℃到+85℃范围内,精度为±0.5℃
④输出格式:数字信号(12位二进制)
⑤通信协议:1-Wire,即仅使用一根数据线与微处理器进行通信
⑥工作电源电压范围:3V到5.5V
⑦温度计分辨率可设置为9~12位,12位时分辨率对应为0.0625℃。
2)典型电路
3)64位ROM
用于实现一根总线挂载多个18B20。
4)配置寄存器
5)温度寄存器
The sign bits (S) indicate if the temperature is positive or negative: for positive numbers S = 0 and for negative numbers S = 1。
6)ROM指令和功能指令
ROM指令(ROM Commands):
搜索ROM(Search ROM):该指令用于搜索总线上连接的所有DS18B20设备的唯一ROM代码。通过发送搜索设备指令,可以获取总线上所有DS18B20设备的地址,以便后续与特定设备进行通信。
读取ROM(Read ROM):该指令用于从DS18B20传感器中读取设备的唯一ROM代码。通过发送读取ROM指令,可以获取特定DS18B20设备的地址。
匹配ROM(Match ROM):使用该指令可以将总线上的通信限定为特定的DS18B20设备。发送匹配ROM指令后,只有匹配的设备会对后续的指令做出响应。
跳过ROM(Skip ROM):使用该指令可以忽略总线上所有设备的地址,直接与总线上唯一一个DS18B20设备进行通信。适用于只连接一个DS18B20设备的情况。
使能温度报警搜索(Alarm Search):该指令用于在总线上启动温度报警搜索过程。可以通过发送该指令,识别温度超过设定阈值的DS18B20设备。
功能指令(Function Commands):
读取温度(Convert T):该指令用于启动温度转换过程。在执行该指令后,DS18B20开始测量温度,并将结果存储在内部寄存器中。
写入温度设定值(Write Scratchpad):该指令用于将温度设定值写入DS18B20传感器的内部寄存器。可以使用该指令设置温度报警阈值等参数。
读取温度设定值(Read Scratchpad):该指令用于从DS18B20传感器的内部寄存器中读取温度设定值和其他配置参数。
复制温度设定值(Copy Scratchpad):该指令用于将写入的温度设定值从内部寄存器复制到DS18B20的EEPROM中。通过执行该指令,可以确保温度设定值在掉电后仍然有效。
读取电源供应(Read Power Supply):该指令用于读取DS18B20传感器的电源供应状态,以确定传感器是否正常供电。
写入温度报警阈值(Set Alarm Temp):使用该指令可以将温度报警的上限和下限阈值写入DS18B20的报警寄存器,以便在温度超出设定范围时触发报警。
7)读取温度顺序。我们只有一个DS18B20,所有跳过ROM指令就可以进行温度转化和读取温度了。
注意:每个字节写的时候都是低位在前高位在后。
主机发出读取RAM的命令(BEH),DS18B20接到指令后依次将9个字节的内容按照低字节在前、低位在前的顺序逐位送出数据。主机可依次读取9个字节的数据,如果只想读取温度数据,在读完前2个字节的数据后就不用再理会后面送来的内容。
在对18b20操作时,对时间的要求是非常严格的,所以需要深入了解单总线时序图。
8)时序图
初始化时序
主机首先发出一个480~960us的低电平脉冲(复位),然后释放总线变为高电平,并在随后的480微秒时间内,对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上无器件应答。作为从机的DS18B20上电后就一直检测总线上是否有480~960微秒的低电平出现,如果检测到该复位脉冲则在总线变为高电平后,等待15~60微秒,之后将总线电平拉低60~240微秒(响应存在脉冲),告诉主机本器件已做好准备。
主机编程:主机将DQ拉成低电平保持最少480us后释放总线,延时15~60us后的60~240us时间内检测DQ是否为低电平,再延时240us保持起始时序的完整。
读写时序
写周期的开始,主机先把总线拉低大于1微秒表示写周期开始。随后若主机想写0,则继续拉低电平最少60微秒直至写周期结束,然后释放总线为高电平。若主机想写1,在拉低总线电平1微秒后就释放总线为高电平,一直到写周期结束。作为从机的DS18B20在检测到总线被拉低后等待15微秒后从15us~45us对总线采样(典型时间15us),在采样时间内,若检测到总线为高电平则认为主机发送了1,若检测到总线为低电平则认为主机发生了0。
读周期的开始,主机先把总线拉低大于1微秒,然后释放总线。主机释放总线后,若DS18B20发送0,则把总线拉低并保持至少从读周期开始的15us,然后释放总线为高电平。若DS18B20发送1,则在主机释放总线后不拉低总线(为高电平)。主机须在读周期开始的15us内检测总线电平的高低,若检测到总线为低则表示DS18B20发送来0,若检测到总线为高则表示DS18B20发送来1。
2,有源蜂鸣器
我们这个模块就是给低电平就响;
3,74HC595数码管模块
数码管相关资料参照数码管显示部分。
4,电路连接
74HC595链接在PA15、PA16、PA17
18B20连接在PA18
蜂鸣器连接在PA1
三、软件实现
1)74HC595 GPIO配置。DI连接开发板的PA15,SCLK连接开发板的PA16,RCLK连接开发板的PA17.
2)DS18B20数据引脚定义,使用PA18,我们这里定义为输出,18B20在驱动中根据需要配置为输入输出。
3)配置蜂鸣器引脚,使用PA22,定义为输出。默认输出高电平。避免蜂鸣器初始化时响起。
2,DS18B20驱动
首先定义几个宏定义
初始化时序
写时序
读时序
读取温度
3)温度报警控制
当温度高于设定的极限值时,蜂鸣器响起。我这里设置的大于31摄氏度时,蜂鸣器响起。
编译、下载、运行。