51单片机电子秤(HX711模块 + LCD1602)

这篇具有很好参考价值的文章主要介绍了51单片机电子秤(HX711模块 + LCD1602)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

51单片机电子秤(HX711模块 + LCD1602)

(简单易懂)

1.---------------序
2.HX711测重模块
3.LCD1602显示模块
4.电子秤整体实现原理
5.模块升级>>去皮与还原
6.源代码

零.先来一个效果展示
51单片机电子秤(HX711模块 + LCD1602)
这里可以看到3个20g砝码加上去显示60g的重量
5个20g砝码加上去显示100g的重量,精度是比较准的
51单片机电子秤(HX711模块 + LCD1602)
51单片机电子秤(HX711模块 + LCD1602)

一.首先考虑如何把这样一个项目设计出来

1.明确目标
–做这样一个东西,我们需要实现怎样的效果–
2.思路清晰
–整个执行过程我门需要设计哪些事–
–整个执行过程我们要按照怎样的一个逻辑–
3.确保执行
–有效(花时间并不等于有效)的执行力是成功所必不可缺的–
4.总结收获
–在实现项目过程中我们学到了什么–
–以后应对不同的项目有哪些想法是可以通用的–

二.HX711测重模块原理

1.HX711模块可以看成由三个部分组成>>压力传感器,电压放大器,ad转换芯片

  压力传感器:感知物体重力,并转化为电压信号
  					 这里是0~5kg压力传感器,灵敏电压为1mv,
  				     即1kg重力产生1mv电压
  电压放大器:由于压力传感器产生电压太小,需要对电压信号放大
  					  这里用的是128倍电压增益
  ad转换芯片(24位):将模拟信号(放大后的电压值)转化为数字信号(ad值)

2.ad值转化为重力大小

  	假设重力为x kg,
  	ad = (x/5)*128*2^24*(5/5000),(满量程为5kg,128倍放大,精度为2^24)
  													(传感器满偏电压5mv,单片机为5v)
  	ad = 429496.7296x    >>    x = ad/429496.7296  (按g显示再乘1000即可)
//ad转化为重力大小公式,(float)将整除转化为小数运算,再将运算结果强制转化为无符号整型数值
Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/423.15);
//理论上是除以429.5,实际上存在误差(传感器曲线以及电压的微小误差),需要根据显示情况来调整这一数值

3.HX711时序图 & ad取值代码

51单片机电子秤(HX711模块 + LCD1602)

sbit HX711_DOUT = P2^1; 	//声明P2^1口接HX711数据线
sbit HX711_SCK = P2^0;		//声明P2^0口接HX711时钟线
unsigned long HX711_Read(void)
{
	unsigned long count; 	//存ad值
	unsigned char i; 
  	HX711_DOUT = 1; 	//数据端口拉高,参照时序图写
	_nop_();		//延时
	_nop_();
  	HX711_SCK = 0; 		//时钟端口拉低
  	count = 0;		//ad值初始化
  	for(i=0; i<24; i++)		//循环24次传数据,按位接收数据
	{ 
	  	HX711_SCK = 1; 		//准备转换数据
	  	count = count << 1; 	//向左移位,即向低位补0,空出最低位进行传值操作,如1<<1为10
		HX711_SCK = 0; 		//时钟脉冲下降延,数据开始转换
	  	if(HX711_DOUT)
			count++; 		//数据端为高则最低位+1,为1,数据端为低则最低位不变,为0(左移把最低位空出)
	} 
 	HX711_SCK = 1; 		//第25个脉冲延
    count = count^0x800000;		//异或输出原码
	_nop_();
	_nop_();
	HX711_SCK = 0;		//结束ad转换
	return(count);		//传出ad值
}

ad值以二进制补码输出

51单片机电子秤(HX711模块 + LCD1602)

这里用的是128倍增益A通道

51单片机电子秤(HX711模块 + LCD1602)

三.LCD1602液晶显示模块原理

引脚说明

51单片机电子秤(HX711模块 + LCD1602)

读写说明

51单片机电子秤(HX711模块 + LCD1602)

写指令/数据时序图

51单片机电子秤(HX711模块 + LCD1602)

1.写指令(发送写下的指令码给LCD1602并执行)

sbit LCD1602_RS = P3^5;
//sbit LCD1602_RW = P2^5;		//郭天祥51板LCDRW端直接接了地,故省略(就不能拉高不能读指令/数据操作)
sbit LCD1602_EN = P3^4;
void LCD1602_write_com(unsigned char com)		//声明指令参数
{
	LCD1602_RS = 0;
	Delay(10);
	LCD1602_EN = 1;
	P0 = com;		//生成指令
	Delay(10);
	LCD1602_EN = 0;
}

lcd1602指令表

51单片机电子秤(HX711模块 + LCD1602)

2.写数据(把数据写入LCD1602并显示)

void LCD1602_write_data(unsigned char dat)		//声明数据参数
{
	LCD1602_RS = 1;
	Delay(10);	
	P0 = dat;		//生成数据
	LCD1602_EN = 1;
	Delay(10);
	LCD1602_EN = 0;
}

3.写连续字符(字符串)

void LCD1602_write_word(unsigned char *s)
{
	while(*s>0)
	{
		LCD1602_write_data(*s);		//写指针位置处字符数据
		s++;		//指针++指向连续字符下一个位置
	}
}

4.LCD1602初始化

void Init_LCD1602()
{
	LCD1602_EN = 0;
	//LCD1602_RW = 0;			//设置为写状态
	LCD1602_write_com(0x38);		//显示模式设定
	LCD1602_write_com(0x0c);		//开关显示、光标有无设置、光标闪烁设置
	LCD1602_write_com(0x06);		//写一个字符后指针加一
	LCD1602_write_com(0x01);		//清屏指令
}

四.电子秤整体实现原理

1.HX711模块与51单片机的通信(获取到重量电压信号ad值传给单片机)
2.51单片机与LCD1602的通信(在LCD1602上显示ad值转换为的实际重量)

以下是如何显示重量值

/*0x80为移动光标到显示屏第一行首位,+0x40是光标到第二行首位,再+0x09是光标再往后挪九格,指令表中可查*/
LCD1602_write_com(0x80+0x49);	
/*取千位具体数字值,+0x30表示将该数字值转为ASCII码表地址,例int a=8,ASCII码表中8的地址为0x38,即a+0x30*/	
LCD1602_write_data(Weight_Shiwu%10000/1000 + 0X30);	
		LCD1602_write_com(0x80+0x49);		//光标移动第二行第九个位置
		LCD1602_write_data(Weight_Shiwu%10000/1000 + 0X30);		//千位
        LCD1602_write_data(Weight_Shiwu%1000/100 + 0X30);		//百位
        LCD1602_write_data(Weight_Shiwu%100/10 + 0X30);		//十位
        LCD1602_write_data(Weight_Shiwu%10 + 0X30);		//个位
		LCD1602_write_word(" g");		//显示单位克

五.模块升级>>去皮与还原

1.首先理解去皮的含义:
假如你有一个梨,你想知道它的重量,看看卖家有没有坑你,以后能不能再到这买梨,
可你觉得秤太脏了,秤一下梨都没有食欲不想吃了,灵光突然一闪想到可以用一个碗垫着秤,
想法不错可问题就来了,碗的重量怎么办呢,这时去皮的意义就出来了
先把碗放在秤盘上,这时显示屏显示的是碗的重量,小手一抖按一下去皮键,
碗的重量就没有了,显示屏显示0,这下可以安心秤梨了

2.去皮如何实现:

	I/O口声明&变量声明
sbit key1 = P3^6;		//声明按键1(去皮键)具体I/O口和单片机型号有关
sbit key2 = P3^7;		//声明按键2(还原键)
unsigned long Weight_Shiwu = 0;		//无符号长型变量存实物重量
unsigned long Weight_Maopi = 0;		//毛皮重量(相当于碗的重量)

先判断去皮键是否被按下

void Keyscan()
{
	if(key1 == 0)
		Delay(10);		//消抖
	if(key1 == 0){
		Get_Maopi();		//获取毛皮重量(相当于碗的重量)
		while(!key1);		//松手检测
	}
}

去皮键按下后,就可以获取毛皮重量(碗重量)了

void Get_Maopi()
{
	Weight_Maopi = HX711_Read();		//把ad值获取到
	Weight_Maopi = (unsigned int)((float)Weight_Maopi/423.15); 		//换算成真正的毛皮重量
}

将按键扫描放在主函数while(1)死循环的最开始,去皮键按下才执行
去皮键未按下就直接称重,跳过去皮环节

while(1)
	{
		Keyscan();
		Get_Weight();
		
		/*............*/
		
void Get_Weight()
{
	Weight_Shiwu = HX711_Read();		//把ad值获取到
	Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/423.15);			//换算成真正的实物重量
	Weight_Shiwu = Weight_Shiwu - Weight_Maopi;		//毛皮重量初始为0
}

3.如何还原去皮:
在按键扫描函数中再加一个还原按键
如果还原键按下,毛皮重量被初始化(置0)
就实现了还原去皮的效果

void Keyscan()
{
	if(key1 == 0)
		Delay(10);
	if(key1 == 0){
		Get_Maopi();
		while(!key1);
	}
	if(key2 == 0)
		Delay(10);
	if(key2 == 0){
		Weight_Maopi = 0;		//毛皮重量置0
		while(!key2);
	}
}

六.源代码及注释文章来源地址https://www.toymoban.com/news/detail-401570.html

#include<reg52.h>
#include <intrins.h>

/*I/O口声明*/
sbit LCD1602_RS = P3^5;
//sbit LCD1602_RW = P2^5;
sbit LCD1602_EN = P3^4;
sbit HX711_DOUT = P2^1; 
sbit HX711_SCK = P2^0;
sbit key1 = P3^6;
sbit key2 = P3^7;

/*全局变量定义*/
unsigned long Weight_Shiwu = 0;
unsigned long Weight_Maopi = 0;

/*函数声明*/
void Delay(unsigned int n);
void Init_LCD1602();
void LCD1602_write_com(unsigned char com);
void LCD1602_write_word(unsigned char *s);
void LCD1602_write_data(unsigned char dat);
unsigned long HX711_Read(void);
void Keyscan();
void Get_Maopi();
void Get_Weight();

int main()
{ 
	Init_LCD1602();		//LCD1602初始化
	LCD1602_write_com(0x80);		//移动光标到第一行首位
	LCD1602_write_word(" Dian Zi Cheng! ");		//显示 Dian Zi Cheng! 
	LCD1602_write_com(0x80 + 0x40);			//移动光标到第二行首位
	LCD1602_write_word("Weight :"),			//显示Weight :
	Delay(1000);		//1s延时
	while(1)
	{
		Keyscan();
		Get_Weight();	
			
		LCD1602_write_com(0x80+0x49);		//移动光标到第二行第九位
		LCD1602_write_data(Weight_Shiwu%10000/1000 + 0X30);		
        LCD1602_write_data(Weight_Shiwu%1000/100 + 0X30);
        LCD1602_write_data(Weight_Shiwu%100/10 + 0X30);
        LCD1602_write_data(Weight_Shiwu%10 + 0X30);
		LCD1602_write_word(" g");
	}
	return 0;
}

/*称实物重*/
void Get_Weight()
{
	Weight_Shiwu = HX711_Read();
	Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/423.15);
	Weight_Shiwu = Weight_Shiwu - Weight_Maopi;
}

/*延时子函数*/
void Delay(unsigned int n)
{
	int i, j;
	for(i=0; i<n; i++)
		for(j=0; j<110; j++);
}

/*写指令*/
void LCD1602_write_com(unsigned char com)
{
	LCD1602_RS = 0;
	Delay(10);
	LCD1602_EN = 1;
	P0 = com;
	Delay(10);
	LCD1602_EN = 0;
}

/*写数据*/
void LCD1602_write_data(unsigned char dat)
{
	LCD1602_RS = 1;
	Delay(10);	
	P0 = dat;
	LCD1602_EN = 1;
	Delay(10);
	LCD1602_EN = 0;
}

/*写连续字符(字符串)*/
void LCD1602_write_word(unsigned char *s)
{
	while(*s>0)
	{
		LCD1602_write_data(*s);
		s++;
	}
}

/*初始化LCD1602*/
void Init_LCD1602()
{
	LCD1602_EN = 0;
	//LCD1602_RW = 0;
	LCD1602_write_com(0x38);
	LCD1602_write_com(0x0c);
	LCD1602_write_com(0x06);
	LCD1602_write_com(0x01);
}

/*获取ad值*/
unsigned long HX711_Read(void)
{
	unsigned long count; 
	unsigned char i; 
  	HX711_DOUT = 1; 
	_nop_();
	_nop_();
  	HX711_SCK = 0; 
  	count=0;
  	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;
	_nop_();
	_nop_();
	HX711_SCK = 0;  
	return(count);
}

/*称毛皮重*/
void Get_Maopi()
{
	Weight_Maopi = HX711_Read();
	Weight_Maopi = (unsigned int)((float)Weight_Maopi/423.15); 
}

/*按键扫描*/
void Keyscan()
{
	if(key1 == 0)
		Delay(10);
	if(key1 == 0){
		Get_Maopi();
		while(!key1);
	}
	if(key2 == 0)
		Delay(10);
	if(key2 == 0){
		Weight_Maopi = 0;
		while(!key2);
	}
}

到了这里,关于51单片机电子秤(HX711模块 + LCD1602)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HX711 AD芯片详解电子秤制作oled显示(附:32源码)

    本文首先对HX711 AD芯片以及其使用方法进行了详细的介绍,然后介绍了全桥应变传感器,最后介绍了简易电子秤的制作方法。(文末附有32控制源码) HX711为一款包含前置放大器的24位AD转换芯片,内部集成了差分处理电路、稳压电源、片内时钟振荡器等,因此极大的简化了芯片外

    2024年02月13日
    浏览(24)
  • 基于单片机的智能数字电子秤proteus仿真设计

    一、系统方案 1、当电子称开机时,单片机会进入一系列初始化,进入1602显示模式设定,如开关显示、光标有无设置、光标闪烁设置,定时器初始化,进入定时器模式,如初始值赋值。之后液晶会显示Welcome To Use Electronic Scale,这是一个欢迎使用界面: 2、此电子秤是开机检测托

    2024年02月09日
    浏览(34)
  • STC15WProteus仿真HX711电子秤串口计价称重4x4键盘STC15W4K32S4

    STC15WProteus仿真HX711电子秤串口计价称重4x4键盘STC15W4K32S4 Proteus 仿真小实验: STC15WProteus仿真HX711电子秤串口计价称重4x4键盘STC15W4K32S4 功能: 硬件组成:STC15W4K32S4单片机 +LCD12864显示器+4x4矩阵键盘+HX711电子秤 1.单片机通过HX711读取称重传感器数据计算出重量,重量乘于单价可以

    2024年02月12日
    浏览(38)
  • 单片机毕业设计 stm32智能电子秤系统设计与实现 - 物联网 嵌入式

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月06日
    浏览(59)
  • K_A16_001 基于STM32等单片机驱动HX711称重模块 串口与OLED0.96双显示

    单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M HX711称重模块 STC89C52RC驱动HX711称重模块 串口与OLED0.96双显示 STM32F103C8T6 晶振8M/系统时钟72M HX711称重模块 STM32F103C8T6驱动HX711称重模块参数 串口与OLED0.96双显示 其他资料目录 直戳跳转 HX711参数 1.两路可选择差分输入

    2023年04月27日
    浏览(58)
  • STC 51单片机54——气压水压计HX710B 串口显示均值滤波+滑窗滤波

        //气压模块为红色模块,传感器型号未知,其信号放大器型号为HX710B // STC15W408AS 11.0592MHz 波特率9600,串口输出大气压强值 // STC15W408AS没有定时器1,所以用定时器2做波特率发生器 // 采用电脑USB供电会有很大的干扰,建议采用电池或者充电宝 #include \\\"reg52.h\\\" #define Download_co

    2024年02月05日
    浏览(32)
  • 电子模块|压力传感器模块HX711---硬件介绍与C51&&STM32驱动

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

    2024年02月14日
    浏览(47)
  • 51单片机项目(9)——基于51单片机的电子琴设计

    简易电子琴设计设计内容: 1.用矩阵键盘代表琴键,至少能弹出8个音符,分别是:音符1.23.4.,5,6,  2.键按下的时间长短表征节拍的长短,用蜂鸣器发出声音 3.数码管显示出当前音符 4.音量可调 (代码及其工程文件放在最后) 电路图如下: 51单片机电子琴是一种基于51单片机(

    2024年02月09日
    浏览(39)
  • 51单片机-电子密码锁

    实物演示效果: https://www.bilibili.com/video/BV1xh4y1K7uV/?vd_source=6ff7cd03af95cd504b60511ef9373a1d 电子密码锁的主要功能 1.按键设置6位密码,输入密码若密码正确,则锁打开。显示open! 2.密码可以自己修改(6位密码),必须是锁打开时才能改密。为防止误操作,修改密码得输入两次。

    2024年01月17日
    浏览(35)
  • 51单片机电子时钟(C语言)

     全部硬件电路分为四大部分: 控制模块51单片机; 显示模块LCD1602,由P0口控制; 计时模块DS1302,由P1口控制; 输入按键,由P3口控制。         实际设计硬件电路时应考虑到51单片机的电源、复位电路以及外接晶振,时钟芯片DS1302的备用电源等。 从1302的寄存器中读取数据

    2024年02月07日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包