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

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 发射模块软件流程
系统初始化:
单片机I/O口初始化:配置P1、P3口为输出或输入。
定时器初始化:配置定时器用于DS18B20单总线时序的精确延时。
NRF24L01+模块初始化:配置为发射模式,设置工作频率、数据速率、发送功率、发送地址、开启自动重发和自动应答等。这涉及一系列的SPI寄存器写入操作。
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的数据格式将其转换为实际的摄氏温度值(浮点数或定点数)。
数据封装与无线发送:
将获取到的温度值(例如,转换为整数,乘以10或100以保留小数位,或直接发送浮点数转换为字节数组)进行打包,形成一个数据帧。数据帧可以包含标识符、温度值、校验和等信息。
通过SPI接口将数据帧写入NRF24L01+的发送缓冲区。
拉高CE引脚(持续一段时间后拉低)触发NRF24L01+发送数据。
等待发送完成或发送失败(通过IRQ中断或查询STATUS寄存器)。
进入低功耗模式(可选):发送完成后,单片机和NRF24L01+可以进入低功耗模式,周期性地唤醒进行下一次测量和发送,以延长电池寿命。
4.2 接收模块软件流程
系统初始化:
单片机I/O口初始化。
NRF24L01+模块初始化:配置为接收模式,设置工作频率、数据速率、接收地址等。
LCD初始化:发送LCD初始化指令,设置显示模式、清屏等。
无线数据接收:
NRF24L01+进入接收模式并持续监听。
轮询或中断检测: 周期性轮询NRF24L01+的STATUS寄存器(RX_DR位)或配置外部中断(IRQ引脚),当有数据到达时触发。
读取数据: 通过SPI接口从NRF24L01+的接收缓冲区读取数据。
数据解析与校验: 对接收到的数据帧进行解析,提取温度值,并进行校验(如CRC),确保数据有效性。
温度数据显示:
将解析出的温度值转换为字符串格式(例如,使用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)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。
拍明芯城拥有对此声明的最终解释权。

产品分类

2012- 2022 拍明芯城ICZOOM.com 版权所有 客服热线:400-693-8369 (9:00-18:00)