基于OneWire通讯协议驱动DS18B20温度传感器笔记

本文详细介绍了DS18B20温度传感器的工作原理及应用,涵盖单总线通讯协议、温度转换指令、读取存储器指令等内容,并提供了具体的代码实现。

前言

 这一次来介绍开发板上板载的温度传感器DS18B20,所使用的封装为左边这款三线的(两根电源线一根信号线)资料基于芯片手册以及普中51单片机A2开发板攻略

OneWire

硬件构成

单总线系统只有一条信号线,因此每一个总线上的器件必须是漏极开路或者三态输出0、1、高阻态

漏极&三态

首先先来复习一下模电----MOS管

 漏极开漏电路如下

 这是一个集成了二极管的MOS管,源极连接二极管

当二极管导通时,MOS管漏极接地

此时若MOS管导通,则输出口被拉至低电平0,当MOS管断开,输出口被上拉电阻拉至高电平1

当二极管断开时,MOS管漏极不接,此时输出口不受输入电路控制,呈现高阻态

OneWire电路

 单总线的空闲状态为高电平,总线如果需要暂停某一执行过程时,如果想要恢复执行,总线必须停留在空闲状态,单总线处在高电平下时间可以无线长,但当总线停留在低电平超过480us时,总线上所有的器件都将被复位

时序逻辑

OneWire单总线大致包括以下几种时序:初始化时序、写(0 和 1)时序、 读(0 和 1)时序, DS18B20 发送所有的命令和数据都是字节的低位在前,下面我们来依次介绍一下

初始化时序

总线上的所有通讯均从初始化序列开始,和前面提到的一样,主机持续输出低电平使总线保持低电平在(480us-960us),这样可以产生一个复位脉冲

之后主机释放总线,总线被拉高置高电平15-60us以进入接收

<think> 首先,用户的问题是基于提供的引用设计一个智能温控风扇系统。系统必须包括: - DS18B20温度传感器:检测环境温度。 - LCD1602:显示当前温度和设定的上下限阈值。 - AT24C02:存储通过按键设置的上下限阈值,实现掉电保存。 - 功能:当温度高于下限阈值时启动风扇;当温度高于上限阈值时,蜂鸣器报警。 用户引用了几个来源: - Ref 1:描述了按键控制温度上限,存储在AT24C02中。 - Ref 2:提到了多个DS18B20和温度调节系统,包括云端上传和PID调节,但用户没做。 - Ref 3:DS18B20的特性,如测温范围-55°C到+125°C,1-Wire通信等。 - Ref 4:DS18B20的代码示例,包括转换温度和读取温度值的函数。 - Ref 5:PWM控制风扇的笔记,讨论了PWM频率设置。 我需要构建一个清晰的回答,结构清晰,逐步解决问题。回答必须使用中文。 关键组件: 1. **硬件组件**: - 微控制器:假设是51单片机(基于引用)。 - DS18B20温度传感器- LCD1602:显示模块。 - AT24C02:EEPROM存储芯片。 - 按键:用于设置阈值。 - 风扇:连接到单片机输出,通过继电器或直接驱动- 蜂鸣器:用于报警。 2. **功能需求**: - 温度检测:使用DS18B20读取温度。 - 显示:在LCD1602上显示当前温度、上下限阈值。 - 存储:使用AT24C02存储阈值,实现掉电保存。 - 控制:按键设置阈值;温度超限时控制风扇和蜂鸣器。 - 报警逻辑:温度 > 下限阈值时启动风扇;温度 > 上限阈值时启动蜂鸣器(可能同时风扇已经启动)。 3. **系统框图**: - 需要描述整体设计:传感器、控制器、显示器、存储器、执行器。 4. **软件逻辑**: - 初始化:读取AT24C02中的阈值,设置初始值。 - 主循环:读取温度、显示信息、检查按键输入、控制输出。 - 按键处理:增加/减少阈值,并保存到AT24C02。 - 温度控制逻辑:比较温度与阈值,触发风扇和蜂鸣器。 5. **代码示例**: - 基于引用4中的DS18B20代码,可以扩展。 - 需要添加LCD1602驱动、AT24C02驱动、按键扫描、PWM控制风扇(参考引用5)。 回答结构: 1. **引言**:概述系统设计。 2. **硬件设计**:描述组件和连接。 3. **软件设计**: - 初始化步骤。 - 主函数逻辑。 - 关键函数:温度读取、阈值设置、存储读写、显示更新、输出控制。 4. **代码片段**:提供关键部分的代码,使用C语言。 5. **注意事项**:如PWM设置、通信协议。 6. **生成相关问题**:在末尾添加相关问题。 系统级指令: - 行内数学表达式用$...$,例如温度值。 - 独立公式用$$...$$,但可能不需要。 - LaTeX语法正确。 - 添加引用标识,如[^1]。 最后,生成相关问题。 完整回答大纲: - **标题**:智能温控风扇系统设计 - **内容**: 1. **系统概述**:简述基于51单片机的系统,集成DS18B20、LCD1602、AT24C02等组件。 2. **硬件连接**: - DS18B20连接到P3.7(假设1-Wire接口)。 - LCD1602连接到P0口或其他。 - AT24C02使用I2C协议,连接到P2.0和P2.1。 - 按键连接到P1口。 - 风扇连接到P2.2(通过PWM控制)。 - 蜂鸣器连接到P2.3。 3. **软件设计**: - 初始化:从AT24C02读取阈值,初始化LCD、DS18B20- 主循环:读取温度 → 显示 → 检查按键 → 控制输出。 - 按键处理:按键1增加上限,按键2减少上限,按键3增加下限,按键4减少下限。保存到AT24C02。 - 温度控制:如果温度 >下限阈值,启动风扇;如果温度 >上限阈值,启动蜂鸣器。 - 显示:LCD显示“Temp: XX°C Low: YY High: ZZ”。 4. **代码实现**:提供伪代码或关键函数。 - 基于Ref4的DS18B20代码。 - 添加AT24C02读写函数。 - LCD1602驱动- PWM控制风扇(Ref5提到100us中断,设置10K-20K频率)。 5. **注意事项**: - PWM频率设置以避免抖动。 - 阈值范围:DS18B20支持-55°C到125°C,所以阈值要在此范围内。 - 掉电保存:确保AT24C02写操作正确。 - **引用**:在相关部分末尾添加引用标识。 生成相关问题: 1. 如何优化DS18B20的温度读取精度? 2. 多个DS18B20传感器如何集成到系统中? 3. 如何添加PID控制以实现更平滑的温度调节? 4. 系统如何扩展到物联网应用(如上传数据到云端)? </think> ### 智能温控风扇系统设计 基于您的需求,我将设计一个基于51单片机的智能温控风扇系统。该系统使用DS18B20检测环境温度,LCD1602实时显示当前温度和设定的上下限阈值,AT24C02存储阈值实现掉电保存,并通过按键设置阈值。当温度超过下限阈值时启动风扇(例如,使用PWM控制直流电机),当温度超过上限阈值时触发蜂鸣器报警。设计参考了DS18B20的1-Wire通信协议[^3]、AT24C02的存储功能[^1],以及PWM控制风扇的优化方法[^5]。系统硬件简单、成本低,适用于小规模温控场景如电子设备散热或温室监控。 #### 1. **系统硬件设计** 系统硬件以51单片机(如STC89C52)为核心,组件连接如下: - **DS18B20温度传感器**:连接单片机P3.7引脚(1-Wire接口),用于检测环境温度,测温范围$-55^\circ\text{C}$ 到 $+125^\circ\text{C}$[^3]。支持寄生供电(仅需数据线和GND)。 - **LCD1602显示模块**:连接P0口(数据线)和P2.4-P2.7(控制线),用于显示实时温度、下限阈值(Low)和上限阈值(High)。 - **AT24C02 EEPROM存储芯片**:通过I²C协议连接P2.0(SCL)和P2.1(SDA),存储阈值数据,实现掉电保存[^1]。 - **按键模块**:连接P1口(例如,P1.0增加上限、P1.1减少上限、P1.2增加下限、P1.3减少下限),用于手动设置阈值(范围$-55^\circ\text{C}$ 到 $+125^\circ\text{C}$)。 - **风扇控制**:直流电机(风扇)通过继电器或MOSFET连接P2.2引脚,使用PWM调速(频率约10kHz-20kHz以避免抖动[^5])。 - **蜂鸣器报警**:无源蜂鸣器连接P2.3引脚,用于高温报警。 - **其他**:5V电源供电,晶振频率11.0592MHz以确保时序准确。 系统框图如下: - 传感器层:DS18B20 → 采集温度。 - 控制层:51单片机 → 处理数据、控制逻辑。 - 存储层:AT24C02 → 存储阈值。 - 输出层:LCD1602显示;风扇和蜂鸣器执行控制。 #### 2. **软件设计** 软件采用Keil C51编写,基于模块化设计。主程序包括初始化、温度读取、显示更新、按键处理、存储读写和控制逻辑。关键点: - **初始化阶段**:从AT24C02读取保存的阈值(如无数据,默认下限$25^\circ\text{C}$、上限$30^\circ\text{C}$),初始化DS18B20和LCD1602。 - **主循环**:每200ms循环一次(避免DS18B20转换延迟)。 - 读取DS18B20温度。 - 在LCD1602显示格式:第一行 "Temp: XX°C",第二行 "Low: YY High: ZZ"。 - 检查按键输入,调整阈值并保存到AT24C02。 - 比较温度与阈值:若温度 > 下限阈值,启动风扇(PWM控制);若温度 > 上限阈值,启动蜂鸣器(持续鸣响)。 - **温度控制逻辑**: - 风扇启动条件:温度 $T > T_{\text{low}}$。 - 蜂鸣器启动条件:温度 $T > T_{\text{high}}$。 - 注意:$T_{\text{low}} < T_{\text{high}}$,且阈值通过按键设置时限制在$[-55, 125]$内[^1][^3]。 ##### 关键函数代码片段 以下是核心代码(基于引用[^4]的DS18B20驱动和引用[^5]的PWM概念): ```c #include <REGX52.H> #include "OneWire.h" // 1-Wire驱动库 #include "LCD1602.h" // LCD驱动库 #include "AT24C02.h" // AT24C02驱动库 // 引脚定义 sbit FAN = P2^2; // 风扇控制引脚 sbit BUZZER = P2^3; // 蜂鸣器控制引脚 // 全局变量 float currentTemp; int lowerThreshold = 25; // 默认下限阈值 int upperThreshold = 30; // 默认上限阈值 // DS18B20读取温度 (基于引用[^4]) float DS18B20_ReadT(void) { unsigned char TLSB, TMSB; int Temp; OneWire_Init(); OneWire_SendByte(0xCC); // SKIP_ROM OneWire_SendByte(0x44); // CONVERT_T // 延时等待转换完成(约750ms) OneWire_Init(); OneWire_SendByte(0xCC); OneWire_SendByte(0xBE); // READ_SCRATCHPAD TLSB = OneWire_ReceiveByte(); TMSB = OneWire_ReceiveByte(); Temp = (TMSB << 8) | TLSB; return Temp / 16.0; // 转换为实际温度 } // PWM控制风扇(频率~10kHz,周期100us中断) void PWM_Control(int dutyCycle) { // 设置定时器中断,每100us触发一次 // dutyCycle: 0-100(风扇速度比例) // 简化实现:使用定时器调节FAN引脚高低电平 } // 主函数 void main() { // 初始化 LCD_Init(); AT24C02_ReadThresholds(&lowerThreshold, &upperThreshold); // 从EEPROM读取阈值 LCD_Display("Temp: --°C", "Low: 25 High: 30"); // 初始显示 while(1) { // 读取温度 currentTemp = DS18B20_ReadT(); // 显示更新 char tempStr[16], threshStr[16]; sprintf(tempStr, "Temp: %.1f°C", currentTemp); sprintf(threshStr, "Low: %d High: %d", lowerThreshold, upperThreshold); LCD_Display(tempStr, threshStr); // 按键处理(示例:P1.0增加上限) if (P1_0 == 0) { // 按键按下 delay(10); // 消抖 if (upperThreshold < 125) upperThreshold++; AT24C02_SaveThresholds(lowerThreshold, upperThreshold); // 保存到EEPROM while(P1_0 == 0); // 等待释放 } // 类似处理其他按键(P1.1减少上限,P1.2增加下限,P1.3减少下限) // 温度控制逻辑 if (currentTemp > lowerThreshold) { PWM_Control(70); // 启动风扇,70%占空比 } else { FAN = 0; // 关闭风扇 } if (currentTemp > upperThreshold) { BUZZER = 1; // 触发蜂鸣器 } else { BUZZER = 0; // 关闭蜂鸣器 } delay(200); // 主循环延时200ms } } ``` #### 3. **设计注意事项** - **PWM优化**:风扇控制使用定时器中断实现PWM,频率设置为10kHz(周期100us)。避免过高频率导致电机抖动,参考值100us中断,每100次中断更新一次占空比(约10ms周期)[^5]。 - **掉电保存**:AT24C02写操作需延时确保数据稳定;阈值保存应在按键松开时触发,减少不必要的EEPROM写入次数(延长芯片寿命)[^1]。 - **精度处理**:DS18B20温度读取误差约$\pm 0.5^\circ\text{C}$,可通过软件滤波(如平均值)提高精度[^3]。 - **报警逻辑**:蜂鸣器仅在上限超限时触发,避免误报;风扇启动后可基于温度差动态调整PWM占空比(如$T$越高,占空比越大)。 - **功耗**:系统待机电流低,DS18B20支持寄生供电节省功耗[^3]。 #### 4. **测试与优化建议** - **测试步骤**: 1. 初始上电:验证LCD显示默认阈值和温度。 2. 按键测试:调整阈值并检查AT24C02存储是否生效(断电重启)。 3. 温度模拟:用热风枪加热DS18B20,观察风扇启动($T > T_{\text{low}}$)和蜂鸣器报警($T > T_{\text{high}}$)。 - **潜在优化**: - 添加温度校准:补偿DS18B20偏移误差。 - 扩展多个DS18B20:支持多点测温(需修改1-Wire搜索ROM命令)[^2]。 - 物联网集成:添加ESP8266模块上传温度数据到云端[^2]。 该系统可靠、成本低,适用于教育或小型项目。如有不足,可基于引用反馈进一步迭代[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值