找回密码
 立即注册

QQ登录

只需一步,快速开始

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

HX711电子秤称重模块配送资料(加中值滤波的单片机源码)

  [复制链接]
跳转到指定楼层
楼主
电子秤注意!!!!!!
1.程序中采用P16、P17口作为HX711的数据口。
2.每个传感器的系数不一样,第一次测量必须修正传感器的系数。(修正系数HX711_xishu)

修正方法:
例如1000g砝码称出来是934g,则HX711_xishu=(原值)*1000/934;


电路原理图如下:


电子称 LCD1602(加中值滤波)单片机源程序如下:
  1. #include <reg52.h>                 //调用单片机头文件
  2. #include <intrins.h>
  3. #define uchar unsigned char     //无符号字符型 宏定义        变量范围0~255
  4. #define uint  unsigned int            //无符号整型   宏定义        变量范围0~65535
  5. #define ulong unsigned long

  6. sbit rs=P0^5              //寄存器选择信号 H:数据寄存器          L:指令寄存器
  7. sbit rw=P0^6;              //寄存器选择信号 H:数据寄存器          L:指令寄存器
  8. sbit e =P0^7;              //片选信号   下降沿触发
  9. sbit hx711_dout=P1^7;
  10. sbit hx711_sck =P1^6;
  11. sbit beep = P3^0;     //蜂鸣器
  12. sbit K1   = P3^5;     //加        
  13. sbit K2   = P3^6;     //长按去皮键
  14. sbit K3   = P3^7;     //减

  15. uchar K2_num;
  16. uint time1;
  17. uint time2;
  18. uint time3;   

  19. long  weight;                      //实际重量值
  20. long  qi_weight;                  //皮重
  21. ulong warn_weight;
  22. ulong HX711_xishu=35386;                //这是一个修正系数,例如1000g砝码称出来是934g,则HX711_xishu=原数据*1000/934;

  23. #define MEDIAN_LEN  5                          //中值滤波的滤波长度,一般取奇数
  24. #define MEDIAN      3                          //中值在滤波数组中的位置
  25. ulong   buffer[MEDIAN_LEN];           //中值滤波的数据缓存
  26. int     medleng = 0;                  //一组中值滤波数据中,进入滤波缓存的数据个数
  27. ulong   xd,xd1;                                        //数据对比大小中间变量

  28. /***************
  29. 删除键
  30. 去皮
  31. 价格清零

  32. ***************/

  33. /******1ms延时函数***11.0592M晶振**************/
  34. void delay_1ms(uint q)
  35. {
  36.         ulong i,j;
  37.         for(i=0;i<q;i++)
  38.                 for(j=0;j<11;j++);
  39. }

  40. /********************************************************************
  41. * 名称 : delay_uint()
  42. * 功能 : 小延时。
  43. * 输入 : 无
  44. * 输出 : 无
  45. ***********************************************************************/
  46. void delay_uint(uint q)
  47. {
  48.         while(q--);
  49. }

  50. /********************************************************************
  51. * 名称 : write_com(uchar com)
  52. * 功能 : 1602命令函数
  53. * 输入 : 输入的命令值
  54. * 输出 : 无
  55. ***********************************************************************/
  56. void write_com(uchar com)
  57. {
  58.         e=0;
  59.         rs=0;
  60.         rw=0;
  61.         P2=com;
  62.         delay_uint(3);
  63.         e=1;
  64.         delay_uint(25);
  65.         e=0;
  66. }

  67. /********************************************************************
  68. * 名称 : write_data(uchar dat)
  69. * 功能 : 1602写数据函数
  70. * 输入 : 需要写入1602的数据
  71. * 输出 : 无
  72. ***********************************************************************/
  73. void write_data(uchar dat)
  74. {
  75.         e=0;
  76.         rs=1;
  77.         rw=0;
  78.         P2=dat;
  79.         delay_uint(3);
  80.         e=1;
  81.         delay_uint(25);
  82.         e=0;        
  83. }


  84. /***********************lcd1602上显示这字符函数************************/
  85. void write_string(uchar hang,uchar add,uchar *p)
  86. {
  87.         if(hang==1)   
  88.                 write_com(0x80+add);
  89.         else
  90.                 write_com(0x80+0x40+add);
  91.         while(1)                                                                                                                 
  92.         {
  93.                 if(*p == '\0')  break;
  94.                 write_data(*p);
  95.                 p++;
  96.         }        
  97. }

  98. /***********************lcd1602初始化设置************************/
  99. void init_1602()         //lcd1602初始化设置
  100. {
  101.         write_com(0x38);        //
  102.         write_com(0x0c);
  103.         write_com(0x06);
  104.         delay_uint(1000);
  105. }


  106. void Delay__hx711_us(void)
  107. {
  108.         _nop_();
  109.         _nop_();
  110. }

  111. ulong ReadCount(void)        //增益128
  112. {
  113.         ulong count,value = 0;
  114.         uchar i;
  115.           hx711_dout=1;
  116.         Delay__hx711_us();
  117.           hx711_sck=0;
  118.           count=0;
  119.           while(hx711_dout);
  120.           for(i=0;i<24;i++)
  121.         {
  122.                   hx711_sck=1;
  123.                   count=count<<1;
  124.                 hx711_sck=0;
  125.                   if(hx711_dout)
  126.                         count++;
  127.         }
  128.          hx711_sck=1;
  129.     count=count^0x800000;//第25个脉冲下降沿来时,转换数据
  130.         Delay__hx711_us();
  131.         hx711_sck=0;
  132.         return         count;
  133. }

  134. void get_pizhong()          //获取皮重,秤盘重量
  135. {
  136.         ulong hx711_dat;
  137.         uchar i;
  138.         for(i=0;i<MEDIAN_LEN;i++)
  139.         {
  140.                 hx711_dat=ReadCount();                        //HX711AD转换数据处理
  141.                 if(medleng == 0)                    //缓存的第1个元素,直接放入,不需要排序
  142.                 {
  143.                         buffer[0] = hx711_dat; medleng = 1;
  144.                 }
  145.                 else                                    //插入排序算法,按从小到大的顺序排列
  146.                 {  
  147.                         for(i = 0; i < medleng; i ++)  
  148.                         {
  149.                                 if( buffer[i] > hx711_dat)         // 轮询到的当前元素>AD值,则交换它们的值,xd为中间变量存放位置
  150.                                 {
  151.                                         xd = hx711_dat; hx711_dat = buffer[i]; buffer[i] = xd;
  152.                                 }
  153.                         }
  154.                         buffer[medleng] = hx711_dat;         //把轮询出较大的数放入缓存的后面.
  155.                         medleng++;
  156.                 }               
  157.                 if(medleng >= MEDIAN_LEN)                     //ADC采样的数据个数达到中值滤波要求的数据个数
  158.                 {
  159.                         hx711_dat = buffer[MEDIAN];            //最终重量取中值滤波数组的中间值
  160.                         medleng = 0;
  161.                 }
  162.         }
  163.         qi_weight=(uint)(hx711_dat*0.01);        
  164. }

  165. void get_weight()          //获取被测物体重量
  166. {
  167.         ulong hx711_data,a;
  168.         ulong get,aa;        
  169.         hx711_data=ReadCount();                   //HX711数据采集函数
  170.         get=(uint)(hx711_data*0.01);   //HX711AD转换数据处理,数据缩小100倍
  171.         if(get>qi_weight)
  172.         {
  173.                 a=ReadCount();                           //重新采集HX711数据                                                                                                                                                            
  174.                 aa=(uint)(a*0.01)-qi_weight;                             //测得的重量值减去皮重
  175.                 weight=(uint)((float)aa*0.00001*HX711_xishu);//重量转换函数,传感器型号不同此函数要适当修改(修改HX711_xishu的大小)
  176.                 //超重报警
  177.                 if(weight>=warn_weight)
  178.                 {
  179.                         //1602液晶第二行,不停闪烁,以此为超重报警
  180.                         write_string(2,1,"                ");
  181.                         delay_1ms(300);
  182.                 write_string(2,1,"Warning        g");
  183.                         write_com(0xc0+10);
  184.                         write_data(warn_weight/10000%10+0x30);
  185.                         write_data(warn_weight/1000%10+0x30);
  186.                         write_data(warn_weight/100%10+0x30);
  187.                         write_data(warn_weight/10%10+0x30);
  188.                         write_data(warn_weight%10+0x30);
  189.                         write_string(2,15,"g");delay_1ms(200);  
  190.                 }
  191.         }
  192.         else                                
  193.         {
  194.                 //皮重大于商品重量5g(避免干扰),可以在此设置负重报警
  195.                 if(qi_weight*0.00001*HX711_xishu-get*0.00001*HX711_xishu>=5)     
  196.                 {
  197.                         //1602液晶第二行"Warning"不停闪烁,以此为负重报警
  198.                         write_string(2,1,"       ");delay_1ms(300);        
  199.                         write_string(2,1,"Warning");delay_1ms(200);        
  200.                 }
  201.                 weight=0;
  202.                
  203.         }
  204. }

  205. /************************************************
  206. 由于称重传感器线性度参数的不同,而对获得的重量数据处理,此
  207. 处可能会根据不同称重传感器,程序的代码的校准系数会有所不同        


  208. /*****************主函数********************/
  209. void main()
  210. {        
  211.         uchar i;
  212.         delay_1ms(500);                                         //等待开机数据稳定
  213.         init_1602();                             //lcd1602初始化
  214.         write_string(1,0," Welcome to you ");
  215.         write_string(2,0,"Electronic scale");
  216.         get_pizhong();                                         //获取皮重,秤盘重量
  217.         delay_1ms(2000);delay_1ms(2000);                                    
  218.         get_pizhong();                                         //再次获取皮重,秤盘重量
  219.         warn_weight=5000;  
  220.         write_string(1,0," Weight        g");
  221.         write_string(2,0," Warning       g");         
  222.         while(1)
  223.         {                        
  224.                 //按键2
  225.                 if(K2==0)
  226.                 {         
  227.                         delay_1ms(10);
  228.                         if(K2==0)
  229.                         {
  230.                                 while(!K2)                           
  231.                                 {
  232.                                         time2++;
  233.                                         delay_1ms(10);           
  234.                                         if(time2>=200)             //长按键:按下时间达到一定时进入执行
  235.                                         {
  236.                                                 time2=200;
  237.                                                 get_pizhong();         //数据清零,即去皮
  238.                                                 get_weight();
  239.                                                 //去皮成功,清零重量闪烁3下
  240.                                                 write_string(1,10,"00000g");
  241.                                                 write_string(1,10,"      ");delay_1ms(300);
  242.                                                 write_string(1,10,"00000g");delay_1ms(300);
  243.                                                 write_string(1,10,"      ");delay_1ms(300);
  244.                                                 write_string(1,10,"00000g");delay_1ms(300);
  245.                                                 write_string(1,10,"      ");delay_1ms(300);
  246.                                                 write_string(1,10,"00000g");
  247.                                                 while(!K2);
  248.                                         }
  249.         
  250.                                 }
  251.                                 if(time2<200)                           //短按键:按下时间短进入执行
  252.                                 {
  253.                                         K2_num++;
  254.                                         if(K2_num==3)
  255.                                                 K2_num=0;
  256.                                         if(K2_num==0)
  257.                                         {
  258.                                                 write_string(1,0," ");
  259.                                                 write_string(2,0," ");
  260.                                         }
  261.                                         if(K2_num==1)
  262.                                         {
  263.                                                 write_string(1,0,"*");
  264.                                                 write_string(2,0," ");                                
  265.                                         }
  266.                                         if(K2_num==2)
  267.                                         {
  268.                                                 write_string(1,0," ");
  269.                                                 write_string(2,0,"*");                                
  270.                                         }
  271.                                 }
  272.                                 time2=0;
  273.                         }               
  274.                         while(!K2);//松手检测        
  275.                 }
  276.                 //按键1__减
  277.                 if(K1==0)
  278.                 {
  279.                         delay_1ms(10);
  280.                         if(K1==0)
  281.                         {
  282.                                 while(!K1)                           
  283.                                 {
  284.                                         time1++;
  285.                                         delay_1ms(10);           
  286.                                         if(time1>=100)             //长按键:按下时间达到一定时进入执行
  287.                                         {
  288.                                                 time1=100;
  289.                                                 if(K2_num==1)
  290.                                                 {
  291.                                                 
  292.                                                 }
  293.                                                 if(K2_num==2)
  294.                                                 {
  295.                                                         if(warn_weight>1000)
  296.                                                         warn_weight=warn_weight-1000;
  297.                                                         //报警重量显示
  298.                                                         write_com(0xc0+10);
  299.                                                         write_data(warn_weight/10000%10+0x30);
  300.                                                         write_data(warn_weight/1000%10+0x30);
  301.                                                         write_data(warn_weight/100%10+0x30);
  302.                                                         write_data(warn_weight/10%10+0x30);
  303.                                                         write_data(warn_weight%10+0x30);
  304.                                                         while(!K1);
  305.                                                 }
  306.                                         }                                                
  307.                                 }
  308.                                 if(time1<100)                           //短按键:按下时间短进入执行
  309.                                 {
  310.                                                 if(K2_num==2)
  311.                                                 {
  312.                                                         if(warn_weight>100)
  313.                                                         warn_weight=warn_weight-100;        
  314.                                                 }
  315.                                 }
  316.                                 time1=0;
  317.                         }               
  318.                         while(!K1);//松手检测                        
  319.                 }
  320.                 //按键3__加
  321.                 if(K3==0)
  322.                 {
  323.                         delay_1ms(10);
  324.                         if(K3==0)
  325.                         {
  326.                                 while(!K3)                           
  327.                                 {
  328.                                         time3++;
  329.                                         delay_1ms(10);           
  330.                                         if(time3>=100)              //长按键:按下时间达到一定时进入执行
  331.                                         {
  332.                                                 time3=100;
  333.                                                 if(K2_num==1)
  334.                                                 {
  335.                                                 
  336.                                                 }
  337.                                                 if(K2_num==2)
  338.                                                 {
  339.                                                         if(warn_weight<99000)
  340.                                                         warn_weight=warn_weight+1000;
  341.                                                         //报警重量显示
  342.                                                         write_com(0xc0+10);
  343.                                                         write_data(warn_weight/10000%10+0x30);
  344.                                                         write_data(warn_weight/1000%10+0x30);
  345.                                                         write_data(warn_weight/100%10+0x30);
  346.                                                         write_data(warn_weight/10%10+0x30);
  347.                                                         write_data(warn_weight%10+0x30);
  348.                                                         while(!K3);        
  349.                                                 }
  350.                                         }                                                
  351.                                 }
  352.                                 if(time3<100)                              //短按键:按下时间短进入执行
  353.                                 {
  354.                                                 if(K2_num==2)
  355.                                                 {
  356.                                                         if(warn_weight<99900)
  357.                                                         warn_weight=warn_weight+100;        
  358.                                                 }
  359.                                 }
  360.                                 time3=0;
  361.                         }               
  362.                         while(!K3);                     //松手检测                        
  363.                 }
  364.                 get_weight();                            //获取被测物体重量
  365.                 if(medleng == 0)                    //缓存的第1个元素,直接放入,不需要排序
  366.                 {
  367.                         buffer[0] = weight; medleng = 1;
  368.                 }
  369.                 else                                    //插入排序算法,按从小到大的顺序排列
  370.                 {  
  371.                         for(i = 0; i < medleng; i ++)  
  372.                         {
  373.                                 if( buffer[i] > weight)         // 轮询到的当前元素>AD值,则交换它们的值,xd为中间变量存放位置
  374.                                 {
  375.                                         xd = weight; weight = buffer[i]; buffer[i] = xd;
  376.                                 }
  377.                         }
  378.                         buffer[medleng] = weight;         //把轮询出较大的数放入缓存的后面.
  379.                         medleng++;
  380.                 }               
  381.                 if(medleng >= MEDIAN_LEN)                     //ADC采样的数据个数达到中值滤波要求的数据个数
  382.                 {
  383.                         weight = buffer[MEDIAN];            //最终重量取中值滤波数组的中间值
  384.                         medleng = 0;
  385.                         //实际重量显示,四位数据显示
  386.                         write_com(0x80+10);
  387.                         write_data(weight/10000%10+0x30);
  388.                         write_data(weight/1000%10+0x30);
  389.                         write_data(weight/100%10+0x30);
  390.                         write_data(weight/10%10+0x30);
  391.                         write_data(weight%10+0x30);
  392.                         //报警重量显示,四位数据显示
  393.                         write_com(0xc0+10);
  394. ……………………

  395. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


所有资料51hei提供下载:
0.0 TC-C101称重模块配送资料 最后更新时间2017.09.21.7z (2.98 MB, 下载次数: 540)

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

使用道具 举报

沙发
ID:138247 发表于 2018-7-25 13:44 | 只看该作者
感谢分享。。。。
回复

使用道具 举报

板凳
ID:241242 发表于 2018-9-13 11:07 | 只看该作者
非常感谢!学习
回复

使用道具 举报

地板
ID:346927 发表于 2019-5-16 21:34 | 只看该作者
非常好的资料,谢谢分享
回复

使用道具 举报

5#
ID:46475 发表于 2019-6-9 23:23 | 只看该作者
感谢分享不知道能不能用
回复

使用道具 举报

6#
ID:58925 发表于 2019-6-10 21:16 | 只看该作者
有空试试,支持楼主
回复

使用道具 举报

7#
ID:328121 发表于 2019-7-18 10:24 | 只看该作者
学习了,谢谢
回复

使用道具 举报

8#
ID:586048 发表于 2019-8-4 10:41 | 只看该作者
666,谢谢楼主,正需要
回复

使用道具 举报

9#
ID:529085 发表于 2019-8-4 15:24 | 只看该作者
感谢分享
回复

使用道具 举报

10#
ID:315373 发表于 2019-8-7 20:52 | 只看该作者
为什么屏幕没反应
回复

使用道具 举报

11#
ID:572546 发表于 2019-8-28 09:38 | 只看该作者
感谢楼主
回复

使用道具 举报

12#
ID:62514 发表于 2019-8-28 14:17 | 只看该作者
感谢楼主,提供一个带有滤波的程序。
回复

使用道具 举报

13#
ID:624657 发表于 2019-10-16 20:38 | 只看该作者
感谢群主的分享
回复

使用道具 举报

14#
ID:105146 发表于 2019-11-22 21:17 | 只看该作者
好资料,谢谢分享……
回复

使用道具 举报

15#
ID:680917 发表于 2020-1-4 11:10 | 只看该作者
谢谢楼主分享,好资料
回复

使用道具 举报

16#
ID:686056 发表于 2020-1-14 14:37 | 只看该作者
好资料,谢谢分享……
回复

使用道具 举报

17#
ID:169564 发表于 2020-1-15 20:49 | 只看该作者
想看一看
回复

使用道具 举报

18#
ID:169564 发表于 2020-1-15 20:50 | 只看该作者
正在做相关的,看看
回复

使用道具 举报

19#
ID:722740 发表于 2020-4-16 15:50 | 只看该作者
请问怎么更改量程
回复

使用道具 举报

20#
ID:196383 发表于 2020-4-17 08:40 | 只看该作者

谢谢楼主分享,正在学习单片机收藏了
回复

使用道具 举报

21#
ID:201953 发表于 2021-5-30 11:34 | 只看该作者
感谢楼主无私奉献,谢谢
回复

使用道具 举报

22#
ID:47634 发表于 2021-7-23 09:44 | 只看该作者
这个很好,值得参考
回复

使用道具 举报

23#
ID:1092396 发表于 2023-10-26 16:45 | 只看该作者
你有联系方式吗,我们正好需要这个
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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