找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 18784|回复: 11
打印 上一主题 下一主题
收起左侧

HX711称重模块电路+单片机程序(测试通过)

  [复制链接]
跳转到指定楼层
楼主
ID:257389 发表于 2017-12-4 20:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
HX711芯片采用了海芯科技集成电路专利技术,是一款专为高精度压力测量而设计的24 A/D 转换器芯片。该芯片与单片机的接口电路设计和程序编写非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道A 或通道B,与其内部的低噪声可编程放大器相连。通道A 的可编程增益为128 64,对应的满额度差分输入信号电压值分别为±20mV±40mV。通道B 则为固定的32 增益,用于系统参数检测。芯片内提供的稳压电源可以直接向外部传感器和芯片内的A/D 转换器提供电源,系统板上无需另外的模拟电。芯片内的时钟振荡器不需要任何外接器件。上电自动复位功能简化了开机的初始化过程。

原理图:



                                     总体电路


电源+串口通讯



单片机最小系统:


存储模块+下载模块+蜂鸣器+矩阵键盘


单片机源程序如下:



  1. #include "main.h"
  2. #include "LCD1602.h"
  3. #include "HX711.h"

  4. unsigned long HX711_Buffer = 0;
  5. unsigned long Weight_Maopi = 0,Weight_Shiwu = 0;
  6. char Price_Count = 0;
  7. unsigned char KEY_NUM = 0;
  8. unsigned char Price_Buffer[3] = {0x00,0x00,0x00};
  9. unsigned long Money = 0;
  10. bit Flag_OK = 0;

  11. //****************************************************
  12. //主函数
  13. //****************************************************
  14. void main()
  15. {
  16.               Init_LCD1602();                                                                                                                              //初始化LCD1602

  17.               LCD1602_write_com(0x80);                                                                                    //指针设置
  18.               LCD1602_write_word("Welcome to use! ");                                          //开机画面第一行


  19.               Delay_ms(2000);                            //延时2s


  20. loop:Price_Count = 0;
  21.               Price_Buffer[0] = 0;
  22.               Price_Buffer[1] = 0;
  23.               Price_Buffer[2] = 0;
  24.               Flag_OK = 0;

  25.               LCD1602_write_com(0x80);                                                                                    //指针设置
  26.               LCD1602_write_word("+WEI |PRI | MON ");
  27.               LCD1602_write_com(0x80+0x40);                                                        //指针设置
  28.               LCD1602_write_word("0.000|  . |   . ");

  29.             

  30.             
  31.               Get_Maopi();                                                        //称毛皮重量

  32.               while(1)
  33.               {
  34.                             if( Flag_OK == 0)
  35.                             {
  36.                                           Get_Weight();                                          //称重
  37.             
  38.                                           //显示当前重量
  39.                                           LCD1602_write_com(0x80+0x40);
  40.                                           LCD1602_write_data(Weight_Shiwu/1000 + 0x30);
  41.                                           LCD1602_write_data('.');
  42.                                           LCD1602_write_data(Weight_Shiwu%1000/100 + 0x30);
  43.                                           LCD1602_write_data(Weight_Shiwu%100/10 + 0x30);
  44.                                           LCD1602_write_data(Weight_Shiwu%10 + 0x30);
  45.                             }

  46.                             KEY_NUM = KEY_Scan();

  47.                             if( KEY_NUM != 0x55)                                          //当返回的不是初值时候,确认按键按下。
  48.                             {
  49.                                           if(KEY_NUM == 16)                                          //数字A键,去皮功能
  50.                                           {
  51.                                                         Get_Maopi();                                          //去皮            
  52.                                           }

  53.                                           if(KEY_NUM == 15)                                          //数字B键清除键,二次测量
  54.                                           {
  55.                                                         goto loop;            
  56.                                           }

  57.                                           if(KEY_NUM == 12)                                          //数字C输入单价错误时返回上一步
  58.                                           {
  59.                                                         Price_Count--;
  60.                                                         if( Price_Count < 0)
  61.                                                         {
  62.                                                                       Price_Count = 0;
  63.                                                         }
  64.                                                       
  65.                                                         Price_Buffer[Price_Count] = 0;                                             //清除上一个输入的数据

  66.                                                         switch(Price_Count)
  67.                                                         {
  68.                                                                       case 0:
  69.                                                                                                   LCD1602_write_com(0x80+0x40+6);
  70.                                                                                                   LCD1602_write_data(' ');
  71.                                                                                                   break;
  72.                                                                       case 1:
  73.                                                                                                   LCD1602_write_com(0x80+0x40+7);
  74.                                                                                                   LCD1602_write_data(' ');
  75.                                                                                                   break;
  76.                                                                       case 2:
  77.                                                                                                   LCD1602_write_com(0x80+0x40+9);
  78.                                                                                                   LCD1602_write_data(' ');
  79.                                                                                                   break;
  80.                                                                       default : break;
  81.                                                         }            
  82.                                           }

  83.                                           if(KEY_NUM == 13)                                          //数字D键,计算总价
  84.                                           {
  85.                                                         Money = Price_Buffer[0] * 100 + Price_Buffer[1] * 10 + Price_Buffer[2];            
  86.                                                         Money = Money * Weight_Shiwu / 1000;
  87.                                                         LCD1602_write_com(0x80+0x40+11);
  88.                                                         LCD1602_write_data(Money/1000 + 0x30);                                         
  89.                                                         LCD1602_write_data(Money%1000/100 + 0x30);
  90.                                                         LCD1602_write_data(Money%100/10 + 0x30);
  91.                                                         LCD1602_write_data('.');
  92.                                                         LCD1602_write_data(Money%10 + 0x30);
  93.                                                       
  94.                                                         Flag_OK = 1;                                                                     
  95.                                           }

  96.                                           if(KEY_NUM >= 0 && KEY_NUM <= 9)                                                                        //显示输入的价值
  97.                                           {
  98.                                                         Price_Buffer[Price_Count] = KEY_NUM;
  99.             
  100.                                                         switch(Price_Count)
  101.                                                         {
  102.                                                                       case 0:
  103.                                                                                                   LCD1602_write_com(0x80+0x40+6);
  104.                                                                                                   LCD1602_write_data(Price_Buffer[0] + 0x30);
  105.                                                                                                   break;
  106.                                                                       case 1:
  107.                                                                                                   LCD1602_write_com(0x80+0x40+7);
  108.                                                                                                   LCD1602_write_data(Price_Buffer[1] + 0x30);
  109.                                                                                                   break;
  110.                                                                       case 2:
  111.                                                                                                   LCD1602_write_com(0x80+0x40+9);
  112.                                                                                                   LCD1602_write_data(Price_Buffer[2] + 0x30);
  113.                                                                                                   break;
  114.                                                                       default : break;
  115.                                                         }
  116.             
  117.                                                         Price_Count++;
  118.             
  119.                                                         if( Price_Count >= 3)
  120.                                                         {
  121.                                                                       Price_Count = 3;
  122.                                                         }
  123.                                           }

  124.                             }

  125.               }
  126. }

  127. //****************************************************
  128. //矩阵键盘扫描
  129. //****************************************************
  130. unsigned char KEY_Scan()
  131. {
  132.               unsigned char temp = 0;
  133.               unsigned char com = 0x55 , com1 = 0 , com2 = 0;
  134.               P3=0xf0;
  135.               if(P3!=0xf0)
  136.               {
  137.                             com1=P3;
  138.                             P3=0x0f;
  139.                             com2=P3;      
  140.               }
  141.               P3=0xf0;
  142.     while(P3!=0xf0);               
  143.               temp=com1|com2;
  144.               if(temp==0xee)com=1;//数字1
  145.               if(temp==0xed)com=4;//数字4
  146.               if(temp==0xeb)com=7;//数字7
  147.               if(temp==0xe7)com=11;//备用键*号键
  148.               if(temp==0xd7)com=0;//数字0
  149.               if(temp==0xb7)com=14;//备用键*号键
  150.             

  151.               if(temp==0xde)com=2; //数字2
  152.               if(temp==0xdd)com=5; //数字5
  153.               if(temp==0xdb)com=8;//数字8

  154.               if(temp==0xbe)com=3;//数字3
  155.               if(temp==0xbd)com=6; //数字6
  156.               if(temp==0xbb)com=9;//数字9

  157.               if(temp==0x7e)com=16;//数字A键,去皮功能            
  158.               if(temp==0x7d)com=15;//数字B键清除键,二次测量
  159.               if(temp==0x7b)com=12;//数字C输入单价错误时返回上一步
  160.               if(temp==0x77)com=13;//数字D键,计算总价            
  161.               return(com);
  162. }

  163. //****************************************************
  164. //称重
  165. //****************************************************
  166. void Get_Weight()
  167. {
  168.               HX711_Buffer = HX711_Read();
  169.               HX711_Buffer = HX711_Buffer/100;
  170.               if(HX711_Buffer > Weight_Maopi)                                         
  171.               {
  172.                             Weight_Shiwu = HX711_Buffer;
  173.                             Weight_Shiwu = Weight_Shiwu - Weight_Maopi;              //获取实物的AD采样数值。
  174.               Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/4.22+0.05); //计算实物的实际重量
  175. //因为不同的传感器特性曲线不一样,因此,每一个传感器需要矫正这里的4.30这个除数。
  176. //当发现测试出来的重量偏大时,增加该数值。
  177. //如果测试出来的重量偏小时,减小改数值。
  178. //该数值一般在4.0-5.0之间。因传感器不同而定。
  179. //+0.05是为了四舍五入百分位
  180.                             Buzzer = 1;                                                        //关闭警报
  181.               }
  182. //              else if(HX711_Buffer < Weight_Maopi - 30)
  183. //              {
  184. //                            Buzzer = 0;                                                        //负重量报警
  185. //              }
  186. //              else if(HX711_Buffer > Weight_Maopi + 24970)                            //大于5Kg的最大量程,报警            
  187. //              {
  188. //                            Buzzer = 0;
  189. //              }

  190.               if(Weight_Shiwu > 5000 || HX711_Buffer < Weight_Maopi - 30)
  191.               {
  192.                             Buzzer = 0;            
  193.               }
  194.               else
  195.               {
  196.                             Buzzer = 1;
  197.               }

  198.             
  199. }

  200. //****************************************************
  201. //获取毛皮重量
  202. //****************************************************
  203. void Get_Maopi()
  204. {
  205.               HX711_Buffer = HX711_Read();
  206.               Weight_Maopi = HX711_Buffer/100;                           
  207. }

  208. //****************************************************
  209. //MS延时函数(12M晶振下测试)
  210. //****************************************************
  211. void Delay_ms(unsigned int n)
  212. {
  213.               unsigned int  i,j;
  214.               for(i=0;i<n;i++)
  215.                             for(j=0;j<123;j++);
  216. }





  217. 1602.H文件
  218. #ifndef __LCD1602_H__
  219. #define __LCD1602_H__


  220. #include <reg52.h>

  221. //LCD1602 IO设置
  222. #define LCD1602_PORT P0
  223. sbit LCD1602_RS = P2^5;
  224. sbit LCD1602_RW = P2^6;
  225. sbit LCD1602_EN = P2^7;

  226. //函数或者变量声明
  227. extern void LCD1602_delay_ms(unsigned int n);
  228. extern void LCD1602_write_com(unsigned char com);
  229. extern void LCD1602_write_data(unsigned char dat);
  230. extern void LCD1602_write_word(unsigned char *s);
  231. extern void Init_LCD1602();

  232. #endif


  233. 1602.C程序 :

  234. #include "LCD1602.h"

  235. //****************************************************
  236. //MS延时函数(12M晶振下测试)
  237. //****************************************************
  238. void LCD1602_delay_ms(unsigned int n)
  239. {
  240.               unsigned int  i,j;
  241.               for(i=0;i<n;i++)
  242.                             for(j=0;j<123;j++);
  243. }

  244. //****************************************************
  245. //写指令
  246. //****************************************************
  247. void LCD1602_write_com(unsigned char com)
  248. {
  249.               LCD1602_RS = 0;
  250.               LCD1602_delay_ms(1);
  251.               LCD1602_EN = 1;
  252.               LCD1602_PORT = com;
  253.               LCD1602_delay_ms(1);
  254.               LCD1602_EN = 0;
  255. }

  256. //****************************************************
  257. //写数据
  258. //****************************************************
  259. void LCD1602_write_data(unsigned char dat)
  260. {
  261.               LCD1602_RS = 1;
  262.               LCD1602_delay_ms(1);            
  263.               LCD1602_PORT = dat;
  264.               LCD1602_EN = 1;
  265.               LCD1602_delay_ms(1);
  266.               LCD1602_EN = 0;
  267. }

  268. //****************************************************
  269. //连续写字符
  270. //****************************************************
  271. void LCD1602_write_word(unsigned char *s)
  272. {
  273.               while(*s>0)
  274.               {
  275.                             LCD1602_write_data(*s);
  276.                             s++;
  277.               }
  278. }

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




  288. 称重模块.H文件:

  289. #ifndef __HX711_H__
  290. #define __HX711_H__
  291. #include <reg52.h>
  292. #include <intrins.h>

  293. //IO设置
  294. sbit HX711_DOUT=P2^0;
  295. sbit HX711_SCK=P2^1;

  296. //函数或者变量声明
  297. extern void Delay__hx711_us(void);
  298. extern unsigned long HX711_Read(void);

  299. #endif
  300. ……………………
  301. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:

称重压力传感器HX711AD模块电路 程序.docx (691.56 KB, 下载次数: 239)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:64017 发表于 2017-12-6 11:06 | 只看该作者
要看看,就是刷新了一次。有多扣了一次。郁闷。
回复

使用道具 举报

板凳
ID:329634 发表于 2018-5-15 19:23 | 只看该作者
没有main.h文件
回复

使用道具 举报

地板
ID:241242 发表于 2018-9-13 11:07 | 只看该作者
不错的
回复

使用道具 举报

5#
ID:518547 发表于 2019-5-18 21:50 | 只看该作者
真的的很有用了
回复

使用道具 举报

6#
ID:104846 发表于 2019-5-24 16:08 | 只看该作者
确实少MAIN.H文件,望楼主确认回复
回复

使用道具 举报

7#
ID:578886 发表于 2019-7-7 21:11 | 只看该作者
没有main.h文件
回复

使用道具 举报

8#
ID:578886 发表于 2019-7-7 21:13 | 只看该作者
一个错误七个警告
回复

使用道具 举报

9#
ID:554109 发表于 2019-7-12 15:13 | 只看该作者
程序试过了,但是一直处于负重量报警,检查过就是负重量报警,不是超量程报警。例如0.000-0.001-0.002-0.003-0.004-0.003-0.002-0.001-0.000-【bibibi】   so,,,各种尝试,检查都不行。。唉。。两天了,,,头大。。。谁有同类经历或者经验????
回复

使用道具 举报

10#
ID:582255 发表于 2019-8-8 14:58 | 只看该作者
楼主能分享一下所有的文件吗?main.h文件吗?
谢谢了谢谢了
56003418@qq.com
回复

使用道具 举报

11#
ID:62514 发表于 2019-8-16 20:31 | 只看该作者
真的很好。谢谢资料,正要做电子秤。
回复

使用道具 举报

12#
ID:624657 发表于 2019-10-15 19:35 | 只看该作者
真的太好用了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表