基于单片机的5kg电子称的设计

更新时间:2023-11-09 19:08:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于单片机的5kg电子称的设计

一、

意义:

随着科技的发展,电子称在生活中的应用很是广泛,几乎在称重时都会用到,小到超市,菜场的称重,大到工程中的称重。电子秤的主要特点是体积小,电路比较简单,应用广泛,有很多量程和精度可以选择,满足了很多场合的要求,电子秤的应用对普通的杠杆原理的称重有着很大的优点,精度比杠杆称重精度高的多,应用不受太大的限制,所以应用非常广泛。研究和制作各种不同精度和量程的电子秤对人们的生活有着重要的意义。

背景:

中国是发展中国家,在国际上,电子秤行业与发达国家相比有很大的差距,如美国,德国,西欧,电子称重已经达到了很高的水平。特别是在准确度和可靠性等方面有了很大的提高。特别是近30年来,工艺流程中的现场称重、配料定量称重、以及产品质量的监测等工作,都离不开电子衡器。这是由于电子衡器不仅得出质量或重量信号,而且也能作为总系统中的一个单元承担着控制和检验功能。随着称重传感器各项性能的不断突破,为电子秤的发展奠定了基础,早在20世纪60年代就出现了0.1%称量准确度的电子秤,并在70年代中期约对75%的机械秤进行了机电结合改造。如今电子秤已经发展到全电子化,智能化,网络的阶段。外国产智能化程度相当高,通过对原始信息的数字处理,更好的排除了外部干扰对信息影响,提高了产品的耐环境性和测量真实性而且电子秤产品的网络化在国外已经进入实用阶段。如今,国外电子秤品种和结构又有创新,技术功能和应用范围不断扩大。

二、

方案选取:1,用霍尔元件实现 2,用金属应变片实现

在选取方案的时候,觉得霍尔元件原理比较复杂,在设计上有一些难度而且霍尔元件在工作时容易被磁场和电场干扰,所以选择方案2来设计电子秤。

基本设计思路:

当物体放在秤盘上时,物体产生的压力施给传感器,该传感器发生形变,使阻抗发生变化,同时使用激励电压发生变化,传感器输出一个变化的模拟信号。该信号经过放大电路放大输出到电压-频率转换电路转换成便于处理的数字信号输出到微处理器,单片机根据键盘命令将这种结果输出到LED显示电路,显示出要显示的结果,如图1所示。

系统方框图:

图1

传感器输出的模拟信号被放大整形后由运算放大器组成的v/f转换电路完成电压-频率转换,再经过单片机对测量信号进行处理并根据相应的数据关系译码显示出被测物体的重量。

单片机控制适合于功能比较简单的控制系统,算术运算功能强、技术成熟。因此,选用单片机STC89C52来实现系统设计。 三、

芯片简介: 1、 HX711芯片

Hx711采用了海芯科技集成电路专利技术,是一款专为高精度电子秤而设计的24位A/D转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源,片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰能力强等优点。降低了电子秤的整机成本,提高了整机的性能和可靠性。

该芯片与后端MCU芯片的接口与编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道A或通道B,与其内部的低噪声可编程放大器相连。通道A的可编程增益为128或64,对应的满额度差分输入信号幅值分别为20mv或40mv。通道B则为固定的64增益,用于系数参数检测。芯片内提供的稳压电源可以直接向外部传感器和芯片内的A/D转换器提供电源,系统板上无需另外的模拟电源。芯片内的时钟振荡器不需要任何外接器件。上电自动复位功能简化了计算机的初始化过程。

该芯片有两路可选择差分输入,片内低噪音可编程放大器,可选择增益为64和128。

压力传感器信号放大转换压力传感器v/f 51 单片机 压力传感器 片内稳压电路可直接向外部传感器和芯片内A/D转换器提供电源。片内时钟振荡器无需任何外接器件,必要时也可以使用外接晶振或时钟,它能上电自动复位,能够实现简单的数字控制和串口通讯:所有控制由管教输入,芯片内寄存器无需编程,可选择10hz或80hz的输出数据速率,能同步抑制50hz和60hz的电源干扰。封装如图2

图2

VSUP:电源:稳压电路供电电源;2.6~5.5v(不用稳压电源时应接AVDD) BASE:模拟输出:稳压电路控制输出(不用稳压电路时无连接) AVDD:电源:模拟电源:2.6~5.5v

VFB:模拟输入:稳压电路控制输入(不用稳压电路时应接地) AGND:地:模拟地

VBG:模拟输出:参考电源输出 INA-:模拟输入:通道A负端输入 INA+:模拟输入:通道A正端输入 INB-:模拟输入:通道B负端输入 INB+:模拟输入:通道B负端输入

PD_SCK:数字输入:断电控制(高电平有效)和串口时钟输入 DOUT:数字输出:串口数据输出 XO:数字输入输出:晶振输入

XI:数字输入:外部时钟或晶振输入(0:使用片内振荡器) RATE:数字输入:输出数据速率控制(0:10hz;1:80hz) DVDD:电源:数字电源:2.6~5.5v

Hx711在电子秤方面应用典型方案图,如下图3

图3

2、 STC89C52

STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。管脚情况如图4:

图4

这里就不一一对管脚进行介绍了。 各部分硬件电路设计: 1、LCD1602显示电路(如图5)

图5

2管脚接VCC,4到14管脚分别接在单片机对应的管脚。 3、 hx711接口电路(如图6)

图6

这里只用到4个端口,VCC接稳压电路供电电源,单片机P32接HX711数字输入端口,P33接HX711的数字输出端口,实现A/D转换。 4、 蜂鸣器电路(如图7)

图7

从单片机P24引出来接一个电阻R3,接到三极管上,三极管的发射极在于电铃相连。 5、 复位电路(如图8)

Reset端接单片机的9管脚,实现复位功能。 6、 按键电路(如图9)

图9

通过单片机的P14,P15,P16,P17端口实现对按键的控制。 7、 主体电路(如图10)

图10

该电路为主体部分电路为单片机模块。

8、 晶振电路(如图11)

图11

软件设计部分: 主程序流程图

开机 系统初始化 调用显示程序 测重物 V/F转换 数据处理 调用按键处理程序

整体程序: #include \#include \#include \

#include \

//定义变量

unsigned char KEY_NUM = 0; //用来存放按键按下的键值

unsigned long HX711_Buffer = 0; //用来存放HX711读取出来的数据 unsigned long Weight_Maopi = 0; //用来存放毛皮数据 long Weight_Shiwu = 0; //用来存放实物重量 long Max_Value = 0; //用来存放设置最大值 char maxValueTable[4] = {1,0,0,0};

unsigned char state = 0; //用来存放设置状态 unsigned char Blink_Speed = 0;

#define Blink_Speed_Max 6 //该值可以改变设置指针闪烁频率

//校准参数

//因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。

//当发现测试出来的重量偏大时,增加该数值。 //如果测试出来的重量偏小时,减小改数值。 //该值可以为小数 #define GapValue 365

//传感器最大测量值,单位是g #define AlarmValue 5000

//**************************************************** //主函数

//**************************************************** void main() {

LCD1602_write_com(0x80);

//设置LCD1602指针

Init_LCD1602();

//初始化LCD1602

LCD1602_write_word(\

Get_Maopi();

Get_Maopi(); Delay_ms(2000); Get_Maopi(); Get_Maopi();

//称毛皮重量

//多次测量有利于HX711稳定

//延时2s

LCD1602_write_com(0x01); //清屏

//读取EEPROM中保存的报警值

maxValueTable[0] = byte_read(0x2000); maxValueTable[1] = byte_read(0x2001); maxValueTable[2] = byte_read(0x2002); maxValueTable[3] = byte_read(0x2003); Max_Value =

maxValueTable[0]*1000+maxValueTable[1]*100+maxValueTable[2]*10+maxValueTable[3]; //计算超限报警界限值

while(1) {

Get_Weight();

//显示当前重量

LCD1602_write_com(0x80);

LCD1602_write_word(\

LCD1602_write_data(Weight_Shiwu000/1000 + 0x30); LCD1602_write_data('.');

LCD1602_write_data(Weight_Shiwu00/100 + 0x30); LCD1602_write_data(Weight_Shiwu0/10 + 0x30); LCD1602_write_data(Weight_Shiwu + 0x30); LCD1602_write_word(\

KEY_NUM = Scan_Key();

if(KEY_NUM == 1) //按键1切换设置状态 {

state++; if(state == 5) {

state = 0;

SectorErase(0x2000);

byte_write(0x2000,maxValueTable[0]); EEPROM数据

byte_write(0x2001,maxValueTable[1]); byte_write(0x2002,maxValueTable[2]); EEPROM数据

byte_write(0x2003,maxValueTable[3]); Max_Value =

maxValueTable[0]*1000+maxValueTable[1]*100+maxValueTable[2]*10+maxValueTable[3]; //计算超限报警界限值 } }

if(KEY_NUM == 2) //按键加 {

if(state != 0) {

maxValueTable[state-1]++; if(maxValueTable[state-1] >= 10) {

maxValueTable[state-1] = 0; } } }

if(KEY_NUM == 3) //按键减 {

if(state != 0) {

maxValueTable[state-1]--; if(maxValueTable[state-1] <= -1) {

maxValueTable[state-1] = 9; } } }

//保存

//保存

if(KEY_NUM == 4) { }

Get_Maopi();

//去皮

if(state != 0) {

Blink_Speed ++;

if(Blink_Speed == Blink_Speed_Max) {

Blink_Speed = 0; } }

switch(state) {

case 0:

LCD1602_write_com(0x80+0x40); LCD1602_write_word(\

LCD1602_write_data(maxValueTable[0]+0x30); LCD1602_write_data('.');

LCD1602_write_data(maxValueTable[1]+0x30); LCD1602_write_data(maxValueTable[2]+0x30); LCD1602_write_data(maxValueTable[3]+0x30); LCD1602_write_word(\ break; case 1:

LCD1602_write_com(0x80+0x40); LCD1602_write_word(\ if(Blink_Speed < Blink_Speed_Max/2) {

LCD1602_write_data(maxValueTable[0]+0x30); } else {

LCD1602_write_data(' '); }

LCD1602_write_data('.');

LCD1602_write_data(maxValueTable[1]+0x30); LCD1602_write_data(maxValueTable[2]+0x30); LCD1602_write_data(maxValueTable[3]+0x30); LCD1602_write_word(\ break; case 2:

LCD1602_write_com(0x80+0x40); LCD1602_write_word(\

LCD1602_write_data(maxValueTable[0]+0x30); LCD1602_write_data('.');

if(Blink_Speed < Blink_Speed_Max/2) {

LCD1602_write_data(maxValueTable[1]+0x30); } else {

LCD1602_write_data(' '); }

LCD1602_write_data(maxValueTable[2]+0x30); LCD1602_write_data(maxValueTable[3]+0x30); LCD1602_write_word(\ break; case 3:

LCD1602_write_com(0x80+0x40); LCD1602_write_word(\

LCD1602_write_data(maxValueTable[0]+0x30); LCD1602_write_data('.');

LCD1602_write_data(maxValueTable[1]+0x30); if(Blink_Speed < Blink_Speed_Max/2) {

LCD1602_write_data(maxValueTable[2]+0x30); }

else {

LCD1602_write_data(' '); }

LCD1602_write_data(maxValueTable[3]+0x30); LCD1602_write_word(\ break; case 4:

LCD1602_write_com(0x80+0x40); LCD1602_write_word(\

LCD1602_write_data(maxValueTable[0]+0x30); LCD1602_write_data('.');

LCD1602_write_data(maxValueTable[1]+0x30); LCD1602_write_data(maxValueTable[2]+0x30); if(Blink_Speed < Blink_Speed_Max/2) {

LCD1602_write_data(maxValueTable[3]+0x30); } else {

LCD1602_write_data(' '); } LCD1602_write_word(\ break; default: break; }

//超限报警

if(Weight_Shiwu >= Max_Value || Weight_Shiwu >= AlarmValue) //超过设置最大值或者传感器本身量程最大值报警 { Buzzer = 0;

}

else { Buzzer = 1;

}

}

}

//**************************************************** //称重

//**************************************************** void Get_Weight() { Weight_Shiwu = HX711_Read();

Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //获取净重

if(Weight_Shiwu >= 0)

{

Weight_Shiwu = (unsigned long)((float)Weight_Shiwu/GapValue); 实物的实际重量 } else { Weight_Shiwu = 0;

}

}

//**************************************************** //获取毛皮重量

//**************************************************** void Get_Maopi() { Weight_Maopi = HX711_Read();

}

//计算

//**************************************************** //MS延时函数(12M晶振下测试)

//**************************************************** void Delay_ms(unsigned int n) { }

//**************************************************** //蜂鸣器程序

//**************************************************** void Buzzer_Di() { }

//**************************************************** //按键扫描程序

//**************************************************** unsigned char Scan_Key() {

if( KEY1 == 0 )

{

Delay_ms(10); if( KEY1 == 0 ) { }

Buzzer_Di(); while(KEY1 == 0); return 1;

//等待松手

//延时去抖

//按键扫描

Buzzer = 0; Delay_ms(10); Buzzer = 1; Delay_ms(10); unsigned int i,j; for(i=0;i

for(j=0;j<123;j++);

}

//按键扫描

if( KEY2 == 0 )

{ }

Delay_ms(10); if( KEY2 == 0 ) { }

Buzzer_Di();

//延时去抖

while(KEY2 == 0); return 2;

//等待松手

if( KEY3 == 0 )

{ }

if( KEY4 == 0 ) { }

//按键扫描

Delay_ms(10); if( KEY3 == 0 ) { }

Buzzer_Di();

//延时去抖

while(KEY3 == 0); return 3;

//等待松手

//按键扫描

Delay_ms(10); if( KEY4 == 0 ) { }

Buzzer_Di();

//延时去抖

while(KEY4 == 0); return 4;

//等待松手

return 0; }

四、问题及结果分析

经过本次传感器的大作业,我们做的是双平行梁的电子秤,我们的实验电路分为三个模

块,分别是采集模块,控制模块,显示处理模块,在传感器的设计中最困难的地方无非在于如何将重力转化为电信号,然后在LCD1602上显示出来,因为在桥式电路中电压的压差很小而且还是模拟信号,所以我们采用了集成24位AD转化芯片,将电信号先放大128倍然后在进行AD转换,通过P3^2口给出高电平启动信号,然后通过I2C将转化的24位数字量传送到P3^3口,单片机通过计算得出数值。其次在制作的后期还有一个问题就是电子秤的校准问题,所以计算公式中加了一个宏定义GapValue,通过改变它就能校准电子秤的准确性。最后一个问题就是硬件焊接的问题,注意与软件相结合,比如排阻的焊接注意正负,显示屏加上对比调节。

五、总结

1、5月15日

开始选择要用那种传感器 5月16日

确定使用金属应变片做压力传感器 5月17日

上网搜集各种有关压力传感器的资料 5月18日

上网采集所需要的元件 5月19日

开始进行电路图的设计以及构思 5月20日 绘制出电路图 5月23日 对电路进行焊接 5月25日 进行程序的编写 5月27日 调试相关程序 5月28日

烧写程序,对硬件进行测试 5月30日 写设计报告 5月31日 完成

2、陈徐飞50%(进行硬件的焊接以及程序的编写) 梅杰50%(对电路进行检查以及写设计报告)

3、心得体会

随着集成电路和计算机技术的迅速发展,使电子仪器的整体水平发生巨大变化,传统的仪器逐步的被智能仪器所取代。智能仪器的核心部件是单片机,因其极高的性价比得到广泛的应用与发展,从而加快了智能仪器的发展。而传感器作为测控系统中对象信息的入口,越来越受人们的关注。传感器好比人体“五官”的工程模拟物,它是一种能将特定的被测量信息(物理量、化学量、生物量等)按一定规律转换成某种可用信号输出的器件。因此,只有充分了解有关智能仪器、单片机、传感器以及各部分之间的关系才能达到要求。

在这次制作中我熟悉了STC89C52单片机功能及工作特性,通过对数据采集的分析,了解了放大器及A/D转换器有更深的认识。学会了采用面向对象的思想,分层次、分模块构建设计的总体框架。最后,我觉传感器这门课应该重视实践能力的培养,而不应该放在理论上,通过这次大作业我了解了好多有关传感器的知识,真正的了解了传感器相关方面的知识。

六、参考文献

1、陆伯勤,电子称重技术和自动称重系统的进展;自动化博览,1999 2、杨文龙,单片机原理及应用;西安电子科技大学出版社,2000 3、刘伯中,刘景霞,高精度智能电子分析天平;仪器仪表学报,1989 4、李朝青,单片机原理及其接口技术;北京航空航天大学出版社,1999

本文来源:https://www.bwwdw.com/article/8c9v.html

Top