链接:https://pan.baidu.com/s/1nOp1s-aPYyI7ICohP5KioA
提取码:5ufb
系统的功能分析
本设计由STC89C52单片机电路+LCD1602液晶显示电路+HX711称重传感器电路+蜂鸣器报警电路+按键电路+电源电路组成。
1、LCD602液晶实时显示重量和设置阈值。
1、按键可以设置报警阈值,阈值范围0-5000g,实际重量高于阈值报警,否则不报警。
2、称重传感器量程:0-5KG即0-5000g。
3、设置阈值具有eeprom存储功能,即掉电不丢失数据。
方案图:
原理图:
5V电源电路设计
本系统选择5V直流电源作为系统总电源,为整个系统供电,电路简单、稳定。DC为电源的DC插座,可以直接接USB电源线,一端插在DC插座上,另外一端可以插在5V电源上,如电脑USB、充电宝、手机充电器等等。LED为红色LED灯,作为系统是否有点的指示灯,电阻为1K电阻,起到限流作用,保护LED灯,以防电流过大烧坏LED灯。SW为自锁开关,开关按下后,红灯亮,此时系统电源5V直流输出。开关再次按下后,红灯灭,此时系统电源无5V电源输出。
5Kg称重传感器模块电路设计
称重传感器实际上是一种将质量信号转变为可测量的电信号输出的装置。用传感器应先要考虑传感器所处的实际工作环境,这点对正确选用称重传感器至关重要,它关系到传感器能否正常工作以及它的安全和使用寿命,乃至整个衡器的可靠性和安全性。称重传感器按转换方法分为光电式、液压式、电磁力式、电容式、磁极变形式、振动式、陀螺仪式、电阻应变式等8类,以电阻应变式使用最广。本系统使用的传感器为YZC-133悬臂梁5KG的电阻应变式称重传感器,其利用电阻应变片变形时其电阻也随之改变的原理工作。主要由弹性元件、电阻应变片、测量电路和传输电缆4部分组成。它的特点是: 精度高、易加工、结构简单紧凑、抗偏载能力强、固有频率高。
一、模块参数
(1)传感器尺寸:80x12.7x12.7mm
(2)量程:5kg
二、称重传感器的工作原理
应变式力传感器的受力工作原理如下图所示。
将应变片粘贴到受力的力敏型弹性元件上, 当弹性元件受力产生变形时,应变片产生相应的应变, 转化成电阻变化。如下图所示。将应变片接成如下图所示的电桥,力引起的电阻变化将转换为测量电路的电压变化,通过测量输出电压的数值, 再通过换算即可得到所测量物体的重量。
HX711称重传感器专用24位精度AD模块电路设计
HX711是一款专为高精度称重传感器而设计的24位A/D转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。降低了电子秤的整机成本,提高了整机的性能和可靠性。该芯片与后端MCU芯片的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道A或通道B,与其内部的低噪声可编程放大器相连。通道A的可编程增益为128或64,对应的满额度差分输入信号幅值分别为±20mV或±40mV。通道B则为固定的32增益,用于系统参数检测。芯片内提供的稳压电源可以直接向外部传感器和芯片内的A/D转换器提供电源,系统板上无需另外的模拟电源。芯片内的时钟振荡器不需要任何外接器件。上电自动复位功能简化了开机的初始化过程。
一般在使用中,HX711主要是将称重传感器产生的模拟信号转化成高精度的数字信号给单片机处理。
一、模块参数
(1)两路可选择差分输入
(2)片内低噪声可编程放大器,可选增益为64 和128
(3)片内稳压电路可直接向外部传感器和芯片内A/D 转换器提供电源
(4)片内时钟振荡器无需任何外接器件,必要时也可使用外接晶振或时钟
(5)上电自动复位电路
(6)简单的数字控制和串口通讯:所有控制由管脚输入,芯片内寄存器无需编程
(7)可选择10Hz 或80Hz 的输出数据速率
(8)同步抑制50Hz 和60Hz 的电源干扰
(9)耗电量(含稳压电源电路):典型工作电流:<1.7mA, 断电电流:<1μA
(10)工作电压范围:2.6 ~ 5.5V
(11)工作温度范围:-20 ~ +85℃
二、HX711模块接口说明图
输入端
(1)E+ 接称重传感器红色信号线
(2)E- 接称重传感器黑色信号线
(3)A- 接称重传感器白色信号线
(4)A+ 接称重传感器绿色信号线
输出端
(1)GND 接GND
(2)DT 接单片机引脚
(3)SCK 接单片机引脚
(4)VCC 接5V
模块接口原理图如下图所示。
系统软件设计
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#include "1602.h"
#include "delay.h"
#include "hx711.h"
#include "eeprom.h"
sbit key1 =P2^0; //引脚定义
sbit key2 =P2^1;
sbit buzzer =P2^2;
xdata char dis0[16]; // 显示暂存 用于第一行显示
xdata char dis1[16]; // 显示暂存 用于第二行显示
xdata unsigned long time_20ms=0; // 系统定时计数
unsigned char ReadFlag=0; //读取标志
xdata long Weight_mp=0; //毛重
xdata long Weight_Shiwu=0; //实物重量
xdata unsigned long Weight_Maopi=0; //读取初始化值
bit rekey =0; //按键防止重复
unsigned int setdata = 1000 ; //设置值
void Init_Timer0(void);//函数声明
void keydeal(void); //按键检测及处理函数
unsigned char initFlagData; //初始化数据存读取
/******************把数据保存到单片机内部eepom中******************/
void write_eeprom()
{
SectorErase(0x2000); //擦除整个扇区 注意整个扇区数据都擦出了
byte_write(0x2000, setdata % 256); //重新写入值
byte_write(0x2001, setdata / 256);
byte_write(0x2055, initFlagData);
}
/******************把数据从单片机内部eepom中读出来*****************/
void read_eeprom()
{
setdata = byte_read(0x2001); //读取高字节
setdata <<= 8;
setdata |= byte_read(0x2000); //读取低字节 并合并
initFlagData = byte_read(0x2055); //数据初始化读取
}
/**************开机初始化保存的数据*****************/
void init_eeprom(void)
{
read_eeprom(); //先读
if(initFlagData != 0x55) //新的单片机初始单片机内问eeprom 如果不是0x55重新写入
{
setdata = 1000; //初始化参数
initFlagData = 0x55; //修改值
write_eeprom(); //保存数据
}
}
void main (void)
{
Init_Timer0(); //定时器0初始化
DelayMs(20); //延时有助于稳定
LcdReset(); //LCD1602初始化
DelayMs(10);
LcdClear();
sprintf(dis0,"Welcome ! ");//更新显示
DispStr(0,0,(unsigned char *)dis0);//打印显示
DelayMs(200); //延时有助于稳定
DelayMs(200); //延时有助于稳定
Weight_Maopi = HX711_Read(); //读取去皮重量
DelayMs(10);
Weight_Maopi = HX711_Read();
Weight_mp = (unsigned int)((float)Weight_Maopi/430); //皮重计算
init_eeprom();//初始化存储的数据
while (1) //主循环
{
keydeal(); //按键检测及处理函数
if(ReadFlag==1)
{
ReadFlag=0;
Weight_Shiwu = HX711_Read(); //读取实物重量
Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //获取净重
if(Weight_Shiwu > 4300) //过滤错误
{
Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/430); //g计算实物的实际重量
}
else
{ Weight_Shiwu = 0;}
sprintf(dis0,"Now:%5dg",(int)Weight_Shiwu);//显示第一行
DispStr(0,0,(unsigned char *)dis0);//打印显示
sprintf(dis1,"Set:%5dg",(int)setdata);//显示第一行
DispStr(0,1,(unsigned char *)dis1);//打印显示
if(Weight_Shiwu>setdata) //实际重量大于设置值
{buzzer=0;} //打开蜂鸣器
else
{buzzer=1;} //关闭蜂鸣器
}
}
}
.
.