51单片机实验——单总线温度采集

重点使用的元器件DS18B20

一、实验目标

1、学习单总线温度传感器DB18B20的原理和通信时序;
2、使用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是一种数字温度传感器,其工作时序为:
1.主机发出复位脉冲(Reset Pulse): 主机向DS18B20发送一个低电平信号,持续至少480微秒,然后释放总线。
2. DS18B20发送存在脉冲(Presence Pulse): DS18B20在复位脉冲的15微秒之后,会将总线拉低,持续60-240微秒作为存在脉冲,然后释放总线。
3.主机发送指令:主机向DS18B20发送指令字节,指令字节由8个数据位和1个校验位组成。其中,0代表位写0,1代表位写1。
4.主机读取数据:主机向DS18B20发送读取指令后,DS18B20会从最低有效位开始,依次将温度值的8个数据位发送给主机。
5.主机释放总线:主机释放总线,使总线恢复高电平。

需要注意的是,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 
#define uint unsigned int 
#define out P0 // 定义out为P0口
#
目 录 引 言………………………………………………………1 第一章:绪论…………………………………………………………………2 1.1 问题的提出…………………………………………………………2 1.2 设计的目的及系统功能………………………………………………………2 第二章: 硬件电路设计…………………………………………2 2.1 硬件设计思路………………………………………………………2 2.2 总体设计框图………………………………………………………2 2.3 元电路设计………………………………………………………3 2.3.1 8031单片机………………………………………………3 2.3.2 温度采集及调理电路………………………………………3 2.3.3 模-数转换电路……………………………………………4 2.3.4 键盘及数码管显示电路……………………………………6 2.3.5 地址译码电路………………………………………………6 2.3.6 程序存储器的扩展…………………………………………7 第三章:软件设计……………………………………………………9 3.1 程序流程图设计……………………………………………………9 3.2 程序设计…………………………………………………………12 3.2.1 A/D转换………………………………………………3 3.2.2 键盘及数码管显示………………………………………3 3.2.3 读当前温度子程序……………………………………………4 3.3 调试…………………………………………………………15 第四章:结论……………………………………………………16 参考文献……………………………………………………………17 附录:程序清……………………………………………………18 致谢…………………………………………………………………24
<think>好的,我现在需要帮助用户找到基于51单片机的温度监控系统的项目程序。首先,我要理清用户的需求。用户提到参考了两个引用,分别是基于51单片机温度采集监控系统和无线温度监控系统的设计,所以用户可能希望得到一个结合温度采集、显示以及可能的无线传输的程序代码。 首先,我需要确认系统的主要组成部分。根据引用[1]和[2],系统包括STC89C52单片机、DS18B20温度传感器、LCD1602显示模块、按键模块、报警模块、继电器控制模块,以及可能的无线模块如nRF24L01。用户可能需要一个完整的程序,涵盖这些模块的初始化和功能实现。 接下来,我应该考虑如何组织代码结构。通常,51单片机的程序会使用Keil C语言编写,包括头文件、主函数、中断服务程序、各模块的驱动函数等。需要确保各个模块的初始化正确,比如LCD1602的初始化、DS18B20的温度读取、按键扫描、报警判断以及继电器的控制逻辑。 然后,我需要检查DS18B20的驱动程序是否正确。DS18B20是单总线设备,时序要求严格,因此延时函数和读写操作的代码必须准确。同时,温度数据的处理可能需要将读取的原始数据转换为实际温度值,并处理正负号。 LCD1602的显示部分需要正确配置数据线和控制线,编写显示字符串和数字的函数。用户可能需要实时显示当前温度、设定阈值以及报警状态,因此程序中需要包含更新显示内容的函数。 按键模块用于设置温度阈值,通常需要扫描按键输入,处理去抖动,并根据按键操作调整设定值。这部分可能需要使用外部中断或定时器中断来实现响应。 报警模块和继电器控制部分需要根据当前温度与设定阈值的比较结果,触发蜂鸣器和继电器的动作。这部分逻辑在主循环中处理,确保实时监控温度变化。 此外,如果包含无线传输模块如nRF24L01,程序还需要初始化SPI接口,编写数据发送和接收的函数,可能需要在主循环中定时发送温度数据到接收端。 最后,需要测试各个模块的协同工作,确保温度采集准确、显示更新及时、报警和继电器控制可靠,无线传输稳定。同时,代码应保持结构清晰,注释详细,方便用户理解和修改。 可能遇到的问题包括DS18B20的时序问题导致温度读取失败,LCD1602显示乱码,按键响应不灵敏,或者无线模块通信不稳定。需要逐一排查硬件连接和代码逻辑,确保每个部分正常工作。 综上所述,我将按照这些步骤来组织和编写程序代码,确保满足用户的需求,并提供一个可靠、易于理解的温度监控系统项目程序。</think>### 基于51单片机的温度监控系统程序实现 #### 系统组成模块 1. **主控芯片**:STC89C52 2. **温度采集**:DS18B20传感器 3. **显示模块**:LCD1602液晶屏 4. **控制模块**:加热/冷却继电器 5. **报警模块**:蜂鸣器+LED指示灯 6. **人机交互**:4x4矩阵按键[^1] #### 核心代码框架(Keil C) ```c #include <reg52.h> #include <intrins.h> // 硬件定义 #define LCD_DATA P0 sbit DQ = P1^0; // DS18B20数据线 sbit BUZZER = P1^1; sbit HEATER = P1^2; sbit COOLER = P1^3; // 温度阈值 float temp_high = 30.0; float temp_low = 20.0; // LCD1602驱动函数 void LCD_Init(); void LCD_WriteString(unsigned char addr, char *str); void LCD_ShowTemp(float temp); // DS18B20驱动函数 void DS18B20_Init(); float DS18B20_ReadTemp(); // 系统功能函数 void Key_Scan(); void Alarm_Control(int status); void Relay_Control(float current_temp); void main() { float current_temp; LCD_Init(); DS18B20_Init(); while(1) { current_temp = DS18B20_ReadTemp(); LCD_ShowTemp(current_temp); Relay_Control(current_temp); Key_Scan(); // 添加无线传输代码[^2] } } ``` #### DS18B20温度采集关键代码 ```c float DS18B20_ReadTemp() { unsigned char LSB, MSB; int temp; DS18B20_Init(); // 初始化序列 // 温度转换命令 Write_DS18B20(0xCC); // 跳过ROM Write_DS18B20(0x44); // 启动转换 Delay(800); // 等待转换完成 DS18B20_Init(); Write_DS18B20(0xCC); Write_DS18B20(0xBE); // 读取寄存器 LSB = Read_DS18B20(); MSB = Read_DS18B20(); temp = (MSB << 8) | LSB; return temp * 0.0625; // 转换为实际温度 } ``` #### 继电器控制逻辑 ```c void Relay_Control(float current_temp) { if(current_temp > temp_high) { COOLER = 0; // 启动制冷 HEATER = 1; Alarm_Control(1); } else if(current_temp < temp_low) { HEATER = 0; // 启动加热 COOLER = 1; Alarm_Control(1); } else { HEATER = COOLER = 1; // 关闭所有继电器 Alarm_Control(0); } } ``` #### 无线传输扩展(nRF24L01) ```c void NRF24L01_SendData(float temp) { unsigned char buf[4]; *(float*)buf = temp; SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); SPI_Write_Buf(WR_TX_PLOAD, buf, 4); CE = 1; // 启动发射 Delay(15); CE = 0; } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值