51单片机实验——单总线温度采集
51单片机实验——单总线温度采集
本文将介绍如何使用51单片机和DS18B20温度传感器进行温度采集实验。通过学习DS18B20的工作原理和通信时序,读者将能够掌握如何使用单片机实现温度数据的读取和处理。
一、实验目标
- 学习单总线温度传感器DS18B20的原理和通信时序;
- 使用51单片机的一个IO口模拟单总线时序与温度传感器DS18B20通信,读取出检测的环境温度。
二、实验原理
1.DS18B20元器件介绍
DS18B20是一款数字温度传感器,由美国公司Dallas Semiconductor(现在是Maxim Integrated)开发并生产。它采用单总线接口,可以直接与主控器连接,无需额外的模数转换器或外部组件。DS18B20可以在-55°C至+125°C范围内测量温度,并提供12位的数字输出,具有较高的精度和稳定性。
DS18B20内部有一个温度传感器,可以将环境温度转化为数字信号,并通过单总线接口传输给主控器。它的特点包括:
- 使用单个引脚进行通信和电源供应,简化了电路设计和连接。
- 12位的分辨率可以提供更准确和精确的温度测量结果。
- 内部有温度补偿的逻辑,可以提供更稳定和可靠的测量结果。
- 支持多个DS18B20传感器并联,通过唯一的64位ROM代码进行地址识别。
- 可以通过软件进行温度转换和读取,使得使用和集成更为方便。
由于其精度高、稳定性好和可扩展性强的特点,DS18B20被广泛应用于工业控制、自动化系统、气象检测、室内温度监测等领域。
2.DS18B20的工作时序
DS18B20是一种数字温度传感器,其工作时序为:
- 主机发出复位脉冲(Reset Pulse): 主机向DS18B20发送一个低电平信号,持续至少480微秒,然后释放总线。
- DS18B20发送存在脉冲(Presence Pulse): DS18B20在复位脉冲的15微秒之后,会将总线拉低,持续60-240微秒作为存在脉冲,然后释放总线。
- 主机发送指令:主机向DS18B20发送指令字节,指令字节由8个数据位和1个校验位组成。其中,0代表位写0,1代表位写1。
- 主机读取数据:主机向DS18B20发送读取指令后,DS18B20会从最低有效位开始,依次将温度值的8个数据位发送给主机。
- 主机释放总线:主机释放总线,使总线恢复高电平。
需要注意的是,DS18B20的通信时序是在一条串行总线上进行,不存在时钟信号,主机通过控制总线电平变化来实现与DS18B20的通信。同时,DS18B20的通信速率较慢,一般为15-30kbps,因此在通信时需要保持较低的总线速率以确保稳定通信。
3.DS18B20读取温度过程分析
读取温度数据,由于DS18B20 是单总线器件,所有的单总线器件都要求采用严格的信号时序,以保证数据的完整性。DS18B20 时序包括如下几种:初始化时序、写(0和1)时序、读(0 和 1)时序。DS18B20 发送所有的命令和数据都是字节的低位在前。这里我们简单介绍这几个信号的时序:
(1)初始化时序
单总线上的所有通信都是以初始化序列开始。主机输出低电平,保持低电平时间至少 480us (该时间的时间范围可以从 480 到 960 微妙) , 以产生复位脉冲。
接着主机释放总线,外部的上拉电阻将单总线拉高,延时 15~60 us,并进入接收模式。接着 DS18B20 拉低总线 60~240 us,以产生低电平应答脉冲,若为低电平,还要做延时,其延时的时间从外部上拉电阻将单总线拉高算起最少要480微妙。初始化时序图如下:
(2)写时序
写时序包括写 0 时序和写 1 时序。所有写时序至少需要 60us,且在 2 次独立的写时序之间至少需要 1us 的恢复时间,两种写时序均起始于主机拉低总线。写 1 时序:主机输出低电平,延时 2us,然后释放总线,延时 60us。写 0时序:主机输出低电平,延时 60us,然后释放总线,延时 2us。写时序图如下:
(3)读时序
单总线器件仅在主机发出读时序时,才向主机传输数据,所以,在主机发出读数据命令后,必须马上产生读时序,以便从机能够传输数据。所有读时序至少需要 60us,且在 2 次独立的读时序之间至少需要 1us 的恢复时间。每个读时序都由主机发起,至少拉低总线 1us。主机在读时序期间必须释放总线,并且在时序起始后的 15us 之内采样总线状态。读时序图如下:
典型的读时序过程为:主机输出低电平延时 2us,然后主机转入输入模式延时 12us,然后读取单总线当前的电平,然后延时 50us。
在了解了单总线时序之后,我们来看看 DS18B20 的典型温度读取过程,
DS18B20 的典型温度读取过程为:复位→发 SKIP ROM 命令( 0XCC)→发开始转换命令( 0X44)→延时→复位→发送 SKIP ROM 命令( 0XCC)→发读存储器命令( 0XBE)→连续读出两个字节数据(即温度)→结束。
详细介绍请看:DS18B20中文数据手册。
三、实验内容
实验电路图
参考代码
#include "reg51.h"
#include "intrins.h" // 包含头文件,定义了一些内联函数
#define uchar unsigned char