简介这份资源面向正在学习51单片机与LoRa无线通信的嵌入式开发者尤其是希望打通串口与SPI外设、实现点对点远程数据传输的初学者和进阶者。内容围绕51单片机串口通信与LoRa模块的SPI接口展开涵盖寄存器配置、波特率设置、扩频参数调整、数据收发流程以及CRC校验与应答机制等关键环节帮助读者理解从硬件连接到软件配置的完整链路。压缩包共30个文件约47KB包含发送端与接收端两套C语言源码、Keil工程文件uvproj、uvopt、启动代码STARTUP.A51、编译中间文件lst、obj、m51以及可烧录的hex文件目录按收发两端分模块组织便于对照阅读与直接复用。目前已有950人学习下载适合作为课程设计、毕业设计或物联网通信实验的参考范例读者可从中获取可运行的收发代码、工程配置模板与调试思路快速搭建自己的LoRa远程通信原型。1. 从一块51单片机到LoRa模块远程通信方案的需求起点很多做课设的同学一上来就卡在“怎么让两块板子隔几百米还能通信”这个问题上。用WiFi距离不够穿墙就断。用蓝牙十米出头稍微远一点就废。用4G模块成本高还得插卡、走流量、处理AT指令对51单片机那点RAM和Flash来说光是协议栈就够呛。所以当题目要求“51单片机通过LoRa实现远程通信”时核心需求其实很明确低功耗、远距离、低成本、串口透传。LoRa模块恰好满足这四点——它把复杂的扩频调制封装在模块内部单片机只需要通过UART发几个字节就能把数据送到几百米甚至几公里外。这套方案适合电子类、物联网类、通信类的课程设计或毕设也适合需要做小型无线数传的从业者参考。下面从选型、硬件设计、软件实现到验收完整走一遍。2. 硬件选型与总体架构51单片机与LoRa模块怎么搭2.1 主控与LoRa模块的匹配逻辑51单片机型号很多但做LoRa通信我一般会选STC89C52RC或STC12C5A60S2。前者经典、资料多、价格低后者带双串口和更多RAM调试时更从容。LoRa模块常见的有基于SX1278的串口透传模块比如正点原子、安信可、亿佰特等品牌都有类似产品。选型时重点看三个参数工作频段433MHz或470MHz国内常用、串口波特率默认9600或115200、供电电压3.3V或5V。注意51单片机是5V逻辑而多数LoRa模块是3.3V逻辑直接连串口可能烧模块。通常的做法是加电平转换电路或者选那种板载了电平转换芯片的模块。我一般会选带5V tolerant输入的模块省事。2.2 系统总体框图与数据流向整个系统分两端发送端和接收端。发送端由51单片机、LoRa模块、传感器比如DHT11温湿度和按键组成接收端由51单片机、LoRa模块和LCD1602显示屏组成。数据流向是传感器采集→单片机处理→串口发送→LoRa模块空中调制→接收端LoRa模块解调→串口接收→单片机解析→LCD显示。两端之间不需要任何网络点对点透明传输。如果要做多点通信可以给每个模块配置不同地址用软件协议区分。但课设级别点对点足够。2.3 关键电路设计要点51单片机最小系统包括晶振电路11.0592MHz或12MHz推荐11.0592MHz串口波特率更准、复位电路、电源滤波。LoRa模块与单片机连接只需要四根线VCC、GND、TXD、RXD。注意交叉连接单片机TXD接模块RXD单片机RXD接模块TXD。如果模块有M0、M1引脚用于模式切换可以接单片机IO口也可以直接接地或拉高进入透传模式。我一般把M0、M1都接地模块上电即进入透明传输模式单片机发什么就传什么最简单。电源部分LoRa模块发射瞬间电流可能达到120mA所以电源要加100uF以上的电解电容否则发射时电压跌落会导致复位或丢包。这个坑后面还会细说。3. 软件实现串口配置、数据帧设计与收发流程3.1 51单片机串口初始化与波特率计算51单片机的串口工作方式18位UART可变波特率最常用。波特率由定时器1的溢出率决定。公式是波特率 (2^SMOD / 32) * (fosc / (12 * (256 - TH1)))。以11.0592MHz晶振、9600波特率、SMOD0为例TH1 256 - (11059200 / (12 * 32 * 9600)) 256 - 3 253 0xFD。代码如下#include reg52.h void UART_Init() { SCON 0x50; // 模式18位UART允许接收 TMOD 0x0F; // 清除定时器1模式位 TMOD | 0x20; // 定时器1工作方式28位自动重装 TH1 0xFD; // 波特率9600晶振11.0592MHz TL1 0xFD; TR1 1; // 启动定时器1 ES 1; // 使能串口中断 EA 1; // 开总中断 } void UART_SendByte(unsigned char dat) { SBUF dat; while(!TI); // 等待发送完成 TI 0; // 清除发送标志 }这段代码里SCON的0x50表示串口工作在模式1REN1允许接收。TMOD设置定时器1为模式2自动重装这样不需要在中断里手动重装初值。TH1和TL1都设为0xFD对应9600波特率。发送函数里把数据写入SBUF后硬件自动开始发送TI标志在发送完成后由硬件置1软件清零。注意如果晶振不是11.0592MHz比如用12MHz算出来的TH1会有误差9600波特率下误差约8.5%可能通信不稳定。所以晶振一定要选11.0592MHz。3.2 数据帧格式与收发协议直接发原始字节容易出错比如接收端不知道一帧数据从哪开始、到哪结束。我一般会定义一个简单的帧格式帧头0xAA 0x55 数据长度 数据内容 校验和。校验和用累加和取低8位。发送端组帧接收端解析。示例// 发送温湿度数据帧 void Send_SensorData(unsigned char temp, unsigned char humi) { unsigned char frame[6]; frame[0] 0xAA; // 帧头1 frame[1] 0x55; // 帧头2 frame[2] 2; // 数据长度 frame[3] temp; // 温度值 frame[4] humi; // 湿度值 frame[5] frame[2] frame[3] frame[4]; // 校验和 for(unsigned char i 0; i 6; i) { UART_SendByte(frame[i]); } }接收端在串口中断里逐字节接收先找帧头0xAA再找0x55然后读长度、读数据、算校验。如果校验通过就更新显示。这种帧格式简单可靠适合课设。注意接收中断里不要做太多事解析完把数据存到全局变量主循环里再处理显示。3.3 接收端解析与显示逻辑接收端串口中断服务函数里用一个状态机解析帧。状态0等0xAA状态1等0x55状态2读长度状态3读数据状态4校验。解析成功后置一个标志位主循环检测到标志位就刷新LCD1602。LCD1602的驱动代码网上很多这里不展开。关键点是串口中断里不要调用LCD显示函数因为LCD写操作耗时会阻塞中断导致后续字节丢失。我一般会在中断里只存数据主循环里显示。4. 避坑与常见问题排查从丢包到电源跌落4.1 通信距离短或丢包严重现象两块板子隔几十米就收不到数据或者数据断断续续。原因天线没接好、模块功率设置太低、环境遮挡严重。解决先检查天线是否拧紧弹簧天线要垂直焊接或安装然后通过AT指令或配置软件把发射功率调到最大通常20dBm如果还在室内尽量让两端可视或者把模块架高。另外波特率越高距离越短9600比115200传得更远。4.2 接收端乱码或收不到任何数据现象接收端串口助手显示乱码或者完全没反应。原因波特率不匹配、晶振频率不对、接线错误。解决先确认两端单片机晶振都是11.0592MHz再确认LoRa模块的串口波特率与单片机一致默认9600。用示波器看单片机TXD引脚是否有波形如果没有检查串口初始化代码。如果发送端正常但接收端没反应检查接收端RXD是否接对了模块TXD。4.3 发射时单片机复位或死机现象每次发送数据时单片机突然重启或者程序跑飞。原因LoRa模块发射瞬间电流突增电源电压跌落导致单片机欠压复位。解决在LoRa模块的VCC和GND之间并联一个220uF电解电容和一个0.1uF陶瓷电容电容尽量靠近模块引脚。如果还不行换用输出电流更大的电源比如LM2596降压模块不要用AMS1117那种小电流LDO。4.4 数据偶尔出错但校验能过现象接收到的温湿度值偶尔跳变但校验和正确。原因传感器读取时序不对或者变量未初始化。解决DHT11读取时严格按延时要求读完后延时一段时间再读下一次。全局变量定义时赋初值。另外校验和只累加了数据字节如果帧头出错但恰好校验和也对概率极低但存在可以增加帧尾或序列号进一步过滤。5. 验收与答辩怎么证明你的LoRa通信真的可靠验收时老师不会只看你演示一次通常会问通信距离多远丢包率多少功耗多大所以提前准备数据。我一般会做三组测试近距离10米内连续发1000帧统计丢包率中距离100米左右视距发500帧远距离300米以上视距发200帧。用串口助手记录接收到的帧数丢包率低于1%算合格。如果丢包率高检查天线和电源。答辩时把测试数据做成表格比如测试距离发送帧数接收帧数丢包率10米100010000%100米5004980.4%300米2001952.5%然后解释为什么300米丢包率上升——可能是环境遮挡或天线方向。另外准备一个“故障复现”环节故意拔掉天线让老师看丢包现象再插上天线恢复正常。这能体现你对问题的理解。最后代码要模块化串口驱动、LoRa驱动、传感器驱动、显示驱动分开文件答辩时老师翻代码也舒服。从那以后我每次做无线通信课设都强制先测电源纹波再测通信距离最后才写业务逻辑。希望帮到你。本文还有配套的精品资源点击获取