1. 项目概述:HX711电子称重报警系统
这个基于STC89C52单片机的称重系统,是我在工业自动化项目中反复验证过的成熟方案。核心在于HX711这款24位高精度ADC芯片与应变式称重传感器的配合,能够实现0.1g级别的测量精度。不同于市面上简单的称重模块,本系统增加了阈值报警功能,当重量超过预设值时触发声光报警,特别适合生产线上的质量检测场景。
整套系统成本控制在50元以内,PCB尺寸仅8×6cm,却实现了商业级称重仪表80%的功能。下面我将从硬件选型、软件设计到调试技巧,完整还原这个项目的开发过程,重点分享如何避开称重系统常见的温漂、线性度等问题。
2. 硬件设计解析
2.1 核心器件选型
STC89C52单片机选择理由:
- 内置8KB Flash存储器,足够存储称重算法和报警逻辑
- 32个I/O口轻松驱动LCD1602显示屏和报警电路
- 支持5V供电,与HX711电平完美匹配
- 成本仅3-5元,远低于STM32等方案
HX711模块的关键参数:
- 24位ADC分辨率,理论精度可达1/16777216
- 内置128倍增益可编程放大器,直接连接桥式传感器
- 典型采样速率10Hz/80Hz可选
- 工作电压2.6-5.5V,功耗<1.5mA
实际采购时要注意:市场上HX711模块有V1.0和V1.1版本,建议选V1.1版本(丝印清晰可见),其抗干扰能力更强。
2.2 称重传感器接线要点
常见的悬臂梁式称重传感器(如5kg量程)采用全桥电路,四线制接线:
- 红线:激励电压+(接HX711的E+)
- 黑线:激励电压-(接HX711的E-)
- 白线:信号输出+(接HX711的A+)
- 绿线:信号输出-(接HX711的A-)
实测中发现,传感器与HX711之间的导线长度不宜超过50cm,否则容易引入干扰。建议使用屏蔽线,并在HX711的AVDD和AGND之间并联10μF+0.1μF电容。
3. 软件设计实现
3.1 HX711驱动代码
c复制#define HX711_SCK P1_0
#define HX711_DOUT P1_1
long HX711_Read(void) {
unsigned long count = 0;
unsigned char i;
HX711_DOUT = 1;
_nop_();
HX711_SCK = 0;
_nop_();
while(HX711_DOUT); // 等待转换完成
for(i=0;i<24;i++) {
HX711_SCK = 1;
_nop_();
count = count<<1;
HX711_SCK = 0;
_nop_();
if(HX711_DOUT) count++;
}
HX711_SCK = 1; // 选择128增益
_nop_();
HX711_SCK = 0;
_nop_();
return (count^0x800000);
}
这段代码有三个关键点:
- 使用_nop_()插入空指令保证时序
- 转换完成后先左移再读数,避免数据错位
- 最后异或0x800000处理补码
3.2 重量计算算法
实际工程中采用分段线性校准:
c复制float Get_Weight() {
long adc = HX711_Read();
if(adc < 50000)
return 0; // 去皮重
// 分段校准系数
float weight;
if(adc < 1000000)
weight = (adc-50000)*0.0125; // 小量程段
else
weight = 11875 + (adc-1000000)*0.0142; // 大量程段
return weight;
}
校准方法:
- 空载时读取AD值作为零点(如50000)
- 放置500g标准砝码,记录AD值(如90000)
- 计算系数:(90000-50000)/500 = 80 AD值/g
- 取倒数得0.0125 g/AD值
4. 报警功能实现
4.1 硬件报警电路
采用三极管驱动蜂鸣器和LED的典型电路:
code复制P2.0 → 1K电阻 → NPN三极管基极
三极管集电极 → 蜂鸣器+ → 5V
三极管发射极 → GND
P2.1 → 220Ω电阻 → LED → GND
4.2 软件报警逻辑
c复制void Check_Alarm(float weight) {
static bit alarm_state = 0;
if(weight > ALARM_THRESHOLD) {
if(!alarm_state) {
Buzzer = 1; // 启动蜂鸣器
LED = 1; // 点亮报警灯
alarm_state = 1;
Send_UART("超重报警!重量:%.1fg\n", weight);
}
} else {
Buzzer = 0;
LED = 0;
alarm_state = 0;
}
}
5. 系统调试经验
5.1 常见故障排查表
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 读数跳变大 | 电源干扰 | 增加稳压芯片,传感器与HX711间加0.1μF电容 |
| 显示负值 | 传感器接线反 | 交换A+和A-线序 |
| 重量不归零 | 机械结构应力 | 重新安装传感器,确保无侧向力 |
| 线性度差 | 校准点不足 | 至少用3个标准砝码分段校准 |
5.2 提升精度技巧
- 数字滤波算法:采用滑动平均滤波,实测可使波动减小60%
c复制#define FILTER_NUM 10
float weight_buf[FILTER_NUM];
float Filter_Weight(float new_weight) {
static int index = 0;
float sum = 0;
weight_buf[index++] = new_weight;
if(index >= FILTER_NUM) index = 0;
for(int i=0; i<FILTER_NUM; i++) {
sum += weight_buf[i];
}
return sum/FILTER_NUM;
}
-
温度补偿:在HX711附近放置DS18B20,建立温度-零点漂移对照表
-
自动去皮重:长按按键时记录当前AD值作为新零点
6. 仿真与实测对比
使用Proteus仿真时需注意:
- HX711模型需要手动添加,官方库不包含
- 传感器用可变电阻模拟,阻值变化范围建议20-100Ω
- 仿真采样速率比实物慢3-5倍
实测数据与仿真对比误差主要来自:
- 仿真忽略PCB走线阻抗
- 实物存在电磁干扰
- 传感器机械滞后效应
建议先通过仿真验证基本逻辑,再用实物调试参数。我的工程实测表明,经过3次迭代校准后,系统在0-5kg量程内误差可控制在±0.3%以内。
