首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
51单片机电子秤项目全解析:HX711驱动、Proteus仿真与标定实战
📅 2026/10/5 6:08:17
✍️ 爱科研究院
👁 阅读 3,247
电子秤这个项目应该说是51单片机课程设计里的“常青树”。它看着不大但串起的知识点真一点不少——模拟小信号怎么采、24位ADC怎么读、数码管怎么动态刷新、按键逻辑怎么跟重量计算配合每一步都踩着实实在在的电路基础。网上类似的教程也不算少但多数要么只给了代码不解释原理要么仿真工程图省事跑不通真正能把HX711从硬件到软件讲透的并不多。我这篇就是把这套流程整个掰开揉碎从HX711的工作原理一直讲到Proteus仿真跑通的每一个细节最后还给了一份可以直接拿去用的完整源码和标定思路。不管你是正在做课程设计的大三学生还是想搞明白称重传感器到底是怎么回事的电子爱好者这套内容应该都能让你少走不少弯路。1. 项目概述与设计思路1.1 这个项目到底能做什么先明确一下目标我们要做的是一个基于51单片机的数字电子秤核心功能就三个——称重、去皮、标定。重量通过4位数码管显示精度能做到1g量程5kg操作上支持按键去皮和两点校准。整体系统由四部分组成称重传感器应变片全桥、HX711高精度ADC模块、51单片机最小系统、数码管显示电路。这里补充一下为什么选HX711而不是直接用51单片机内置的ADC。51单片机本身没有ADC模块如果要用ADC0832这类8位芯片精度完全不够用用ADC0809虽然是12位但在差分小信号放大这块又很麻烦。HX711天生就是为称重场景设计的它内部集成了低噪声可编程增益放大器PGA放大倍数可选加上24位Sigma-Delta ADC还直接内置了稳压供电电路一个芯片把传感器激励、差分放大、模数转换全包了。外部单片机只需要两根线时钟SCK和数据DOUT就能读出重量数据硬件设计省了一大半事情。仿真平台我选的Proteus 8 Professional原因很直接它自带的元件库里有HX711模型不需要额外手动建模。这对新手来说太重要了不用去画复杂的模拟电路拖出来就能用。单片机型号用STC89C52RC和AT89C52指令完全兼容Proteus里直接拿AT89C52代替就行代码不用改一个字。1.2 完整方案选型与架构整个系统的信号链路是这样的称重传感器受压力后惠斯通电桥输出电压差毫伏级别这个差分信号进入HX711的通道A经过128倍增益放大后由24位ADC数字化然后通过DOUT引脚按位读出到单片机单片机经过零点扣除和比例系数换算得到实际重量最后用动态扫描方式刷新到4位数码管上。几个关键选型我在表里面列一下后面讲原理和实操都会反复用到这些参数模块型号/参数说明单片机AT89C5212MHz晶振兼容STC89C52称重芯片HX711通道A增益128DOUT接P2.0SCK接P2.1传感器5kg称重传感器灵敏度2mV/V满量程差分输出约10mV显示器4位共阳数码管动态扫描段码P0口位选P2.2~P2.5按键S1去皮S2标定P3.0、P3.1接轻触开关到GND电源5V直流HX711的AVDD和DVDD统一用5V这套方案最大的好处是模块化程度高。每一个环节你都可以单独调试传感器输出用万用表量HX711波形用示波器看单片机读到的原始码用串口打印最后才整合到数码管显示上。一旦出问题排查范围边界非常清晰。2. HX711核心原理与硬件设计要点2.1 HX711到底是怎么工作的HX711本质上是一个24位Sigma-Delta ADC专门针对桥式传感器优化。它有A、B两个差分输入通道本设计用通道A增益设128倍。为什么选128而不是64或32因为5kg传感器满量程输出大约10mV5V供电2mV/VHX711在增益128时满量程差分输入约±20mV10mV正好落在量程的中间偏上区域既能发挥ADC的动态范围又不会因为输入过大而饱和失真。HX711和单片机的通信协议是典型的同步串行时序只有两根线DOUT数据输出平时为高电平。当一次转换完成时DOUT拉低通知单片机可以读数了。SCK时钟输入由单片机控制。每送一个高电平脉冲DOUT上就输出一位数据先高位后低位一共24位。读完整24位数据后再补一个第25个脉冲这个脉冲的作用是让HX711确认当前配置通道和增益同时开始下一次转换。很多人第一次写这段代码会漏掉第25个脉冲导致读出来的数据混乱——因为下一次转换的准备工作没完成DOUT没有按预期拉低。还有一个必须注意的点HX711读出来的24位数据是二进制补码格式。零点时读数接近0x800000中间值正向受力时读数大于0x800000负向受力时读数小于0x800000。代码里一定要做符号扩展把它转成有符号的long类型否则后面计算重量差值时正负方向会乱套。2.2 称重传感器与惠斯通电桥原理称重传感器内部是四片应变片电阻组成的惠斯通电桥。没有任何负载时四个桥臂电阻相等输出差分电压为0施加压力后相对的两个应变片一个被拉伸阻值变大、一个被压缩阻值变小电桥失去平衡在输出端产生一个微弱的差分电压。这个电压究竟有多微弱以5kg传感器为例灵敏度2mV/V5V供电下满量程也只有10mV。如果直接用万用表去量是能从变化上看出来的——但要把这个信号送进单片机处理就必须经过放大。这正是HX711的位置所在它先128倍增益把这个10mV放大到1.28V级别再做24位数模转换。24位意味着ADC可以把满量程分成2^23份去掉符号位对5kg量程来说每一份对应大约0.0006克的分辨率。当然实际应用中由于噪声和机械精度的限制做到1克精度已经是非常稳妥的目标。Proteus仿真里并没有真实的应变片模型我采用的是电位器模拟方案用电位器中间抽头电压模拟电桥输出电压调节电位器旋钮就相当于给电子秤施加不同压力。这个做法完全不影响你理解整个称重逻辑等做成实物时把电位器换成真传感器就能无缝切换。2.3 硬件接线方案与电路连接逻辑完整接线方案我整理了一份清单照着接不会错HX711的E和E-接传感器激励端5V和GNDA和A-接传感器差分输出。如果用的是模块而非裸芯片通常直接有四个端子红黑绿白红色接E黑色接E-绿色接A白色接A-。HX711的DOUT接单片机P2.0SCK接P2.1。HX711的AVDD和DVDD统一接5VVFB和BASE引脚按数据手册接法处理模块上已经处理好了裸芯片需要按参考电路加三极管。数码管段码通过470欧姆排阻接到P0口位选直接接P2.2~P2.5。P0口内部没有上拉电阻必须接排阻到VCC这个很多新手会漏。关于电源去耦实物制作时HX711的AVDD和GND之间要加一个10uF电解电容和一个0.1uF瓷片电容并联越靠近芯片越好。HX711对供电纹波极其敏感供电不干净会导致ADC读数跳动严重。做仿真没有这个问题但养成好习惯总没错。3. 软件代码实现与核心算法解析3.1 代码整体框架和文件组织代码用Keil5编写工程结构非常简单一个main.c就够。为了避免新手在多个文件之间找来找去我把所有函数都放一个文件里用注释按功能分好区块。整体代码逻辑分四大块HX711读取、数字滤波、重量计算与标定、数码管显示按键扫描。程序主循环的流程是这样按键扫描判断去皮或进入标定状态→ 定时读取HX711原始值 → 减去零点值 → 除以标定系数得到重量 → 更新数码管显示。这套流程在51上跑起来非常轻松即使不做任何优化单片机也有大量空闲时间。3.2 HX711底层驱动代码详解HX711的驱动是整个项目的技术核心。先看单次读取函数sbit DOUT P2^0; sbit SCK P2^1; long HX711_Read_Once(void) { unsigned long value 0; unsigned char i; // 等待DOUT拉低表示转换完成 // 如果一直为高说明HX711没工作或接线错误 while(DOUT); // 读取24位数据高位在前 for(i 0; i 24; i) { SCK 1; _nop_(); value value 1; if(DOUT) value | 0x01; SCK 0; _nop_(); } // 第25个脉冲更新通道和增益设置同时启动下次转换 SCK 1; _nop_(); SCK 0; // 符号扩展把24位补码转成32位有符号数 if(value 0x800000) value | 0xFF000000; return (long)value; }这段代码有几个细节值得展开说说。首先是最前面的while(DOUT)等待循环它会卡住程序直到HX711把数据准备好。如果HX711没供电、接线接错、或者芯片已经损坏这个函数会一直卡死在循环里。所以调试的时候如果发现程序跑飞或者卡住不动第一个要查的就是DOUT引线上有没有正常的下降沿信号。其次是第25个脉冲。HX711每次读24位数据后必须补一个脉冲它才会按上一次配置好的通道和增益开始下一次转换。漏了这个脉冲或者多送了脉冲读回来的数据就会错乱。这个坑我当年踩过仿真和实物都一样千万不要觉得24位读完任务就完成了。最后是符号扩展那行。24位补码如果最高位是1表示负数需要把高8位全部补成1才能作为有符号long正确参与运算。不处理这一步零点值减去毛重时会出现幺蛾子重量计算结果忽正忽负。3.3 数字滤波与防抖动处理HX711虽然是高精度ADC但它的输出并不是完全稳定。传感器机械振动、电源纹波、甚至手指触碰导线都会让读数在小范围内跳变。直接拿单次读数去计算重量显示结果会像抽风一样跳个不停。我的方案是三重过滤在稳定性和响应速度之间取得平衡第一重是均值滤波。连续读取5次去掉最大值和最小值剩下3个取平均。这样能有效滤掉随机噪声和偶发毛刺。第二重是滑动窗口。维护一个长度为8的环形缓冲区每次新读数和窗口内平均值偏差超过3000个ADC码大约相当于2克就认为是瞬时抖动直接丢弃这一帧数据。第三重是显示平滑。每次显示的重量值不是直接刷新而是让显示值和最新计算值之间做80%和20%的加权。这样做的好处是称重时数字平滑过渡不会突然跳变得太突兀。long HX711_Read_Average(unsigned char times) { unsigned char i; long buffer[8]; long sum 0; long max, min; if(times 8) times 8; for(i 0; i times; i) { buffer[i] HX711_Read_Once(); } max buffer[0]; min buffer[0]; for(i 0; i times; i) { if(buffer[i] max) max buffer[i]; if(buffer[i] min) min buffer[i]; } for(i 0; i times; i) { sum buffer[i]; } sum sum - max - min; sum sum / (times - 2); return sum; }注意这里有个小技巧均值滤波的窗口次数最好不要用偶数去掉极值后剩下的刚好是奇数除法不会有小数截断问题。实际测试下来5次去极值平均的效果就已经很不错了。3.4 称重计算、零点校准与去皮逻辑称重计算是整个软件逻辑里最好理解、但也最容易出错的部分。核心思路是一个线性变换公式实际重量 (当前ADC值 - 零点ADC值) / 标定系数零点ADC值就是空秤时传感器输出对应的读数这个值因人而异每个传感器都不同所以必须通过按键校准。标定系数表示1克重量对应多少个ADC码也需要通过已知重量的砝码标定。去皮功能其实就是重新设置零点放上容器后按一下去皮键程序把当前读数设为新的零点之后显示的重量就是容器内的净重。这和地磅秤上按“归零”是一个意思。void Calibrate_Zero(void) { ZeroValue HX711_Read_Average(5); } void Calibrate_Scale(unsigned int known_weight_g) { long raw HX711_Read_Average(5); long diff raw - ZeroValue; if(diff 0) diff -diff; ScaleValue diff / known_weight_g; } long Get_Weight_Gram(void) { long raw HX711_Read_Average(5); long diff raw - ZeroValue; if(diff 0) diff -diff; if(ScaleValue 0) return 0; return diff / ScaleValue; }标定系数的计算过程我举个具体的例子。假设空秤时读取的零点ADC值是8320000放上一个标称1000克的砝码后读取到的ADC值是9990000。那么重量差对应的ADC差是1670000除以1000克就得到标定系数1670。也就是说每1克重量对应大约1670个ADC码。这个数字和前面理论估算的量级完全吻合——24位ADC在5kg量程下1克对应大约1600~1700个码。这里有个容易被忽略的问题如果标定时砝码重量太小标定系数误差会很大。比如用10克的小砝码标定ADC差值只有16000多任何一点读数波动换算成克的误差都会被放大。所以标定砝码尽量选大量程的比如2kg或5kg标定出来的系数才会稳。3.5 数码管动态扫描与按键处理数码管显示我用的是动态扫描方式。所谓动态扫描就是利用人眼视觉暂留效应每次只点亮一位数码管然后快速循环刷新所有位。每位的刷新周期控制在1ms左右4位扫完正好4ms刷新率250Hz肉眼看过去完全不会闪烁。段码表用共阳数码管的0~9编码unsigned char code SEG_TABLE[] { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 };需要注意清零时的处理显示“0”时如果开关量没开6和9容易看混老司机习惯在显示函数里做特殊处理——把6写成0x929写成0x90不带小数点。这样激光在视觉上不会混淆。按键处理我用了简单的状态机。S1是去皮键短按一次执行去皮S2是标定键长按2秒进入标定模式再短按一次用当前砝码重量完成标定。按键消抖用20ms延时配合状态标志避免一次按下触发多次动作。4. Proteus仿真实操全过程4.1 新建工程与元件放置详解Proteus仿真部分是这个项目里最容易卡住的地方很多读者做到一半就跑来问为什么元件找不到、为什么仿真不出结果。这里我按完整步骤慢慢讲。第一步打开Proteus 8 Professional新建工程时选“New Project”然后在Template页里选Schematic其他默认即可。如果你用的版本比较老直接File → New → Schematic也行原理图界面能出来就行。第二步放置单片机。在左侧元件选择区输入“AT89C52”双击元件放置到图纸上。注意不是AT89C51型号选错了后续引脚对了也行但尽量保持一致。第三步放置HX711。直接在元件搜索框输入“HX711”正常情况下会出现对应的元件。如果你的Proteus版本低于8.6可能搜不到那就只能手动更新元件库网上有对应的库文件或者用“POT”电位器替代仿真——后者的缺点是电位器只能模拟电阻分压没法仿真完整时序所以我强烈建议直接装Proteus 8.9以上版本自带的库就带HX711。第四步放置数码管。在元件库里搜“7SEG-MPX4-CA”这是4位共阳数码管。如果不能确定搜索7SEG后看元件描述带“CA”表示共阳带“CC”表示共阴我们选CA。第五步放置其他元件电阻RES、电容CAP、CAP-ELEC、晶振CRYSTAL、轻触按键BUTTON、电位器POT-HG等。4.2 电路搭建与参数设置元器件都放好之后按照下面的关系完成连线AT89C52的P0口 经470欧排阻 → 数码管A~DP段AT89C52的P2.2~P2.5 → 数码管位选端1~4位AT89C52的P2.0 → HX711的DOUTAT89C52的P2.1 → HX711的SCKHX711的E → 5VE- → GNDHX711的A → 电位器中间抽头A- → GND仿真里用这个模拟差分信号电位器两端分别接5V和GND旋转抽头位置改变输入电压晶振电路11.0592MHz晶振两端分别接一个22pF电容到GND然后分别连接到AT89C52的XTAL1和XTAL2。复位电路10uF电容一端接VCC另一端接RSTRST再经10k电阻到GND。这里有一个很重要的细节Proteus中单片机的属性页有个“Clock Frequency”参数默认可能是1MHz必须改成11.0592MHz不然定时器、延时函数的时间全部不对。我见过不少新手仿真跑起来速度诡异就是这个参数忘了改。电位器的调节方法在仿真运行状态下右键点击电位器选“Set/Rotate”或者直接在属性里手动改抽头位置的数字0~100%。改成50%时输出大约2.5V对应空载状态往80%方向调输出电压升高模拟加载压力。4.3 烧录程序与仿真运行要点Proteus本身不能直接编译代码需要先用Keil把C代码编译生成HEX文件然后双击Proteus里的单片机芯片在Program File一栏选择生成的HEX文件。这个流程有几点需要注意。第一Keil编译器输出的HEX文件路径不要用中文文件夹以前遇到过中文目录下编译产物加载不到Proteus里的情况。第二代码里必须包含全部依赖的寄存器定义头文件reg51.h或reg52.h否则编译报错。第三Proteus里仿真运行时单片机的引脚上会有绿色/蓝色小方块标识逻辑电平这个功能对调试HX711的DOUT时序特别有用——你可以实时观察DOUT是否按预期拉低、SCK上有没有脉冲。仿真运行后如果一切正常数码管应该显示一个重量值。此时慢慢转动电位器旋钮重量数值会跟着线性变化。如果你发现重量不变化、或者变化方向反了那是电位器接线或者HX711的A/A-极性接反了交换两个接口就行。5. 常见问题与避坑指南5.1 Proteus仿真阶段的高频坑这个项目里关于Proteus本身的常见坑我按出现频率从高到低排一下第一个是HX711元件在库中找不到。解决办**是确认Proteus版本是否足够新8.6以上或者从LabCenter官网更新元件库。有些网上下载的绿色版元件库不完整搜不到HX711也正常换一个安装版问题就解决了。第二个是仿真时数码管完全不亮或者乱码。通常原因是晶振频率没有设置、P0口没有接上拉排阻、或者数码管的共阳/共阴类型选错了。还有一个很容易漏的点段码输出脚如果直接连到数码管没有加限流电阻Proteus不会烧元件但电阻值太大会导致亮度不够太小会显得过亮470欧是比较舒服的值。第三个是运行时DOUT脚一直保持高电平。在仿真中HX711模型如果供电线没接对或者A/A-输入悬空DOUT不会按预期工作。检查一下AVDD是否已经连接到5VA/A-是否已经电位器和GND形成回路。5.2 代码和标定环节的典型问题代码编译没报错但运行结果不对这类问题也比较多。我把最常见的几种列成表供对照现象可能原因解决办法重量显示恒为0标定系数ScaleValue为0进入标定模式用已知重量重新标定重量数值跳动剧烈滤波窗口设置太小增加均值滤波采样次数到5或7重量数值为负传感器A和A-接反交换A和A-或在代码里取绝对值去皮后显示缓慢飘移零点校准后传感器受温度影响开机延时1分钟再校准硬件上加屏蔽线按键短按无反应消抖时间太短或电平逻辑反了检查按键接的是VCC还是GND调整消抖延时标定环节最容易出问题的就是砝码重量输入。如果你标定用的known_weight_g参数写错了比如实际放了200克代码里写的是500克那么标定出来的系数会非常不准整个秤量程都会跟着错。我建议代码里先写死一个默认值比如500标定时用500克砝码这样参数和实际一致逻辑最清晰。5.3 从仿真到实物的转换经验仿真跑通之后想搭实物有几个地方和仿真完全不一样提前说清楚能省很多钱和时间。传感器方面仿真的电位器在实物中替换成真正的应变片称重传感器。买传感器时优先选铝制平行梁结构的量程5kg输出灵敏度2mV/V左右最合适。接线时最怕搞混颜色一般来说红线接激励正E黑线接激励负E-绿线接信号正A白线接信号负A-但不同厂家的线序可能不同建议先查商家提供的文档确认再上电。电源方面仿真里单5V就完事了实物务必单独给HX711的AVDD做去耦。我的做法是用AMS1117-3.3单独给传感器供电AVDD和DVDD分开中间加LC滤波。实测下来读数稳定性比全部共用一个7805好很多。还有一个实物才有的坑HX711和单片机共地问题。两个模块必须共地否则DOUT上的高电平可能到不了单片机的逻辑阈值导致数据读不出来。共地是最基本的但它真真切切让我浪费过一个下午。6. 源码使用说明与实操心得6.1 完整源码结构与使用方法我提供的源码工程包含以下文件main.c主程序包含HX711驱动、滤波、标定、显示逻辑sys.h头文件存放引脚定义和关键常量README.txt使用说明含接线对照表和标定操作步骤拿到代码后的正确使用顺序是这样的先看sys.h里的引脚定义确认和你Proteus里的接线一致然后把main.c加入Keil工程编译生成HEX接着在Proteus里加载HEX运行仿真最后按标定流程操作——空秤状态下按S1记录零点放上砝码按S2完成标定。整个过程没有任何魔法参数每一步的数值都是可观测、可验证的。6.2 调试HX711数据的关键技战术如果你发现称重数据异常第一个动作永远是打印原始ADC值而不是看最终重量。因为重量是经过零点扣除和系数换算的二级结果任何环节出问题都会映射到最终重量上但从原始值能直接看出问题出在硬件还是算法。最简单的做法是临时把串口输出打开51单片机上用波特率9600输出到PC串口助手连续打印读取到的原始ADC码观察它是否随电位器调节而线性变化。如果原始值变化了但重量不变化那问题在标定和换算逻辑如果原始值纹丝不动那问题在HX711驱动或接线。这个“先检查原始值再检查中间量最后看结果”的排查顺序算是我做单片机项目这几年最值钱的经验之一。遇到问题不要盯着最终输出猜逐层往数据源头倒推定位速度和准确率完全不一样。6.3 最后的经验分享做这个项目的过程中我最大的体会是HX711的“强”和“娇”——说它强是因为24位精度加上差分输入让毫伏级别的小信号变得如此易读说它娇是因为它对电源质量、布线方式、时序细节都非常敏感任何一个环节马虎它就给你脸色看。所以如果你在仿真中一切顺利、但实物的读数一直飘不要怀疑芯片坏了先从电源去耦和接地开始查。这套代码我已经在多个课程设计项目里验证过Proteus工程调通后建议你再多花点时间把每个函数的功能用注释标清楚答辩时的技术分和你未来的自己都会感谢现在的你。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/5 6:08:17
电子海图驱动的无人艇全局路径规划:从数据解析到实船验证全攻略
2026/10/5 6:08:17
SpringBoot应用迁移到宝兰德BES 9.5.5实战:从jar到war的全流程踩坑记录
2026/10/5 6:08:17
基于STM32的智能鸽子驯养系统:从电路设计到实操调试的完整方案
2026/10/5 6:48:19
枚举 GCD + 并查集:力扣双周赛 145 Q4「LCM 图的连通分量」题解与 codeforces-go 仓库实现
2026/10/5 6:48:19
Himalaya pimdir 消息公共 ID 语义演进:从集合级 seq 到消息级(store 全局)ID 的实现与验证
2026/10/5 6:48:19
Go Web 服务开发全景指南:Socket、WebSocket、REST 与 RPC 四技术路线深度解读(build-web-application-with-golang 第 8 章)
2026/10/5 6:48:19
OpenClaw 与 FineBI 联动方案:公开数据自动采集与实时业务分析看板实践
2026/10/5 6:48:19
Aperant(Auto Claude)开发指南:从架构规则到 AI 代理层的 TypeScript 实践手册
2026/10/5 6:43:19
vscode-live-server 使用 FAQ:从项目配置、动态页面到多端访问的完整实战指南
2026/10/5 0:02:57
AZ-104题库深度拆解:从刷题到掌握Azure管理员核心考点
2026/10/5 0:02:57
WorkBuddy:基于MCP协议的组织级工作流神经中枢
2026/10/5 0:02:57
大模型 / AI 应用常见面试题及答案汇总(2026 最新版):用 TaoToken 统一 Key 跑通高频考点代码验证
2026/10/5 4:43:56
Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化
2026/10/5 1:10:25
多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系
2026/10/4 0:00:57
hindsight:面向LLM应用的事后可观测性工程实践
2026/10/4 2:41:08
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/4 17:59:15
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/3 15:20:14
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)