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

(简单易懂)

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

零.先来一个效果展示

这里可以看到3个20g砝码加上去显示60g的重量
5个20g砝码加上去显示100g的重量,精度是比较准的

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

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取值代码

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为10HX711_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值以二进制补码输出

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

三.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指令表

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;     //毛皮重量置0while(!key2);}
}

六.源代码及注释

#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)相关推荐

  1. 基于51单片机驱动MPU6050模块(LCD1602显示)

    @TOC 一.简介 MPU-6050集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP,可用IIC接口连接一个第三方的数字传感器.MPU-6050对陀螺仪和加速度计分 ...

  2. 【034】基于51单片机的HX711电子秤Proteus仿真设计

    一.压缩包资料内容 (1).基于51单片机的HX711电子秤proteus仿真设计一份: (2).基于51单片机的HX711电子秤proteus仿真设计keli源代码一份: (3).基于51单片机的H ...

  3. 基于51单片机的电子钟万年历LCD1602显示

    本设计是51单片机的电子钟万年历LCD1602显示(proteus仿真+程序+报告+器件清单) 仿真图proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 编号C0002 ...

  4. 【Proteus仿真】51单片机制作简易计算器+ LCD1602显示

    [Proteus仿真]51单片机制作简易计算器+ LCD1602显示 Proteus仿真效果演示 程序代码 #include<reg51.h> //头文件 #define uint uns ...

  5. 单片机与gsm通信c语言,实现51单片机与GSM模块通信介绍

    51单片机与GSM模块实现通信 1.检测串口线的好坏 1)将串口线插在电脑上,用短路子短接串口的2脚和3脚 2)打开串口调试助手 3)点击自动发送,在自动发送的窗口中随便发个数据,看看能不能接收到若能 ...

  6. 51单片机通过ESP8266模块与手机进行通讯

    51单片机通过ESP8266模块与手机进行通讯 WIFI 工作方式: 1.AP模式 提供热点 2.Station模式 作为设备接入热点 3.同时支持 配置 通过USB转TTL模块把ESP8266模块和 ...

  7. 天问51单片机结合WIFI模块上传温度数据到巴法云平台

    目 录 一.前言 二.项目准备 三.设计思路 四.项目主要代码 五.项目成果 六.项目不足 一.前言: 继前一个项目<天问51单片机结合WIFI模块上传温度数据到TCP服务器>,本次项目是 ...

  8. 基于51单片机驱动ADXL346 (LCD1602显示)

    基于51单片机驱动ADXL346 (LCD1602显示) 一.ADXL346传感器介绍 1.实物图 2.产品说明 3.电气参数 4.通信协议 二.驱动代码 1.引脚定义 2.初始化函数 3.主函数 三 ...

  9. 【Proteus仿真】51单片机+SHT11温湿度传感器+LCD1602显示

    [Proteus仿真]51单片机+SHT11温湿度传感器+LCD1602显示 Proteus仿真 主程序代码 /*-------------------------------SHT11湿度测量 -- ...

最新文章

  1. PHP机器学习库php-ml的简单测试和使用
  2. Leaflet中使用leaflet-sidebar插件实现侧边栏效果
  3. gRPC客户端创建和调用原理解析
  4. centos编译apache php mysql,在CentOS6.7中编译安装 apache php mysql
  5. python调试神器_你必须拥有的Python调试神器
  6. Android View的绘制流程简述 Android自定义View(一)
  7. C# Winform编程ListBox之DrawItem事件
  8. LINUX下安装svn客户端
  9. 软件构造之java类图
  10. 【UE编辑器怎么添加新的语法高亮】
  11. 阿里行癫分享“从技术支撑业务、技术赋能业务,到技术创建新商业”
  12. 《东周列国志》第十四回 卫侯朔抗王入国 齐襄公出猎遇鬼
  13. csgo如何旋转跳?如何连跳
  14. 使用MACD指标在上证指数000001.SH上开发单边多头策略
  15. c语言vc怎么改变背景板颜色,VC OnCtlColor函数来修改控件背景颜色
  16. python独立样本t检验 图_Python-两独立样本资料t检验
  17. R7900P/R7960P/R8000P梅林固件
  18. python之路(1)_重要函数使用
  19. 使用 Fastlane 上传 App 到蒲公英
  20. 项目管理关键路径确定方法

热门文章

  1. 环保设施用电监管云平台、蓝天碧水保卫战解决方案
  2. 毫米波雷达FMCW技术理解
  3. 优劣解距离法TOPSIS
  4. 「我只是认真」聊聊工匠情怀
  5. ubuntu服务器修改root密码
  6. 扩展名为xls的html文件,htm是什么格式-后缀名为.htm的文件是什么文件
  7. php编辑器编程程序,有哪些编辑器是可以用来写php编程语言的
  8. Keil5 Load按钮灰色
  9. vue-lazyload 简单使用
  10. 关于股票投资中的k线