一.硬件方案
本设计利用压力传感器采集因压力变化产生的电压信号,经过电压放大电路放大,然后再经过模数转换器转换为数字信号,最后把数字信号送入单片机。单片机经过相应的处理后,得出当前所称物品的重量及总额,然后再显示出来。此外,还可通过键盘设定所称物品的价格。。
电路主要由51单片机(STC89C51/52、AT89C51/52均可使用)+LCD12864液晶显示屏+HX711AD转换模块+LED指示灯+蜂鸣器电路+矩阵按键+10kg压力传感器等;
二.设计功能
(1)可以输出量程为10kg物体的重量,精度为0.001kg;
(2)可通过按键设置单价,并根据实际重量计算出总价;
(3)支持去皮功能、切换量程等功能,输出的重量和总额采用四舍五入;
(4)采用LCD12864显示屏,支持中文显示;
三.设计原理图
(1)原理图主要采用AD软件进行设计,如图:
(2)PCB图如下:
四.软件设计
主程序源码
void main()
{
INT_8 j = 0, k = 0, count = 0;
UINT_8 Key = 0, Num = 0; //Key存储按键的键值,Num存储按下的是那个数字
UINT_32 tmp = 0;
Init();
while (1)
{
WDT_FeedDog(); //喂狗
if (KeycanFlag == 0) //价格还没输入时可以显示(防止价格输入一半DDRAM地址改变,造成价格不可连续输入)
{
if (TimeCount >= 50) //定时时间超过250ms执行AD采集
{
// Offset = AD_Hx711(); //8527820-8475960 =51860
// Display_Int2str(Offset, WeightTable, 0x93);
WeightTemp = AD_Weight(AD_Hx711()); //把AD值转化为以克为单位的质量(含小数)
if (WeightTemp > 4000) //超出量程4000g报警
{
for (k = 0; k < 4; k++)
{
LcdDdram_Display(1,3,table5); //输出错误字符串
}
Beep = 0; //蜂鸣器鸣叫
Led = 0; //Led亮
}
else
{
Beep = 1; //重量少于最大量程关闭蜂鸣器
Led = 1;
tmp = (UINT_32)(WeightTemp); // tmp = (UINT_32)(WeightTemp + 0.5); //将质量四舍五入,例如1000.50 》1001
if(RangeFlag == 0) //量程单位为g
{
Init_Weighttab(WeightTable,table6); //初始化字符数组为空格,防止上次字符位数比这次大,没有清除
k = 0; //例如上次显示1234,这次12,残留34
Weight = tmp; //中间质量变量赋给质量
while (tmp != 0)
{
WeightTable[k++] = 0x30 + tmp % 10; //提取十进制最后一位转换为字符
tmp /= 10;
}
if (k == 0) //质量为0时
{
WeightTable[k++] = '0';
}
Write_Cmd(0x93);
count = k;
while (k > 0)
{
Write_Data(WeightTable[k-1]); //质量倒序输出,因为之前是倒序输入,高位地址为高位,由高位到低位
k--;
}
for (k = count; k < 5; k++ ) //把上次残留的字符清掉
{
Write_Data(WeightTable[k]);
}
}
else
{
Init_Weighttab(WeightTable,table8); //清空字符串数组
k = 0;
Weight = tmp / 1000.0; //质量/g 1000 = /kg
while (tmp != 0)
{
WeightTable[k++] = 0x30 + tmp % 10;
tmp /= 10;
if (k == 3) //i=3时就是获得3位小数时插入小数点
{
WeightTable[k] = '.';
k += 1;
}
}
if (k == 4) //刚好3个小数补0 0.123
{
WeightTable[k] = '0';
k++; //和上面统一,k比实际大1,下面再减回
}
if (k < 3) //当不够两位小数时,例如1实际代表的是0.01
{
WeightTable[4] = 0x30; //在最高位插入0
WeightTable[3] = '.'; //在最次高位插入.
for (j = k; j < 3; j++)
{
WeightTable[j] = 0x30; //如果只有0位时插入一个插入两个0 0.00
} //如果只有1位时插入一个插入1个0 0.0
k = 5; //0.001刚好5个数
}
Write_Cmd(0x93); //重定位液晶DDRAM地址
while (k > 0)
{
Write_Data(WeightTable[k-1]); //总额结算,倒序输出,因为之前是倒序输入,高位地址为高位
k--;
}
}
}
TimeCount = 0;
Write_Cmd(0x8b); //显示完体重就定位价格显示地址
}
}
}
}
资料链接:https://pan.baidu.com/s/1t9dsUnf_ShlmLXLgaFJHWg?pwd=u945