微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 基于hx711的51单片机电子秤设计

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

时间:09-19 来源:互联网 点击:

  电子秤是采用现代传感器技术、电子技术和计算机技术一体化的电子称量装置,满足并解决现实生活中提出的"快速、准确、连续、自动"称量要求,同时有效地消除人为误差,使之更符合法制计量管理和工业生产过程控制的应用要求。

硬件设计

  称重传感器感应被测重力,输出微弱的毫伏级电压信号。该电压信号经过电子秤专用模拟/数字(A/D)转换器芯片hx711对传感器信号进行调理转换。HX711 采用了海芯科技集成电路专利技术,是一款专为高精度电子秤而设计的24 位A/D 转换器芯片,内置增益控制,精度高,性能稳定。HX711芯片通过2线串行方式与单片机通信。单片机读取被测数据,进行计算转换,再液晶屏上显示出来。

  矩阵键盘主要用于计算金额。当被测物体重量得到后,用户可以通过矩阵键盘输入单价,电子秤自动计算总金额并在液晶屏显示。电源系统给单片机、HX711电路及传感器供电。

  电子秤专用24位AD转换芯片HX711电路


  单片机STC89C52电路


  液晶屏电路

  矩阵键盘电路

  矩阵键盘可以显示0-9数字、小数点和五个功能键。键盘行扫描信号为ROW1—ROW4,列扫描信号为COL1—COL4。行信号为输入信号,低电平有效;列信号为输出信号。当没有键按下时,即使行扫描输入低电平信号,列信号仍为高电平;当行扫描为低电平并且有键按下时,相应的列输出低电平。该低电平信号可以定位至按下键的位置。

  声光报警电路

  当测量重量超过量程时,beep和alert给出低电平信号,驱动蜂鸣器鸣响,报警灯亮。

  电源电路

  电源采用USB接口供电,电源电压5V。同时,USB接口通过内含PL2303芯片的转换电路对单片机进行程序编写。

软件设计

  主程序使用了定时器,用来实现每0.5秒称重一次的功能,流程图如下:

       

  时钟中断程序流程图                                 键盘扫描程序流程图               

  主程序流程图

主程序编写

  下面介绍main.c主程序编写,其他程序略。

  (1) 头文件和一些宏定义

  #include 《reg52.h》

  #include 《intrins.h》

  #include 《string.h》

  #include "lcd.h"

  #include "hx711.h"

  #include "keyboard.h"

  //定义量程系数

  #define RATIO 2114/1623

  (2) 管脚、常量、变量定义

  //定义标识

  volaTIle bit FlagTest = 0;

  //定时测试标志,每0.5秒置位,测完清0

  volaTIle bit FlagKeyPress = 0; //有键按下标志,处理完毕清0

  volaTIle bit FlagSetPrice = 0; //价格设置状态标志,设置好为1

  //管脚定义 sbit LedA = P2^2;

  sbit beep = P1^0;

  sbit alert = P1^1;

  //显示用变量 int Counter;

  uchar idata str1[6] = "000000";

  int i, iTemp; //称重用变量

  unsigned long idata FullScale; //满量程AD值/1000

  unsigned long AdVal; //AD采样值

  unsigned long weight; //重量值,单位g

  unsigned long idata price; //单价,长整型值,单位为分

  unsigned long idata money; //总价,长整型值,单位为分

  //键盘处理变量

  uchar keycode; uchar DotPos;

  //小数点标志及位置

  (4) 各子程序

  //整型转字符串的函数,转换范围0--65536 void int2str(int x, char* str)

  {

  int i=1;

  int tmp=10;

  while(x/tmp!=0)

  {

  i++;

  tmp*=10;

  }

  tmp=x;

  str[i]=‘\0’;

  while(i》1)

  {

  str[--i]=‘0’+(tmp%10);

  tmp/=10;

  }

  str[0]=tmp+‘0’;

  }

  //重新找回零点,每次测量前调用

  void To_Zero() {

  FullScale=ReadCount()/1000;

  price=0;

  }

  //显示单价,单位为元,四位整数,两位小数

  void Display_Price()

  {

  unsigned int i,j;

  display_GB2312_string(5,44," ");

  i = price/100; //得到整数部分

  j = price - i*100;//得到小数部分

  int2str(i,str1); //显示整数部分

  if (i》=1000)

  {

  display_GB2312_string(5,44,str1);

  }

  else if (i》=100)

  {

  display_GB2312_string(5,52,str1);

  }

  else if (i》=10)

  {

  display_GB2312_string(5,60,str1);

  }

  else

  {

  display_GB2312_string(5,68,str1);

  }

  //显示小数点

display_GB2312

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top