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

硬件设计

称重传感器感应被测重力,输出微弱的毫伏级电压信号。该电压信号经过电子秤专用模拟/数字(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_string(5,76,“。”);

//显示小数部分

int2str(j,str1);

if (j《10)

{

display_GB2312_string(5,84,“0”);

display_GB2312_string(5,92,str1);

}

else

{

display_GB2312_string(5,84,str1);

}

}

//显示重量,单位kg,两位整数,三位小数

void Display_Weight()

{

unsigned int i,j;

display_GB2312_string(3,60,“ ”); //weight单位是g

i = weight/1000; //得到整数部分

j = weight - i*1000;//得到小数部分

int2str(i,str1);

if (i》=10)

{

display_GB2312_string(3,60,str1);

}

else

{

display_GB2312_string(3,68,str1);

}

display_GB2312_string(3,76,“。”);

int2str(j,str1);

if (j《10) else if (j《100)

{

display_GB2312_string(3,84,“0”);

display_GB2312_string(3,92,str1);

}

else

{

display_GB2312_string(3,84,str1);

}

}

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

void Display_Money()

{

unsigned int i,j;

display_GB2312_string(7,44,“ ”);

if (money》999999) //超出显示量程

{

display_GB2312_string(7,44,“-------”);

return;

}

display_GB2312_string(7,44,str1);

}

else if (i》=100)

{

display_GB2312_string(7,52,str1);

}

else if (i》=10)

{

display_GB2312_string(7,60,str1);

}

else

{

display_GB2312_string(7,68,str1);

}

//显示小数点

display_GB2312_string(7,76,“。”); //显示小数部分

int2str(j,str1);

if (j《10)

{

display_GB2312_string(7,84,“0”);

display_GB2312_string(7,92,str1);

}

else

{

display_GB2312_string(7,84,str1);

}

}

//数据初始化

void Data_Init()

{

price = 0;

DotPos = 0;

beep = 1;

alert = 1;

}

//管脚配置 void Port_Init()

{

}

//定时器0初始化

void Timer0_Init()

{

ET0 = 1; //允许定时器0中断 TMOD = 1;

//定时器工作方式选择 TL0 = 0x06;

TH0 = 0xf8; //定时器赋予初值

TR0 = 1; //启动定时器

}

//定时器0中断

void Timer0_ISR (void) interrupt 1 using 0

{

TL0 = 0x06;

TH0 = 0xf8; //定时器赋予初值

//每0.5秒钟刷新重量

Counter ++;

if (Counter 》= 200)

{

FlagTest = 1;

Counter = 0;

}

}

//===============main program===================//

void main(void)

{

Rom_CS=1;

initial_lcd();

EA = 0;

Data_Init();

Port_Init();

Timer0_Init(); //初始化完成,开中断

EA = 1; //背光

LedA = 1;

clear_screen(); //clear all dots

display_GB2312_string(1,1,“电子秤初始化。。。。”);

To_Zero();

display_GB2312_string(1,1,“电子秤初始化成功”);

display_GB2312_string(3,1,“重量: kg”);

display_GB2312_string(5,1,“单价: 元”);

display_GB2312_string(7,1,“金额: 元”);

Display_Price();

while(1)

{

//每0.5秒称重一次

if (FlagTest==1)

{

//称重,得到重量值weight,单位为g

AdVal=ReadCount();

weight=FullScale-AdVal/1000;

if (weight》0x8000) weight=0;

weight=10000*weight/FullScale;

weight=weight*RATIO; //如果超量程,则报警

if (weight 》= 10000)

{

beep = 0;

alert = 0;

display_GB2312_string(3,60,“------”);

display_GB2312_string(7,44,“--------”);

}

//如果不超量程

else

{

beep = 1;

alert = 1; //显示重量值

Display_Weight();

//如果单价设定好了,则计算价格

if (FlagSetPrice == 1)

{

money = weight*price/1000; //money单位为分

//显示总金额

Display_Money();

}

else

{

display_GB2312_string(7,44,“ ”);

}

//清测试标志

FlagTest = 0;

}

}

//获取按键

keycode = Getkeyboard(); //有效键值0-15

if ((keycode《16)&&(FlagKeyPress==0))

{

FlagKeyPress = 1;

KeyPress(keycode);

FlagKeyPress = 0;

}

delay(20);

}

}

用单片机c51电子秤的c语言,基于hx711的51单片机电子秤设计相关推荐

  1. c51中断优先级c语言,基于proteus的51单片机开发实例(14)中断嵌套和中断优先级...

    1. 基于proteus的51单片机开发实例(14)中断嵌套和中断优先级 1.1. 实验目的 在前面实例中我们已经学习了51单片机的定时器/计数器中断,外部中断,通过这些实例,知道了中断电路的设计,中 ...

  2. 用单片机c51电子秤的c语言,基于51单片机的电子秤系统设计

    微机原理论文第八篇:基于51单片机的电子秤系统设计 摘要:本文主要分析51单片机下的数字电子秤.在设计过程中,这种电子秤具体包括电源.传感器.蓝牙.转换器.单片机.键盘.开关.显示器等组成部分,在实践 ...

  3. c++程序设计_基于proteus的51单片机开发实例30-模块化程序设计

    1. 基于proteus的51单片机开发实例30-模块化程序设计 1.1. 实验目的 模块化程序设计 不知不觉我们的51单片机开发实例已经进行到第三十篇了,是时候进行一个总结和反思了,总结什么?反思什 ...

  4. 最简单DIY基于C#和51单片机上下位机一体化的PCA9685舵机控制程序

    51单片机物联网智能小车系列文章目录 第一篇:最简单DIY的51蓝牙遥控小车设计方案 第二篇:最简单DIY串口蓝牙硬件实现方案 第三篇:最简单DIY蓝牙PS2遥控器控制蓝牙智能小车 第四篇:最简单DI ...

  5. C语言极速学习开发——51单片机入门编程之使用KeilC51进行代码编译(点亮你心中学习的精神之灯-下)

    系列文章目录 提示:本文章为系列文章,系列文章的所有文章的目录后期会时刻更新,喜欢的朋友请收藏好 <第一章 C语言极速学习开发--51单片机入门编程之使用KeilC51进行代码编译(点亮你心中学 ...

  6. hc05与单片机连接图_基于proteus的51单片机开发实例(13)-LED指示那个按键被按下

    1. 基于proteus的51单片机开发实例(13)-LED指示那个按键被按下 1.1. 实验目的 本实例将实现两路外部中断的检测和识别,让我们能够更好地理解51单片机的外部中断以及中断优先级的概念. ...

  7. 基于Tiny-51操作系统的51单片机温度测控系统设计

    文章目录 基于Tiny-51操作系统的51单片机温度测控系统设计 一.设计题目 二.设计要求 三.设计作用及目的 四.硬件设计 五.软件流程 六.调试界面 七.心得体会 八.程序源码 基于Tiny-5 ...

  8. 基于ESP8266与51单片机的震动报警器(车辆报警器)(简单向)

    基于ESP8266与51单片机的震动报警器(车辆报警器) 前言 笔者是桂工通信工程的一名在读大学生,在进行课程设计的时候,想要去做一个可以在手机上进行消息提醒的报警器.在传统的声光报警器上有所突破,可 ...

  9. hc05与单片机连接图_基于proteus的51单片机开发实例37-DAC0832

    学习手记 1. 基于proteus的51单片机开发实例37-DAC0832 1.1. 实验目的 之前我们学习了数模转换芯片DAC0808,今天我们继续学习另一种D/A转换芯片DAC0832. 1.2. ...

最新文章

  1. 在字典里添加项_Python 字典(Dictionary)
  2. ubuntu使用rabbitmq的一些基本命令
  3. Python OpenCV实现鼠标画框
  4. 工厂设计模式----python版本
  5. 微信 开发 图片 上传 阿里云 oss 服务器
  6. python环境变量的运用_Windows下python环境变量配置
  7. flutter将毫秒转为日期
  8. (转)VmWare下安装CentOS6图文安装教程
  9. oracle append 分区,insert append 到底扩展几个数据块?
  10. Servlet做Controller,实现一个类处理多个请求
  11. xmind 拖拽_XMind 2020
  12. Farrago for Mac 1.1.0 音频效果和音乐剪辑工具 破解版下载
  13. JS实现本地文件选择
  14. 谷歌翻译不能用,解决方案
  15. 《FLIPPED》(怦然心动)读书笔记
  16. Mapwingis添加图层,实现label
  17. mysql group 查询的替代_mysql group_concat替代或多行作为列
  18. 字节跳动2020秋招研发笔试题
  19. 实现变色TextView及ViewPager指示器(原来可以这么简单)
  20. 现代x64的APIC中断控制器架构

热门文章

  1. 美国多年提高网安预算分析
  2. 2018.7.26 日,第二节直播课,课堂笔记,安装centos和登陆,
  3. 可以读取html文件,javascript能读取本地文件吗?
  4. 在西电四年的小结和对小型机器人制作的总结(上)
  5. 罗斯蒙特T1056浊度计T1056-01-10-20-30-71
  6. html直角三角形怎么实现,CSS绘制三角形的实现代码(border法)
  7. turtle画画灵魂画手之海绵宝宝
  8. 低代码学习教程:通讯录支持批量导出导入
  9. 阿里巴巴私有化:B2B夕阳西下 马云布局大阿里
  10. 手把手教你如何破解无线网络密码(蹭网教程) .