高校教材征订管理系统设计与实现:Spring Boot + Vue3 全栈实践
2026/10/4 14:35:15
在菜市场、超市甚至家庭厨房里,电子秤早已成为不可或缺的计量工具。传统机械秤存在读数模糊、易作弊等问题,而市面上的低端电子秤又常有漂移误差。这次我们要用成本不到50元的51单片机搭配24位高精度HX711模块,打造一个分度值达1g的实用电子秤。
这个项目最吸引我的地方在于:它完美结合了模拟信号处理(传感器)和数字控制(单片机)两大技术领域。实测下来,系统在0-5kg量程内误差能控制在±2g以内,完全满足日常使用需求。下面我就从硬件选型开始,带你一步步实现这个既有趣又实用的DIY项目。
常见的电阻应变式压力传感器内部其实是个惠斯通电桥。当金属弹性体受力变形时,粘贴在上面的应变片电阻值会发生变化。我选用的是5kg量程的铝合金传感器,价格约15元,其关键参数如下:
| 参数 | 数值 | 说明 |
|---|---|---|
| 额定负载 | 5kg | 最大承重 |
| 灵敏度 | 1.0mV/V | 每伏激励电压对应输出毫伏 |
| 非线性误差 | ±0.03%F.S. | 满量程误差 |
| 工作温度 | -10~+40℃ |
注意:传感器需要配合弹性支架使用,我直接用了废光盘做托盘支架,既省钱又够结实。
相比传统的ADC0804,HX711有三大优势:
接线时特别注意:HX711的DT引脚接P3.2,SCK接P3.3,这样可以利用51单片机的外部中断提高采样效率。
为了让显示更稳定,我做了这些改进:
// LCD初始化代码示例 void LCD_Init() { DelayMs(15); Write_Cmd(0x38); // 8位数据接口,两行显示 Write_Cmd(0x0C); // 开显示,不显示光标 Write_Cmd(0x06); // 写入后地址指针自动加1 Write_Cmd(0x01); // 清屏 }最初我用7805稳压芯片,发现传感器输出有10mV左右的波动。后来改用AMS1117-5.0后,纹波降到了2mV以内。建议布局时:
4x4矩阵键盘采用状态机扫描法,相比传统的延时消抖更可靠:
uint8_t Key_Scan() { static uint8_t key_state = 0; uint8_t key_val = 0xFF; switch(key_state) { case 0: // 检测按键按下 if((P3 & 0xF0) != 0xF0) { DelayMs(10); key_state = 1; } break; case 1: // 确认按键值 key_val = Get_KeyVal(); if(key_val != 0xFF) { key_state = 2; return key_val; } break; case 2: // 等待释放 if((P3 & 0xF0) == 0xF0) { key_state = 0; } break; } return 0xFF; }float Get_Weight() { long adc_val = HX711_Read(); // 校准公式:Weight = (AD - AD0) * K return (adc_val - calib.ad_zero) * calib.scale_factor; }通过分时刷新技术,在保持显示流畅的同时降低CPU占用:
void Display_Update() { static uint8_t disp_state = 0; switch(disp_state) { case 0: Show_Weight(current_weight); break; case 1: Show_Price(unit_price); break; case 2: Show_Total(current_weight * unit_price); break; } disp_state = (disp_state + 1) % 3; }| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 显示值跳变 | 电源不稳或接地不良 | 检查滤波电容,改进接地 |
| 重量显示为0 | HX711时序错误 | 用逻辑分析仪检查SCK脉冲宽度 |
| 按键响应迟钝 | 消抖时间过长 | 调整状态机检测时间 |
| 超量程不报警 | 比较阈值设置错误 | 在代码中修正MAX_WEIGHT值 |
#define FILTER_LEN 10 long HX711_Filter() { static long buf[FILTER_LEN]; static uint8_t index = 0; long sum = 0; buf[index++] = HX711_Read(); if(index >= FILTER_LEN) index = 0; for(uint8_t i=0; i<FILTER_LEN; i++) { sum += buf[i]; } return sum / FILTER_LEN; }完成基础版后,可以尝试这些升级:
最后提醒:焊接HX711时建议使用热风枪,普通烙铁容易因静电损坏芯片。我在第一批制作时就因操作不当烧毁了3个模块,后来改用温度可控的焊台才解决问题。