FEATURED · 精选文章

基于51单片机与HX711的电子秤设计及Proteus仿真

发布时间 / 2026/9/1 12:56:57
来源 / 创域科博编辑部
栏目 / 资讯中心
基于51单片机与HX711的电子秤设计及Proteus仿真 简介本资源是一套完整的基于51/52单片机的电子秤毕业设计实现方案面向电子信息、自动化及嵌入式相关专业本科生解决课程设计、毕设选题与实践能力提升中的硬件搭建、传感器采集、人机交互与系统联调等核心问题。压缩包共104个文件含Keil源程序工程.c/.h/.uvproj等、Proteus仿真工程.dsn/.pdsprj、电路原理图.sch、技术手册与论文资料.pdf/.doc/.docx以及调试过程生成的.hex、.lst、.obj等关键中间文件整体大小为17.89MB。已有195人学习下载资源结构清晰覆盖从原理图设计、HX711高精度AD采集编程、数码管动态显示驱动、去皮/校准按键逻辑到蜂鸣器反馈的全流程代码与文档。配套技术手册详述软硬件协同机制论文资料提供可直接参考的章节框架与算法说明仿真工程支持无实物快速验证是单片机实践项目中少有的具备完整开发闭环与教学支撑能力的高质量资料。 做过单片机课设的朋友应该都很清楚电子秤这个题目属于“看着简单做起来全是细节”的典型。很多人的方案一上来就翻车不是读数乱跳就是标定漂移最后只能靠调参数凑合交差。这次这个项目就是一套基于51单片机STC89C52 HX711称重ADC 4位数码管SEG4B 10kg量程传感器的完整电子秤设计配套程序、电路图和Proteus仿真三件套。这篇博文我把整个设计思路、核心代码、仿真搭建以及调试踩坑过程全部拆开讲一遍适合正在做课程设计的学生也适合想自己DIY一台厨房秤的电子爱好者参考。核心目标只有一个让你照着做也能调出一台读数稳定、精度够用的电子秤而不是只会抄代码。1. 项目整体设计与方案选型1.1 系统架构与工作流程整套电子秤的硬件链路非常清晰称重传感器把重量转换为微弱的差分电压信号HX711负责把这个微伏级别的小信号放大并做24位高精度模数转换最后由51单片机读取转换结果经过滤波和标定计算后把重量值显示在4位数码管上。传感器信号的流向是电阻应变式传感器 - HX711模拟前端ADC - 51单片机数据处理 - 数码管显示。按键和蜂鸣器则作为输入和反馈设备接入系统。软件层面的工作流程则是系统上电初始化 - HX711零点采样 - 主循环不断读取当前重量 - 滑动滤波 - 标定换算 - 数码管动态扫描显示同时轮询按键状态响应去皮、校准等操作。这个架构属于典型的“传感器专用ADC主控”组合也是目前工业电子秤和家用电子秤最主流的方案。相比直接用51内部ADC去采传感器信号多一颗HX711的成本换来的却是数量级的精度提升这个投入非常划算。1.2 为什么选51单片机HX711组合我见过不少同学一上来就想用STM32、用ESP32理由无非是“性能强、以后用得着”。但如果这个项目的定位是课程设计或者入门练手51单片机反而是更合适的选择。原因很实在51的资料和例程全网最全遇到问题随便一搜就有答案外围电路简单5V供电不需要考虑复杂的时钟树和启动配置Keil开发环境对新手友好编译下载流程简单。用STM32当然可以做但很多精力会花在跟称重无关的配置上反而偏离了核心。HX711这颗芯片则是整个项目的灵魂。它是一个24位高精度A/D转换芯片专为电子秤设计内部集成了低噪声仪表放大器、稳压电源和时钟振荡器外部只需要很少的阻容元件就能工作。最关键的是它支持最高128倍的增益能够把传感器输出的毫伏级信号放大到ADC可以分辨的范围。相比用分立运放搭建放大电路HX711把硬件调试难度降到了几乎为零用单片机IO口模拟时序就能读取数据这就是我选它的核心理由。提示如果纯粹为了省钱也可以用ADC0832之类的8位/10位ADC做但实际效果会差很多。10kg传感器满量程输出大约5mV后面详细算10位ADC在5V参考电压下的分辨率接近5mV也就是说你只能分辨出满量程根本没法实现克级称重。24位的HX711在这个量级下优势是碾压性的。2. HX711称重原理与硬件电路设计2.1 电阻应变式传感器与惠斯通电桥常见的10kg称重传感器内部结构是4片电阻应变片粘贴在弹性体上接成一个惠斯通电桥。当弹性体受力变形时相对的两片应变片电阻一增一减电桥失去平衡在激励电压两端产生一个正比于外力的差分电压。这个差分电压有多小以常见的10kg铝合金传感器为例灵敏度典型值是1mV/V。也就是说在5V激励电压下满量程10kg时输出也只有5mV也就是0.005V左右。这么小的信号如果直接用单片机内置ADC去采样几乎就是噪声级别的完全无法分辨。所以必须先用HX711内部的仪表放大器把信号放大再进行模数转换。这里需要特别提醒一点传感器满量程输出的5mV是“理想空载到满载”的变化量。实际接线中传感器还存在着零点不平衡输出通常会有±0.1mV左右的初始偏置。也就是说不受力的时候输出差分电压也不是0。这个偏置会在HX711的原始读数上体现为一个“零点偏移量”必须在程序里通过去皮或者在标定时扣除否则会出现“空秤显示负值”之类的现象。2.2 HX711芯片关键参数与通讯时序HX711的核心参数是24位无失码、内置128/64/32三档可编程增益、差分输入范围在128增益下约为±20mV、数据输出速率有10Hz和80Hz两档可选。对电子秤来说10Hz输出速率足够还能顺便起到一定的硬件滤波效果。通讯方式是完全由单片机控制的串行时序只有两根线PD_SCK时钟和DOUT数据。单片机拉高PD_SCK发出脉冲DOUT上就按位输出转换结果。每次完整读取需要25个脉冲前24个脉冲从最高位到最低位依次读出24位数据第25个脉冲用于确定下一次转换的增益通道如果第25个是高电平下次使用128增益如果是低电平则使用32增益。这个细节非常容易忽略如果时序控制不当很可能出现读回来的数据是正常值的情况但实际上增益配置已经悄悄变了导致称重曲线完全不对。芯片的供电也需要注意。HX711的模拟电源AVDD和数字电源VCC可以独立供电常见接法是把AVDD接到5V数字电源VCC接到3.3V或者5V但需要保证两者的上电顺序和电压范围在手册允许范围内。最稳妥的做法是AVDD和VCC全部接5V同时在AVDD引脚对地加一个10uF电解电容和一个0.1uF陶瓷电容去耦这样可以有效抑制电源纹波对ADC精度的影响。2.3 电路设计要点从传感器到单片机到显示电路设计的整体连接关系如下51单片机的引脚分配可根据自己的PCB调整这里给出参考传感器四根线红线接HX711的E黑线接E-也就是传感器的激励电源白线接S绿线接S-也就是差分信号输出。HX711的DOUT接单片机P1.0PD_SCK接P1.1。4位数码管采用动态扫描方式段码线通过限流电阻接P0口位选线接P2.0~P2.3。蜂鸣器接P1.2三个按键分别接P3.0、P3.1、P3.2都按下拉电阻到地用低电平触发。这里有几个容易掉坑的地方需要重点说明第一P0口是开漏输出驱动数码管段码时必须外接上拉电阻一般用10K排阻最方便否则段码输出高电平的驱动能力不足数码管亮度会很暗甚至不亮。第二蜂鸣器如果是无源蜂鸣器需要单片机输出一定频率的方波才能发声如果是有源蜂鸣器只要给高电平就会响。本设计用的是有源蜂鸣器IO口拉高即可。第三按键的IO口一定要加上拉电阻51单片机P3口内部有上拉但外部再加一个10K会更稳同时程序里要处理机械抖动否则会出现一次按下触发多次的“幽灵按键”现象。提示10kg量程的电子秤传感器供电电压的稳定性直接决定了称重精度。如果稳压芯片质量不好输出电压随负载波动传感器的灵敏度也会跟着漂表现出来就是“同样的东西今天称是一个数明天称又是一个数”。建议用AMS1117-5.0或者7805加足够容量的滤波电容来供电。3. 软件程序设计与核心代码解析3.1 主程序框架设计软件部分采用最经典的前后台结构一个主循环负责数据采集、处理和显示按键检测放在主循环里轮询。之所以不用中断是因为HX711的读取时序要求时钟信号稳定如果被高优先级中断打断很容易破坏时序导致读回来的数据错位。对于这个项目的实时性要求10Hz更新率主循环轮询完全够用。主程序逻辑可以用伪代码概括为void main() { System_Init(); // 定时器初始化、IO初始化 HX711_Init(); // 等待HX711稳定 tare_offset HX711_Read(); // 上电自动采样零点 while(1) { raw_value HX711_Read(); // 读取原始值 filtered SlidingAverage(raw); // 滑动滤波 weight ConvertToGram(filtered); // 标定换算单位g Display_Update(weight); // 动态扫描刷新数码管 Key_Scan(); // 按键处理去皮、校准 Buzzer_Check(weight); // 超重报警判断 } }核心思路是把所有外设都封装成独立模块主循环只做调度。这样后续如果要增加功能比如加LCD1602显示、加串口上传数据只需要在对应位置插入调用不用改动其他模块的代码。3.2 HX711读取函数与关键代码HX711读取24位数据的核心代码如下24位补码格式高位在前sbit HX711_DOUT P1^0; // 数据输出 sbit HX711_SCK P1^1; // 时钟输入 unsigned long HX711_Read(void) { unsigned long value 0; unsigned char i; HX711_SCK 0; while(HX711_DOUT); // 等待DOUT变低表示数据就绪 for(i 0; i 24; i) { HX711_SCK 1; value value 1; HX711_SCK 0; if(HX711_DOUT) value; } HX711_SCK 1; // 第25个脉冲设置增益为128 value value ^ 0x800000; // 转换为有符号数 HX711_SCK 0; return value; }这段代码有两个坑需要解释。第一个是while(HX711_DOUT);这个等待循环它确保芯片已经完成一次转换并且数据稳定在输出寄存器里。如果数据输出速率配置为10Hz每100ms才有一个新数据这个等待最多会阻塞100ms。如果单片机在等待期间被其他任务占用会导致主循环卡顿不过在我们的纯轮询设计里这不算问题。第二个是value value ^ 0x800000这一行。HX711输出的24位数据是二进制补码形式最高位是符号位。直接把unsigned long类型的变量当作有符号数使用时需要手动进行符号扩展。异或0x800000相当于翻转符号位把补码转换为对应的有符号数值这样才能正确处理负重量比如空秤时的零点负偏移。3.3 标定算法与数据处理标定是整个电子秤软件里最核心的部分算法原理其实非常简单两点标定。先记录空秤时的零点读数zero_val再把一个已知重量的标准砝码比如1kg放上去记录满点读数full_val然后算出比例系数scale之后任意重量都可以用公式换算weight (current_val - zero_val) / scale其中scale (full_val - zero_val) / standard_weight。注意这里的单位换算如果标准砝码是1000g那么scale的单位是“每克的ADC读数”计算出来的重量自然就是克。为了得到稳定的读数必须在原始ADC值上做滤波处理。最简单的有效方案是滑动平均滤波维护一个长度为10的数组每次读取新的原始值就覆盖掉最旧的一个然后取平均值。在10Hz采样率下10次平均等效于1秒的响应时间既能有效滤除高频抖动又不会让人感觉称重反应太慢。如果觉得还不够平滑可以把滤波窗口加大到20但响应会明显变迟钝需要根据实际体验权衡。去皮功能的实现也很直接在任意时刻按下去皮键就把当前的滤波值记录为新的零点用这个新零点替换原来标定的零点值。这样用户把容器放上去之后按去皮就能直接显示容器里物品的净重。3.4 数码管动态扫描与按键交互4位数码管采用动态扫描原理是人眼的视觉暂留效应。每次只点亮一位数码管显示对应的段码延时2~3ms后切换到下一位循环往复。当扫描频率超过50Hz时人眼看到的效果就是4位数字同时稳定显示。段码表根据共阳还是共阴选择本项目用的是共阴数码管段码表如下unsigned char code table[] { 0x3F, // 0 0x06, // 1 0x5B, // 2 0x4F, // 3 0x66, // 4 0x6D, // 5 0x7D, // 6 0x07, // 7 0x7F, // 8 0x6F // 9 };按键部分要做消抖处理我的做法是检测到按键按下后延时10ms再次检测确认仍然按下才认为有效。三颗按键的功能分配如下KEY1去皮KEY2标定长按进入校准模式配合KEY3调整系数KEY3单位切换克/千克显示。按键处理时注意去皮操作不要在读取HX711数据的瞬间执行否则会用一个尚未稳定的值当零点造成去皮漂移。4. Proteus仿真搭建与实物联调4.1 Proteus仿真电路搭建步骤仿真部分用的是Proteus 8.x整体搭建步骤按顺序来第一步从元件库中选取STC89C52、HX711、4位数码管7SEG-MPX4-CC或CA根据你的共阴/共阳选择、按键、蜂鸣器和电阻电容。Proteus元件库中自带的HX711模型可以直接使用如果搜不到确认一下元件库版本8.9以上一般都带。第二步摆放元件按电路图连线。注意HX711在仿真中的传感器模型直接用两个滑动变阻器POT分别模拟传感器差分输出的正负端比用真实传感器模型更可控。具体做法E接5VE-接地S接一个电位器的中间抽头S-接另一个电位器的中间抽头两个电位器分别接在5V和地之间这样就能手动调节差分电压模拟不同的重量。第三步双击HX711模型把增益设置为128数据输出速率设置为10Hz方便观察数据变化。然后给单片机加载编译好的HEX文件点击开始仿真。一个非常实用的仿真技巧在HX711的S和S-节点上分别放置电压探针仿真运行时实时观察这两个节点的电压差。当手动调节电位器时电压差变化HX711的输出读数和数码管显示值也同步变化就说明从模拟前端到数据处理的整个链路都是通的。如果数码管没反应先用探针确认HX711是否输出了变化的脉冲再检查单片机是否在正常运行这样可以快速定位问题到底出在前级还是后级。4.2 仿真与实物的差异及调试侧重点必须认清一个现实Proteus仿真只能验证程序逻辑和时序正确性无法验证真实的模拟信号精度。仿真中的电位器输出是理想信号没有噪声、没有温漂、没有接触电阻所以仿真能跑通不代表实物能直接好用。仿真调试的侧重点应该是逻辑验证HX711读回来的值是否随输入信号线性变化去皮按键是否能正确更新零点超重阈值判断是否准确数码管动态扫描有没有闪烁或拖影。这类纯逻辑问题在仿真阶段全部解决掉再去焊实物能省下大量的实际调试时间。实物的调试流程我建议这样走先用USB转TTL供电用万用表确认各点电压正常VCC5V、HX711的两个电源引脚都对地有正确电压然后空载观察HX711的DOUT引脚波形应该能看到每100ms左右出现一次低电平有效脉冲。确认硬件供电和信号链路正常后再烧录标定程序逐项验证显示、按键、蜂鸣器功能。注意实物上电后不要马上去放砝码标定。HX711和传感器在上电初期会有明显的零点漂移通常需要预热1~2分钟才能稳定。很多同学急着一上电就标定结果半小时后零点漂掉好几十克最后怎么调都调不准多半就是没做预热。5. 常见问题与排查技巧实录5.1 典型问题速查表我在调试这类电子秤时积累了一套快速排查问题的清单按优先级排列如下现象可能原因排查方法与解决方案数码管完全不亮电源没接对或者P0口上拉电阻缺失先量VCC对地电压检查段码电阻和位选线接线显示数字固定不变HX711读取时序错误DOUT一直为高用示波器或者逻辑分析仪看DOUT波形检查SCK极性读数明显偏大或偏小标定系数错误或HX711增益配置不对用标准砝码重新两点标定检查第25个脉冲逻辑读数上下乱跳电源纹波过大或者传感器线接触不良检查供电滤波电容重新焊接传感器焊点加大滑动滤波窗口空秤显示负值没有做零点扣除或者零点偏移过大检查去皮逻辑确认传感器信号线接线颜色是否对应按键触发不稳定没有消抖处理或按键IO口上拉不够程序加10ms消抖延时外部加10K上拉电阻蜂鸣器一直响超重阈值设得太低或误触发检查阈值计算逻辑确认单位换算是克还是千克这个表看起来简单但每一条背后都是我实测踩过的坑。比如“空秤显示负值”这个问题第一次遇到时我还以为是传感器坏了后来一查是传感器白线和绿线接反了导致差分信号极性反了读数变成负数。把两根线对调问题立刻消失。5.2 关于稳定性和精度的深度经验分享最后再讲几个直接影响成品质感的细节。关于传感器固定传感器必须固定在稳定的基座上且传感器受力方向要垂直于弹性体表面不能有侧向力。如果你的电子秤放在桌上读数稳定手一扶着桌子读数就跳多半是传感器没有固定好或者底座太软。关于PCB布线和飞线如果做洞洞板HX711到传感器的连线尽量短并且采用双绞线或者屏蔽线否则容易引入50Hz工频干扰。我实测过用20cm长的普通杜邦线连接传感器手一靠近线读数就跳换成双绞线后问题基本消失。关于标定时间点零点和满量程标定必须在系统充分预热后进行。如果条件允许最好在标定之前先放一个5kg左右的砝码压几分钟让传感器弹性体“活动开”然后再做空秤清零和满量程标定这样得到的线性度会好很多。关于单位显示如果你想让显示更专业可以在数码管上加入小数点来区分克和千克比如显示1.000表示1kg显示350.0表示350g。这需要根据按键切换动态调整小数点位置代码上并不复杂但观感提升非常大。这个项目我在教学和DIY实践中反复做过好几个版本最深的体会是电子秤这个题目硬件成本不高技术难度也就中等偏下但真正能把它调到“稳、准、快”三个字都满足的靠的不是多高深的理论而是对传感器特性、芯片时序和接地供电这些细节的死磕。把这套流程走完一遍单片机外设操作、通信时序模拟、数据处理与滤波这些能力都会有一次很扎实的锻炼以后再去做其他传感器类的项目思路会顺很多。本文还有配套的精品资源点击获取
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻