基于51单片机的电子秤设计

目    录

引言........................................................ 1

1  概述... 1

1.1 课题背景... 1

1.2 电子秤发展现状和发展趋势... 1

2  系统方案与功能指标... 2

2.1 系统方案... 2

2.2 任务指标... 2

3  系统器件选型及参数介绍... 2

3.1 主控芯片选择... 2

3.2 显示模块选择... 3

3.3 压力传感器... 5

3.4 AD采集模块选择... 6

4  系统硬件电路设计... 6

4.1 主控系统电路... 6

4.2 AD采集电路... 7

4.3 矩阵键盘电路... 8

4.4 LCD12864显示电路... 8

5  系统程序设计... 9

5.1 主程序设计... 9

5.2 矩阵键盘扫描程序设计... 10

5.3 LCD12864液晶显示程序设计... 10

5.4 AD采集程序设计... 11

6  系统测试... 12

6.1 系统测试与测试结果分析... 12

6.1.1LCD12864液晶显示测试... 12

6.1.2压力传感器测试... 13

6.1.3物品总重量和总金额计算测试... 14

6.2 测试分析... 14

6.3 测试结果... 15

7  结论... 15

谢辞... 17

参考文献... 18

附录... 19

                                                                                   

                                                                                   

引言

在生活中,物品的质量起到了决定性因素,通过测量质量而决定它自身的价值。在古时,为了对数量的改变进行估测,使用土制器具来对产品交换进行估测。随着时代的推移,秤也逐渐出现在世人的眼前。根据考古研究,最早出现的测量仪器出土于古埃及,而最早出现的等臂天平也来自埃及的一座古老墓穴中。秤是家家户户都能用到的工具,电子秤的发展,也意味着老式的秤落下了时代的帷幕。制作简单、智能的电子秤无疑是人们的第一选择,电子秤在市场方面也具有极大的市场价值。

本章通过介绍电子秤的发展历程,阐述了简易和智能化电子秤的意义,介绍了课题研究背景、电子秤技术等。

1 概述

1.1 课题背景

相对于传统的计量设备,例如:吊秤、杆秤、台秤、案秤、弹簧秤和托盘天平等,这些计量设备都具有很高的计量效率,然而这类称的计量精度都普遍不太高,并且随着使用时间的加长,其使用起来也极其不稳定。因此,设计一款基于单片机的电子秤,在满足计量要求并且计量精度高的应用需要的同时,增加超重报警、去皮、计算总物品的重量和价格,可以满足使用者日常的应用需要,也可以提高工作效率。

1.2 电子秤发展现状和发展趋势

发展现状:当前电子秤的发展,电子秤被应用于商业,工业等行业,如今,电子秤越来越多的应用到数据计算中,使当今的称量工艺成为工业、物品运输、收货业务和商业等方面中不可或缺的因素。

电子秤的种类多种多样,而且还牵涉到交易结算和大量客户的利益,因此成为了各个国家关注和重视的对象,并被称为是各国强制管理的法定计量工具。电子秤是自动化称重控制和贸易计量的重要手段,在加强各企管理、生产、贸易结算,运输、贸易和研究方面都起到了决定性因素。

发展趋势:当前的电子秤发展现状随着科技的不断进步,人们也逐渐取代了以往老式的秤,如今的电子秤是由传感器感应,用仪器数字显示的。电子秤是机械、电子、仪器的集合,具有多种功能可选、称重质量准确、快速称重、稳定可靠等特性,代表了电子衡器的发展走向。电子秤属于日用衡器,是劳动密集型产品。

2  系统方案与功能指标

2.1 系统方案


本系统采用STC89C52RC芯片为主要控制单元,并配有单片机最小系统,由复位模块,晶振模块,电源电路模块,构成了一个最小的主控系统。主控系统以4×4矩阵键盘作为基于单片机的电子秤系统的控制输入模块;以LCD12864液晶显示模块作为单片机为核心的电子秤系统输出显示模块;5KG压力传感器作为基于单片机的电子秤系统的物品重量模拟量采集模块;以HX711模块作为AD模数转换模块,把读取到的物品重量AD值传给STC89C52RC芯片,再通过相关数据公式转换,把物体的实际重量和物品数量总价通过LCD12864液晶显示模块显示出来。基于单片机的电子秤系统的硬件设计图如图2-1所示。

图 2-1 系统硬件总体设计框图

2.2 任务指标

  • 电子秤称量范围:0g~5000g;电子秤分度值:1g-5000g;电子秤精度等级III级;
  • 电子秤能测量物体质量并可以通过显示模块显示出来;
  • 电子秤可以通过物体的单价计算出物体数量的总价格;
  • 电子秤具备去皮功能,方便计算物体的实际重力;

3  系统器件选型及参数介绍

3.1 主控芯片选择

基于单片机的电子秤系统主控芯片采用的是STC公司研发的STC89C52RC直插40脚芯片。STC89C52RC芯片是STC公司研发的新一代小型单片机,其在软件和硬件方面与MCS-51系列的单片机完全兼容,甚至更强,这类单片机将多功能8CPU和闪烁存储器组合在单个芯片中,这个类型的单片机也抗干能力很强,数据传输速率快,具备高性能的同时,其功耗也低,为很多嵌入式控制系统提供了一个性价比高的方案。

STC公司研发的STC89C52RC芯片特点:①52芯片可以在宽电源电压2.7V~6V的电压范围内工作,以及可以在宽温度环境-40°C~85°C的温度范围内进行工作;②52芯片可以处于全静态工作模式,可以工作在0Hz~24Hz之间的频率范围;③52芯片在指令系统和管脚方面与MCS-51系列的微处理器之间具有很好的一致性,这就意味着MCS-51系列的微处理器可以在52芯片中直接使用;⑤52芯片支持可以三级加密的程序存储器;⑥52芯片不支持ALE输出;⑦52芯片具有电流保护功能,能够在4kv范围内对脉冲进行干涉。

STC公司研发的STC89C52RC芯片同时也具备非常丰富的资源:①STC89C52RC芯片内部拥有128×8位的RAM;②STC89C52RC芯片拥有32个可以支持双向输入输出的串行引脚(P0P1P2P38I/O端口。P0端口有三态,分别是:高阻,高电平,低电平。P1端口是专门供使用者使用的端口,是一个准双向端口;当系统扩展时,P2端口是STC89C52RC芯片的高8位,不做外部扩展时,也是准双向口;③STC89C52RC芯片拥有两个16位的定时器和两个16位的计数器;④STC89C52RC芯片拥有5个中断源,两级中断优先级;⑤STC89C52芯片具有异步通信接口等多种资源,支持全双工。

因此,STC89C52单片机芯片成为了以MCU为核心的电子秤系统的主要控制芯片。STC89C52RC直插芯片实物图如3-1所示。

3.2 显示模块选择

据自己目前所了解的相关电子元器件初步认为以下两种的显示方案适合作为基于单片机的电子秤系统的显示模块:

方案1

使用MAX7219数码管显示模块作为基于单片机的电子秤系统输出显示模块,MAX7219数码管显示模块是一种已集成的驱动器,LED驱动通过3线串行传输数据,可与 MCU直接相连,使用者可轻松调整其内部参数,完成多个LED显示。整个MAX7219数码管显示模块的四线串行接口可以级联多个MAX7219数码管显示模块,达到多个数码管同时使用还不占用芯片资源的好处。

MAX7219数码管显示模块可以工作在0°C~70°C的温度范围。MAX7219数码管显示模块实物图如图3-2所示。

方案2:

LCD1602芯片使用方法都是相同的,LCD显示作为基于单片机的电子秤系统输出显示模块,LCD1602液晶显示模块作为各类单片机实物设计的常用显示屏,是一种专门用于显示单元、字母和符号等的显示屏,LCD1602表示LCD能显示的内容为16×2,也就是说显示模块可以显示两行字符,每一行字符可以显示16个字符;LCD1602的LCD模块的读写操作、显示屏和光标操作均由程序控制(1表示高,0表示低)。


LCD1602液晶模块实物如图3-3所示。

方案3:

使用LCD12864液晶显示模块作为基于单片机的电子秤系统输出显示模块,LCD12864液晶显示模块和LCD1602液晶显示模块一样是各类单片机实物设计的常用显示屏。LCD12864液晶显示模块也是点阵式液晶显示模块,其由12864个液晶显示点组成一个128列×64行的阵列,每一个点都对应这一个二进制数。


LCD12864液晶显示模块的各项参数:其工作电压在+3.3V~+5.5V之间;显示分辨率为128×64点;LCD12864液晶显示模块内部自带汉字字库,提供8192个16×16的点阵汉字(支持繁体字);LCD12864液晶模块内部存在128个16×8点阵字符;LCD12864液晶显示模块支持的时钟频率可达2MHz;LCD12864液晶显示模块支持STN、半透和正显等显示方式;支持1/32DUTY和1/5BIAS驱动方式;LCD12864液晶显示模块支持串行和并行等通信方式。LCD12864液晶显示模块实物如图3-4所示。

最后,通过三个方案的显示模块进行对比,MAX7219 数码管显示模块只能显示数字、一些常用的字母以及个别字符;LCD1602液晶显示模块可以显示大多数的数字、字母和符号等;LCD12864液晶显示模块可以显示数字、字母和中文。结合实际并结合自身的能力,从性价比和使用角度考虑,认为LCD12864液晶显示模块更适合当前基于单片机的电子秤系统课题的需要,并且LCD12864液晶显示模块可以显示16×8的字符,也能更好的满足电子制作者的需求,所以基于单片机的电子秤系统选用LCD12864液晶显示模块作为输出显示模块。

3.3 压力传感器


对于基于单片机的电子秤系统的重力测量方案,通过查资料和相关文献了解了压力传感器,基于单片机的电子秤系统采用的是5Kg的压力传感器。基于单片机的电子秤系统使用的是5Kg的压力传感器的支架直径为10cm,直径包含托盘直径;5Kg的压力传感器的电压为3.3V或5V;最大量程可达5Kg。所使用的压力传感器体积小,重量也很轻,结构也简单,使用也十分可靠。5Kg的压力传感器实物如图3-5所示。

3.4 AD采集模块选择

对于基于单片机的电子秤系统的重力AD数据采集方案,通过查资料和相关文献了解了,基于单片机的电子秤系统采用的是与5Kg的压力传感器相配套的HX711模块。

HX711芯片是一款由海芯科技研发的专为电子称而设计的高精度的24位A/D转换芯片。HX711模块使用串口通讯线是由SCK引脚和DT引脚组成,其可以用来数据输出,同时也是用来选择信号输入通道和增益大小的引脚,例如当DT引脚使能为高电平时,说明模块的A/D转换器还未准备好输出数据等。HX711模块集成了稳压电源、片内时钟振荡器等芯片需要的外围电路,相对于其他同类型的模块,HX711芯片提供了可以提高整个系统的性能和可靠性。

HX711模块的重要电气参数:①HX711模块的满额度差分输入范围为:±0.5V;②输入共模电压范围在AGND+1.2V,AVDD-1.3V;③输出的数据二进制补码编码在800000~7FFFFF之内;④模块输入共模信号的抑制比是100 dB;⑤输出参考电压为1.25V。

HX711模块的特点:①HX711模块可以选择两路差分输入;②HX711模块由片内低噪声可编程放大器,可选增益有32、64和128;③HX711模块内部的稳压电路可以直接向外部传感器和A/D转换器提供电源;④片内的时钟振荡器无需任何外接电器,必要时也可以接外部时钟;⑤HX711模块上电自动复位;⑥HX711模块支持10Hz或者60Hz的输出数据速率;⑦HX711模块可以同步抑制50Hz和60Hz的电源干扰;⑧HX711模块可以工作在2.6V~5.5V的电压范围和-40°C~+85°C的温度范围。


HX711模块实物图如图3-6所示。

基于51单片机的电子秤设计_第1张图片

图 3-6 HX711模块实物图

4  系统硬件电路设计

4.1 主控系统电路

主控电路由STC89C52RC直插芯片、DC-5V开关电路、电源指示灯模块、复位电路、起振电路组成一个最小系统。复位电路采用了一个10K直插电阻和一个10uF的铝电解电容,由此可以计算出系统的复位时间为T=RC=10ms;起振电路采用的是12MHz的晶振芯片和两个30pF的独石电容组成,选择晶振12MHz是因为其能够准确的划分时钟频率,与串口通信的波特率有很大的关系,其参数对于较高的波特率计算比较准确,12MHz晶振对于STC89C52RC芯片的定时器来说也有很大的影响,因为用其计算的的定时器初值都是整数的,如果使用12MHz的晶振,对于波特率的计算和定时器的初值计算都存在一定的变差,但是在误差范围内;同时电源指示灯是用来提示整个主控系统有没有正常工作,以及独立的程序烧写接口,方便在编程过程中对系统程序进行烧写和擦除;DC-5V开关电路使用一个DC-5V电源接口,再接一个开关作为系统的电源开关,用以控制整个系统的电源输入,方便使用前后的断电和上电。主控系统电路如图4-1所 示。

基于51单片机的电子秤设计_第2张图片

图 4-1 主控系统电路图

4.2 AD采集电路

AD采集电路使用的是5Kg压力传感器和5Kg压力传感器相配套的HX711模块,HX711模块使用串行的方式和STC89C52RC单片机进行通信和连接。STC89C52RC单片机通过给HX711模块时钟信号,HX711模块收到信号就会正常工作,当给5Kg压力传感器放上一定重量的物品,传感器采集的模拟量传给HX711模块,HX711模块内部的放大电路会把采集到的模拟量进一步放大,再放大的模拟量进行模/数转换得到AD值,HX711模块利用数据线把AD数值传给STC89C52RC芯片,STC89C52RC芯片把读取到的AD值在内部利用转换公式再把AD值进行重量转换就可以到得物品的实际重量。

AD采集电路连接电路如图4-2所示。

基于51单片机的电子秤设计_第3张图片

图 4-2 AD采集电路连接电路图

4.3 矩阵键盘电路


矩阵键盘电路采用的是4×4矩阵键盘,通过并行与STC89C52RC芯片的P3端口进行连接,STC89C52RC芯片内部一直使用端口电平进行列/行扫描就能读取那个按键按下。使用4×4矩阵键盘是因为可以使用多个按键设定不同的功能,方便可以输入不同的数值和实现不同的按键功能。4×4矩阵键盘连接电路如图4-3所示。

基于51单片机的电子秤设计_第4张图片

图 4-3 4×4矩阵键盘连接电路图

4.4 LCD12864显示电路

LCD12864液晶显示模块采用总线并行方式与STC89C52RC单片机通信。通过分析LCD12864液晶显示模块读写操作时序图,写指令时只要单片机给LCD12864液晶显示模块的RS端使能高电平、RW和EN端使能为低电平,就可以把指令数据送到D0~D7;写数据时;写数据时:LCD12864液晶显示模块的RS、RW和EN都要使能为低电平,就可以把数据送到D0~D7用以显示出来。同时要给LCD12864液晶显示模块的对比度
引脚接上一个电位器,用于调节液晶显示器对比度。12864显示连接电路如4-4所示。

基于51单片机的电子秤设计_第5张图片

图 4-4 LCD12864显示连接电路图

部分程序展示:

#include  

#include

#include

#include

#include

#include

#define MAX 3         宏定义,单价最大输入3位数

sbit led=P3^2; 超重指示灯

uchar key;       储存按键值   

double price=0;      储存0时单价

double prices=0;      储存最终单价

double pricess=0;    储存最终总价

bit price_f=0;       记录输入单价标志

bit price_w=0;       记录输入单价完成标志

bit dian_f=0;         小数单价标志

bit dian_w=0;       

uchar n=0;            

uchar z_s[9]="        \0";

uchar wei=0;          

void clear_data()

{

      uchar i;

      for(i=wei;i<8;i++)

             z_s[i]=' ';

}

/********************************************************

void fixed_display()

{        

      LCD12864_display_string(0,1,"重量: "); 

      LCD12864_display_string(0,2,"单价: 0 ");

      LCD12864_display_string(0,3,"总价: ");

      LCD12864_display_string(0,4,"合计: ");

      LCD12864_display_string(7,1,"g ");

      LCD12864_image3216(6,2,ASI);           

      LCD12864_display_string(7,3,"元");

      LCD12864_display_string(7,4,"元");

}

void chuli()

{

      if(key<=9)//判断当前按下是否为0~9的数字键

      {

             if((price_f==1&&price_w==0&&n

             {

                    if(dian_f==0)                

                    {

                           if(price==0)       

                           {

                                  price=key;     

                                  n=1;                    

                           }

                           else                     

                           {

                                  price=price*10+key;

                                  n++;                          

                           }

                           if(n==MAX)                    

                                  price_w=1;                       

                    }

                    else                            

                    {                                         

                           price=price+(float)key/10;

                           dian_w=1;                          

                           price_w=1;                       

                    }                         

             }

      }

      if(key=='.')

      {           

             if(price_f==1&&dian_f==0)

                    dian_f=1;

      }

      if(key=='Q')

      {

             if(price_f==0)                  

                    init_val=fil(3);         

      } 

      if(key=='D')

      {

              price_f=1;                      

              LCD12864_display_string(3,2,"        ");

      }

      if(key=='T')                       

      {

              if(price_f==1&&price!=0)

              {

                   if(dian_f==1)            

                    {

                           price_w=0;

                           dian_w=0;          

                           dian_f=0;

                           price=(ulong)price;  

                           LCD12864_display_string(3,2,"        ");

                    }

                    else                       

                    {

                           n--;              

                           price_w=0;                

                           price=(ulong)price/10;

                           LCD12864_display_string(3,2,"        ");

                    }

              }

              else

                     if(price_f==0)

                     {

                           prices=0;

                            LCD12864_display_string(3,2,"        ");

                           pricess=0;

                            LCD12864_display_string(3,4,"        ");

                     }

      }

      if(key=='C')

      {

             if(price_f==0&&value<=10000)

             {

                    pricess+=(double)value/1000*prices;       

                    wei=sprintf(z_s,"%0.1f",(double)pricess);

                    clear_data();                                            

                    LCD12864_display_string(3,4,z_s);       

             }

      }

      if(key=='=')

      {

             if(price_f==1)      

             {    

                     prices=price;

                     price_f=0;  

                     price=0;

                     n=0;

                     price_w=0;

                     dian_f=0;

                     dian_w=0;

          }

      }

}

void main()

{

      LCD12864_init();       

      LCD12864_display_string(0,2,"欢迎使用电子秤. ");

      init_val=fil(30);                     

      while(ii>=8000)                            

      {

             LCD12864_clear12864();                    

             LCD12864_display_string(2,1,"☆警告☆");       

             LCD12864_display_string(1,2,"未检测到模块");

             LCD12864_display_string(0,3,"关闭电源后检测下");

             LCD12864_display_string(0,4,"HX711 是否插接好");       

      }

      init_val=fil(10);  调用一个fil函数,给了个参数值是10,给了个返回值,init_val

      write_com(0x01); 

      LCD12864_clear12864();     

      fixed_display();                      

      while(1)                                      

      {

             if(price_f==0)                     

             {

                    value=fil(3);        

                    if(value

                           value=(init_val-value)/357.53;

                    else

                    {

                           value=0;                    

                           led=1;                        

                    }

                    if(value<=5000)       

                    {

                           led=1;            

                        wei=sprintf(z_s,"%ld",(ulong)value);

                           clear_data();             

                           LCD12864_display_string(3,1,z_s);

                           wei=sprintf(z_s,"%0.1f",(double)value/1000*prices);

                           clear_data();             

                           LCD12864_display_string(3,3,z_s);

                    }

                    else

                    {

                           led=0;

                           LCD12864_display_string(3,1,"超重    ");

                    }    

             }

             key=keyscan()

             if(key!=0xff)

             {

                    chuli();

                    if(price_f==1)

                    {

                           if(dian_f==1)

                           {

                                  wei=sprintf(z_s,"%0.1f",price);      

                                  clear_data();                                     

                                  LCD12864_display_string(3,2,z_s); 

                                  LCD12864_clear3216(6,2);

                           }

                           else

                           {

                                  wei=sprintf(z_s,"%ld",(ulong)price);  

                                  clear_data();                                      

                                  LCD12864_display_string(3,2,z_s);  

                                  LCD12864_clear3216(6,2);   

                           }

                    }

                    else

                    {

                           wei=sprintf(z_s,"%0.1f",prices);     

                           clear_data();                                            

                           LCD12864_display_string(3,2,z_s);        

                           LCD12864_image3216(6,2,ASI);            

                    }                 

             }                 

      }

}

需要完整资料可在我的资源里下载,内容包括:

基于51单片机的电子秤设计_第6张图片

 基于51单片机的电子秤设计_第7张图片

 可以加入我的纷传圈子,里面有资源压缩包的百度网盘下载地址及提取码。

纷传点击用微信打开即可,过程有点繁琐请见谅。

你可能感兴趣的:(基于51单片机的设计,大数据,1024程序员节)