历史上的今天
今天是:2024年10月08日(星期二)
2021年10月08日 | 基于51单片机的电子秤设计-LCD12864
2021-10-08 来源:eefocus
一.硬件方案
本设计利用压力传感器采集因压力变化产生的电压信号,经过电压放大电路放大,然后再经过模数转换器转换为数字信号,最后把数字信号送入单片机。单片机经过相应的处理后,得出当前所称物品的重量及总额,然后再显示出来。此外,还可通过键盘设定所称物品的价格。
主要由51单片机(STC89C51/52、AT89C51/52均可使用)+LCD12864液晶显示屏+HX711AD转换模块+LED指示灯+蜂鸣器电路+矩阵按键+10kg压力传感器等;如图:

二.设计功能
(1)可以输出量程为10kg物体的重量,精度为0.001kg;
(2)可通过按键设置单价,并根据实际重量计算出总价;
(3)支持去皮功能、切换量程等功能,输出的重量和总额采用四舍五入;
(4)采用LCD12864显示屏,支持中文显示;
三.设计原理图
(1)原理图主要采用AD软件进行设计,如图:

(2)PCB图如下:

四.软件设计
(1)程序流程图

(2)主程序源码
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); //显示完体重就定位价格显示地址
}
}
}
}
上一篇:基于51单片机的智能雨刷设计
下一篇:基于51单片机自动售货机设计
史海拾趣
|
PS:本文转自 飞凌嵌入式技术交流群 这个是由群里一些工程师朋友做的小实验,可以作为参考。 嵌入式Linux简单路由实验 本实验所用硬件平台为飞凌(www.witech.com.cn)TE2440V2型开发板;该开发板上有两个网卡芯片,分别为C ...… 查看全部问答> |
|
关于WINCE6.0 VS2005 “go to definition ”功能 无法定位相关内容 关于WINCE6.0 VS2005 “go to definition ”功能 无法定位相关内容 大家好!向大家请教一个问题: 我现在装了VS2005 打开mini2440的BSP包(缺省内核工程),可以编译内核通过。 我想用go to definition 功能跟踪一下程序,比如定位一个函数或 ...… 查看全部问答> |
|
请问大家-有没有从事过在自己的软件中嵌入摄像头功能,就是自己的软件能够同过手机的摄像头照相,并且存储,而不是用手机自带的照相机。 有这方面的书也可以,大家介绍下吧,急用。 … 查看全部问答> |
|
EVC3.0+PPC202程序编译出错,关于StdAfx.sbr Compiling resources... Compiling... Error spawning clarm.exe Creating browse info file... BSCMAKE: error BK1506 : cannot open file \'.\\ARMRel\\StdAfx.sbr\': No such file or directory Error executing bscmake.exe. Main.exe - ...… 查看全部问答> |
|
可以连上,必须把JTAG口RST脚上的电容拿掉,但又碰到了新问题:在线仿真5438时速度极慢,下载操作需1分钟左右,执行一个单步需十几秒,执行一次复位需半分钟,运算结果倒是正确的。iar是4.20.1版,操作系统是vista,仿真器是USB型的LSD-FET430UIF, ...… 查看全部问答> |
|
急求助:Linux无法从NFlash(K9F1208U0A)启动 自己开了一个ARM架构板, CPU: S5PC100, SDRAM: K4T1G164QQ(两颗),Nand flash: K9F1208U0A。现在系统能从SD卡启动,对FLASH擦除操作后返回OK,但将SD卡取后,从FLASH启动串口不出现任何信息。有没有人知道是哪里出了问题,急求大家的帮助,不甚 ...… 查看全部问答> |




