首页 理论教育 基于单片机的软件编程技巧与方法

基于单片机的软件编程技巧与方法

时间:2023-06-23 理论教育 版权反馈
【摘要】:如图7.9所示,当DS18B20响应复位并向主机发送应答脉冲时,即意味着向主机指示它在总线上并准备好运行。在发出DS18B20功能命令之前,主设备必须发出适当的ROM 命令。这些命令允许主机对DS18B20的暂存器进行写入和读取,启动温度转换并确定电源模式。DS18B20采用严格的1-Wire通信协议来确保数据的完整性。表7.4DS18B20功能命令的类型及功能续表续表总线主机在写时隙期间将数据写入DS18B20,并在读时隙期间从DS18B20读取数据。写DS18B20的程序如下。

基于单片机的软件编程技巧与方法

访问DS18B20的顺序为

第一是初始化;

第二是执行ROM 命令(后跟所需的数据交换);

第三是执行3DS18B20功能命令(后跟所需的数据交换);

第四是处理数据。

每次访问DS18B20时都必须遵循此顺序,因为如果序列中的任何步骤丢失或无序,DS18B20都将不会响应。此规则的例外是Search ROM [F0h]和Alarm Search[ECh]命令,当DS18B20发出这两种ROM 命令后,主机必须返回序列中的步骤①。

(1)初始化

DS18B20的单总线上的所有操作都以初始化序列开始,该序列由来自主机的复位脉冲和来自DS18B20的应答脉冲组成。如图7.9所示,当DS18B20响应复位并向主机发送应答脉冲时,即意味着向主机指示它在总线上并准备好运行。

DS18B20时序

图7.9 DS1B20初始化时序图

在初始化序列期间,总线主机通过将1-Wire总线拉低至少480μs来传输复位脉冲。然后总线主机释放总线并进入接收模式(RX)。释放总线时,5 kΩ上拉电阻将1-Wire总线拉高。当DS18B20检测到该上升沿时,它会等待15μs至60μs,然后通过将1-Wire总线拉低60μs至240μs来发送应答脉冲。

DS18B20初始化汇编程序如下。

(2)ROM 命令

在总线主控器检测到存在脉冲之后,它可以发出ROM 命令。这些命令对每个从器件的唯一64位ROM 代码进行操作,如果1-Wire总线上有许多器件,则允许主器件单独输出特定器件。这些命令还允许主设备确定总线上存在多少设备和哪些类型的设备,或者是否有任何设备遇到报警条件。具有五个ROM 命令,每个命令长度为8位,具体命令列举在表7.3中。在发出DS18B20功能命令之前,主设备必须发出适当的ROM 命令。

表7.3 ROM 命令的类型及功能

续表

注意:只有在总线上有单个从设备时,Read Scratchpad[BEh]命令才能遵循Skip ROM 命令。在这种情况下,通过允许主设备读取设备而不发送设备的64位ROM 代码来节省时间。如果有多个从设备,则会在跳过ROM 命令后直接启动Read Scratchpad命令,这将导致总线上的数据冲突,因为多个设备将同时尝试传输数据。

(3)DS18B20功能命令

在总线主机上使用ROM 命令寻址希望与之通信的DS18B20之后,主机可以发出DS18B20功能命令之一。这些命令允许主机对DS18B20的暂存器进行写入和读取,启动温度转换并确定电源模式。DS18B20功能命令的类型及功能总结在表7.4中。(www.xing528.com)

DS18B20采用严格的1-Wire通信协议来确保数据的完整性。该协议定义了几种信号类型:复位脉冲、在线脉冲、写入0、写入1、读取0和读取1。总线主控器启动所有这些信号,但存在脉冲信号除外。

表7.4 DS18B20功能命令的类型及功能

续表

总线主机在写时隙期间将数据写入DS18B20,并在读时隙期间从DS18B20读取数据。每个时隙通过1-Wire总线传输一位数据。下面将具体介绍读时隙与写时隙。

(1)写时隙

写时隙有两种类型:写1时隙和写0时隙。总线主机通过使用写1时隙将逻辑1写入DS18B20,通过使用写0时隙将逻辑0写入DS18B20。所有写时隙的持续时间必须至少为60μs,最长不超过120μs,且两个写时隙之间的恢复时间至少为1μs。两种类型的写时隙均由主机将1-Wire总线拉低启动。

若要产生写1时隙,在将1-Wire总线拉低后,总线主机必须在15μs内释放1-Wire总线。总线释放后,5 kΩ 上拉电阻将总线拉高一直到写时隙周期结束。要产生写0时隙,在将1-Wire总线拉低后,总线主控器必须在时隙期间(至少60μs)继续保持总线低电平。

在主机启动写时隙后,DS18B20在一个持续15μs至60μs的窗口期间对1-Wire总线进行采样。如果在采样窗口期间总线为高电平,主机则会向DS18B20写入1;如果该线为低电平,则向DS18B20写入0。

写DS18B20的程序如下。

(2)读时隙

当主机发出读时隙时,DS18B20只能向主机发送数据。因此,主机必须在发出Read Scratchpad[BEh]或Read Power Supply[B4h]命令后立即生成读时隙,以便DS18B20可以提供请求的数据。此外,主机可以在发出转换T[44h]或调用E2[B8h]命令后生成读时隙,以找出操作状态。

所有读取时隙的持续时间必须至少为60μs,插槽之间的恢复时间至少为1μs。主器件启动一个读时隙后,需将1-Wire总线拉低至少1μs,然后释放总线(见图7.10)。主机启动读时隙后,DS18B20 将开始在总线上发送1 或0。DS18B20通过将总线保持为高电平来发送1,并通过将总线拉低来发送0。发送0时,DS18B20将在时隙结束时释放总线,并通过上拉电阻将总线拉回高空闲状态。在启动读时隙的下降沿之后,DS18B20的输出数据有效时间为15μs。因此,主器件必须释放总线,然后在从插槽开始的15μs内采样总线状态。

图7.10 DS18B20读写时序图

读DS18B20的程序(从DS18B20中读出2字节的温度数据)示例如下。

单片机实现温度转换和读取温度数值程序的流程图如图7.11所示,初始化过程包括单片机的初始化,以及使用ROM 命令Search ROM 搜索获取单总线上挂接的DS18B20的个数和各DS18B20的序列号信息。

图7.11 单片机实现温度转换读取温度数值程序的流程图

在测温模块中,单片机首先要产生一个复位脉冲来初始化DS18B20,这是通过拉低DQ 脚1 ms实现的。在程序里,先将单片机的DQ 脚设为输出,然后DQ 输出低电平,延时1 ms后,DQ 脚再拉高,这样就实现了复位脉冲的产生。发出复位脉冲后,单片机就要接收DS18B20的应答脉冲。在程序里,通过先判断DQ 脚是否为高电平,紧接着判断DQ 是否被拉低为低电平来实现应答脉冲的检测。在检测到应答脉冲后,根据DS18B20的时序要求,还需再延时400μs,以便下一步的指令操作。

在检测到DS18B20 正确的应答后,就可以对它发出操作命令。首先向DS18B20发出0xCC的指令字节,该指令是Skip ROM 指令,在这里不需要对DS18B20的ROM 命令进行操作,紧接着发出0x44的启动温度转换的指令,DS18B20收到指令后开始测量温度,并将温度值进行A/D 转换。由于该转换过程需要750 ms,所以设置了延时1 s,以确保测得准确的温度值。延时1 s后,就可以读取温度。同样地,首先要向DS18B20发出复位脉冲,然后检测应答脉冲,接着向DS18B20发出0xBE的读取温度寄存器的指令。发出读取温度指令后,立即将单总线设置为单片机读周期的模式,读取DS18B20发出的温度值。至此,基于DS18B20的温度检测模块的设计就完成了。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈