资讯动态

51单片机+NRF905+DS18B20无线温度采集系统设计与实现

发布时间:2026/10/17 14:04:28 来源:尧图企业网站定制
简介这套基于51单片机的温度采集与NRF905无线传输程序适合单片机爱好者、电子类专业学生及DIY玩家。资源包含完整的Keil工程源码覆盖发射机与接收机两端程序并配套LCD1602显示与DS18B20温度采集模块可学习无线通信、传感器读取、显示驱动等核心电路与代码设计思路。包内共34个文件以C源文件、头文件、Keil工程文件uvproj/uvopt为主另有备份、目标文件及hex烧写文件等整体大小仅80KB结构清晰便于直接打开和对照学习。压缩包内将发射机与接收机程序分目录存放适合用于课程设计或毕业设计参考。已有172人学习下载对于小体积入门级单片机通信项目而言具有一定参考价值。使用者需具备基础电子技术知识和C语言能力建议结合实际电路搭建验证重点理解无线收发流程及传感器数据转换逻辑。1. 51单片机NRF905温度采集一个低成本无线测温方案长什么样把一个51单片机温度采集加NRF905无线传输的工程翻出来折腾了一整个下午终于让接收端的1602屏稳定显示出三米外发送端探头的实时温度。这套方案朴素但完整发送端用DS18B20采集温度通过NRF905无线模块在433MHz频段把数据发出去接收端解出数据再显示到LCD屏幕上。对比蓝牙和Wi-Fi方案NRF905的协议栈简单到可以手写射频链路没有固件黑匣子所有寄存器都暴露在SPI总线上非常适合想搞懂“无线传输到底怎么把字节搬过去的”开发者。它也是小型温室监控、机房温度巡检这类低成本场景里最常见的工程模板几十块钱物料就能搭一套出来。2. 系统架构搭建发送端到接收端的完整链路与硬件接线2.1 双端结构发送端采集、接收端显示的分工整个系统由两个独立的51单片机最小系统组成。发送端单片机负责读取DS18B20温度通过SPI接口把数据写进NRF905的发送缓冲区再触发无线发射。接收端单片机的NRF905一直处于接收模式检测到空中信号后自动完成解调和CRC校验DR引脚拉高单片机从SPI口把数据读出来交给1602屏幕显示。这种双端设计有个明显的好处发送端和接收端可以完全独立开发。先单独调试发送端用逻辑分析仪看SPI波形确认数据真的进入了NRF905再单独调接收端用一个循环发送程序当信号源验证接收端能不能正确解出数据。最后把两边合起来联调出问题时直接判断是哪一半的锅不用同时怀疑两个方向。这个习惯在无线项目里非常救命后边的避坑章节还会详细说。2.2 NRF905引脚与51单片机接线电平问题怎么处理NRF905工作在433/868/915MHz三个ISM频段调制方式是GFSK空中波特率最高50kbps手册标称接收灵敏度在-100dBm级别。对它而言51单片机这种低速MCU反而是合适搭配SPI时钟不用多快几兆赫兹以下都能稳定跑。空旷环境配合1/4波长天线通信距离在50到100米量级室内穿一堵墙问题不大。从外设角度看NRF905一共只需要接7个引脚给单片机外加一个DR数据就绪输出。工程里用的模块引脚分布和市面上常见的433MHz版本一致接线参考下表NRF905引脚51单片机引脚功能说明CEP1.0发射/接收使能控制芯片进入对应状态PWR_UP3.3V上电控制高电平使能TX_ENP1.11为发送模式0为接收模式CSNP1.2SPI片选低有效SCKP1.3SPI时钟由51单片机产生MOSIP1.4SPI数据输入单片机→NRF905MISOP1.5SPI数据输出NRF905→单片机DRP1.6数据就绪标志发送完成或收到数据时变高这里最需要注意的是电平匹配。51单片机用5V供电NRF905芯片电源范围是1.9V到3.6V模块板载稳压后接3.3V即可。但SPI信号线如果直接拿5V电平推NRF905引脚时间长了容易损坏射频芯片。我在工程里用了最稳妥的做法MOSI、SCK、CSN三条信号线上各串一个1k电阻做分压MISO由NRF905输出3.3V电平给51单片机5V的单片机读3.3V逻辑高电平完全没有问题。如果你的模块明确标注5V容忍可以直接连但我建议还是串电阻成本几毛钱省得哪天射频芯片烧了还找不到原因。2.3 工程文件目录每个源文件和头文件的职责发送端和接收端在Keil里是两个独立工程两边的单片机运行逻辑完全不同。发送端工程包含main.c、ds18b20.c、nrf905.c、delay.c四个源文件接收端把ds18b20.c换成lcd1602.c。头文件的分工也清晰ds18b20.h只暴露温度获取接口nrf905.h封装射频模块的初始化和收发lcd1602.h仅供接收端使用。tx/ ├── main.c // 发送端主流程采集→组帧→发射 ├── ds18b20.c // DS18B20单总线时序温度读取 ├── ds18b20.h ├── nrf905.c // NRF905 SPI驱动、寄存器配置、收发 ├── nrf905.h └── delay.c // 毫秒和微秒延时依赖晶振频率 rx/ ├── main.c // 接收端主流程接收→解析→显示 ├── nrf905.c // 这里只使用NRF905接收功能 ├── lcd1602.c // 1602液晶初始化、写命令/数据、显示 ├── lcd1602.h └── delay.c模块化拆分后你想改成“接收端把温度通过串口转发给上位机”只需要在rx工程里加一个uart.c完全不碰nrf905.c的接收代码。原工程里的延时函数基于12MHz晶振、标准12T模式的51单片机编写如果你的板子是11.0592MHz或用了6T模式延时函数循环次数必须重新计算否则DS18B20和SPI时序都会出问题。这个问题几乎每个跑通项目的人都会踩一次避坑章节单独说。3. 发送端代码解析从DS18B20读取温度到NRF905发射3.1 DS18B20单总线协议复位、跳过ROM、读暂存器的关键时序DS18B20是单总线器件一根DQ线同时传输时钟和数据时序要求比普通SPI设备严格很多。51单片机没有硬件单总线外设只能靠IO模拟读一次温度大概分三步复位总线、写命令跳过ROM匹配、读暂存器数据。// 复位DS18B20从机存在时返回0 unsigned char DS18B20_Reset(void) { unsigned char presence; DQ 0; // 主机拉低总线 delay_us(480); // 保持低电平480us以上形成复位脉冲 DQ 1; // 释放总线 delay_us(60); // 等待从机响应窗口 presence DQ; // 采样DS18B20会拉低总线60~240us delay_us(420); // 补全剩余时序完成复位周期 return presence; }这里两个关键参数。第一个是复位脉冲宽度手册要求480us实际取480us到960us都可用时间太短从机可能没反应太长也不会出错。第二个是释放总线后必须等待60us再采样因为DS18B20在收到复位脉冲后的15到60us内会拉低总线采样太早读不到应答信号。项目调试时用逻辑分析仪抓过波形主机释放总线后大约20us从机就开始拉低60us的等待窗口完全够用。温度转换的主流程放在ReadTemp函数里unsigned int DS18B20_ReadTemp(void) { unsigned char low, high; unsigned int temp; EA 0; // 关中断保证读取过程时序不被干扰 DS18B20_Reset(); // 复位总线 DS18B20_WriteByte(0xCC); // 跳过ROM匹配直接寻址所有器件 DS18B20_WriteByte(0x44); // 启动温度转换12位分辨率约耗时750ms delay_ms(750); // 等待转换完成 DS18B20_Reset(); // 再次复位准备读操作 DS18B20_WriteByte(0xCC); // 跳过ROM DS18B20_WriteByte(0xBE); // 读暂存器从字节0开始读9个字节 low DS18B20_ReadByte(); // 温度低字节 high DS18B20_ReadByte(); // 温度高字节 DS18B20_Reset(); // 结束读操作释放总线 EA 1; // 恢复中断 temp ((unsigned int)high 8) | low; return temp; // 原始值实际温度原始值*0.0625 }0xCC跳过ROM命令是单总线协议里最常用的指令意思是忽略64位ROM序列号直接对总线上唯一的一个DS18B20操作。如果总线上挂了多个DS18B20就不能用这条命令需要先读ROM获取序列号再逐条寻址。这个场景因为只有一个传感器跳过ROM就是标准做法也是工程里最常见的用法。读出来的原始值乘以0.0625才是实际温度。例如原始值是0x0191即401对应25.0625℃。高字节的高5位是符号扩展位0表示正温度1表示负温度。如果做冰箱冷库应用高字节等于0xFF开头按二进制补码处理就得了常温场景可以不处理负温度。3.2 NRF905初始化与SPI寄存器配置433MHz频段怎么设NRF905的配置通过SPI接口写入芯片内部寄存器组完成。工程里把配置数据放在一个10字节的常量数组里初始化时一次性写入// NRF905配置数组共10字节 // byte50x50表示433MHz频段发射功率约10dBm // byte60x0C表示接收地址宽度4字节CRC校验8位 // byte7~10为接收地址 unsigned char code RF_CONFIG[10] { 0x00, // byte0 保留 0x00, // byte1 保留 0x00, // byte2 保留 0x00, // byte3 保留 0x00, // byte4 保留 0x50, // byte5 频段配置 0x0C, // byte6 地址宽度与CRC配置 0xE7, 0xE7, 0xE7, 0xE7 // byte7~10 接收端地址 };写配置寄存器的代码void NRF905_Init(void) { unsigned char i; NRF905_CE 0; // CE拉低进入配置模式 NRF905_CSN 0; // SPI片选拉低 NRF905_SPI_RW(0x00); // 写配置寄存器命令0x00 for(i 0; i 10; i) { NRF905_SPI_RW(RF_CONFIG[i]); // 逐个写入配置字节 } NRF905_CSN 1; // 释放片选 NRF905_CE 1; // CE拉高进入工作模式 }SPI_RW函数用软件模拟SPI实现这是老式51工程师最常用的手法unsigned char NRF905_SPI_RW(unsigned char dat) { unsigned char i, temp 0; for(i 0; i 8; i) { NRF905_SCK 0; // 时钟拉低 if(dat 0x80) NRF905_MOSI 1; // 数据最高位先输出 else NRF905_MOSI 0; dat 1; // 准备下一个位 NRF905_SCK 1; // 时钟拉高从机在上升沿采样 temp 1; if(NRF905_MISO) temp | 1; // 同时读回MISO数据 } return temp; }循环里每次处理一个bitMOSI在SCK上升沿之前准备好MISO在SCK上升沿之后采样SPI的Mode 0时序。为什么不用硬件SPI因为51单片机的硬件SPI不是标配至少老型号的STC89C52没有软件模拟反而通用管脚换到任意IO口都能跑。两个配置参数说明一下。byte50x50从二进制看是0101 0000其中频段选择位和频道号组合起来是433MHz ISM频段的典型配置发射功率约10dBm。如果你的模块是868MHz版本这一字节要换成对应值。byte60x0C低两位规定了地址宽度我写的是4字节地址模式高4位里bit2置1代表8位CRC。这里所有值必须和接收端完全一致是NRF905联调里最常见的翻车点。3.3 发送主循环组帧格式、通道地址与发射时序发送端main.c的主循环做三件事读温度、组帧、触发发射。工程里用了一个4字节帧格式前面两个字节是温度原始值的高低字节第三个字节是数据包类型标识第四个字节预留。这样设计是为了后续扩展时有明确的位置放节点号、电池电压之类的信息。void NRF905_SendPacket(unsigned char *buf, unsigned char len) { unsigned char i; NRF905_CE 0; // 关闭射频进入配置状态 NRF905_TX_EN 1; // 设置发送模式 NRF905_CSN 0; NRF905_SPI_RW(0x22); // WTA写发送地址命令 for(i 0; i 4; i) { NRF905_SPI_RW(0xE7); // 写入4字节地址与接收端配置一致 } NRF905_SPI_RW(0x20); // WTP写发送数据命令 for(i 0; i len; i) { NRF905_SPI_RW(buf[i]); // 写入温度数据帧 } NRF905_CSN 1; NRF905_CE 1; // CE拉高启动发送 delay_us(20); // 等待RF稳定 NRF905_CE 0; // CE拉低完成一次发射 }主循环void main(void) { unsigned char tx_buf[4]; unsigned int temp; delay_ms(200); // 上电等待系统稳定 NRF905_Init(); // 初始化射频写入配置寄存器 tx_buf[2] 0x01; // 0x01表示数据包类型为温度数据 tx_buf[3] 0x00; // 预留字节后续可扩展 while(1) { temp DS18B20_ReadTemp(); // 读取温度原始值 tx_buf[0] temp 8; // 温度高字节 tx_buf[1] temp 0xFF; // 温度低字节 NRF905_SendPacket(tx_buf, 4); // 发送4字节负载 delay_ms(2000); // 2秒采集一次DS18B20转换需750ms } }这里帧格式和发射时序的匹配值得注意地址0xE7E7E7E7是收发双方约定的“通信暗号”接收端暂存器里存的接收地址必须和发送端写进去的发送地址一致否则数据包在接收端就被硬件过滤掉。周期2秒是为了给DS18B20留出750ms的转换时间同时让接收端屏幕上的温度刷新速度不至于太快而闪烁。如果你要更快的数据刷新率可以考虑换用9位分辨率模式转换时间只要90ms左右代价是精度从0.0625℃降到0.5℃。4. 接收端代码解析NRF905接收、LCD1602显示与主循环4.1 NRF905接收模式的配置与数据读取接收端的NRF905配置和发送端几乎完全相同。这里要说一个常被忽略的点两个板子的RF_CONFIG数组必须一模一样地址、CRC配置、频段任何一个字节不一致接收端即使收到射频信号也过不了地址匹配DR永远不拉高数据就是不出来。我最初调这个项目时在这个问题上卡了将近一小时最后用逻辑分析仪对比两边的配置表才发现接收端byte6被我改成了0x10。接收数据的核心逻辑比发送简单void NRF905_ReceiveData(unsigned char *rx_buf) { unsigned char i; if(NRF905_DR 0) { // DR为低表示没有数据到来 return; } NRF905_CE 0; // 关闭射频准备读数据 NRF905_CSN 0; NRF905_SPI_RW(0x24); // RRP读接收负载命令 for(i 0; i 4; i) { rx_buf[i] NRF905_SPI_RW(0x00); // 读出4字节温度帧 } NRF905_CSN 1; NRF905_CE 1; // 重新使能接收等待下一个数据包 }接收模式下NRF905持续监听空中射频信号自动完成地址匹配、解调、CRC校验一旦数据有效就把DR引脚拉高。51单片机的主循环只需要不断轮询DR读到高电平就从SPI里取数据。这个过程没有中断参与逻辑上非常直观也适合新手理解射频链路的动作顺序。这里有个细节必须提读数据前要把CE拉低读完再拉高。如果不拉低CE直接读NRF905内部的接收状态机还在工作读出来的数据可能不完整。工程最初实现时省掉了这两行结果偶尔收到一次正常数据大部分时间读出来的是某个字节重复的乱码翻车翻得很完整。4.2 LCD1602显示驱动初始化序列与数值格式化接收端把温度显示在1602液晶上。1602本身是HD44780兼容控制器初始化需要按固定时序发送几个命令。工程里的lcd1602.c提供一个标准初始化流程void LCD1602_Init(void) { delay_ms(15); // 上电等待15ms LCD1602_WriteCmd(0x38); // 功能设置8位接口、双行显示、5x7点阵 delay_ms(5); LCD1602_WriteCmd(0x38); // 重复发送确保时序稳定 delay_ms(5); LCD1602_WriteCmd(0x08); // 关闭显示 LCD1602_WriteCmd(0x01); // 清屏 LCD1602_WriteCmd(0x06); // 光标右移显示不位移 LCD1602_WriteCmd(0x0C); // 开显示隐藏光标 }单字节命令和数据写入本质上是对RS、RW、E三个控制引脚以及数据总线的时序操作void LCD1602_WriteCmd(unsigned char cmd) { LCD1602_RS 0; // RS0表示写入指令 LCD1602_RW 0; // RW0写入模式 LCD1602_DB cmd; // 数据总线输出指令 LCD1602_E 1; // E拉高准备写入 delay_us(50); // 保持高电平50us让控制器锁存数据 LCD1602_E 0; // E拉低锁存完成 } void LCD1602_WriteData(unsigned char dat) { LCD1602_RS 1; // RS1表示写入数据 LCD1602_RW 0; LCD1602_DB dat; LCD1602_E 1; delay_us(50); LCD1602_E 0; }LCD1602_DB接在P0口需要注意P0口内部没有上拉电阻如果外部不加4.7k到10k的上拉排阻8位数据总线会输出高阻态屏幕要么白屏要么显示乱码。这个坑新手踩得非常多多数人以为是初始化命令的顺序错了实际上就是少了上拉电阻。显示温度数值时接收端把原始值还原并格式化成适合显示的数字。工程里没有用sprintf因为51单片机的Keil C51里sprintf会引入重库函数占用大量代码空间运行速度也慢。所以我把整数部分和小数部分拆开处理void LCD1602_ShowTemperature(unsigned int raw_temp) { unsigned char t_int, t_dec; unsigned char str[7]; t_int raw_temp 4; // 原始值除以16得到整数部分 t_dec (raw_temp 0x0F) * 10; // 小数部分乘10取一位小数 t_dec t_dec 4; // 除以16得到0~9之间的一位小数 str[0] t_int / 10 0; str[1] t_int % 10 0; str[2] .; str[3] t_dec 0; str[4] 0xDF; // 1602自定义度符号 str[5] C; str[6] \0; LCD1602_ShowString(0, 1, Temp:); LCD1602_ShowString(6, 1, str); LCD1602_ShowString(0, 0, RX_Mode); }整数部分计算方式原始值乘以0.0625等于原始值除以16所以t_int raw_temp 4。小数部分是低4位的量化值每个单位0.0625℃乘以10再除以16得到0到9之间的一位小数。这方法避免了浮点运算在8位单片机上跑起来很轻是个实用的小技巧。0xDF这个字节在1602的字符表里是一个度符号兼容性很好你手头屏幕如果显示别的字符可以直接换成一个普通的°字符。4.3 接收端主循环轮询、状态指示与异常处理接收端主循环结构比发送端多了一层超时判断void main(void) { unsigned char rx_buf[4]; unsigned char timeout_cnt 0; delay_ms(200); // 上电稳定 NRF905_Init(); // 和发送端相同配置成433MHz LCD1602_Init(); // 初始化液晶 LCD1602_ShowString(0, 0, NRF905 Receiver); NRF905_TX_EN 0; // 设置为接收模式 NRF905_CE 1; // 打开接收 while(1) { if(NRF905_DR 1) { // 有数据到达 NRF905_ReceiveData(rx_buf); LCD1602_ShowTemperature( ((unsigned int)rx_buf[0] 8) | rx_buf[1] ); timeout_cnt 0; // 收到数据清零连续超时计数 } else { if(timeout_cnt 10) { // 大约10秒没有收到数据 LCD1602_ShowString(0, 1, No Signal!); timeout_cnt 0; } } delay_ms(100); // 轮询间隔100ms } }轮询间隔选100ms是个合适的折中。DS18B20的采样周期是2秒一次接收端用100ms轮询DR引脚不会漏掉任何一帧也不会因为频繁查询占用太多CPU时间。如果把轮询间隔拉大到2秒以上就可能错过一帧数据不上屏显示刷新看起来就会“卡一下”。“No Signal”这个提示帮了大忙。调试接收端的时候我一度把NRF905_CE拉低之后忘了恢复导致接收一直关闭屏幕一直显示无信号这个超时提示直接指出链路问题省了自己对着逻辑分析仪发呆的半天时间。这种“超时刷新”的思路放在任何无线接收端都适用比单纯显示死数据要健康得多。5. 避坑指南无线温度采集跑不通的5个常见踩坑现场5.1 发送端没反应SPI配置写入失败现象发送端程序跑起来后接收端完全收不到数据用示波器看NRF905的DR引脚始终低电平。原因NRF905的配置寄存器根本没写进去。最常见的是初始化函数里CE和CSN的顺序写反了。进入配置模式要求CE为低、CSN拉低后才能发SPI命令如果CSN没有拉低就直接发数据命令字节根本进不了芯片。另一个常见原因是SPI的时钟极性不对NRF905要求的时序和普通SPI从机不完全一样。解决在初始化函数开头加上NRF905_CE 0和NRF905_CSN 1的默认状态确保SPI总线空闲时片选拉高。再用逻辑分析仪抓SCK和MOSI波形确认命令字节的顺序和位序正确。调这类项目最好备一个逻辑分析仪二三十块钱的8通道版本就够用不用搬示波器那么重的设备。5.2 通信距离只有三米天线没接对现象发送端和接收端在同一张桌面上通信正常拉开到三米以上就丢包隔一堵墙直接失联。原因NRF905模块上的天线没接对。大多数NRF905模块留的是天线座或焊盘需要接一根1/4波长的导线做天线。433MHz的1/4波长约17.2厘米868MHz约8.6厘米。不少人只焊了一根两三厘米的短线辐射效率极低距离就停留在三米。无线通信有时候很玄学天线差一厘米效果都能差出一倍。解决按模块标注的频段选天线长度433MHz模块剪一根17厘米左右的裸铜线焊在天线焊盘上。天线周围不要在板子背面铺铜要尽量让天线下方没有大面积地平面。如果还不行换一根433MHz螺旋天线网上几块钱一根比裸铜线稳定得多。5.3 温度读取乱码DS18B20时序被中断干扰现象DS18B20读出来的温度偶尔正常25℃偶尔飙到70多度或者直接读到0xFF而且是随机出现。原因DS18B20单总线时序对时间要求严苛读写时隙是us级别的操作误差超过几us就可能误判。51单片机的定时器中断、串口中断如果正好在温度读取过程中触发中断服务程序执行期间总线电平被保持DS18B20就会认为主机在发起一个错误的读写时序。解决读取DS18B20之前先关总中断EA 0读完再恢复。工程里ReadTemp函数开头和结尾就是这两行。但要提醒自己关闭中断的时间要算好整个读时序大概几毫秒如果系统里还有UART在收发数据关中断太久会丢串口字节这时候可以考虑只关定时器中断或者用临界区保护。5.4 收包偶尔丢一帧帧格式缺少包序号和校验现象接收端屏幕温度显示基本正常但偶尔一帧数据就变成0或乱值尤其在通信距离边远的时候。原因无线链路本身就不可靠。NRF905硬件CRC能保证数据没被改错但区分不了这是新数据还是重复的旧数据也不能告诉接收端哪一帧丢了。射频干扰、天线抖动、供电电压波动都可能导致丢帧。发送间隔2秒接收端不知道中间空了一帧就继续显示上一帧看起来像“卡了”。解决在数据帧里加一个自增的包序号接收端判断序号是否连续不连续说明丢帧可以提示“信号不稳定”。再给数据帧加上简单的累加和校验校验失败就不刷新显示。这个改动只有十几行代码却能让接收端从“哑巴收数据”变成“有判断力地收数据”。5.5 接收端一直No Signal收发配置不一致现象发送端明明在正常发接收端却一直显示无信号。原因这一类问题基本都是收发两端配置不一致。最常见三种一是两边频段配置值不同比如发送端用0x50433MHz接收端用了0x58868MHz频段二是两边的地址字节不一致NRF905带地址匹配功能接收端的地址和发送端写入的发送地址对不上数据包在接收端被硬件过滤掉三是CRC格式设置不一致CRC长度不同或者一边开一边关都过不了校验。解决把RF_CONFIG数组做成一个公共头文件发送端和接收端都包含同一份配置常量只维护一处天然不会出现两边不一致的问题。这个工程我后来在做二次开发版本时就把配置表抽了出来放到common.h里之后再也没在这类问题上耗过时间。6. 二次开发思路把单点测温改造成多节点无线传感网络拿到工程跑通之后大概率想的第一个问题是“这玩意儿怎么变成我自己的东西”。最直接的方向是把单点测温升级成多点组网——多个发送端往一个接收端发数据接收端循环显示不同位置的温度。改造的核心是把帧格式升级一下把原来4字节的简版数据帧改成带帧头、节点号、校验的完整协议typedef struct { unsigned char head[2]; // 帧头 0xAA 0x55用于接收端找帧边界 unsigned char node_id; // 节点编号多个发送端各分配一个 unsigned char type; // 数据类型 0x01温度 0x02湿度 unsigned char high; // 数据高字节 unsigned char low; // 数据低字节 unsigned char checksum; // 累加和校验 } RF_FRAME;接收端收到数据后先校验帧头和累加和再根据node_id判断来自哪个节点选择LCD上的对应位置刷新。发送端那边的改动更小只是把tx_buf[2]改成自己的节点号这样接收端就能分辨多个探头。另一个值得做的方向是把接收端数据通过串口转发给上位机。51单片机本身带UART从NRF905读到的数据帧不做解析直接丢给串口PC端用一个串口调试工具就能画出温度曲线。我一般是把接收端当作一个“无线网关”来用NRF905收上来串口发出去上位机负责存储和可视化。如果要做双向控制比如远程开关一个加热器就把接收端再增加发送功能发送端增加接收功能两个NRF905本来就是全双工射频芯片代码层面只要封装一对收发函数就行。每次改完硬件我习惯先做一次“回环测试”把发送端和接收端放在同一张桌子上用一根杜邦线把NRF905的DR引脚引到一个LED上看数据到达时灯闪不闪。这段小验证能挡住八成以上的低级接线问题。从那以后我每次跑无线模块调试都强制自己先过一遍这个流程再去看代码。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑