其他分享
首页 > 其他分享> > 基于STC89C52单片机的硬币电子秤——2020科创杯

基于STC89C52单片机的硬币电子秤——2020科创杯

作者:互联网

人生实苦,要和甜的人在一起~要多笑一笑哦,不管遇到什么困难,都不要愁眉苦脸,因为你不知道谁会爱上你的笑容嘻嘻嘻

emmm之所以说这句话是因为这次的比赛我们队差一分拿奖,着实遗憾,不过这也凸显出我平常一个不好的习惯,就是完成了就觉得自己做得很好了(其实真的很菜),没有细致地思考还有哪些地方可以做得更好,我还有一个坏毛病,就是总希望赶紧把这个做完,时间赶紧过去,而没有把重点放在自己是否学到了知识上~吸取教训,继续加油!

文章目录

Q1:什么是硬币电子秤?

A1:你觉得呢
在这里插入图片描述
首先它要是一个电子秤,一个普通的电子秤具有的功能有:称重、显示重量,而本文所说的硬币电子秤是专为硬币设计的,它不仅可以显示硬币的总重量,还可以显示硬币面值以及硬币个数,所以会多了个按键部分的操作哦!

Q2:硬币电子秤实现的思路是什么?

A2:从我们要实现的功能入手,思考需要用到什么模块
在这里插入图片描述

首先它要具有称重功能,就必须要有称重传感器,其次要有显示功能,可以用LCD或者数码管显示,具体的思路如下:
在这里插入图片描述
本系统的设计主要从硬件电路设计,软件编程调试,实物焊接调试三部分进行详细阐述。硬件电路主要是基于单片机STC89C52为核心的控制单元实现数据的处理,采用压力传感器对数据进行采集,电子秤专用24位AD转换芯片HX711对传感器采集到的模拟量进行AD转换,转换后的数据送到单片机进行处理显示,数据显示由LCD1602液晶实现。其中显示部分还包含了重要的按键部分,本文通过按键来设置硬币的面值和单个重量,并将通过压力传感器得到的数值进行各部分模块的处理后得到的总重量除以通过按键设置的硬币面值,即可得到硬币的数量及其面值,在LCD1602上显示硬币的总重量、硬币的个数以及面值。

Q3:为啥我们选了STC89C52而不是STC89C51?

在这里插入图片描述

A3:在控制器的选择上,我们选择了STC89C52而不是STC89C51:

52是51基础上衍生出来的增强产品,事实上52内核现在是实际应用的主流。

主要差别在于

——内部ROM增加了4K,总计8K,相应的如果外扩程序存储器,则从2000H开始从外部取指。
——增加了128字节的内部RAM,地址从80H到FFH。使用时这128字节地址因为与特殊功能寄存器地址重叠,所以只能采用间接寻址的方式读写。
——增加了定时器2,而且该定时器也可用作波特率发生器,具备16位自动重装载和捕获能力。
——相应的增加了定时器2中断。
——增加了有关定时器2的特殊功能寄存器T2MOD、T2CON、RCAP2L、RCAP2H、TH2、TL2等,还有诸如T2、ET2等控制位 其它方面均与51一致。

Q4:为啥我们选择了LCD1602而不是数码管?

A4:
在这里插入图片描述

方案一:采用LED数码管,价格适中,要显示比较多的数字时数码管的使用必然会增多,连线方面会很麻烦,编程上也会相应的复杂。考虑到效率的因素不采用该方案。

方案二:采用点阵式数码管,它由8行8列发光二级管组成,在很多场合可以看到这种显示方式。以点阵式来显示文字有优势,但显示数字存在一定的劣势,既不够直观也会显得有点浪费。本设计需要显示硬币的重量和数量,都是数字,综合考虑各种因素排除这种方案。

方案三:采用LCD1602液晶显示屏,液晶显示屏显示的功能强大,可显示大量文字,图形,显示多样,清晰可见,可以显示32个字符。

综上所述,LCD1602是本设计的驱动显示模块的最佳选择。

Q5:为啥我们选择了HX711而不是普通AD芯片?

A5:
在这里插入图片描述

方案一:普通AD芯片无信号放大功能。若采用此芯片,还需要在压力传感器与AD模数转换中间加上信号放大处理,考虑到效率和精度的因素不采用该方案。

方案二:HX711是一款专为高精度电子秤而设计的24位A/D转换器芯片,与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。降低了电子秤的整机成本,提高了整机的性能和可靠性。该芯片与后端MCU 芯片的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道A 或通道B,与其内部的低噪声可编程放大器相连。通道A 的可编程增益为128 或64,对应的满额度差分输入信号幅值分别为±20mV或±40mV。通道B 则为固定的64 增益,用于系统参数检测。芯片内提供的稳压电源可以直接向外部传感器和芯片内的A/D 转换器提供电源,系统板上无需另外的模拟电源。芯片内的时钟振荡器不需要任何外接器件。上电自动复位功能简化了开机的初始化过程。

Q6:参数计算???

A6:
在这里插入图片描述

——压力传感器的电压和重力的转换关系:
满量程输出电压=激励电压*灵敏度 1.0mv/v
例如:供电电压是 5v 乘以灵敏度 1.0mv/v=满量程 5mv。
相当于有 5Kg 重力产生时候产生 5mV 的电压。

——HX711模块的供电电压的计算:
HX711 模块 A 通道带有 128 倍信号增益,可以将 5mV 的电压放大 128 倍,然后采样输 出 24bit AD 转换的值,单片机通过指定时序将 24bit 数据读出。 HX711 可以在产生 VAVDD 和 AGND 电压,即 HX711 模块上的 E+和 E-电压。 该电压通过 VAVDD=VBG(R1 +R2 )/R2 计算。
VBG 为模块儿基准电压 1.25v,且R1 = 20K,R2 = 8.2K ,因此得出 VAVDD = 4.3V
(为了降低功耗,该电压只在采样时刻才有输出,因此用万用表读取的值可能低于 4.3v,因为万用表测量的是有效值。)
在这里插入图片描述

——将AD值反向转换为重力值。
假设重力为 A Kg,(x<5Kg),测量出来的 AD 值为 y
传感器输出,发送给 AD 模块儿的电压为 A Kg * 4.3mV / 5Kg = 0.86A mV
经过 128 倍增益后为 128 * 0.86A = 110.08AmV转换为 24bit 数字信号为 110.08A mV * 224 / 4.3V = 429496.7296A
所以 y = 429496.7296A
因此得出 A = y / 429496.7296 g
所以得出程序中计算公式
Weight_Shiwu = (unsigned long)((float)Weight_Shiwu/429.5);
特别注意:
因为不同的传感器斜率特性曲线不是完全一样,因此,每一个传感器需要矫正这里的 429.5 这个除数,才能达到精度很高。
修改以下部分代码用于校准(该段程序在 main.c 最上面)
#define GapValue 430
当发现测试出来的重量偏大时,增加该数值。 如果测试出来的重量偏小时,减小改数值。

Q7:怎么实现显示硬币面值的?

A7:通过按键改变设置面值并通过LCD显示出来

按键的输入功能有去皮即去除开始容器的重量和设置硬币的面值信息如1角,5角和1元,因此在此处直接采用独立按键即可。

在这里插入图片描述

四个独立按键分别代表去皮,三种硬币面值的确定(1角,5角,1元)一端接地,一端接
P3^2
P3^3
P3^4口
通过检测I/O口的改变来确定此时称重硬币的重量和面值

Q8:最终的显示效果怎么样,有无实物图?

A8:强烈建议用蓝色显示屏~
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Q9:代码呢?电路图呢?

硬币电子秤的实现

点个赞再走?
在这里插入图片描述

标签:显示,AD,硬币,芯片,STC89C52,电子秤,单片机,电压
来源: https://blog.csdn.net/weixin_45870610/article/details/110571024