久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2041|回復: 0
收起左側

基于51單片機與stm32的HX711電子秤程序

[復制鏈接]
ID:606512 發表于 2019-9-2 17:38 | 顯示全部樓層 |閱讀模式
注意!
1.程序中采用P16、P17口作為HX711的數據口。
2.每個傳感器的系數不一樣,第一次測量必須修正傳感器的系數。(修正系數HX711_xishu)

修正方法:
例如1000g砝碼稱出來是934g,則HX711_xishu=(原值)*1000/934;

單片機源程序如下:
  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.                         write_data(warn_weight/10000%10+0x30);
  395.                         write_data(warn_weight/1000%10+0x30);
  396.                         write_data(warn_weight/100%10+0x30);
  397.                         write_data(warn_weight/10%10+0x30);
  398.                         write_data(warn_weight%10+0x30);
  399.                         weight=0;
  400.                 }                                                                               
  401.         }
  402. }
復制代碼

所有資料51hei提供下載:
基于stm32的電子秤.7z (2.53 MB, 下載次數: 51)
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品久久久久久久久中文字幕 | 亚洲一区久久 | 成年女人免费v片 | 精品视频在线免费观看 | 久久久涩 | 久久久久国产精品一区三寸 | 在线免费观看一区二区 | 亚洲国产成人精品女人久久久 | 久久精品电影 | 精品国产欧美一区二区 | 久久久久国产成人精品亚洲午夜 | 成人免费在线电影 | 亚洲国产二区 | 欧美日韩在线一区二区三区 | 亚洲国产精品一区 | 国产精品国产精品国产专区不卡 | 欧美日韩国产精品一区 | 激情av在线 | 久久久国产精品视频 | 操一草 | 91免费看片| 久久久免费电影 | 91电影| 伊人二区 | 欧美综合一区 | av中文字幕在线观看 | 日韩一二区 | 日韩精品免费一区 | 美女131mm久久爽爽免费 | 尤物在线 | 在线小视频 | 国产精品久久久久无码av | 综合色在线 | 2019天天操| 久久噜噜噜精品国产亚洲综合 | 国产农村妇女精品一区 | 中文字幕在线看人 | 久久国产精品免费一区二区三区 | 欧美日韩成人 | 成人免费视屏 | 精品欧美一区二区三区久久久 |