基于51单片机的HX711模块

2023-11-10

(一)项目介绍

基于51单片机的HX711称重计,最大称重量为5kg,并且在LCD1602上显示数值,可设置称重物品单价,称重精度可由按键key调节。误差可达0。传感器在某宝上买的,需要可以找我拿连接。

(二)HX711简介

HX711是一款专为高精度电子秤而设计的24位A/D转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。降低了电子秤的整机成本,提高了整机的性能和可靠性。该芯片与后端MCU 芯片的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道A 或通道B,与其内部的低噪声可编程放大器相连。通道A 的可编程增益为128 或64,对应的满额度差分输入信号幅值分别为±20mV或±40mV。通道B 则为固定的32 增益,用于系统参数检测。芯片内提供的稳压电源可以直接向外部传感器和芯片内的A/D 转换器提供电源,系统板上无需另外的模拟电源。芯片内的时钟振荡器不需要任何外接器件。上电自动复位功能简化了开机的初始化过程。

(三)芯片管脚图以及功能

在这里插入图片描述
管脚功能:

1 VSUP 电源 稳压电路供电电源: 2.6 ~ 5.5V(不用稳压电路时应接AVDD)
2 BASE 模拟输出 稳压电路控制输出(不用稳压电路时为无连接)
3 AVDD 电源 模拟电源: 2.6 ~ 5.5V
4 VFB 模拟输入 稳压电路控制输入(不用稳压电路时应接地)
5 AGND 地 模拟地
6 VBG 模拟输出 参考电源输出
7 INA- 模拟输入 通道 A 负输入端
8 INA+ 模拟输入 通道 A 正输入端
9 INB- 模拟输入 通道 B 负输入端
10 INB+ 模拟输入 通道 B 正输入端
11 PD_SCK 数字输入 断电控制(高电平有效)和串口时钟输入
12 DOUT 数字输出 串口数据输出
13 XO 数字输入输出 晶振输入(不用晶振时为无连接)
14 XI 数字输入 外部时钟或晶振输入,0: 使用片内振荡器
15 RATE 数字输入 输出数据速率控制,0: 10Hz; 1: 80Hz
16 DVDD 电源 数字电源: 2.6 ~ 5.5V

(四)HX711原理图

该图为HX711相关部分的PCB原理图
在这里插入图片描述

(五)HX711配置代码

记得配置DOUT和SCK端口。不要复用了就OK。最后把HX711的VCC和GND连接到单片机,配置端口相应连接上就可以了。

#include "HX711.h"
//****************************************************
//延时
//****************************************************
sbit HX711_DOUT=P1^4; 
sbit HX711_SCK=P1^5;
void Delay__hx711_us(void)
{
	_nop_();
	_nop_();
}
//****************************************************
//读取HX711
//****************************************************
unsigned long HX711_Read(void)	//增益128
{
	unsigned long count; 
	unsigned char i; 
  	HX711_DOUT=1; 
	Delay__hx711_us();
  	HX711_SCK=0; 
  	count=0; 
  	while(HX711_DOUT); 
  	for(i=0;i<24;i++)				
	{ 
	  	HX711_SCK=1; 
	  	count=count<<1; 
		HX711_SCK=0; 
	  	if(HX711_DOUT)
			count++; 
	} 
 	HX711_SCK=1; 
    count=count^0x800000;//第25个脉冲下降沿时,转换数据
	Delay__hx711_us();
	HX711_SCK=0;  
	return(count);
}

(六)main函数部分主要代码

1.配置定时器

//定时器T0初始化
void Timer0_Init()
{
	ET0 = 1;        //允许定时器0中断
	TMOD = 1;       //定时器工作方式选择
	TL0 = 0xb0;     
	TH0 = 0x3c;     //定时器赋予初始值
	TR0 = 1;        //启动定时器
}

//定时器0中断
void Timer0_ISR (void) interrupt 1 using 0
{
	uchar Counter;
	TL0 = 0xb0;
	TH0 = 0x3c;     //定时器赋予初值

	//每0.5秒刷新重量
    Counter ++;
    if (Counter >= 10)
    {
       FlagTest = 1;
	   Counter = 0;
    }
}

2.按键去皮以及精度加减操作

void KeyPress()
{
	if(ROW1==0)   //去皮键
	{
		Delay_ms(5);
		if(ROW1==0)
		{
//			Get_Maopi();
			if(qupi==0)
			qupi=Weight_Shiwu;
			else
			qupi=0;
			Buzzer=0;
			Delay_ms(50);
			Buzzer=1;	
			while(ROW1==0);
		}
	}
	if(ROW2==0)	   //加
	{
		Delay_ms(5);
		if(ROW2==0)
		{
			while(!ROW2)
			{
				key_press_num++;
				if(key_press_num>=100)
				{
					key_press_num=0;
					while(!ROW2)
					{
						if(GapValue<10000)
						GapValue+=10;
						Buzzer=0;
						Delay_ms(10);
						Buzzer=1;
						Delay_ms(10);
						Get_Weight();
					}
				}
				Delay_ms(10);
			}
			if(key_press_num!=0)
			{
				key_press_num=0;
				if(GapValue<10000)
				GapValue++;
				Buzzer=0;
				Delay_ms(50);
				Buzzer=1;
			}
			write_eeprom();		
		}
	}
	if(ROW3==0)  //减
	{
		Delay_ms(5);
		if(ROW3==0)
		{
			while(!ROW3)
			{
				key_press_num++;
				if(key_press_num>=100)
				{
					key_press_num=0;
					while(!ROW3)
					{
						if(GapValue>1)
						GapValue-=10;
						Buzzer=0;
						Delay_ms(10);
						Buzzer=1;
						Delay_ms(10);
						Get_Weight();
					}
				}
				Delay_ms(10);
			}
			if(key_press_num!=0)
			{
				key_press_num=0;
				if(GapValue>1)
				GapValue--;
				Buzzer=0;
				Delay_ms(50);
				Buzzer=1;
			}
			write_eeprom();			   //保存数
		}
	}
}

3.称重模块

void Get_Weight()
{
	Weight_Shiwu = HX711_Read();
	Weight_Shiwu = Weight_Shiwu - Weight_Maopi;		//获取净重
	
	Weight_Shiwu = (unsigned int)((float)(Weight_Shiwu*10)/GapValue)-qupi; 	//计算实物的实际重量															
	if(Weight_Shiwu >= 5000)		//超重报警
	{
		Buzzer = !Buzzer;	
		LED=!LED;
		LCD1602_write_com(0x80+0x40+8);
	   LCD1602_write_word("--.---");
	}
	else
	{
		if(Weight_Shiwu==0)
		LED=0;
		else if(Weight_Shiwu>0)
		LED=1; 
		Buzzer = 1;
		Display_Weight();
	}
}

4.主函数

void main()
{
	init_eeprom();  //开始初始化保存的数据
	Init_LCD1602();									//初始化LCD1602
   EA = 0;
   Timer0_Init();
   //初始化完成,开启中断
   EA = 1;
	
//	Get_Maopi();
	LCD1602_write_com(0x80);						//LCD上显示位置设置
   LCD1602_write_word(" welcome to use ");	//  
   LCD1602_write_com(0x80+0x40);						//LCD上显示位置设置
   LCD1602_write_word("Electronic Scale");
   Delay_ms(2000);
   Get_Maopi();
   LCD1602_write_com(0x80);						//LCD上显示位置设置
   LCD1602_write_word("The Weight:     ");
   LCD1602_write_com(0x80+0x40);				//LCD上显示位置设置
   LCD1602_write_word("         0.000kg");
//	Get_Maopi();				//称毛皮重量

	while(1)
	{
//每0.5秒称重一次
		if (FlagTest==1)
		{
			Get_Weight();
			FlagTest = 0;
		}	 
		KeyPress();
	}
}

LCD1602的配置参考我另一篇文章
望各位大佬指出不足之处,感激不尽!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于51单片机的HX711模块 的相关文章

  • Windows防火墙配置(允许某个网段和部分IP访问某个端口)

    1 win R 2 gpedit msc 3 计算机配置 Windows设置 安全设置 IP安全策略 在本地计算机 4 创建IP安全策略 5 配置IP筛选器列表 筛选器操作 6 分配 https img2018 cnblogs com bl
  • Transformers使用教程

    模型参数下载 数据集查找 Transformers中文使用说明 Huggingface 超详细介绍 知乎 Hugging Face 的 Transformers 库快速入门 文档说明 Transformers 提供文本相关的预训练模型 Di

随机推荐

  • (一)linux系统安装——从0开始大数据开发实战:电影推荐系统(scala版)

    参考资源 厦大实验室博客http dblab xmu edu cn blog 大数据基础编程 实验和案例教程 林子雨 linux版本 ubuntu ubuntukylin 16 04 desktop amd64 https pan baid
  • OpenCV三维图像的创建和数据遍历

    创建一个如图所示的3 X 4 X 6 三维矩阵 include
  • 学习iot_小熊派IoT开发板系列教程正式发布——免费学习

    小宅按 小熊派开源社区针对小熊派IoT开发板首次规划了小熊派未来的系列教程 从基础到进阶的设计 可适应具有不同基础的开发者 通过该系列教程的学习 开发者能够轻松掌握IoT产品的开发 该系列教程包括单片机基础 LiteOS操作系统基础 通信外
  • [第五空间 2021]pklovecloud

    除了按部就班的根据代码来写序列化
  • 42 访问者模式(Visitor模式)详解

    行为型模式 模板方法 Template Method 模式 策略 Strategy 模式 命令 Command 模式 职责链 Chain of Responsibility 模式 状态 State 模式 观察者 Observer 模式 中介
  • stm32---基本定时器(TIM6,TIM7)

    STM32F1的定时器非常多 由两个基本定时器 TIM6 TIM7 4个通用定时器 TIM2 TIM5 和两个高级定时器 TIM TIM 组成 基本定时器的功能最为简单 类似于51单片机内定时器 通用定时器是在基本定时器的基础上扩展而来 增
  • dump文件分析工具_jvm系列:dump文件深度分析

    JVM dump java内存dump是jvm运行时内存的一份快照 利用它可以分析是否存在内存浪费 可以检查内存管理是否合理 当发生OOM的时候 可以找出问题的原因 那么dump文件的内容是什么样的呢 我们一步一步来 获取JVM dump文
  • super()

    super 关键字 关键字的理解 父类中定义了该方法 但是子类中重写了该方法 使用super来修饰这个方法 在调用的时候调用父类的方法 super关键字的使用 1 super理解为父类 2 super可以用来调用 属性方法和构造器 3 su
  • 【Maven】Maven slf4j-api 出现 NoClassDefFoundError:org/slf4j/event/LoggingEvent

    1 背景 程序偶然报错这个 然后我查找了一下 发现这个包是1 7 7版本的 然后我想知道那个版本加入了这个东东 于是去查了一下 可以发现 在1 7 14版本之前都没有和这个包 1 7 14之后就全都有了 换个版本就好了
  • 【速度收藏】20个常用的Python技巧,太赞啦

    Python的可读性和简单性是其广受欢迎的两大原因 本文介绍20个常用的Python技巧来提高代码的可读性 并能帮助你节省大量时间 下面的技巧将在你的日常编码练习中非常实用 1 字符串反转 使用Python切片反转字符串 Reversing
  • 02-express安装apidoc生成接口文档

    02 express安装apidoc生成接口文档 1 安装 npm i apidoc 2 在项目根目录下创建 apidoc json name news是项目接口文档 version 0 1 0 description 新闻接口文档 tit
  • SpringCloud之Feign传递Json参数(个人使用)

    SpringCloud之Feign传递Json参数 个人使用 Client端 启动类 SpringBootApplication EnableDiscoveryClient EnableFeignClientspublic class Fe
  • 条款11:优先选用删除函数,而非private 未定义函数

    使用场景 比如在自定义类中 为了阻止其他程序员使用 拷贝构造 等函数 我们常用的用法 将该函数定义为private 不去定义只是声明 或者delete 区别 区别一 delete 可以修饰任何函数 private 只能修饰类 类对象 的成员
  • myeclipse java错误提示_myeclipse常见错误集锦 及解决方案

    1 An internal error occurred during Add Deployment Container with path org eclipse jdt launching JRE CONTAINER org eclip
  • vcxsrv连linux黑屏,通过 VcXsrv 在 WSL2 上使用图形化界面(xfce4)

    当然网络上已经有很多相关教程了 但是对于我的情况那些方法都不完全正确以至于我不能使用图形化界面 所以如果你查了很多方法也不能使用的话可以看看这篇 这是我的系统参数 开门见山 启动 VcXsrv 在 Windows 上下载 VcXsrv 并安
  • 词向量实践(gensim)

    词向量训练步骤 分词并去停用词 词频过滤 训练 项目完整地址 https github com cyandn practice tree master Word2Vec gensim中Word2Vec参数解释 主要参数介绍如下 senten
  • 基于Matlab的变压器铁芯截面优化设计

    基于Matlab的变压器铁芯截面优化设计 前言 优化思路 Matlab程序运行结果 结果分析 代码 前言 变压器是电力系统中非常重要的设备 在变压器设计过程中 给定的铁心直径条件下 铁心截面积越大 填充率越高 变压器经济指标越好 因此铁心截
  • WIN10 编译ffmpeg(包含ffplay)

    1 安装MSYS2 Win10 搭建MSYS2环境 cloud yq的博客 CSDN博客 2 编译SDL SDL是编译生成ffplay的基础 不需要生成ffplay可不编译SDL 1 下载地址 https www libsdl org do
  • Mall谷粒商城(基础篇的开发)

    项目简介 Mall商城项目致力于打造一个完整的大型分布式架构的电商平台 采用先阶段流行的前后端分离模式编写 Mall商城是一套电商项目 包括前台的商城系统以及后台管理系统 基于SpringCloud SpringCloud Alibaba
  • 基于51单片机的HX711模块

    一 项目介绍 基于51单片机的HX711称重计 最大称重量为5kg 并且在LCD1602上显示数值 可设置称重物品单价 称重精度可由按键key调节 误差可达0 传感器在某宝上买的 需要可以找我拿连接 二 HX711简介 HX711是一款专为