基于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  |
                     |  放大模块|
                     +---------+
                           |
                     +-----|-----+
                     |  传感器  |
                     |  模块    |
                     +----------+
posted @ 2025-12-05 16:14  lingxingqi  阅读(0)  评论(0)    收藏  举报