1. 引言这是一套基于STC89C52REGX52.H的智能称重分拣系统核心硬件包括HX71124 位高精度 A/D 转换芯片负责读取称重传感器电阻应变式的原始数据DS1302实时时钟芯片用于记录每次称重的日期与时间AT24C02I²C 接口的 EEPROM用于断电保存累计合格数、次品数、标准重量、误差阈值等关键参数LCD1602两行 16 字符液晶屏用于人机交互显示蜂鸣器 LED超重/异常报警输出。本文从代码实现角度逐段讲解这段代码的工作原理、数据流向与各模块的协作方式帮助你彻底读懂这套称重分拣系统的每一行代码。文末附有函数职责总览表与状态机流程图方便你快速把握全局。2. 系统整体架构与模块划分2.1 硬件连接概览外设模块接口类型与单片机连接作用HX711自定义 GPIO 时序P 口SCK/DOUT读取称重传感器原始值DS1302三线串行RST/SCLK/IO提供实时时钟AT24C02I²CSCL/SDA掉电保存统计数据LCD1602并行 8 位P0/P2 等显示模式、重量、时间蜂鸣器GPIO 输出任意 I/O超重报警LEDGPIO 输出P2.4超重指示2.2 软件模块划分MODE 1MODE 2MODE 3MODE 4是否main() 主循环mode 判断Display_M1 时间显示Display_M2 称重超重报警Display_M3 误差检测/批量测量Display_M4 数据统计/串口发送Get_Weight() 读取重量超重?Buzzer_Time(100) 报警LED1 正常3. 代码逐段精讲3.1 全局变量与宏定义sbit LEDP2^4;unsignedintWeight_Maopi0,Range1000,qupi,num;longWeight_Shiwu0;unsignedcharnum_Store,Weight_Store_Num0,mode,m4;unsignedcharERROR1,Bad_Num1,Keynum,TimeSetSelect7,TimeSetFlashFlag;unsignedcharWeight_Shiwu_Flag1,num_Flag,Weight_Shiwu_Flag2;unsignedintWeight_Standard1,FanWei_Max,FanWei_Min;intWeight_Standard200;chartemp,m3,ERROR,Bad_Num,sum,Month,Day,Hour,Minute,m3_Flag;unsignedchari,Weight_Flag,KeynumFlag1,k8,m3_qingling;floatT;#defineGapValue426.04讲解要点Weight_Maopi毛皮重量与qupi去皮值是两个容易混淆的变量前者是 HX711 原始读数后者是去皮后的偏移量二者在Get_Weight()中分别承担「零点偏移」与「去皮」两个不同阶段的补偿。Weight_Shiwu用long是因为 HX711 原始值可达 24 位有符号数unsigned int16 位会溢出。GapValue是标定系数注释已说明不同传感器需单独校准——它决定了原始 A/D 值到克数的换算比例是称重系统能否准确的关键参数。### 3.2 去皮函数Get_Maopi()voidGet_Maopi(){qupiWeight_Shiwu;}逻辑分析该函数把当前净重存入qupi作为去皮基准。它依赖Weight_Shiwu已被Get_Weight()更新过因此调用顺序很关键——必须先执行Get_Weight()得到当前重量再调用Get_Maopi()记录去皮值后续称重时Get_Weight()会减去该值得到净重。3.3 重量读取与超重判断Get_Weight()voidGet_Weight(){Weight_ShiwuHX711_Read();Weight_ShiwuWeight_Shiwu-Weight_Maopi;Weight_Shiwu(unsignedint)((float)(Weight_Shiwu)/GapValue)-qupi;Weight_Shiwu-18600;if(Weight_Shiwu0||Weight_Shiwu5000){Weight_Shiwu0;}if(Weight_Shiwu0Weight_Shiwu5000){if(Weight_ShiwuRangemode2){Buzzer_Time(100);LED0;}elseif(mode2Weight_ShiwuRange){LED1;}}}逐行讲解代码行作用潜在问题HX711_Read()读取 24 位原始 A/D 值需确认返回类型是有符号还是无符号- Weight_Maopi减去毛重零点偏移Weight_Maopi初始为 0首次需先标定(float)/GapValue原始值 → 克数换算GapValue需按传感器实测标定- qupi去皮偏移与Weight_Maopi功能重叠易混淆- 18600经验补偿值硬编码魔法数建议改为宏定义并注释来源5000归零超量程保护量程上限写死建议用宏MAX_WEIGHT关键点说明18600是经验补偿值用于修正传感器零点漂移属于硬编码常量理解时需结合具体传感器特性量程上限5000是超量程保护阈值超过该值重量被强制归零避免异常读数超重判断仅在mode2称重模式下生效其他模式不触发报警。### 3.4 时间设置与显示TimeSet()/Timeshow()TimeSet()是状态机式的按键处理Keynum1切换当前编辑的时间字段年→月→日→时→分→秒循环Keynum5当前字段加 1并做边界回绕如月份 1–12、日期按大小月/闰年判断Keynum6当前字段减 1同样做边界回绕。亮点闰年判断DS1302_Time[0]%40已实现逻辑完整。实现细节大小月判断通过查表或分支实现日期边界按月份天数回绕按键处理为单次触发未做消抖与长按加速。### 3.5 数据存储AT24C02_*系列voidAT24C02_Writebyte_Data(){AT24C02_Writebyte(0,sum);Delay(5);AT24C02_Writebyte(1,Bad_Num);Delay(5);// ... 共 10 个字节}存储布局表EEPROM 地址存储内容数据类型说明0x00sumunsigned char累计合格数0x01Bad_Numunsigned char累计次品数0x02–0x03Weight_Standardint低/高字节标准重量0x04ERRORunsigned char误差阈值0x05–0x08月/日/时/分unsigned char最后称重时间0x09m3_Flagunsigned char模式 3 标志写入机制说明每次写 10 个字节都带Delay(5)可改为「先写后校验读回」建议增加**校验和checksum**字节防止掉电写入不完整导致数据损坏AT24C02_Writebyte_qingling_data()与AT24C02_Writebyte_qingling()功能几乎重复可合并为一个函数并加参数。3.6 显示函数族Display_*函数名显示内容适用模式Display_M1()MODE 1 时间占位模式 1Display_M2()MODE 2 MAX 当前重量模式 2Display_M3()MODE 3 ERROR 标准重量模式 3 设置Display_M3_Measure()MODE 3 NUM 当前重量模式 3 测量Display_M3_Store()“save data …”模式 3 保存Display_M4_Standard()Weight ERROR模式 4 查看标准Display_M4_Num()SUM BadNum模式 4 统计Display_M4_Time()最后称重时间模式 4 时间Display_M4_Send()“SEND DATA ?”模式 4 确认发送Display_M4_successful()“send successfully”模式 4 发送成功设计评价每个显示函数职责单一、命名清晰是这段代码中结构最规范的部分值得保持。6. 案例补充一个完整的称重分拣场景场景某小型电子厂需要对电阻进行重量分拣标准重量 200g误差 ±5g。操作流程上电→ 系统自动读取 AT24C02 中保存的标准重量 200g、误差 5g模式 2 称重→ 放上电阻LCD 显示实时重量超重判断→ 若 205g蜂鸣器报警、LED 亮判定为次品模式 3 批量测量→ 连续测量 10 个自动统计合格/次品数模式 4 查看统计→ 显示 SUM8、BadNum2并通过串口发送到上位机掉电保护→ 数据自动存入 AT24C02下次上电可恢复。串口输出示例last time: 10-11 20:27 last standard: error: 5 weight: 0200 last data: sum: 008 bad: 0027. 函数职责总览表函数名所属模块职责依赖Get_Maopi()称重记录去皮值Weight_ShiwuGet_Weight()称重读取并换算重量、超重报警HX711、蜂鸣器、LEDTimeshow()时间读取 DS1302 并刷新 LCDDS1302、LCDTimeSet()时间按键设置时间含闰年判断按键、DS1302AT24C02_Readbyte_Data()存储从 EEPROM 读回全部参数AT24C02AT24C02_Writebyte_Data()存储保存全部参数到 EEPROMAT24C02Display_M1~M4_*()显示各模式界面刷新LCD1602UART_Send_num()通信串口发送统计结果UART8. 总结这段代码功能完整、模块划分清晰尤其是显示函数族和 AT24C02 存储设计值得肯定。主要改进空间集中在消除魔法数用宏定义替代硬编码收敛全局变量用结构体或状态机封装补齐边界处理按键消抖、变量类型、初始化增加数据校验提升掉电可靠性。如果你需要我可以进一步把TimeSet()重构为查表法、为Get_Weight()增加数字滤波滑动平均、或补充完整的main()主循环框架。