0 卖盘信息
BOM询价
您现在的位置: 首页 > 技术方案 >无线互联 > 基于AT89C2051单片机和InRF401+DSl8B20数字温度传感器的无线监测系统设计方案

基于AT89C2051单片机和InRF401+DSl8B20数字温度传感器的无线监测系统设计方案

来源: elecfans
2021-11-18
类别:无线互联
eye 6
文章创建人 拍明

原标题:基于AT89C2051和InRF401的无线监测系统设计方案

基于AT89C2051与InRF401+DS18B20的无线温度监测系统设计方案

在现代工业、农业、仓储管理、环境监测乃至于智能家居等诸多领域,对环境温度的实时、精确监测与无线传输需求日益迫切。传统的有线温度监测系统在部署灵活性、布线成本以及复杂环境下可靠性方面存在诸多限制。无线温度监测系统以其非接触式、易于安装、维护成本低等显著优势,成为解决上述问题的理想方案。本设计方案旨在构建一个基于经典的AT89C2051单片机与高集成度无线收发模块InRF401,并配合高性能数字温度传感器DS18B20的无线温度监测系统。该系统将实现对目标区域温度数据的精确采集、无线传输、以及数据接收与显示,为相关应用提供稳定可靠的温度监测解决方案。

image.png

1. 系统概述与总体架构

本无线温度监测系统主要由两个核心部分组成:温度数据采集与无线发射模块,以及无线数据接收与显示模块。

温度数据采集与无线发射模块: 该模块负责感应环境温度,将模拟信号转换为数字信号,通过单片机进行处理,并将处理后的温度数据通过无线方式发送出去。其核心组成包括:DS18B20数字温度传感器、AT89C2051单片机、InRF401无线收发模块、电源模块及必要的接口电路。

无线数据接收与显示模块: 该模块负责接收无线发射模块发送的温度数据,对数据进行解析,并通过显示单元将温度值直观地呈现给用户。其核心组成包括:InRF401无线收发模块、AT89C2051单片机、LCD液晶显示屏(或数码管)、电源模块及必要的接口电路。

整个系统的工作流程可以概括为:DS18B20采集温度数据,并将数字信号发送给AT89C2051单片机;单片机对数据进行处理和封装;InRF401模块将数据通过无线方式发送;接收端的InRF401模块接收数据并发送给接收端的AT89C2051单片机;接收单片机解析数据并通过LCD或数码管显示出来。

2. 核心元器件选型与分析

2.1 单片机:AT89C2051

元器件型号: AT89C2051

器件作用: AT89C2051作为整个系统的核心控制器,负责管理和协调各个模块的工作。在发射端,它负责读取DS18B20的温度数据、对数据进行格式化处理、控制InRF401无线模块的数据发送;在接收端,它负责接收InRF401模块解调后的数据、对数据进行解析、控制显示模块显示温度值。

为什么选择这颗元器件:

  • 成本效益高: AT89C2051是一款经典的8位CMOS微控制器,其价格低廉,非常适合成本敏感型的应用。

  • 资源丰富且易于开发: 尽管引脚数量较少(20引脚),但内部集成了2KB的Flash可编程存储器、128字节RAM、两个16位定时器/计数器、一个全双工串行口以及可编程I/O端口。对于本温度监测系统所需的串口通信(与DS18B20的单总线通信模拟实现,或与InRF401的SPI/UART通信)和基本的控制任务而言,其资源完全足够。

  • 功耗相对较低: CMOS技术使得其在正常工作和空闲模式下功耗相对较低,有利于延长电池供电系统的使用寿命。

  • 开发资料丰富,学习曲线平缓: 作为51系列单片机的衍生型号,AT89C2051拥有大量的开发资料、成熟的开发工具链(如Keil C51)以及广泛的社区支持,对于开发者而言,入门和调试都相对容易。

  • 集成度高,外围电路简单: 相较于需要大量外围芯片才能实现类似功能的方案,AT89C2051内部集成了许多功能模块,减少了外部元件的数量,从而简化了电路设计,降低了PCB的复杂度。

元器件功能:

  • 中央处理器(CPU): 执行程序指令,控制所有内部和外部操作。

  • 闪存(Flash Memory): 2KB的片内可编程Flash存储器,用于存储用户程序代码和固定数据。

  • 随机存取存储器(RAM): 128字节的片内RAM,用于存储临时数据、堆栈和寄存器。

  • I/O端口: 15个可编程I/O引脚,可配置为输入或输出,用于与DS18B20、InRF401以及显示模块进行数据和控制信号的交互。

  • 定时器/计数器: 两个16位定时器/计数器(T0和T1),可用于产生延时、计时、计数事件等,例如精确控制DS18B20的单总线时序。

  • 串行通信接口(UART): 全双工串行口,虽然AT89C2051的UART引脚可能被复用,但在本设计中,与DS18B20的通信是基于其单总线协议,通过GPIO口模拟实现;与InRF401的通信则取决于InRF401的具体接口,如果是SPI或模拟UART,则需要通过GPIO口模拟。

  • 中断系统: 两个外部中断源和定时器中断源,用于响应外部事件(如InRF401的数据接收中断)或定时事件。

2.2 数字温度传感器:DS18B20

元器件型号: DS18B20

器件作用: DS18B20是本系统的核心传感元件,负责将环境温度转换为数字信号,供单片机读取。

为什么选择这颗元器件:

  • 单总线接口: DS18B20采用独特的单总线(1-Wire)通信协议,仅需一根信号线即可与单片机进行通信,极大地简化了硬件连接,节省了单片机的I/O口资源。这对于引脚资源有限的AT89C2051尤为重要。

  • 宽温度测量范围与高精度: 测量范围覆盖-55°C至+125°C,在此范围内,精度在-10°C至+85°C时可达到±0.5°C,足以满足大多数环境温度监测需求。其高分辨率(可配置为9~12位,对应0.5°C~0.0625°C)确保了测量的精确性。

  • 数字输出: DS18B20直接输出数字温度值,省去了传统模拟温度传感器所需的A/D转换电路,简化了系统设计,提高了抗干扰能力,并减少了误差源。

  • 寄生电源模式: DS18B20支持寄生电源模式,即只需两根线(数据线和地线)即可工作,电源由数据线提供。这对于需要节省布线或空间的应用非常有益,虽然通常为了稳定性,仍会建议独立供电。

  • 唯一序列号: 每个DS18B20都带有一个唯一的64位序列号,允许多个DS18B20并联在同一条单总线上进行识别和寻址,实现多点温度监测。这为系统的扩展性提供了可能。

元器件功能:

  • 温度感应元件: 内部集成有高精度半导体温度传感器。

  • A/D转换器: 将感应到的模拟温度信号转换为数字信号。

  • 单总线接口: 实现与单片机的串行通信,支持数据读写和功能控制。

  • 存储器: 包括一个用于存储温度值和配置参数的暂存器(Scratchpad)以及一个用于存储高低温报警阈值的EEPROM。

  • 报警功能: 可编程的高低温报警功能,当温度超出设定范围时,DS18B20可以发出报警信号。

2.3 无线收发模块:InRF401 (或NRF24L01+等类似模块)

元器件型号: InRF401(这里假设InRF401是一个低成本、易于集成的RF收发模块。若无此具体型号,通常会选择NRF24L01+或Si4432等)。鉴于InRF401信息相对较少,这里以NRF24L01+作为示例进行详细阐述,因为它在低功耗无线通信领域应用极为广泛且性能优异,是InRF401的常见替代品或同类型产品。

器件作用: InRF401(或NRF24L01+)是本系统实现无线数据传输的关键组件。它负责将单片机处理后的数字温度数据调制成无线电波发射出去,并在接收端接收无线电波并解调出数字数据,从而实现两点间的无线通信。

为什么选择NRF24L01+(作为InRF401的代表):

  • 工作频率与抗干扰: 工作在2.4GHz ISM(工业、科学、医疗)频段,这是全球通用且免费的频段,具有较好的抗干扰能力。

  • 高数据传输速率: 支持1Mbps或2Mbps的空中数据传输速率,可以快速传输少量温度数据,满足实时性要求。

  • 低功耗设计: 具有多种省电模式(如掉电模式、空闲模式),在发射和接收模式下电流消耗也相对较低,非常适合电池供电的无线设备,有助于延长发射模块的续航时间。

  • 自动应答与自动重发: 内部集成了自动应答和自动重发机制,大大简化了软件层的错误检测和纠正,提高了通信的可靠性。

  • 多点通信能力: 具有6路数据接收管道(Data Pipes),理论上可以支持一点对多点或多点对一点的通信网络,为系统扩展性提供了可能。

  • 硬件接口简单: 采用SPI(串行外设接口)与单片机进行通信,SPI接口速度快,且只需四根线(CSN, SCK, MOSI, MISO)即可完成通信,对于AT89C2051这样的单片机来说,通过软件模拟SPI或利用其IO口进行位操作即可实现通信。

  • 集成度高: 内部集成了射频前端、基带处理器等,外围元件极少,通常只需几颗电容即可工作,降低了硬件设计复杂度。

  • 模块化易于使用: 市面上存在大量基于NRF24L01+的模块,通常带有天线接口,直接引出SPI引脚和电源引脚,方便用户集成到自己的电路板上。

元器件功能(以NRF24L01+为例):

  • 射频收发器: 完成射频信号的调制、解调、发射和接收。

  • 基带处理器: 处理数字基带信号,包括数据打包、解包、CRC校验、自动应答和自动重发等功能。

  • 增强型ShockBurst™: 一种高效的硬件数据包处理协议,包括数据包格式、自动数据包组装、自动应答和自动重发等。

  • 多通道: 支持125个频道,可以方便地进行跳频,进一步提高抗干扰能力。

  • SPI接口: 与微控制器进行高速数据交换和配置的接口。

  • 低功耗管理: 通过各种模式(如掉电模式、待机模式、RX模式、TX模式)实现功耗优化。

2.4 显示模块:1602 LCD液晶显示屏 (或LED数码管)

元器件型号: 1602 LCD液晶显示屏(或其他兼容型号,如2004 LCD)或共阳/共阴LED数码管(如FMD5461AS)

器件作用: 显示模块用于接收端,将单片机解析出的温度数据显示出来,方便用户直观地查看。

为什么选择1602 LCD:

  • 显示内容丰富: 1602 LCD可以显示两行,每行16个字符,除了温度值,还可以显示单位、状态信息等,比数码管能提供更多信息。

  • 功耗相对较低: 相较于点阵式LCD,段式LCD(如1602)的功耗更低,适合长时间运行的设备。

  • 接口简单: 1602 LCD采用并口(8位或4位)与单片机通信,虽然占用AT89C2051的I/O口较多,但在接收端,AT89C2051的I/O口资源相对充足。如果I/O口紧张,也可以选择IIC接口的1602 LCD,但需要额外的IIC驱动芯片或软件模拟IIC。

  • 成本低廉: 1602 LCD是市场上非常普及且价格低廉的显示器件。

  • 编程控制相对简单: 有成熟的驱动库和例程可供参考,便于开发。

元器件功能(1602 LCD):

  • 显示控制器: HD44780(或兼容)控制器,负责接收指令和数据,并驱动液晶显示。

  • 字符发生器: 内置ROM和RAM,用于存储字符点阵数据,可以显示英文字母、数字和一些特殊符号。

  • 数据/指令接口: D0-D7数据线(或D4-D7用于4位模式)、RS(寄存器选择)、RW(读写选择)、EN(使能)等控制线。

  • 背光: 大部分1602 LCD带有LED背光,提供在光线不足条件下的可视性,但会增加功耗。

为什么选择LED数码管(作为替代):

  • 简单直观: 对于仅仅显示数字温度值而言,数码管显示效果直观,易于识别。

  • 驱动简单: 可以通过74HC595等串行移位寄存器进行驱动,节省单片机I/O口,或者直接由单片机I/O口驱动,但会占用更多引脚。

  • 响应速度快: 数字切换响应速度非常快。

  • 成本更低: 数码管通常比LCD更便宜。

元器件功能(LED数码管):

  • LED段: 由7个(或8个,带小数点)LED构成,通过点亮不同LED段来显示数字。

  • 共阳极/共阴极: 根据驱动方式选择,决定所有LED段的公共端是接电源正极(共阳)还是负极(共阴)。

2.5 电源模块

元器件型号: LM7805(线性稳压器)、AMS1117-3.3(低压差线性稳压器LDO)、或DC-DC降压模块(如基于MP1584等芯片)

器件作用: 为系统的各个模块提供稳定、可靠的直流电源。DS18B20通常工作在3.0V-5.5V,AT89C2051通常工作在3V-5.5V,NRF24L01+工作在1.9V-3.6V,LCD通常工作在5V。因此,需要根据不同模块的需求,提供相应的稳压电源。

为什么选择这些元器件:

  • LM7805: 经典的5V线性稳压器,输入电压范围广(7V-35V),输出稳定,可靠性高,价格便宜。适用于为AT89C2051和5V供电的LCD提供电源。

  • AMS1117-3.3: 低压差(LDO)线性稳压器,输入输出压差小,适合电池供电。用于为NRF24L01+等3.3V供电的模块提供稳定电源。其优势在于压差小,在电池电压下降时能更好地保持3.3V输出。

  • DC-DC降压模块: 如基于MP1584等开关电源芯片的模块。相较于线性稳压器,开关电源的转换效率更高,特别是在输入输出压差较大或需要较大电流时,可以显著减少热量产生,提高电池续航能力。对于功耗敏感或需要从较高电压(如12V电池)降压的应用是更优的选择。

元器件功能:

  • LM7805/AMS1117: 通过内部调整管将较高的输入电压稳定到固定的输出电压,其特点是输出电压纹波小,但转换效率相对较低,剩余能量以热量形式散失。

  • DC-DC降压模块: 通过高频开关、电感和电容的配合,将输入电压高效地转换为较低的输出电压,转换效率高,发热量小。

2.6 其他辅助元器件

  • 晶振: 11.0592MHz或12MHz,为AT89C2051提供精确的时钟源。11.0592MHz有助于精确实现串口通信波特率。

  • 复位电路: RC复位电路(电阻+电容)或专用复位芯片(如MAX813),保证单片机上电可靠复位。

  • 滤波电容: 各电源引脚旁并联104(0.1uF)瓷片电容和10uF/47uF电解电容,用于电源滤波,增强系统稳定性,抑制高频干扰。

  • 上拉电阻: DS18B20的DQ引脚需要接一个4.7kΩ左右的上拉电阻,以确保单总线通信的正常进行。

  • 发光二极管(LED): 用于指示系统工作状态,如电源指示、数据发送/接收指示等。

  • 按键: (可选)用于配置系统参数,如报警阈值、发送间隔等。

  • 电容、电阻: 构成RC延时、限流、分压等基本电路。

  • PCB板: 承载所有元器件并实现电气连接。

3. 系统硬件设计

3.1 发射模块硬件设计

  • DS18B20与AT89C2051连接: DS18B20的DQ引脚(数据线)直接连接到AT89C2051的一个普通I/O口(如P3.0),同时DQ引脚通过一个4.7kΩ电阻上拉到5V电源。GND引脚接地。VCC引脚接5V电源(若采用独立供电)。

  • AT89C2051与InRF401(NRF24L01+)连接:

    • SCK (P1.0) -> NRF24L01+ SCK

    • MOSI (P1.1) -> NRF24L01+ MOSI

    • MISO (P1.2) -> NRF24L01+ MISO

    • CSN (P1.3) -> NRF24L01+ CSN

    • CE (P1.4) -> NRF24L01+ CE (使能引脚)

    • IRQ (P1.5) -> NRF24L01+ IRQ (中断引脚,可选,用于接收数据中断)

    • SPI接口: AT89C2051没有硬件SPI,需要通过软件模拟SPI。分配P1口或P3口作为SPI的SCK、MOSI、MISO、CSN引脚。例如:

    • 电源: NRF24L01+通常工作在3.3V,因此需要一个AMS1117-3.3V稳压器将5V电源降压至3.3V供其使用。在3.3V和GND之间并联10uF电解电容和0.1uF瓷片电容进行滤波。

  • 电源电路: 外部DC电源输入(如9V电池或适配器)经过LM7805稳压为5V,供AT89C2051、DS18B20(独立供电模式)以及后续的3.3V稳压器使用。再由5V通过AMS1117-3.3V为NRF24L01+供电。

  • 晶振与复位电路: 11.0592MHz或12MHz晶振连接到AT89C2051的XTAL1和XTAL2引脚,并并联两个30pF左右的瓷片电容接地。复位引脚RST通过RC电路或复位芯片连接到电源。

3.2 接收模块硬件设计

  • AT89C2051与InRF401(NRF24L01+)连接: 连接方式与发射模块类似,电源处理也相同。IRQ引脚在此处更为重要,可以配置外部中断,当NRF24L01+接收到数据时触发中断,通知单片机读取数据。

  • AT89C2051与1602 LCD连接:

    • 数据线: 1602 LCD的D4-D7(4位模式)连接到AT89C2051的P1或P3口,例如P1.4-P1.7。

    • 控制线: RS、RW、EN引脚连接到AT89C2051的P1或P3口,例如P1.0、P1.1、P1.2。

    • 背光: VCC和LED+连接到5V,GND和LED-连接到GND,或通过限流电阻连接。VEE通过电位器调节对比度。

    • 电源: 1602 LCD通常工作在5V,由LM7805提供的5V电源直接供电。

  • 电源电路: 与发射模块类似,提供稳定的5V和3.3V电源。

  • 晶振与复位电路: 同发射模块。

4. 系统软件设计

软件设计是实现系统功能的关键,主要包括DS18B20温度采集、NRF24L01+无线通信协议实现以及数据显示。

4.1 发射模块软件流程

  1. 系统初始化:

    • 单片机I/O口初始化:配置P1、P3口为输出或输入。

    • 定时器初始化:配置定时器用于DS18B20单总线时序的精确延时。

    • NRF24L01+模块初始化:配置为发射模式,设置工作频率、数据速率、发送功率、发送地址、开启自动重发和自动应答等。这涉及一系列的SPI寄存器写入操作。

  2. DS18B20温度采集:

    • 复位DS18B20: 通过单总线发送复位脉冲。

    • 跳过ROM(Skip ROM,0xCC): 如果只有一个DS18B20,可以使用此命令跳过ROM匹配过程。

    • 启动温度转换(Convert T,0x44): 发送此命令启动DS18B20的温度转换。

    • 等待转换完成: DS18B20温度转换需要一定时间(最高分辨率12位时约750ms),可以通过延时或轮询DS18B20状态位(读数据线)来判断是否完成。

    • 复位DS18B20: 再次发送复位脉冲。

    • 跳过ROM(Skip ROM,0xCC):

    • 读取暂存器(Read Scratchpad,0xBE): 读取9字节的暂存器内容,其中包含温度数据和CRC校验码。

    • CRC校验: 对读取的9字节数据进行CRC校验,确保数据完整性。

    • 解析温度值: 从读取的暂存器中提取温度数据(通常是第0和第1字节),并根据DS18B20的数据格式将其转换为实际的摄氏温度值(浮点数或定点数)。

  3. 数据封装与无线发送:

    • 将获取到的温度值(例如,转换为整数,乘以10或100以保留小数位,或直接发送浮点数转换为字节数组)进行打包,形成一个数据帧。数据帧可以包含标识符、温度值、校验和等信息。

    • 通过SPI接口将数据帧写入NRF24L01+的发送缓冲区。

    • 拉高CE引脚(持续一段时间后拉低)触发NRF24L01+发送数据。

    • 等待发送完成或发送失败(通过IRQ中断或查询STATUS寄存器)。

    • 进入低功耗模式(可选):发送完成后,单片机和NRF24L01+可以进入低功耗模式,周期性地唤醒进行下一次测量和发送,以延长电池寿命。

4.2 接收模块软件流程

  1. 系统初始化:

    • 单片机I/O口初始化。

    • NRF24L01+模块初始化:配置为接收模式,设置工作频率、数据速率、接收地址等。

    • LCD初始化:发送LCD初始化指令,设置显示模式、清屏等。

  2. 无线数据接收:

    • NRF24L01+进入接收模式并持续监听。

    • 轮询或中断检测: 周期性轮询NRF24L01+的STATUS寄存器(RX_DR位)或配置外部中断(IRQ引脚),当有数据到达时触发。

    • 读取数据: 通过SPI接口从NRF24L01+的接收缓冲区读取数据。

    • 数据解析与校验: 对接收到的数据帧进行解析,提取温度值,并进行校验(如CRC),确保数据有效性。

  3. 温度数据显示:

    • 将解析出的温度值转换为字符串格式(例如,使用sprintf函数将浮点数转换为字符串)。

    • 通过AT89C2051控制1602 LCD显示屏,将温度字符串发送到LCD显存,并在指定位置显示出来。可以显示“TEMP: XX.X C”等格式。

    • 异常处理: 如果数据接收失败或校验错误,可以在LCD上显示“RX ERROR”或上次有效值,并进行错误计数。

4.3 DS18B20单总线通信协议实现细节(C语言伪代码)

  // 假设P3.0连接DS18B20的DQ引脚
  #define DQ_PIN P3_0 // DQ引脚定义
  #define DQ_OUT_MODE DQ_PIN = 0 // 设置为输出低
  #define DQ_IN_MODE  // 设置为输入(高阻态,DS18B20拉低)
  #define DQ_READ     DQ_PIN    // 读取DQ引脚状态
  // 单总线复位和存在脉冲
  unsigned char DS18B20_Reset() {
  unsigned char presence_pulse;
  DQ_OUT_MODE;       // 拉低DQ
  Delay_us(480);     // 延时480us
  DQ_IN_MODE;        // 释放DQ(高阻态)
  Delay_us(60);      // 延时60us,等待DS18B20响应
  presence_pulse = DQ_READ; // 读取存在脉冲
  Delay_us(420);     // 延时420us,等待总线恢复
  return presence_pulse; // 0表示存在,1表示不存在
  }
  // 单总线写1
  void DS18B20_Write1() {
  DQ_OUT_MODE;
  Delay_us(6); // 保持低电平6us
  DQ_IN_MODE;
  Delay_us(64); // 保持高电平64us
  }
  // 单总线写0
  void DS18B20_Write0() {
  DQ_OUT_MODE;
  Delay_us(60); // 保持低电平60us
  DQ_IN_MODE;
  Delay_us(10); // 保持高电平10us
  }
  // 单总线读位
  unsigned char DS18B20_ReadBit() {
  unsigned char bit_value;
  DQ_OUT_MODE;
  Delay_us(6); // 拉低DQ 6us
  DQ_IN_MODE;
  Delay_us(9); // 等待9us
  bit_value = DQ_READ; // 读取位
  Delay_us(55); // 等待55us,总线恢复
  return bit_value;
  }
  // 单总线写字节
  void DS18B20_WriteByte(unsigned char dat) {
  unsigned char i;
  for (i = 0; i < 8; i++) {
  if (dat & 0x01) {
  DS18B20_Write1();
  } else {
  DS18B20_Write0();
  }
  dat >>= 1;
  }
  }
  // 单总线读字节
  unsigned char DS18B20_ReadByte() {
  unsigned char i, dat = 0;
  for (i = 0; i < 8; i++) {
  if (DS18B20_ReadBit()) {
  dat |= 0x01 << i;
  }
  }
  return dat;
  }
  // 获取DS18B20温度
  float Get_DS18B20_Temp() {
  unsigned char temp_H, temp_L;
  int temp;
  float real_temp;
  if (DS18B20_Reset() == 0) { // 如果存在
  DS18B20_WriteByte(0xCC); // Skip ROM
  DS18B20_WriteByte(0x44); // Convert T
  // 等待转换完成,此处简化为延时,实际应轮询DQ或延时750ms
  // 可以通过DS18B20_ReadBit()读取DQ判断转换是否完成 (DQ为1表示完成)
  // while(DS18B20_ReadBit() == 0); // 实际应这样等待
  Delay_ms(800); // 粗略延时
  DS18B20_Reset();
  DS18B20_WriteByte(0xCC); // Skip ROM
  DS18B20_WriteByte(0xBE); // Read Scratchpad
  temp_L = DS18B20_ReadByte(); // 读取低字节
  temp_H = DS18B20_ReadByte(); // 读取高字节
  // 其他7字节数据可以忽略,但通常建议全部读取,并进行CRC校验
  temp = (temp_H << 8) | temp_L; // 拼接为16位数据
  // 判断符号位(最高位)
  if (temp & 0xF800) { // 如果是负数
  temp = ~temp + 1; // 补码转换
  real_temp = (float)temp * 0.0625; // 转换为实际温度
  real_temp = -real_temp;
  } else { // 正数
  real_temp = (float)temp * 0.0625;
  }
  return real_temp;
  }
  return -999.0; // 表示读取失败
  }

4.4 NRF24L01+ SPI通信与操作(C语言伪代码)

  // 假设P1口用于模拟SPI:P1.0=SCK, P1.1=MOSI, P1.2=MISO, P1.3=CSN, P1.4=CE
  // SPI引脚定义
  #define CSN_PIN P1_3
  #define CE_PIN  P1_4
  #define SCK_PIN P1_0
  #define MOSI_PIN P1_1
  #define MISO_PIN P1_2
  // NRF24L01+ SPI基本操作
  void NRF24L01_SPI_WriteByte(unsigned char dat) {
  unsigned char i;
  for (i = 0; i < 8; i++) {
  SCK_PIN = 0; // SCK拉低
  if (dat & 0x80) { // 发送高位在前
  MOSI_PIN = 1;
  } else {
  MOSI_PIN = 0;
  }
  dat <<= 1;
  SCK_PIN = 1; // SCK拉高,传输一位
  }
  SCK_PIN = 0; // 完成后SCK拉低
  }
  unsigned char NRF24L01_SPI_ReadByte() {
  unsigned char i, dat = 0;
  MOSI_PIN = 1; // 读操作时MOSI可保持高电平
  for (i = 0; i < 8; i++) {
  SCK_PIN = 0; // SCK拉低
  // Delay_us(1); // 适当延时以保证建立时间
  SCK_PIN = 1; // SCK拉高,采样MISO
  if (MISO_PIN) {
  dat |= (0x80 >> i); // 接收高位在前
  }
  }
  SCK_PIN = 0; // 完成后SCK拉低
  return dat;
  }
  // NRF24L01+写寄存器
  unsigned char NRF24L01_Write_Reg(unsigned char reg, unsigned char dat) {
  unsigned char status;
  CSN_PIN = 0; // 片选使能
  status = NRF24L01_SPI_WriteByte(reg | 0x20); // 写命令(0x20)+寄存器地址
  NRF24L01_SPI_WriteByte(dat); // 写入数据
  CSN_PIN = 1; // 片选失能
  return status; // 返回状态寄存器
  }
  // NRF24L01+读寄存器
  unsigned char NRF24L01_Read_Reg(unsigned char reg) {
  unsigned char reg_val;
  CSN_PIN = 0;
  NRF24L01_SPI_WriteByte(reg); // 读命令 + 寄存器地址
  reg_val = NRF24L01_SPI_ReadByte(); // 读取数据
  CSN_PIN = 1;
  return reg_val;
  }
  // NRF24L01+写FIFO
  unsigned char NRF24L01_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char len) {
  unsigned char status, i;
  CSN_PIN = 0;
  status = NRF24L01_SPI_WriteByte(reg);
  for (i = 0; i < len; i++) {
  NRF24L01_SPI_WriteByte(*pBuf++);
  }
  CSN_PIN = 1;
  return status;
  }
  // NRF24L01+读FIFO
  unsigned char NRF24L01_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char len) {
  unsigned char status, i;
  CSN_PIN = 0;
  status = NRF24L01_SPI_WriteByte(reg);
  for (i = 0; i < len; i++) {
  pBuf[i] = NRF24L01_SPI_ReadByte();
  }
  CSN_PIN = 1;
  return status;
  }
  // NRF24L01+模块初始化(发射端)
  void NRF24L01_TX_Init() {
  CE_PIN = 0; // 使能芯片配置
  NRF24L01_Write_Reg(0x00, 0x0A); // CONFIG: CRC enable, 2-byte CRC, Power UP, TX mode
  NRF24L01_Write_Reg(0x01, 0x00); // EN_AA: disable auto-ack for all pipes (根据需求开启或关闭)
  NRF24L01_Write_Reg(0x02, 0x01); // EN_RXADDR: enable data pipe 0 (接收地址0用于应答)
  NRF24L01_Write_Reg(0x03, 0x03); // SETUP_AW: 5 bytes address width
  NRF24L01_Write_Reg(0x04, 0x03); // SETUP_RETR: auto retransmit delay 1000us, retransmit count 3
  NRF24L01_Write_Reg(0x05, 20);   // RF_CH: 2.420GHz
  NRF24L01_Write_Reg(0x06, 0x06); // RF_SETUP: 2Mbps, 0dBm output power
  // 设置发射地址(与接收地址一致)
  unsigned char TX_ADDR[5] = {0x34, 0x43, 0x10, 0x10, 0x01};
  NRF24L01_Write_Buf(0x30, TX_ADDR, 5); // TX_ADDR
  NRF24L01_Write_Buf(0x10, TX_ADDR, 5); // RX_ADDR_P0 (for auto-ack)
  NRF24L01_Write_Reg(0x11, 32); // RX_PW_P0: payload width (for auto-ack)
  CE_PIN = 1; // 进入待机模式
  Delay_us(130); // 确保NRF24L01+进入正常工作状态
  }
  // NRF24L01+发送数据
  unsigned char NRF24L01_TX_Data(unsigned char *tx_buf, unsigned char len) {
  unsigned char sta;
  CE_PIN = 0;
  NRF24L01_Write_Buf(0xA0, tx_buf, len); // Write_TX_PAYLOAD
  NRF24L01_Write_Reg(0x00, 0x0E); // CONFIG: Power UP, TX mode
  CE_PIN = 1; // 启动发送
  Delay_us(10);
  CE_PIN = 0;
  // 轮询发送状态
  while((sta = NRF24L01_Read_Reg(0x07))&0x40 == 0); // TX_DS 或 MAX_RT
  NRF24L01_Write_Reg(0x07, sta); // 清除中断标志
  if(sta&0x20) { // MAX_RT (最大重发次数)
  NRF24L01_Write_Reg(0xE1, 0xFF); // 清空TX FIFO
  return 0; // 发送失败
  }
  if(sta&0x60) { // TX_DS (发送完成)
  return 1; // 发送成功
  }
  return 0;
  }

4.5 1602 LCD显示驱动(C语言伪代码)

  // 假设P1口连接1602 LCD:RS=P1.0, RW=P1.1, EN=P1.2, D4-D7=P1.4-P1.7
  // LCD引脚定义
  #define LCD_RS P1_0
  #define LCD_RW P1_1
  #define LCD_EN P1_2
  #define LCD_DATA_PORT P1 // 数据线所在端口,需位操作
  // 写入命令或数据到LCD
  void LCD_Write_Byte(unsigned char dat, unsigned char cmd) {
  if (cmd) LCD_RS = 1; else LCD_RS = 0; // RS: 1=数据,0=命令
  LCD_RW = 0; // 写模式
  // 先发送高4位
  LCD_DATA_PORT = (LCD_DATA_PORT & 0x0F) | (dat & 0xF0);
  LCD_EN = 1; Delay_us(5); LCD_EN = 0;
  // 再发送低4位
  LCD_DATA_PORT = (LCD_DATA_PORT & 0x0F) | ((dat << 4) & 0xF0);
  LCD_EN = 1; Delay_us(5); LCD_EN = 0;
  Delay_ms(2); // 等待LCD处理
  }
  // 写入命令
  void LCD_Write_Cmd(unsigned char cmd) {
  LCD_Write_Byte(cmd, 0);
  }
  // 写入数据
  void LCD_Write_Data(unsigned char dat) {
  LCD_Write_Byte(dat, 1);
  }
  // LCD初始化
  void LCD_Init() {
  Delay_ms(15); // 上电延时
  LCD_Write_Cmd(0x33); // 4位数据接口,两行,5x7点阵
  Delay_ms(5);
  LCD_Write_Cmd(0x32);
  Delay_us(100);
  LCD_Write_Cmd(0x28); // 4位接口,两行,5x7点阵
  LCD_Write_Cmd(0x0C); // 显示开,光标关,闪烁关
  LCD_Write_Cmd(0x06); // 地址自动加1,显示不移动
  LCD_Write_Cmd(0x01); // 清屏
  Delay_ms(2);
  }
  // LCD显示字符串
  void LCD_Show_String(unsigned char x, unsigned char y, char *s) {
  unsigned char addr;
  if (y == 0) addr = 0x80 + x; // 第一行
  else addr = 0xC0 + x; // 第二行
  LCD_Write_Cmd(addr); // 设置DDRAM地址
  while (*s) {
  LCD_Write_Data(*s++);
  }
  }

5. 系统优势与应用前景

5.1 系统优势

  • 低成本: 采用AT89C2051和DS18B20等成熟、价格低廉的元器件,有效控制了系统硬件成本。

  • 低功耗: DS18B20本身功耗极低,NRF24L01+支持多种低功耗模式,配合AT89C2051的空闲模式,发射模块可以设计成电池供电,续航时间长。

  • 高可靠性: 数字温度传感器DS18B20具有良好的抗干扰能力和高精度,NRF24L01+的自动应答和重发机制提高了无线通信的可靠性。

  • 安装灵活: 无需布线,发射模块可以放置在任何需要监测温度的区域,部署灵活方便。

  • 扩展性: DS18B20的单总线特性允许多个传感器并联(需增加单片机寻址代码);NRF24L01+的多管道特性也支持构建简单的星型或点对多点网络。

  • 易于开发: 51系列单片机开发资料丰富,软件编程相对简单,调试周期短。

5.2 应用前景

本无线温度监测系统具有广泛的应用前景,包括但不限于:

  • 智能家居: 实时监测室内外温度,配合智能空调、取暖设备进行联动控制。

  • 农业大棚: 监测温室大棚内温度,辅助农作物生长环境控制。

  • 冷链物流: 监测冷藏车、冷库温度,确保货物在运输和储存过程中的质量。

  • 仓储管理: 监测仓库温度,预防物品变质或火灾风险。

  • 工业控制: 监测生产线关键部位温度,实现预警和故障诊断。

  • 环境监测: 监测特定区域的环境温度变化,用于气象站或科研数据采集。

  • 医疗卫生: 监测医院病房、药品储藏室温度,保障医疗环境和药品安全。

6. 系统进一步优化与改进方向

  • 功耗优化: 更精细的软件电源管理,利用AT89C2051的空闲模式和NRF24L01+的掉电模式,在非工作时间进入超低功耗状态,并通过定时器中断或外部中断唤醒。

  • 数据加密与安全: 对于某些敏感应用,可以考虑在数据传输前进行简单的数据加密,提高通信安全性。

  • 网络化扩展: 可以引入路由器或协调器,构建更复杂的星型或网状网络,实现多点温度数据的集中监控。例如,使用更多的NRF24L01+模块构建多传感器节点网络。

  • 报警功能: 在接收端增加声光报警模块,当温度超出预设阈值时发出警报。

  • 数据存储与历史查询: 接收端可以增加EEPROM或Flash存储芯片,用于存储历史温度数据,并可通过上位机或显示屏进行查询。

  • 云平台接入: 通过增加WiFi模块(如ESP8266)或GPRS模块,将温度数据上传至云平台,实现远程监控和大数据分析。但这会显著增加单片机的处理能力需求,可能需要升级到更强大的MCU。

  • 用户界面: 接收端可以考虑使用带触摸功能的TFT LCD显示屏,提供更友好的用户交互界面。

  • PCB设计优化: 采用更紧凑、更抗干扰的PCB布局,特别是RF部分的布线需要注意阻抗匹配和接地处理,以确保无线通信的稳定性和距离。

  • 电池管理: 对于电池供电的发射模块,可以集成电池电量检测电路,并在电量低时发出预警。

  • 自动校准: 可以考虑在系统初始化时或定期进行温度传感器校准,提高测量精度。

总结

本设计方案详细阐述了一个基于AT89C2051单片机与InRF401(或NRF24L01+)无线模块和DS18B20数字温度传感器的无线温度监测系统。通过对核心元器件的深入分析,以及软硬件设计的详细规划,为构建一个低成本、高可靠、易于实现的无线温度监测系统提供了全面的指导。尽管AT89C2051是一款经典的单片机,但其强大的功能和极高的性价比,结合现代无线通信模块,依然能够胜任许多实际应用中的温度监测需求。此方案为开发者提供了一个坚实的基础,在此基础上可以根据具体需求进行进一步的功能扩展和性能优化。

责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

相关资讯

拍明芯城微信图标

各大手机应用商城搜索“拍明芯城”

下载客户端,随时随地买卖元器件!

拍明芯城公众号
拍明芯城抖音
拍明芯城b站
拍明芯城头条
拍明芯城微博
拍明芯城视频号
拍明
广告
恒捷广告
广告
深亚广告
广告
原厂直供
广告