分享单片机项目培训-51单片机电子秤(语音播报版)。如有不足,请指出。
【实验图】
【演示视频】
【项目培训】51单片机电子秤(语音播报版)
一、设计要求
二、方案选择
三、软件设计
四、图片展示
五、数据链接
六、设计要点
七、关于作者
八、后记
1.用单片机控制数字电子秤的各种功能。
2.数字电子秤能够显示商品的重量、单价,且自动完成商品总价的计算,可通过语音播报商品总价。
3.数字电子秤的测量范围要求达到5KG,测量精度要求1g。
1.设计思路
根据设计要求,首先要实现电子秤的基本称重功能,需要通过称重传感器收集到重量信号,放大电路处理后,从模量到数量,所以每个数量对应于物体的质量(在一定的精度范围内),所以只要数量质量和物体质量建立映射关系,就可以完成称重要求。通过程序操作和键盘控制,可以实现其他功能。
总体结构框架图如下:
原理图如下:
2.控制器
由于系统需要控制液晶显示器和键盘,因此不应使用大型可编程逻辑器件,如CPLD、FPGA来实现。由于大型可编程逻辑器件一般采用状态机实现,即所解决的问题都是有规有限状态转换。系统状态多,难度大。此外,系统没有其他高标准要求,最终选择STC89C52RC单片机实现系统设计,内部有8台K可满足系统设计要求的程序存储器。
3.数据采集部分
(1)传感器。传感器是测量机构中最重要的部件。该系统选用电阻应变压力传感器。电阻应变压力传感器主要由弹性体。内部线路采用惠斯通电桥,当弹性体承受载荷产生的变形时,电阻应变片受到拉伸或压缩应变片变形后,它的阻值将会发生变化(增大或减小),从而电桥失去平衡,产生相应的差动信号,供后续电路测量和处理。该系统要求测量范围为0~4.999Kg,考虑到秤台的自重、振动和冲击重量,传感器的量程必须大于额定称重(4).999Kg),我们选择的称重传感器量程为5Kg,如下图所示。
(2)A/D转换器。所谓A/D转换器是将输入的模拟信号转换为数字信号的装置。HX711,HX711是24位的高精度A/D转换芯片是一种高精度、低成本的设计方案,专门为高精度电子秤设计,有两个模拟通道输入,内部集成128倍增益可编程放大器。
(3)液晶显示部分
本系统选用1602液晶显示屏进行显示。
(4)键盘输入
选择16个按钮的矩阵键盘,其中0~9数字按钮和小数点按钮用于输入单价;去皮按钮用于仅显示物品净重;删除物品单价的按钮;校准; /校准-按钮用于调整校正系数,播放按钮用于播放物品总价,矩阵键盘布局如图所示。
(5)语音模块
方案一:采用OTP语音芯片(一次性语音芯片)。一次性语音芯片在制造商完成记录后,语音内容不能更改,因此需要提前与制造商沟通,需要广播语音内容,如:
首先将你可能使用的所有语音写入语音芯片,然后烧成语音芯片。虽然OTP语音芯片不能重复烧写,但低成本的优势也使其占有一定的市场份额,OTP语音芯片广泛应用于儿童玩具、汽车电子、医疗器械、安全报警等行业。作者以前用过一个OTP语音芯片,成本不超过2元,对于固定内容的广播,建议使用该方案,其硬件连接也很简单,如下图所示。
方案二:最好支持集成语音模块支持 FAT 文件系统和操作简单类似U盘,但成本是OTP芯片的几倍。,在电子秤作品中使用JQ8400-FL,通过类U盘操作将音频文件复制到模块内存,然后一线串口发送文件名(数字)播放语音内容。
该芯片最大的优点是可以灵活更换 SPI-flash 语音内容节省了传统语音芯片需要安装上位机来更换语音,SPI FLASH 直接模拟成 U 盘,跟拷贝 U 盘一样,非常方便。使产品研发和生产方便简单。一线串口控制模式,RX232 串口控制为研发提供更多的选择
三、软件设计
(1)主程序
void main()
{
System_Init();
while(1)
{
Get_Weight();
keycode = MatrixKey_RanksScan();
if(keycode)
{
KeyPress(keycode);
}
}
}
(2)流程图
<1>主程序流程图
<2>键盘扫描程序流程图
四、图片展示
(1)PCB-3D视图
(2)实物演示
五、资料链接
(1)作品演示视频链接
链接①:哔哩哔哩--------点击播放
(2)硬件电路分析视频
(3)软件程序分析视频
(4)原理图下载(PDF版)
(5)源程序下载
六、设计要点
(1)如何实现数据的稳定输出?
数据的稳定输出主要依靠两个方面:①硬件电路 和 ②软件程序。
①先分析硬件电路,HX711为24位的AD模块,对微量的变动非常敏感,所以硬件电路部分一定要注意:
这是作者在设计第一版的电路板的时候的硬件链接,设计后完成发现数据输出不是很稳定,而在E+和E-之间连接一个电解电容,数据的稳定性会有所改善,具体实验过程如下如下:
①首先,E+和E-之间电解电容,然后放置200g标准砝码,采用串口打印相关信息,采集20000次数据,重量数据作图得到:
可以看到,数据稳定性不好,数据范围在0.199Kg~0.202Kg,上下起伏为0.003Kg,即3g左右误差。具体统计如下:
重量值(Kg) | 出现次数 | 次数占比 |
0.199 | 689 | 3.445% |
0.2 | 15259 | 76.295% |
0.201 | 4047 | 20.235% |
0.202 | 5 | 0.025% |
也就是正确数据占比为76.295%。(
②在E+和E-之间电解电容,再次实验,采集20000次数据,数据稳定性如下所示:
可以看到,数据稳定性有所好转,具体统计如下:
重量值 | 出现次数 | 次数比例 |
0.2 | 19998 | 99.990% |
0.201 | 2 | 0.010% |
也就是正确数据占比为99.990%。
②再分析软件程序,对单片机获取到的重量值,可以采用软件滤波的方式,获取到较为稳定的数据,比如多次求值,然后求平均值,当然还有其他很多滤波方式,都可以去实验,本作品中作者未涉及,有兴趣的可以去试着做。
(2)如何保留小数点后两位有效数字?
float money=0; //总价,单位为元
money +=0.005; //用于四舍五入,保留总价有效数值到百分位
//注意这里的技巧:巧妙利用数据类型转换,使得总价数值保留到百分位(一般金额精确到分)
money = ((float)((unsigned long)(money*100)))/100;
该作品程序中,有这样两部分代码,摘抄这两句代码在一起。具体举例分析,假设money最开始等于22.986元,通过
money +=0.005; //用于四舍五入,保留总价有效数值到百分位
得到money等于22.991元,再通过:
//注意这里的技巧:巧妙利用数据类型转换,使得总价数值保留到百分位(一般金额精确到分)
money = ((float)((unsigned long)(money*100)))/100;
注意这里包含两次数据类型转换,第一次money先乘以100得到2299.1,然后强制转换为unsigned long类型数据,得到的就是2299元,然后再将其类型转换为float,得到2299.0元,然后除以100,得到的就是22.99元,得到的结果就是四舍五入后保留小数点后两位的结果。
七、关于作者
微创电子工作室,刺客阿瑞原创