欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5374|回復: 3
收起左側

STC89C51單片機+HX711稱重模塊電子秤程序

  [復制鏈接]
ID:592160 發表于 2020-12-5 13:35 | 顯示全部樓層 |閱讀模式
電子秤是基于STC89C51單片機,以及HX711稱重模塊,利用單片機控制A/D轉換,屏幕數據顯示,鍵盤實時輸入,設計方案能夠易于各種場合使用。
IMG_20201125_165028.jpg

單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <string.h>
  4. #include "main.h"
  5. #include "HX711.h"
  6. #include "eeprom52.h"

  7. #define uchar unsigned char
  8. #define uint  unsigned int

  9. unsigned long HX711_Buffer = 0;
  10. unsigned long Weight_Maopi = 0;
  11. unsigned long Weight_Maopi_0 = 0;
  12. long Weight_Shiwu = 0;
  13. unsigned int qupi=0;
  14. unsigned char p=0;
  15. //鍵盤處理變量
  16. unsigned char keycode;
  17. unsigned char key_press_num=0;

  18. uint GapValue,GapValue1;
  19. bit flag_cz=0;

  20. uchar code  LEDData[]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7,0xCF,0xDA,0x9B,0xDC,0x9B,0x8B}; //數碼管顯示碼表
  21. //定義標識
  22. volatile bit FlagTest = 0;                //定時測試標志,每0.5秒置位,測完清0
  23. volatile bit FlagKeyPress = 0;  //有鍵按下標志,處理完畢清0
  24. //校準參數
  25. //因為不同的傳感器特性曲線不是很一致,因此,每一個傳感器需要矯正這里這個參數才能使測量值很準確。
  26. //當發現測試出來的重量偏大時,增加該數值。
  27. //如果測試出來的重量偏小時,減小改數值。
  28. //該值可以為小數
  29. //#define GapValue 349
  30. sbit LED=P1^1;
  31. sbit ROW1=P3^0;
  32. sbit ROW2=P3^1;
  33. sbit ROW3=P3^2;
  34. sbit ROW4=P3^3;
  35. sbit DIAN = P0^5;                        //小數點

  36. volatile bit ClearWeighFlag = 0; //傳感器調零標志位,清除0漂

  37. /******************把數據保存到單片機內部eeprom中******************/
  38. void write_eeprom()
  39. {
  40.         SectorErase(0x2000);
  41.         GapValue1=GapValue&0x00ff;
  42.         byte_write(0x2000, GapValue1);
  43.         GapValue1=(GapValue&0xff00)>>8;
  44.         byte_write(0x2001, GapValue1);
  45.         byte_write(0x2060, a_a);       
  46. }

  47. /******************把數據從單片機內部eeprom中讀出來*****************/
  48. void read_eeprom()
  49. {
  50.         GapValue   = byte_read(0x2001);
  51.         GapValue   = (GapValue<<8)|byte_read(0x2000);
  52.         a_a      = byte_read(0x2060);
  53. }

  54. /**************開機自檢eeprom初始化*****************/
  55. void init_eeprom()
  56. {
  57.         read_eeprom();                //先讀
  58.         if(a_a != 1)                //新的單片機初始單片機內問eeprom
  59.         {
  60.                 GapValue  = 3500;
  61.                 a_a = 1;
  62.                 write_eeprom();           //保存數據
  63.         }       
  64. }
  65. /*****顯示開機初始化等待畫面*****/
  66. void Disp_init(void)   
  67. {
  68.         P0 = ~0x80;      //顯示----
  69.         P2 = 0xBF;                 //依次打開各位
  70.         Delay_ms(1);                 //延時
  71.         P2 = 0xEF;
  72.         Delay_ms(1);   
  73.         P2 = 0xFB;
  74.         Delay_ms(1);
  75.         P2 = 0xFE;
  76.         Delay_ms(1);
  77.         P2 = 0xFF;         //關閉顯示
  78. }

  79. //顯示重量,單位kg,兩位整數,三位小數
  80. void Display_Weight()
  81. {
  82.     P0 = ~LEDData[Weight_Shiwu%10];      //
  83.         P2 = 0xBF;                 //打開位
  84.         Delay_ms(1);                 //延時
  85.         P2 = 0xff;         //關閉顯示
  86.         P0=~LEDData[Weight_Shiwu%100/10];    //顯示個位
  87.         P2 = 0xEF;
  88.         Delay_ms(1);
  89.         P2 = 0xff;         //關閉顯示
  90.         P0 =~LEDData[Weight_Shiwu%1000/100];    //顯示十位
  91.         P2 = 0xFB;
  92.         Delay_ms(1);
  93.         P2 = 0xff;         //關閉顯示
  94.         P0 =~LEDData[Weight_Shiwu%10000/1000];    //顯示百位
  95.         DIAN = 0;         //顯示小數點
  96.         P2 = 0xFE;
  97.         Delay_ms(1);
  98.         P2 = 0xff;         //關閉顯示
  99. }

  100. //定時器0初始化
  101. void Timer0_Init()
  102. {
  103.         ET0 = 1;        //允許定時器0中斷
  104.         TMOD = 1;       //定時器工作方式選擇
  105.         TL0 = 0xb0;     
  106.         TH0 = 0x3c;     //定時器賦予初值
  107.         TR0 = 1;        //啟動定時器
  108. }

  109. //定時器0中斷
  110. void Timer0_ISR (void) interrupt 1 using 0
  111. {
  112. uchar Counter;
  113.         TL0 = 0xb0;
  114.         TH0 = 0x3c;     //定時器賦予初值

  115.         //每0.5秒鐘刷新重量
  116.     Counter ++;
  117.     if (Counter >= 10)
  118.     {
  119.        FlagTest = 1;
  120.            Counter = 0;
  121.     }
  122. }


  123. //按鍵響應程序,參數是鍵值
  124. //返回鍵值:
  125. //         7          8    9      10(清0)
  126. //         4          5    6      11(刪除)
  127. //         1          2    3      12(未定義)
  128. //         14(未定義) 0    15(.)  13(確定價格)

  129. void KeyPress()
  130. {
  131.         if(ROW1==0)   //清零鍵
  132.         {
  133.                 Display_Weight();
  134.                 if(ROW1==0)
  135.                 {
  136.                         if(qupi==0)
  137.                         qupi=Weight_Shiwu;
  138.                         else
  139.                         qupi=0;
  140.                         Buzzer=0;
  141.                         for(p=0;p<10;p++)
  142.                         Display_Weight();
  143.                         Buzzer=1;       
  144.                         while(ROW1==0) Display_Weight();
  145.                 }
  146.         }
  147.         if(ROW2==0)           //加
  148.         {
  149.                 Display_Weight();
  150.                 if(ROW2==0)
  151.                 {
  152.                         while(!ROW2)
  153.                         {
  154.                                 key_press_num++;
  155.                                 if(key_press_num>=100)
  156.                                 {
  157.                                         key_press_num=0;
  158.                                         while(!ROW2)
  159.                                         {
  160.                                                 if(GapValue<10000)
  161.                                                 GapValue+=10;
  162.                                                 Buzzer=0;
  163.                                                 for(p=0;p<2;p++)
  164.                                                 Display_Weight();
  165.                                                 Buzzer=1;
  166.                                                 for(p=0;p<2;p++)
  167.                                                 Display_Weight();
  168.                                                 Get_Weight();
  169.                                         }
  170.                                 }
  171.                                 Display_Weight();
  172.                                 Delay_ms(8);
  173.                         }
  174.                         if(key_press_num!=0)
  175.                         {
  176.                                 key_press_num=0;
  177.                                 if(GapValue<10000)
  178.                                 GapValue++;
  179.                                 Buzzer=0;
  180.                                 for(p=0;p<10;p++)
  181.                                 Display_Weight();
  182.                                 Buzzer=1;
  183.                         }
  184.                         write_eeprom();               
  185.                 }
  186.         }
  187.         if(ROW3==0)  //減
  188.         {
  189.                 Display_Weight();
  190.                 if(ROW3==0)
  191.                 {
  192.                         while(!ROW3)
  193.                         {
  194.                                 key_press_num++;
  195.                                 if(key_press_num>=100)
  196.                                 {
  197.                                         key_press_num=0;
  198.                                         while(!ROW3)
  199.                                         {
  200.                                                 if(GapValue>1)
  201.                                                 GapValue-=10;
  202.                                                 Buzzer=0;
  203.                                                 for(p=0;p<2;p++)
  204.                                                 Display_Weight();
  205.                                                 Buzzer=1;
  206.                                                 for(p=0;p<2;p++)
  207.                                                 Display_Weight();
  208.                                                 Get_Weight();
  209.                                         }
  210.                                 }
  211.                                 Display_Weight();
  212.                                 Delay_ms(8);
  213.                         }
  214.                         if(key_press_num!=0)
  215.                         {
  216.                                 key_press_num=0;
  217.                                 if(GapValue>1)
  218.                                 GapValue--;
  219.                                 Buzzer=0;
  220.                                 for(p=0;p<10;p++)
  221.                                 Display_Weight();
  222.                                 Buzzer=1;
  223.                         }
  224.                         write_eeprom();                           //保存數?
  225.                 }
  226.         }
  227. }
  228. //****************************************************
  229. //主函數
  230. //****************************************************
  231. void main()
  232. {
  233.         init_eeprom();  //開始初始化保存的數據
  234.    EA = 0;
  235.    Timer0_Init();
  236.    //初中始化完成,開斷
  237.    EA = 1;
  238.    Get_Maopi();

  239.         while(1)
  240.         {
  241. //每0.5秒稱重一次
  242.                 if (FlagTest==1)
  243.                 {
  244.                         Get_Weight();
  245.                         FlagTest = 0;
  246.                 }
  247.                 if(flag_cz==1)
  248.                 Disp_init();
  249.                 else
  250.                 Display_Weight();         
  251.                 KeyPress();
  252.         }
  253. }
  254. //****************************************************
  255. //稱重
  256. //****************************************************
  257. void Get_Weight()
  258. {
  259.         Weight_Shiwu = HX711_Read();
  260.         Weight_Shiwu = Weight_Shiwu - Weight_Maopi;                //獲取凈重
  261.        
  262.         Weight_Shiwu = (unsigned int)((float)(Weight_Shiwu*10)/GapValue)-qupi;         //計算實物的實際重量                                                                                                                               
  263.         if(Weight_Shiwu >= 5000)                //超重報警
  264.         {
  265.                 Buzzer = !Buzzer;       
  266.                 LED=!LED;
  267.                 flag_cz=1;
  268.         }
  269.         else
  270.         {
  271.                 if(Weight_Shiwu==0)
  272.                 LED=0;
  273.                 else if(Weight_Shiwu>0)
  274.                 LED=1;
  275.                 Buzzer = 1;
  276.                 flag_cz=0;
  277.         }
  278. }
  279. ……………………

  280. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
1-程序5kg.rar (65.57 KB, 下載次數: 129)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

無效樓層,該帖已經被刪除
ID:748312 發表于 2020-12-5 19:49 | 顯示全部樓層
好帖,學習了,謝謝提供!
回復

使用道具 舉報

ID:855271 發表于 2020-12-9 16:03 | 顯示全部樓層
upup,有沒有沒有分文件,一感到壓力就報警的代碼
回復

使用道具 舉報

ID:955504 發表于 2021-7-31 15:11 | 顯示全部樓層
有沒有沒有分文件,一感到壓力就報警的代碼
回復

使用道具 舉報

6#
無效樓層,該帖已經被刪除
7#
無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表