- 基于单片机的去皮计价与超重报警电子秤设计与实现
点击链接下载protues仿真设计资料:https://download.csdn.net/download/m0_51061483/92081456
-
系统总体概述
2.1 设计背景与应用场景
电子秤作为日常生活与商业交易中最常见的测量设备之一,广泛应用于菜市场、超市、生鲜店、零售柜台、仓储分拣、实验室称量以及家庭厨房等场景。与传统机械秤相比,电子秤具有称量精度高、读数直观、响应速度快、可扩展计算与记录等优势。尤其在零售交易场景中,电子秤不仅要完成重量测量,还常常需要实现"按单价自动计价""去皮称量""超重提示"等功能,以提高交易效率并减少人工计算误差。
在实际使用中,普通电子秤常见问题包括:
- 小重量不稳定或漂移明显,影响交易公平性;
- 去皮操作复杂,或去皮后易受外力影响导致零点偏移;
- 单价输入不便,显示界面不直观;
- 超载超重缺乏明显提示,长期超重可能损坏传感器;
- 环境振动、温度变化、电源波动导致测量误差增大。
本设计以单片机为核心,采用HX711高精度称重采集芯片配合0~10kg量程称重传感器,实现稳定准确的重量测量;通过按键实现去皮功能,能在称量前或称量过程中消除容器重量得到净重;通过按键输入商品单价,系统自动完成金额计算;采用汉字液晶显示屏实时显示重量、单价、金额及状态提示;当重量超过设定上限时触发声光报警,防止超限称量并保护硬件。该系统结构完整、功能实用、可扩展性强,适合课程设计、实验项目与小型商业称重设备方案实现。
2.2 系统功能目标
系统需要实现以下功能:
1)重量测量:采用HX711高精度称重传感器,测量范围0~10kg,确保数据稳定准确。
2)去皮功能:支持去皮操作,可在称量前或称量过程中消除容器重量,直接获得净重。
3)价格计算:通过按键输入商品单价,系统自动完成价格计算并实时显示。
4)显示与交互:汉字液晶显示屏实时显示重量、单价、金额及系统状态,界面清晰易读。
5)超重报警:当重量超过设定上限时,系统立即发出声光报警提示,防止称量超限。
2.3 系统总体结构与工作原理
系统整体由以下层次构成:
- 传感采集层:称重传感器(应变片桥式)+ HX711模数转换模块
- 控制处理层:单片机完成数据采集、滤波、单位转换、去皮与计价运算
- 人机交互层:按键输入单价与去皮操作,LCD显示重量/单价/金额/状态
- 报警输出层:蜂鸣器+LED声光报警,超重时提示并保护传感器
- 电源与抗干扰层:稳压供电、滤波去耦、采样线屏蔽与软件滤波
工作原理概述:
1)称重传感器受力后输出微弱差分电压信号;
2)HX711对差分信号进行高增益放大并转换为数字量;
3)单片机读取HX711数据,经过滤波与标定换算得到重量值;
4)用户按键输入单价,系统实时计算金额 = 净重 × 单价;
5)用户可按去皮键记录当前重量为皮重,净重 = 总重 - 皮重;
6)当总重或净重超过上限(如10kg或设定阈值)时,蜂鸣器与LED报警并提示"超重"。
-
系统功能设计详解
3.1 重量测量功能设计
3.1.1 称重传感器与HX711配合测量机制
电子秤常用的称重传感器为"电阻应变式传感器",内部通常为惠斯通电桥结构。当传感器受力变形时,桥臂电阻发生微小变化,从而产生毫伏级差分电压信号。由于信号非常微弱,直接用普通ADC采样容易受噪声影响且分辨率不足,因此本设计采用专用称重采集芯片HX711。
HX711特点:
- 24位高分辨率ADC,适合微弱信号采集;
- 内置可编程增益放大器(常用128倍);
- 抗工频干扰能力较强,适合实际称重环境;
- 与单片机采用简单的两线接口(PD_SCK、DOUT)通信,易于实现。
3.1.2 0~10kg量程设计与分辨率分析
测量范围0~10kg意味着系统必须在保证量程的同时具备足够的精度。实际应用中,秤的可用分辨率不仅取决于HX711理论24位精度,还与:
- 传感器灵敏度与线性误差
- 机械结构的稳定性与回弹
- 电源噪声与接地方式
- 软件滤波与标定精度
密切相关。
通常010kg电子秤的实际显示精度可达到1g5g级别已经非常实用。为了获得稳定读数,软件需要加入多次采样平均、滑动滤波、零点漂移补偿等算法。
3.1.3 零点校准与标定系数
称重系统必须经过校准(标定)才能将HX711原始计数值转换为重量。一般采用两点标定:
- 零点标定:空秤时读取原始值 raw0
- 满量程或已知砝码标定:放置已知重量 W_cal,读取原始值 raw1
计算比例系数: - scale = (raw1 - raw0) / W_cal
重量计算: - W = (raw - raw0) / scale
标定系数可存储于EEPROM,确保断电不丢失。
3.2 去皮功能设计
3.2.1 去皮功能意义
去皮(Tare)是计价秤最重要的功能之一,用于消除容器或包装重量。例如称水果时常使用塑料袋或托盘,若不去皮则重量包含容器重量导致金额偏高。去皮功能能够在称量前或称量过程中记录当前重量为"皮重",之后显示净重。
3.2.2 去皮实现方式
系统定义两个重量概念:
- 总重 Gross:当前传感器测得的真实重量(包含容器)
- 皮重 Tare:用户按下去皮键时记录的重量
- 净重 Net = Gross - Tare
去皮操作流程:
1)用户放置容器(或容器+部分物品)
2)按下去皮键
3)系统将当前总重写入皮重变量 Tare
4)之后显示净重 Net
若用户再次按去皮键,则更新皮重,支持多次去皮。
3.2.3 去皮的稳定性与防误触策略
去皮时若秤盘不稳定(物体晃动)可能导致皮重记录误差,因此去皮需增加稳定判定:
- 连续多次采样变化小于阈值(例如±2g)才允许去皮;
- 去皮成功后显示提示"已去皮";
- 去皮后若总重小于皮重(物体拿走),净重可能为负,应强制显示0并提示"请清零"。
3.3 价格计算功能设计
3.3.1 单价输入需求与输入方式
在零售场景中,商家需输入商品单价(元/kg或元/500g等),系统自动计算金额。单价输入方式常见两类:
- 数字键盘输入(0~9 + 确认/清除)
- 简化按键(UP/DOWN调节单价,适合单品场景)
本设计采用按键输入单价,可实现精确输入,适用于多品类交易。
3.3.2 金额计算与单位换算
假设单价单位为"元/kg",净重单位为"kg",则金额:
- Money = Price × NetWeight
若净重以"g"显示,则需换算: - Money = Price × NetWeight(g) / 1000
为避免浮点误差,单片机常采用"定点运算"实现: - 单价以"分/kg"存储
- 重量以"g"存储
- 金额(分)= 单价(分/kg) × 重量(g) / 1000
这样可保证计算精确且运行效率高。
3.3.3 金额显示与四舍五入
显示金额时通常保留两位小数(元)。定点运算得到的金额(分)可直接转换显示:
- 元 = 分 / 100
- 小数 = 分 % 100
同时可加入四舍五入策略: - MoneyFen = (PriceFenPerKg * WeightG + 500) / 1000
其中+500用于除法四舍五入,提高金额显示准确性。
3.4 显示与交互功能设计(汉字液晶)
3.4.1 使用汉字液晶的优势
相比数码管,汉字液晶(常见12864 LCD或1602带中文模块)可显示更多信息,例如:
- "重量:xxx g"
- "单价:xx.xx 元/kg"
- "金额:xx.xx 元"
- "状态:去皮/超重/稳定/输入中"等
汉字液晶界面直观,能显著提升用户体验与设备档次。
3.4.2 显示界面布局设计
建议界面布局如下:
- 第一行:重量(总重/净重),并标注单位
- 第二行:单价
- 第三行:金额
- 第四行:状态提示(稳定、去皮、超重、输入单价等)
这样用户在称量时可一眼看到关键交易信息。
3.4.3 输入状态提示与交互反馈
为避免用户误操作,系统应提供交互反馈:
- 输入单价时显示"正在输入单价:xxx"
- 去皮成功显示"去皮完成"
- 清零显示"已清零"
- 超重显示"超重报警"并闪烁提示
良好的交互反馈能减少交易纠纷与使用疑惑。
3.5 超重报警功能设计
3.5.1 超重报警的必要性
称重传感器与机械结构都有最大承载能力,长期超载会导致传感器塑性变形、灵敏度下降甚至损坏。超重报警可以:
- 提醒用户及时减少重量,避免损坏;
- 防止测量数据失真;
- 提高系统可靠性与使用寿命。
3.5.2 超重判定与报警策略
超重判定通常以"总重 > 上限"作为条件,上限可设为10kg或可由用户设置更低值。报警策略:
- 超重立即蜂鸣器鸣叫、LED闪烁
- LCD显示"超重"并可闪烁
- 超重时可锁定显示或停止计价(避免错误金额)
- 重量恢复正常后自动解除报警,或需按键确认解除(可选)。
3.5.3 防抖与持续超重保护
若重量在上限附近波动,报警可能频繁触发。可采用:
- 回差:例如超重解除条件为 Weight < Limit - 50g
- 连续超限确认:连续3次超限才报警
若持续严重超重,可将报警频率加快并显示"请立即卸载"。
-
系统电路设计
4.1 硬件总体结构与模块划分
系统电路按功能可分为:
1)单片机最小系统模块
2)称重传感器 + HX711采集模块
3)按键输入模块(单价输入、去皮、清零、确认)
4)汉字液晶显示模块
5)声光报警模块(蜂鸣器+LED)
6)电源模块与抗干扰保护模块
7)数据存储模块(EEPROM,可选,用于保存标定系数与阈值)
4.2 单片机最小系统模块
单片机负责采集、运算、显示与控制。最小系统包括:
- 晶振电路:常用11.0592MHz或12MHz
- 复位电路:RC上电复位 + 手动复位
- 电源去耦:0.1uF贴近VCC,10uF稳定电源
- IO保护:关键输出加下拉,避免上电误报警
设计要点:
- HX711数据线与时钟线应使用短线并尽量远离蜂鸣器和电源转换模块
- LCD与按键线尽量整齐布线,减少串扰
- 单片机与HX711建议使用同一模拟地参考,避免地电位差影响精度
4.3 HX711称重采集模块
HX711与称重传感器构成核心测量部分:
- E+、E-为桥式传感器激励电源
- A+、A-为差分输入
- DOUT输出数据,PD_SCK为时钟输入
- RATE引脚选择输出速率(10Hz或80Hz)
设计要点:
- 传感器激励电源要稳定,建议同一稳压供电并加滤波
- HX711模拟部分需靠近传感器,减少噪声耦合
- RATE选择10Hz可获得更高抗干扰与稳定性,80Hz响应更快但噪声略大
- DOUT与PD_SCK可加小电阻串联(如100Ω)抑制尖峰干扰
4.4 按键输入模块
按键用于:
- 数字输入单价(0~9)
- 去皮(TARE)
- 清零(ZERO)
- 确认(OK)
- 删除(DEL)
若按键数量较多,可用矩阵键盘减少IO占用。
设计要点:
- 按键上拉输入,按下接地有效
- 软件消抖(10~20ms)避免误触发
- 输入模式与称重模式需区分,避免输入时误去皮
4.5 汉字液晶显示模块
常见汉字液晶为12864 LCD:
- 可采用并口方式(数据线D0~D7 + RS/RW/EN)
- 或采用串口方式(减少IO占用)
显示内容包括重量、单价、金额与状态。
设计要点:
- LCD供电需稳定,背光电流较大,应单独限流或驱动
- 数据线应避免与HX711模拟线平行过长
- 可加入对比度调节电位器,适应不同光照环境
4.6 声光报警模块
声光报警由蜂鸣器与LED组成:
- 有源蜂鸣器:单片机输出控制即可
- LED可采用闪烁提示超重状态
若蜂鸣器电流较大,需三极管/MOS驱动并加限流电阻。
4.7 电源模块与抗干扰保护模块
称重系统对电源噪声非常敏感,因此电源设计至关重要:
- 使用低噪声稳压芯片(LDO)为HX711与单片机供电
- 数字电路与模拟电路分区布线,单点接地
- 增加电源滤波电容(100uF+0.1uF)
- 对蜂鸣器、背光等噪声源加隔离或独立供电分支
- 建议增加ESD保护,防止静电损坏HX711输入端
4.8 数据存储模块(可选)
若需要保存:
- 标定系数scale
- 零点raw0
- 超重阈值limit
- 上次单价
可使用外接EEPROM(如24C02)或利用单片机内部EEPROM(如STC系列支持)。保存能提升实际使用便利性。
-
程序设计
5.1 软件总体架构与设计思想
软件采用"任务轮询 + 定时节拍 + 状态机交互"的结构:
- 高优先级:HX711采样与滤波(保证重量稳定)
- 显示任务:LCD刷新(无需太高频率,200ms刷新即可)
- 按键任务:输入单价、去皮、清零、确认
- 计价任务:根据净重与单价计算金额
- 报警任务:超重报警节奏控制
状态机可分为:
- ST_WEIGH:称重显示状态
- ST_PRICE_INPUT:单价输入状态
- ST_TARE:去皮状态(瞬时状态)
- ST_ALARM:超重报警状态(可与称重并行)
5.2 HX711数据采集模块
该模块实现:
- 读取24位原始数据
- 进行符号扩展(HX711为补码输出)
- 多次采样平均
- 滑动滤波或中值滤波去除突变
- 输出稳定原始值raw
关键点:
- 采样周期与RATE匹配,10Hz模式每100ms更新一次
- 读取时钟时序需严格满足HX711要求
- 采样数据要防止溢出,使用32位或64位整型存储
5.3 重量换算与标定模块
- 空载时采集raw0作为零点
- 通过标定系数scale换算重量
- 支持自动零点跟踪(可选):在空载稳定时微调零点以消除漂移
- 输出重量单位可为g,并保留一位或两位小数(kg)
5.4 去皮处理模块
- 去皮键触发时记录当前重量为TareWeight
- 净重 = 总重 - 皮重
- 若净重小于0则显示0
- 去皮后状态提示"已去皮"
- 清零键可清除皮重与零点恢复
5.5 单价输入模块
单价输入采用缓冲区保存用户输入的数字:
- 支持输入小数(例如12.50元/kg)
- 支持退格删除、清空
- 确认后存入单价变量(以分/kg保存)
- 输入时LCD显示正在输入内容,避免用户混淆
5.6 计价计算模块
采用定点运算:
- WeightG:净重(g)
- PriceFenPerKg:单价(分/kg)
- MoneyFen = (PriceFenPerKg * WeightG + 500) / 1000
- 显示 MoneyFen / 100 元
这种计算方式精度高、适合8位/16位单片机。
5.7 LCD显示刷新模块
LCD刷新周期可设置为200ms:
- 显示总重/净重
- 显示单价
- 显示金额
- 显示状态(稳定/去皮/输入/超重)
同时可在超重时反白或闪烁某行提示。
5.8 超重报警模块
报警逻辑:
- if (GrossWeight > Limit) → 进入报警状态
- 蜂鸣器间歇鸣叫,LED闪烁
- LCD提示"超重"
- 若重量恢复至 Limit - Hys 则解除报警
- 报警期间可暂停计价或将金额显示为"----"避免误交易
-
参考程序(示例代码,C语言,通用单片机逻辑,可移植至51/STM32等)
c
#include <stdint.h>
#include <stdbool.h>
// ===================== 参数配置 =====================
#define HX711_AVG_N 10
#define WEIGHT_LIMIT_G 10000 // 10kg = 10000g
#define WEIGHT_HYS_G 50 // 回差 50g
#define STABLE_DELTA_G 2 // 稳定判定变化阈值
#define STABLE_CNT_N 5 // 连续稳定次数
// ===================== 全局变量 =====================
static int32_t g_raw = 0; // HX711原始值
static int32_t g_raw0 = 0; // 零点
static float g_scale = 1.0f; // 标定系数 raw/count per gram (示例用float,实际可用定点)
static int32_t g_weight_g = 0; // 总重(g)
static int32_t g_tare_g = 0; // 皮重(g)
static int32_t g_net_g = 0; // 净重(g)
static uint32_t g_price_fen_per_kg = 0; // 单价(分/kg)
static uint32_t g_money_fen = 0; // 金额(分)
static bool g_alarm_over = false;
static bool g_stable = false;
// ===================== 硬件接口函数(需按平台实现) =====================
int32_t HX711_ReadRaw(void); // 读取HX711原始数据
void LCD_Show(int32_t weight_g, int32_t net_g, uint32_t price_fen_per_kg, uint32_t money_fen,
bool stable, bool tare_on, bool over);
uint8_t Key_Scan(void); // 扫描按键,返回键值
void BEEP_Set(bool on);
void LED_Set(bool on);
uint32_t millis(void);
// ===================== 工具函数:绝对值 =====================
static int32_t iabs32(int32_t x){ return x>=0? x : -x; }
// ===================== 读取并平均HX711数据 =====================
static int32_t HX711_ReadAvg(void)
{
int64_t sum = 0;
for(uint8_t i=0;i<HX711_AVG_N;i++)
{
sum += HX711_ReadRaw();
}
return (int32_t)(sum / HX711_AVG_N);
}
// ===================== 重量换算(raw->g) =====================
static int32_t RawToGram(int32_t raw)
{
// W = (raw - raw0) / scale
float w = (float)(raw - g_raw0) / g_scale;
if(w < 0) w = 0;
return (int32_t)(w + 0.5f); // 四舍五入到1g
}
// ===================== 稳定判定 =====================
static void Stable_Check(int32_t weight_g)
{
static int32_t last_w = 0;
static uint8_t stable_cnt = 0;
if(iabs32(weight_g - last_w) <= STABLE_DELTA_G)
{
if(stable_cnt < 255) stable_cnt++;
}
else
{
stable_cnt = 0;
}
last_w = weight_g;
g_stable = (stable_cnt >= STABLE_CNT_N);
}
// ===================== 计价计算(定点) =====================
static void Money_Calc(void)
{
// MoneyFen = PriceFenPerKg * NetG / 1000 (四舍五入)
uint64_t tmp = (uint64_t)g_price_fen_per_kg * (uint64_t)g_net_g;
g_money_fen = (uint32_t)((tmp + 500) / 1000);
}
// ===================== 超重报警判断 =====================
static void Over_Check(void)
{
if(!g_alarm_over)
{
if(g_weight_g > WEIGHT_LIMIT_G) g_alarm_over = true;
}
else
{
if(g_weight_g < (WEIGHT_LIMIT_G - WEIGHT_HYS_G)) g_alarm_over = false;
}
}
// ===================== 报警输出节奏 =====================
static void Alarm_Task(void)
{
static uint32_t t = 0;
static bool on = false;
if(!g_alarm_over)
{
BEEP_Set(false);
LED_Set(false);
return;
}
// 300ms翻转一次
if(millis() - t >= 300)
{
t = millis();
on = !on;
BEEP_Set(on);
LED_Set(on);
}
}
// ===================== 去皮操作 =====================
static void Do_Tare(void)
{
// 仅稳定时允许去皮
if(g_stable)
{
g_tare_g = g_weight_g;
}
}
// ===================== 清零操作 =====================
static void Do_Zero(void)
{
g_tare_g = 0;
// 可选:将当前raw作为新的零点
g_raw0 = g_raw;
}
// ===================== 单价输入(简化示例:按键UP/DOWN调单价) =====================
// 说明:真实工程可加入数字键盘输入,此处演示核心逻辑:UP加10分/kg,DOWN减10分/kg
static void Price_InputTask(uint8_t key)
{
if(key == 1) // UP
{
g_price_fen_per_kg += 10;
}
else if(key == 2) // DOWN
{
if(g_price_fen_per_kg >= 10) g_price_fen_per_kg -= 10;
}
}
// ===================== 主循环 =====================
void App_Loop(void)
{
static uint32_t sample_timer = 0;
static uint32_t lcd_timer = 0;
uint32_t now = millis();
// 1) 按键处理
uint8_t key = Key_Scan();
// 假设:3=去皮,4=清零,1/2=单价调节
if(key == 3) Do_Tare();
else if(key == 4) Do_Zero();
else if(key == 1 || key == 2) Price_InputTask(key);
// 2) 采样更新(100ms)
if(now - sample_timer >= 100)
{
sample_timer = now;
g_raw = HX711_ReadAvg();
g_weight_g = RawToGram(g_raw);
// 稳定判定
Stable_Check(g_weight_g);
// 净重计算
g_net_g = g_weight_g - g_tare_g;
if(g_net_g < 0) g_net_g = 0;
// 计价计算(超重时可选择停止计价)
if(!g_alarm_over) Money_Calc();
else g_money_fen = 0;
// 超重判断
Over_Check();
}
// 3) LCD刷新(200ms)
if(now - lcd_timer >= 200)
{
lcd_timer = now;
LCD_Show(g_weight_g, g_net_g, g_price_fen_per_kg, g_money_fen,
g_stable, (g_tare_g > 0), g_alarm_over);
}
// 4) 报警任务
Alarm_Task();
}
-
程序设计关键点与工程优化建议
7.1 称重稳定性来自"硬件+软件"双重保证
HX711虽然分辨率高,但称重稳定性仍依赖:
- 机械结构稳固,避免秤盘晃动
- 传感器固定可靠,避免受力偏心
- 电源干净,减少噪声
- 软件滤波合理,多次采样平均与滑动滤波抑制抖动
若任何一环不足,都会导致读数跳动,从而影响去皮和计价准确性。
7.2 去皮必须结合稳定判定与防负值处理
去皮时必须保证重量稳定,否则皮重记录会出现误差,导致净重不准。并且在去皮后拿走物体会出现负净重,需要强制显示0或提示清零。
7.3 计价运算建议采用定点,避免浮点误差与性能损耗
许多51单片机不具备硬件浮点运算能力,浮点计算会降低刷新速度并导致显示卡顿。采用"分/kg + g → 分"的定点方式不仅快,而且能保证金额两位小数精确无误,更符合交易场景要求。
7.4 超重报警要设计回差与强提示,保护传感器寿命
超重报警不仅是提醒,更是保护传感器与机械结构。通过回差避免报警抖动,通过蜂鸣频率与LCD提示强化警示,可以有效降低用户继续加重的概率,延长设备寿命。
7.5 标定与零点跟踪决定实际精度
标定系数与零点若不正确,所有重量都会偏差。工程上建议:
- 出厂标定:使用标准砝码生成scale并存储
- 使用中零点跟踪:在空载且稳定时自动微调raw0,抵消温漂与传感器漂移
- 避免在有物体时执行零点跟踪,否则会产生严重误差
7.6 可扩展功能建议
- 单价数字输入(矩阵键盘)并支持小数点输入
- 单价记忆与快捷键(常用商品)
- 打印小票或串口输出交易数据
- 过载保护:超重时自动锁定采样并提示卸载
- 低电压检测:电池供电时提示低电并限制称重精度
-
系统总结
本设计实现了一套基于单片机的去皮计价与超重报警电子秤系统。系统采用HX711高精度称重采集芯片和0~10kg量程称重传感器,实现稳定准确的重量测量;通过去皮操作可在称量前或称量过程中消除容器重量,直接得到净重;通过按键输入商品单价,系统自动完成金额计算并实时显示;采用汉字液晶显示屏清晰显示重量、单价、金额及系统状态;当重量超过设定上限时立即启动声光报警,有效防止超限称量并保护硬件。
在电路设计方面,系统模块化划分清晰,重点强化HX711采样电源稳定性与抗干扰措施,保证称重精度;在程序设计方面,通过多次采样平均、稳定判定、去皮逻辑、定点计价计算与回差报警策略,实现准确可靠的称重与计价功能。该设计功能完整、实用性强,既适合作为单片机课程设计项目,也可作为小型商业计价秤的基础方案进一步产品化升级。