標(biāo)題: 基于HX711+51單片機(jī)電子秤仿真制作源碼 [打印本頁(yè)]

作者: always121    時(shí)間: 2018-4-3 16:18
標(biāo)題: 基于HX711+51單片機(jī)電子秤仿真制作源碼
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)



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

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

  10. unsigned long HX711_Buffer = 0;
  11. unsigned long Weight_Maopi = 0;
  12. unsigned long Weight_Maopi_0 = 0;
  13. long Weight_Shiwu = 0;
  14. unsigned int qupi=0;
  15. //鍵盤(pán)處理變量
  16. unsigned char keycode;
  17. unsigned char key_press_num=0;
  18. uint GapValue,GapValue1;

  19. //定義標(biāo)識(shí)
  20. volatile bit FlagTest = 0;                //定時(shí)測(cè)試標(biāo)志,每0.5秒置位,測(cè)完清0
  21. volatile bit FlagKeyPress = 0;  //有鍵按下標(biāo)志,處理完畢清0
  22. //校準(zhǔn)參數(shù)
  23. //因?yàn)椴煌膫鞲衅魈匦郧(xiàn)不是很一致,因此,每一個(gè)傳感器需要矯正這里這個(gè)參數(shù)才能使測(cè)量值很準(zhǔn)確。
  24. //當(dāng)發(fā)現(xiàn)測(cè)試出來(lái)的重量偏大時(shí),增加該數(shù)值。
  25. //如果測(cè)試出來(lái)的重量偏小時(shí),減小改數(shù)值。
  26. //該值可以為小數(shù)
  27. //#define GapValue 349
  28. sbit LED=P1^1;
  29. sbit ROW1=P3^0;
  30. sbit ROW2=P3^1;
  31. sbit ROW3=P3^2;
  32. sbit ROW4=P3^3;

  33. volatile bit ClearWeighFlag = 0; //傳感器調(diào)零標(biāo)志位,清除0漂

  34. /******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eeprom中******************/
  35. void write_eeprom()
  36. {
  37.         SectorErase(0x2000);
  38.         GapValue1=GapValue&0x00ff;
  39.         byte_write(0x2000, GapValue1);
  40.         GapValue1=(GapValue&0xff00)>>8;
  41.         byte_write(0x2001, GapValue1);
  42.         byte_write(0x2060, a_a);        
  43. }

  44. /******************把數(shù)據(jù)從單片機(jī)內(nèi)部eeprom中讀出來(lái)*****************/
  45. void read_eeprom()
  46. {
  47.         GapValue   = byte_read(0x2001);
  48.         GapValue   = (GapValue<<8)|byte_read(0x2000);
  49.         a_a      = byte_read(0x2060);
  50. }

  51. /**************開(kāi)機(jī)自檢eeprom初始化*****************/
  52. void init_eeprom()
  53. {
  54.         read_eeprom();                //先讀
  55.         if(a_a != 1)                //新的單片機(jī)初始單片機(jī)內(nèi)問(wèn)eeprom
  56.         {
  57.                 GapValue  = 3500;
  58.                 a_a = 1;
  59.                 write_eeprom();           //保存數(shù)據(jù)
  60.         }        
  61. }

  62. //顯示重量,單位kg,兩位整數(shù),三位小數(shù)
  63. void Display_Weight()
  64. {
  65.         LCD1602_write_com(0x80+0x40+8);
  66.         if(Weight_Shiwu/10000==0)
  67.         LCD1602_write_data(' ');
  68.         else
  69.         LCD1602_write_data(Weight_Shiwu/10000 + 0x30);
  70.         LCD1602_write_data(Weight_Shiwu%10000/1000 + 0x30);
  71.         LCD1602_write_data('.');
  72.         LCD1602_write_data(Weight_Shiwu%1000/100 + 0x30);
  73.         LCD1602_write_data(Weight_Shiwu%100/10 + 0x30);
  74.         LCD1602_write_data(Weight_Shiwu%10 + 0x30);
  75. }

  76. //定時(shí)器0初始化
  77. void Timer0_Init()
  78. {
  79.         ET0 = 1;        //允許定時(shí)器0中斷
  80.         TMOD = 1;       //定時(shí)器工作方式選擇
  81.         TL0 = 0xb0;     
  82.         TH0 = 0x3c;     //定時(shí)器賦予初值
  83.         TR0 = 1;        //啟動(dòng)定時(shí)器
  84. }

  85. //定時(shí)器0中斷
  86. void Timer0_ISR (void) interrupt 1 using 0
  87. {
  88.         uchar Counter;
  89.         TL0 = 0xb0;
  90.         TH0 = 0x3c;     //定時(shí)器賦予初值

  91.         //每0.5秒鐘刷新重量
  92.     Counter ++;
  93.     if (Counter >= 10)
  94.     {
  95.        FlagTest = 1;
  96.            Counter = 0;
  97.     }
  98. }


  99. //按鍵響應(yīng)程序,參數(shù)是鍵值
  100. //返回鍵值:
  101. //         7          8    9      10(清0)
  102. //         4          5    6      11(刪除)
  103. //         1          2    3      12(未定義)
  104. //         14(未定義) 0    15(.)  13(確定價(jià)格)

  105. void KeyPress()
  106. {
  107.         if(ROW1==0)   //去皮鍵
  108.         {
  109.                 Delay_ms(5);
  110.                 if(ROW1==0)
  111.                 {
  112. //                        Get_Maopi();
  113.                         if(qupi==0)
  114.                         qupi=Weight_Shiwu;
  115.                         else
  116.                         qupi=0;
  117.                         Buzzer=0;
  118.                         Delay_ms(50);
  119.                         Buzzer=1;        
  120.                         while(ROW1==0);
  121.                 }
  122.         }
  123.         if(ROW2==0)           //加
  124.         {
  125.                 Delay_ms(5);
  126.                 if(ROW2==0)
  127.                 {
  128.                         while(!ROW2)
  129.                         {
  130.                                 key_press_num++;
  131.                                 if(key_press_num>=100)
  132.                                 {
  133.                                         key_press_num=0;
  134.                                         while(!ROW2)
  135.                                         {
  136.                                                 if(GapValue<10000)
  137.                                                 GapValue+=10;
  138.                                                 Buzzer=0;
  139.                                                 Delay_ms(10);
  140.                                                 Buzzer=1;
  141.                                                 Delay_ms(10);
  142.                                                 Get_Weight();
  143.                                         }
  144.                                 }
  145.                                 Delay_ms(10);
  146.                         }
  147.                         if(key_press_num!=0)
  148.                         {
  149.                                 key_press_num=0;
  150.                                 if(GapValue<10000)
  151.                                 GapValue++;
  152.                                 Buzzer=0;
  153.                                 Delay_ms(50);
  154.                                 Buzzer=1;
  155.                         }
  156.                         write_eeprom();               
  157.                 }
  158.         }
  159.         if(ROW3==0)  //減
  160.         {
  161.                 Delay_ms(5);
  162.                 if(ROW3==0)
  163.                 {
  164.                         while(!ROW3)
  165.                         {
  166.                                 key_press_num++;
  167.                                 if(key_press_num>=100)
  168.                                 {
  169.                                         key_press_num=0;
  170.                                         while(!ROW3)
  171.                                         {
  172.                                                 if(GapValue>1)
  173.                                                 GapValue-=10;
  174.                                                 Buzzer=0;
  175.                                                 Delay_ms(10);
  176.                                                 Buzzer=1;
  177.                                                 Delay_ms(10);
  178.                                                 Get_Weight();
  179.                                         }
  180.                                 }
  181.                                 Delay_ms(10);
  182.                         }
  183.                         if(key_press_num!=0)
  184.                         {
  185.                                 key_press_num=0;
  186.                                 if(GapValue>1)
  187.                                 GapValue--;
  188.                                 Buzzer=0;
  189.                                 Delay_ms(50);
  190.                                 Buzzer=1;
  191.                         }
  192.                         write_eeprom();                           //保存數(shù)?
  193.                 }
  194.         }
  195. }
  196. //****************************************************
  197. //主函數(shù)
  198. //****************************************************
  199. void main()
  200. {
  201.         init_eeprom();  //開(kāi)始初始化保存的數(shù)據(jù)
  202.         Init_LCD1602();                                                                        //初始化LCD1602
  203.    EA = 0;
  204.    Timer0_Init();
  205.    //初中始化完成,開(kāi)斷
  206.    EA = 1;
  207.         
  208. //        Get_Maopi();
  209.         LCD1602_write_com(0x80);                                                //指針設(shè)置
  210.    LCD1602_write_word(" Welcome To Use ");        //  
  211.    LCD1602_write_com(0x80+0x40);                                                //指針設(shè)置
  212.    LCD1602_write_word("Electronic Scale");
  213. //   Delay_ms(2000);
  214.    Get_Maopi();
  215.    LCD1602_write_com(0x80);                                                //指針設(shè)置
  216.    LCD1602_write_word("The Weight:     ");
  217.    LCD1602_write_com(0x80+0x40);                                //指針設(shè)置
  218.    LCD1602_write_word("         0.000kg");
  219. //        Get_Maopi();                                //稱(chēng)毛皮重量

  220.         while(1)
  221.         {
  222. //每0.5秒稱(chēng)重一次
  223.                 if (FlagTest==1)
  224.                 {
  225.                         Get_Weight();
  226.                         FlagTest = 0;
  227.                 }         
  228.                 KeyPress();
  229.         }
  230. }
  231. //****************************************************
  232. //稱(chēng)重
  233. //****************************************************
  234. void Get_Weight()
  235. {
  236.         Weight_Shiwu = HX711_Read();
  237.         Weight_Shiwu = Weight_Shiwu - Weight_Maopi;                //獲取凈重
  238.         
  239.         Weight_Shiwu = (unsigned int)((float)(Weight_Shiwu*10)/GapValue)-qupi;         //計(jì)算實(shí)物的實(shí)際重量                                                                                                                                
  240.         if(Weight_Shiwu >= 10000)                //超重報(bào)警
  241.         {
  242.                 Buzzer = !Buzzer;        
  243.                 LED=!LED;
  244.                 LCD1602_write_com(0x80+0x40+8);
  245.            LCD1602_write_word("--.---");
  246.         }
  247.         else
  248.         {
  249.                 if(Weight_Shiwu==0)
  250.                 LED=0;
  251.                 else if(Weight_Shiwu>0)
  252.                 LED=1;
  253.                 Buzzer = 1;
  254.                 Display_Weight();
  255.         }
  256. }
  257. ……………………

  258. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:

1-程序長(zhǎng)按校準(zhǔn).rar (71.51 KB, 下載次數(shù): 822)
2-原理圖.rar (218.25 KB, 下載次數(shù): 573)
5-仿真.rar (76.88 KB, 下載次數(shù): 915)


作者: luxuan    時(shí)間: 2018-4-19 10:57
請(qǐng)問(wèn),顯示此處 LCD1602_write_data(Weight_Shiwu/10000 + 0x30);         LCD1602_write_data(Weight_Shiwu%10000/1000 + 0x30);         LCD1602_write_data('.');         LCD1602_write_data(Weight_Shiwu%1000/100 + 0x30);         LCD1602_write_data(Weight_Shiwu%100/10 + 0x30);         LCD1602_write_data(Weight_Shiwu%10 + 0x30);為什莫加0x30
作者: llyBXS    時(shí)間: 2018-5-9 19:36
請(qǐng)問(wèn)怎么仿真hx711

作者: 王ji    時(shí)間: 2018-5-21 01:58
里面有hx711的仿真庫(kù)文件
作者: 邵卷卷    時(shí)間: 2018-7-18 11:37
求問(wèn) 怎么改一下按鍵的作用    讓它按一下加一次 顯示到1602上呢  急求
作者: XIAOBIG    時(shí)間: 2019-3-30 21:08
贊一個(gè),下了一個(gè)Proteus7.8終于成功了
作者: dxn396396396    時(shí)間: 2019-4-3 19:18
你好,hx711仿真圖和電路圖不一樣?有傳感器部分的電路圖嗎?
作者: L哈哈    時(shí)間: 2019-4-8 11:06
仿真庫(kù)里面沒(méi)有HX711啊
作者: L哈哈    時(shí)間: 2019-4-26 14:29
HX711模塊右邊那兩個(gè)那兩個(gè)引腳的作用是什么
作者: 18850023545    時(shí)間: 2019-5-4 16:41
很好,完美
作者: 15207818259    時(shí)間: 2019-5-24 09:38
非常感謝樓主的分享,最近在學(xué)習(xí)單片機(jī),資料非常有幫助。
作者: 幫幫我    時(shí)間: 2019-5-25 09:46
這個(gè)程序真的很走心,不過(guò)還是HX711的部分有點(diǎn)看不懂,希望技術(shù)員大大能及時(shí)出現(xiàn)
作者: 竹露    時(shí)間: 2019-6-4 21:06
hx711右邊兩個(gè)接地的引腳作用是什么?

作者: 我和我的貓    時(shí)間: 2019-6-8 12:45
仿真圖怎么運(yùn)行??
作者: 半年    時(shí)間: 2019-6-13 19:07
稱(chēng)重在哪
作者: llh0303    時(shí)間: 2019-6-14 22:24
很棒!
作者: llh0303    時(shí)間: 2019-6-15 00:26
請(qǐng)問(wèn),hx711加載模塊怎么加載到proteus軟件里,使hx711能在proteus里找到呢?謝謝
作者: DDFGH    時(shí)間: 2019-9-22 11:52
很好,很實(shí)用
作者: qq937507874    時(shí)間: 2019-11-23 14:38
學(xué)習(xí)哦
作者: 2大豬頭2    時(shí)間: 2019-11-25 10:40
很棒的程序

作者: 雪曦    時(shí)間: 2020-2-21 21:19
顯示器用lcd1602可以嗎
作者: 秋易老    時(shí)間: 2020-3-4 23:10
這個(gè)可以用嗎
作者: 秋易老    時(shí)間: 2020-3-4 23:27
llh0303 發(fā)表于 2019-6-15 00:26
請(qǐng)問(wèn),hx711加載模塊怎么加載到proteus軟件里,使hx711能在proteus里找到呢?謝謝

需要把HX711添加在庫(kù)里,系統(tǒng)→設(shè)置路徑→庫(kù)文件夾→右面的+,然后下面的確定,最后添加搜索HX711就有了
作者: 12341315    時(shí)間: 2020-4-4 16:48
里面沒(méi)有找到hx711的庫(kù)鴨
作者: yy3900636    時(shí)間: 2020-4-4 22:16
已經(jīng)做完了才看到樓主分享的東東~~哎,不過(guò)仿真還是用得上的~~~
作者: 樹(shù)呀兒    時(shí)間: 2020-4-10 17:14
請(qǐng)問(wèn)訪(fǎng)問(wèn)中 hx711那的非門(mén)是什么作用呢 ,怎么將輸入按鍵變成壓力傳感器輸入呢 求大佬指導(dǎo)一下

作者: 123看看    時(shí)間: 2020-4-15 00:37
這個(gè)顯示屏可以換成LCD12864嗎
作者: 樹(shù)呀兒    時(shí)間: 2020-4-15 16:26
請(qǐng)問(wèn)hx711模塊加載的hex文件 是從哪里來(lái)的
作者: zbfdyw    時(shí)間: 2020-4-16 11:10
如果我要學(xué)習(xí),你這是很好的資料。感謝您細(xì)心的整理,感謝論壇提供給大家學(xué)習(xí)交流的環(huán)境!
作者: bigbon    時(shí)間: 2020-4-18 09:23
12341315 發(fā)表于 2020-4-4 16:48
里面沒(méi)有找到hx711的庫(kù)鴨

需要把HX711添加在庫(kù)里,系統(tǒng)→設(shè)置路徑→庫(kù)文件夾→右面的+,然后下面的確定,最后添加搜索HX711就有了
作者: bigbon    時(shí)間: 2020-4-18 09:25
HX711你這里面有嗎?
作者: lingluoling    時(shí)間: 2020-4-29 15:51
這個(gè)的傳感器是如何實(shí)現(xiàn)的
作者: wdx1234    時(shí)間: 2020-5-7 15:18
優(yōu)秀!
作者: HA12678    時(shí)間: 2020-5-18 12:02
有hx711庫(kù)文件可以提供一下嗎
作者: hyxhyxzb    時(shí)間: 2020-9-3 14:33
luxuan 發(fā)表于 2018-4-19 10:57
請(qǐng)問(wèn),顯示此處 LCD1602_write_data(Weight_Shiwu/10000 + 0x30);         LCD1602_write_data(Weight_Shiw ...

同問(wèn)?
作者: vtjason    時(shí)間: 2020-9-22 14:12
剛好需要, 感謝分享~~
作者: 熱愛(ài)小白    時(shí)間: 2020-11-8 16:45
我protues用不了?

作者: BRYCE0    時(shí)間: 2021-4-20 21:03
根本沒(méi)有庫(kù)文件啊
作者: feier    時(shí)間: 2021-4-25 20:12
能不能教個(gè)具體方案通過(guò)51控制hx711到達(dá)一定程度后舵機(jī)可以轉(zhuǎn)一定程度,然后低于一定程度舵機(jī)回轉(zhuǎn)

作者: 860012525    時(shí)間: 2021-5-14 18:29
這個(gè)功能比較簡(jiǎn)單,剛好可以用
作者: N123456N    時(shí)間: 2021-11-29 21:24
llyBXS 發(fā)表于 2018-5-9 19:36
請(qǐng)問(wèn)怎么仿真hx711

里面有仿真好的

作者: kavin21513    時(shí)間: 2021-12-1 08:39
厲害了,還HX711也做了個(gè)仿真
作者: dhbt2021    時(shí)間: 2021-12-10 21:31
有沒(méi)有設(shè)置功能?
作者: 潘汝見(jiàn)    時(shí)間: 2023-3-26 13:40
HX711模塊是要自己繪制嗎,Proteus庫(kù)里找不到和這個(gè)一樣的
作者: 潘汝見(jiàn)    時(shí)間: 2023-3-26 14:40
樓主,這個(gè)HX711是怎么繪制的啊
作者: 潘汝見(jiàn)    時(shí)間: 2023-4-5 16:24
luxuan 發(fā)表于 2018-4-19 10:57
請(qǐng)問(wèn),顯示此處 LCD1602_write_data(Weight_Shiwu/10000 + 0x30);         LCD1602_write_data(Weight_Shiw ...

顯示字符啊,數(shù)字加個(gè)0X30在lcd1602就能顯示出來(lái)
作者: goalpeak    時(shí)間: 2023-4-7 15:23
lingluoling 發(fā)表于 2020-4-29 15:51
這個(gè)的傳感器是如何實(shí)現(xiàn)的

圖片左上角E+ A+ A-和GND是惠世通電橋輸出
作者: goalpeak    時(shí)間: 2023-4-7 15:24
feier 發(fā)表于 2021-4-25 20:12
能不能教個(gè)具體方案通過(guò)51控制hx711到達(dá)一定程度后舵機(jī)可以轉(zhuǎn)一定程度,然后低于一定程度舵機(jī)回轉(zhuǎn)

可以通過(guò)讀取711內(nèi)部的AD,和軟件內(nèi)部設(shè)定的值進(jìn)行比較后判斷輸出即可
作者: goalpeak    時(shí)間: 2023-4-7 15:25
半年 發(fā)表于 2019-6-13 19:07
稱(chēng)重在哪

左上角圖片E+ A+ A- GND就是
作者: 清風(fēng)飛舞    時(shí)間: 2023-6-1 22:23
秋易老 發(fā)表于 2020-3-4 23:27
需要把HX711添加在庫(kù)里,系統(tǒng)→設(shè)置路徑→庫(kù)文件夾→右面的+,然后下面的確定,最后添加搜索HX711就有了

添加加哪一個(gè)文件呢?
作者: wsadfeww    時(shí)間: 2023-6-13 22:32
HX711庫(kù)里面不一樣




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1