HX711模块称重51单片机电子秤称重压力检测阈值报警仪系统 源码+原理图仿真(文件,文件,文件) 本系统由STC89C52单片机、LCD1602液晶显示、HX711称重传感器、 蜂鸣器报警、按键及电源组成。 1、LCD602液晶实时显示重量和设置阈值。 2、按键可以设置报警阈值,阈值范围0-5000g,实际重量高于阈值 报警,否则不报警。 3、称重传感器量程:0-5KG即0-5000g。 4、设置阈值具有eeprom存储功能,即掉电不丢失数据。 注意:称重/压力传感器上电时,保持没有重物,去皮功能。

刚搞完这个51单片机电子秤项目,手头还有点余温,直接上干货。这系统核心就三块:HX711称重、阈值报警和掉电存储。咱们从硬件连线开始捋,别急着敲代码,硬件不对啥都白搭。

传感器接法要注意,HX711的DT脚接P3^2,SCK接P3^3。为啥选这俩引脚?51的INT0中断刚好在P3^2,采集数据时用查询方式更方便。上电前切记空载,这是去皮的关键,代码里得体现:

void HX711_Tare(void)
{
    unsigned long sum = 0;
    for(uint8_t i=0;i<10;i++)  //取10次平均值
    {
        sum += HX711_Read();
    }
    offset = sum / 10;  //去皮基准值
}

这个函数在初始化时调用,把空载时的AD值存到offset变量。后面每次读数都要减去这个基准,相当于电子秤的归零操作。

阈值设置用三个按键:设置键、加、减。这里有个坑,按键防抖必须做,不然数值跳得你怀疑人生。看这段状态机实现:

if(KeySet_Press)  //设置键按下
{
    __asm__("nop");  //空指令做延时
    if(KeySet_Press)
    {
        setting_mode = !setting_mode;  //切换设置模式
        BEEP = 0;  //蜂鸣器短响
        delay_ms(50);
        BEEP = 1;
        while(KeySet_Press);  //等待松手
    }
}

用while卡住直到松手,实测比延时更靠谱。设置好的阈值要存EEPROM,STC89C52自带Flash模拟EEPROM,注意写之前先擦除扇区:

void Save_Threshold(uint16_t val)
{
    IAP_CONTR = 0x80;  //使能ISP
    IAP_CMD = 0x03;    //擦除模式
    IAP_ADDRH = 0x80;  //扇区地址
    IAP_ADDRL = 0x00;
    IAP_Trigger();
    _nop_();
    
    IAP_CMD = 0x02;    //写模式
    IAP_DATA = val>>8; //存高字节
    IAP_Trigger();
    IAP_DATA = val&0xFF;//存低字节
    IAP_Trigger();
    IAP_Disable();     //关闭ISP
}

这里有个细节,STC的EEPROM操作需要严格按照时序,每次操作后都要Disable,否则可能锁死芯片。

报警逻辑简单粗暴,主循环里加个判断:

if(real_weight > threshold && threshold!=0)
{
    BEEP = 0;   //持续报警
    LED = 0;    //指示灯亮
}
else
{
    BEEP = 1;   //关闭报警
    LED = 1;
}

注意threshold=0时相当于关闭报警功能,这个细节很多新手会漏掉。

HX711模块称重51单片机电子秤称重压力检测阈值报警仪系统 源码+原理图仿真(文件,文件,文件) 本系统由STC89C52单片机、LCD1602液晶显示、HX711称重传感器、 蜂鸣器报警、按键及电源组成。 1、LCD602液晶实时显示重量和设置阈值。 2、按键可以设置报警阈值,阈值范围0-5000g,实际重量高于阈值 报警,否则不报警。 3、称重传感器量程:0-5KG即0-5000g。 4、设置阈值具有eeprom存储功能,即掉电不丢失数据。 注意:称重/压力传感器上电时,保持没有重物,去皮功能。

显示部分用LCD1602,第一行显示实时重量,第二行显示阈值。重量显示要转成字符串处理,别直接怼数值到液晶:

sprintf(display_buf,"Weight:%05d g",real_weight);
LCD_Write_String(0,0,display_buf);

用%05d固定5位显示,避免数值跳动时字符位置乱窜。实测这样显示稳定很多。

最后说校准,这是项目的灵魂。准备标准砝码,比如500g、1kg的,通过修改校准系数:

float calibration_factor = 106600.0;  //这个值需要实测调整
real_weight = (HX711_Read()-offset)/calibration_factor;

不同传感器的系数可能差个数量级,建议先用串口输出原始AD值,再计算系数。别相信商家给的标称值,自己测才准。

掉电存储实测时发现个坑:频繁写入会导致Flash寿命缩短。解决方法是在设置阈值时加个3秒延时,只有数值稳定超过3秒才存储,避免误操作损耗。

整个项目最费时间的不是代码,是结构装配。传感器要悬空固定,单片机板得和秤盘物理隔离,不然你会看到重量值自己在那儿蹦迪。用3D打印了个支架,效果比洞洞板好太多。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐