基于STC89C52单片机的电子秤系统设计
一、系统架构
1. 硬件组成框图
STC89C52单片机
├─ P1.0-P1.3 → 4×4矩阵键盘
├─ P0口 → LCD1602数据总线
├─ P3.0(RXD) → MAX232串口通信
├─ P3.1(TXD)
├─ P2.0 → HX711_SCK
├─ P2.1 → HX711_DOUT
├─ P2.2 → 蜂鸣器驱动
├─ P2.3 → A/D转换启动
└─ 电源模块 → 5V稳压供电
2. 核心模块选型
| 模块 | 型号/参数 | 功能说明 |
|---|---|---|
| 压力传感器 | BLR-10KG(量程0-10kg) | 应变式传感器,输出0-50mV信号 |
| 放大模块 | HX711(增益128倍) | 24位Σ-Δ ADC,含自动增益校准 |
| 显示模块 | LCD1602 | 实时显示重量(单位:g/kg) |
| 电源模块 | LM7805+AMS1117 | 双路稳压(5V/3.3V) |
| 存储模块 | AT24C02 EEPROM | 掉电保存校准参数 |
二、硬件电路
1. 传感器信号调理电路
传感器输出 → 仪表放大器(AD620) → 0.1μF隔直电容 → HX711_CHA
│
└─ 10kΩ电位器 → HX711_GAIN(增益调节)
2. 关键电路参数
- ADC采样率:10Hz(满足静态称重需求)
- 电源滤波:0.1μF陶瓷电容 + 10μF电解电容并联
- 信号隔离:光耦TLP521-4隔离数字/模拟地
三、软件系统设计
1. 主程序流程图

2. 核心代码实现
// HX711驱动代码
#define HX711_SCK P2^0
#define HX711_DOUT P2^1
long HX711_Read() {
unsigned char i;
long count=0;
HX711_SCK=0; HX711_DOUT=1; // 释放数据线
while(HX711_DOUT); // 等待DOUT置低
for(i=0;i<24;i++) {
HX711_SCK=1; count<<=1;
HX711_SCK=0; if(HX711_DOUT) count++;
}
HX711_SCK=1; count^=0x800000; // 添加符号位
HX711_SCK=0;
return count;
}
// 重量计算函数
float Get_Weight() {
long raw = HX711_Read();
float voltage = (raw * 4.096) / 8388608; // 24位ADC转换
return (voltage / 0.05) * 1000; // 转换为克(假设灵敏度50mV/kg)
}
// LCD显示驱动
void LCD_Display(float weight) {
lcd_clr();
sprintf(buf, "Wt:%.1f g", weight);
lcd_set_cursor(0,0);
lcd_write_string(buf);
sprintf(buf, "Unit:%s", unit_flag?"kg":"g");
lcd_set_cursor(0,1);
lcd_write_string(buf);
}
四、关键算法
1. 数字滤波算法
#define BUFFER_SIZE 10
static float adc_buf[BUFFER_SIZE](@ref)= {0};
static uint8_t index = 0;
float Filter_ADC() {
adc_buf[index++] = Get_RawValue();
if(index >= BUFFER_SIZE) index = 0;
float sum = 0;
for(uint8_t i=0; i<BUFFER_SIZE; i++) sum += adc_buf[i](@ref);
return sum / BUFFER_SIZE;
}
2. 校准算法
// 校准参数结构体
typedef struct {
float zero_offset; // 零点偏移
float scale_factor; // 比例系数
} Calibration;
// 两点校准法
void Calibrate(Calibration *cal, float m1, float w1, float m2, float w2) {
cal->zero_offset = (m1*w2 - m2*w1)/(w2 - w1);
cal->scale_factor = (w2 - w1)/(m2 - m1);
}
// 重量计算
float Calc_Weight(float raw) {
return (raw - cal.zero_offset) * cal.scale_factor;
}
五、系统功能实现
1. 基本功能
- 动态称重:实时刷新显示(1Hz更新率)
- 去皮功能:长按"-"键3秒清零
- 单位切换:kg/g切换(通过*键)
- 超载报警:>10kg触发蜂鸣器(持续鸣叫)
2. 扩展功能
- 数据存储:EEPROM保存校准参数(AT24C02)
- 串口通信:RS232输出称重数据(波特率9600)
- 低功耗模式:空闲时关闭HX711时钟(电流<1mA)
参考代码 基于89c52单片机开发的一种通过检测压力传感器来称重的电子称,含原理图 www.youwenfan.com/contentcnm/72163.html
六、完整工程结构
├── Src/
│ ├── main.c // 主程序入口
│ ├── sensor.c // 传感器驱动
│ ├── lcd.c // LCD1602驱动
│ └── eeprom.c // EEPROM操作
├── Inc/
│ ├── defines.h // 宏定义
│ ├── types.h // 数据类型
│ └── constants.h // 系统常量
├── Project/
│ ├── STC89C52.cmd // 链接脚本
│ └── vectors.asm // 中断向量表
└── Debug/
├── calibration.log // 校准记录
└── waveform.csv // 原始数据记录
七、参考电路图
+-------------------+
| |
| STC89C52 |
| |
+5V -----------|VCC |
GND -----------|GND |
P1.0-P1.3 ---->|矩阵键盘 |
P0.0-P0.7 ---->|LCD1602数据总线 |
P2.0 -------->|HX711_SCK |
P2.1 <-------|HX711_DOUT |
P2.2 -------->|蜂鸣器驱动 |
P3.0 <-------|MAX232_RX |
P3.1 >-------|MAX232_TX |
| |
+-----|-----+ |
| HX711 |
| 放大模块|
+---------+
|
+-----|-----+
| 传感器 |
| 模块 |
+----------+

浙公网安备 33010602011771号