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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 8197|回復(fù): 6
收起左側(cè)

51單片機(jī)hx711簡(jiǎn)易電子秤源程序

  [復(fù)制鏈接]
ID:383761 發(fā)表于 2018-8-7 12:05 | 顯示全部樓層 |閱讀模式
此程序適用單片機(jī)類(lèi)型STC89C52RC
0.png

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

  8. #define MAX   10000
  9. #define uint unsigned int
  10. #define uchar unsigned char
  11. #define ulong unsigned long

  12. #define delayNOP();{_nop_();_nop_();_nop_();_nop_();};

  13. //定義量程系數(shù)
  14. //#define RATIO     2356/1000
  15. uint RATIO;  

  16. //定義標(biāo)識(shí)
  17. volatile bit FlagTest = 0;                //定時(shí)測(cè)試標(biāo)志,每0.5秒置位,測(cè)完清0
  18. volatile bit FlagKeyPress = 0;  //有鍵按下標(biāo)志,處理完畢清0
  19. volatile bit FlagSetPrice = 0;  //價(jià)格設(shè)置狀態(tài)標(biāo)志,設(shè)置好為1?
  20. volatile bit ClearWeighFlag = 0; //傳感器調(diào)零標(biāo)志位,清除0漂?
  21. volatile bit wtk = 0; //稱(chēng)重/時(shí)間模式

  22. //管腳定義
  23. sbit beep = P3^3;
  24. sbit alert = P3^4;

  25. //顯示用變量
  26. int Counter;
  27. uchar idata str1[6] = "000000";
  28. int i, iTemp;

  29. //稱(chēng)重用變量
  30. ulong idata FullScale; //滿量程AD值/1000
  31. ulong AdVal;     //AD采樣值
  32. ulong weight;    //重量值,單位g
  33. ulong idata price;     //單價(jià),長(zhǎng)整型值,單位為分   
  34. ulong idata money;     //總價(jià),長(zhǎng)整型值,單位為分
  35. ulong idata pricebc;   //單價(jià),長(zhǎng)整型值,單位為分  

  36. //鍵盤(pán)處理變量
  37. uchar keycode;
  38. uchar DotPos;                                   //小數(shù)點(diǎn)標(biāo)志及位置
  39. uchar wttime;//

  40. //函數(shù)聲明
  41. void int2str(int, char *);
  42. void Data_Init();
  43. void Timer0_Init();
  44. void Timer0_ISR () ;
  45. void INT1_Init();
  46. void KeyPress(uchar);
  47. void To_Zero();
  48. void Display_Price();  //單價(jià)寫(xiě)入屏函數(shù)
  49. void Display_Weight(); //重量寫(xiě)入屏函數(shù)
  50. void Display_Money();  //總價(jià)寫(xiě)入屏函數(shù)


  51. //整型轉(zhuǎn)字符串的函數(shù),轉(zhuǎn)換范圍0--65536
  52. void int2str(int x, char* str)
  53. {
  54.         int i=1;
  55.         int tmp=10;
  56.         while(x/tmp!=0)
  57.         {
  58.                         i++;
  59.                         tmp*=10;
  60.         }
  61.         tmp=x;
  62.         str[i]='\0';
  63.         while(i>1)
  64.         {
  65.                         str[--i]='0'+(tmp%10);
  66.                         tmp/=10;
  67.         }
  68.         str[0]=tmp+'0';
  69. }

  70. //重新找回零點(diǎn),每次測(cè)量前調(diào)用
  71. void To_Zero()
  72. {
  73.            FullScale=ReadCount();
  74.            price=0;
  75. }


  76. /******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eeprom中******************/
  77. void write_eeprom()
  78. {
  79.         uchar x1,x2;
  80.         x1=RATIO/256;
  81.   x2=RATIO%256;
  82.         SectorErase(0x2000);
  83.         byte_write(0x2000, x1);
  84.         byte_write(0x2001, x2);
  85.         byte_write(0x2058, a_a);       
  86. }

  87. /******************把數(shù)據(jù)從單片機(jī)內(nèi)部eeprom中讀出來(lái)*****************/
  88. void read_eeprom()
  89. {
  90.         uchar x1,x2;
  91.   x2 = byte_read(0x2001);
  92.         x1 = byte_read(0x2000);
  93.         a_a= byte_read(0x2058);
  94.         RATIO = x1*256+x2;
  95. }

  96. /**************開(kāi)機(jī)自檢eeprom初始化*****************/
  97. void init_eeprom()
  98. {
  99.         read_eeprom();                //先讀
  100.         if(a_a != 1)                //新的單片機(jī)初始單片機(jī)內(nèi)問(wèn)eeprom
  101.         {
  102.                 RATIO = 3500;
  103.                 a_a = 1;
  104.                 write_eeprom();           //保存數(shù)據(jù)
  105.         }       
  106. }

  107. //顯示單價(jià),單位為元,四位整數(shù),兩位小數(shù)
  108. void Display_Price()
  109. {
  110.            uint i,j;
  111.         uchar A1,A2,A3,A4;
  112.         uchar B1,B2;
  113.            i = price/100;    //得到整數(shù)部分
  114.            j = price - i*100;//得到小數(shù)部分
  115.            int2str(i,str1);
  116.         A1=i/1000+48;
  117.         A2=i%1000/100+48;
  118.         A3=i%1000%100/10+48;
  119.         A4=i%1000%100%10+48;
  120.         B1=j/10+48;
  121.         B2=j%10+48;
  122.            //顯示整數(shù)部分
  123.            if (i>=1000)
  124.            {
  125.               Lcd_Pos(2,3);
  126.                 Lcd_Wdat(A1);
  127.                    Lcd_Wdat(A2);
  128.                 Lcd_Wdat(A3);
  129.                 Lcd_Wdat(A4);
  130.            }
  131.            else if (i>=100)
  132.            {
  133.               Lcd_Pos(2,3);
  134.                 Lcd_Wdat(' ');
  135.                    Lcd_Wdat(A2);
  136.                 Lcd_Wdat(A3);
  137.                 Lcd_Wdat(A4);
  138.            }
  139.            else if (i>=10)
  140.            {
  141.               Lcd_Pos(2,3);
  142.                 Lcd_Wdat(' ');
  143.                 Lcd_Wdat(' ');
  144.                 Lcd_Wdat(A3);
  145.                 Lcd_Wdat(A4);
  146.            }
  147.    else
  148.    {
  149.         Lcd_Pos(2,3);
  150.                 Lcd_Wdat(' ');
  151.                 Lcd_Wdat(' ');
  152.                 Lcd_Wdat(' ');
  153.                 Lcd_Wdat(A4);
  154.    }
  155.    //顯示小數(shù)點(diǎn), 小數(shù)點(diǎn)部分
  156.    int2str(j,str1);
  157.    if(j<10)
  158.    {
  159.         Lcd_Pos(2,5);
  160.                 Lcd_Wdat('.');
  161.                 Lcd_Wdat('0');
  162.                 Lcd_Wdat(B2);
  163.                 Lcd_Wdat(' ');          
  164.    }
  165.    else
  166.    {
  167.         Lcd_Pos(2,5);
  168.                 Lcd_Wdat('.');
  169.                 Lcd_Wdat(B1);
  170.                 Lcd_Wdat(B2);
  171.                 Lcd_Wdat(' ');
  172.    }
  173. }
  174. //顯示重量,單位kg,兩位整數(shù),三位小數(shù)
  175. void Display_Weight()
  176. {
  177.            uint i,j;
  178.            uchar A1,A2;
  179.            uchar B1,B2,B3;
  180.            //weight單位是g                                          
  181.            i = weight/1000;    //得到整數(shù)部分
  182.            j = weight - i*1000;//得到小數(shù)部分
  183.            A1=i/10+48;
  184.            A2=i%10+48;
  185.            B1=j/100+48;
  186.            B2=j%100/10+48;
  187.            B3=j%100%10+48;
  188.     int2str(i,str1);
  189.            if (i>=10)
  190.            {
  191.              
  192.            }
  193.            else
  194.            {
  195.                Lcd_Pos(1,4);
  196.                 Lcd_Wdat(' ');
  197.                 Lcd_Wdat(A2);
  198.            }  
  199.            int2str(j,str1);
  200.            if (j<10)
  201.            {
  202.               Lcd_Pos(1,5);
  203.                 Lcd_Wdat('.');
  204.                 Lcd_Wdat('0');
  205.                 Lcd_Wdat('0');
  206.                 Lcd_Wdat(B3);
  207.            }
  208.            else if (j<100)
  209.            {
  210.               Lcd_Pos(1,5);
  211.                 Lcd_Wdat('.');
  212.                 Lcd_Wdat('0');
  213.                 Lcd_Wdat(B2);
  214.                 Lcd_Wdat(B3);
  215.            }
  216.            else
  217.            {
  218.               Lcd_Pos(1,5);
  219.                 Lcd_Wdat('.');
  220.                 Lcd_Wdat(B1);
  221.                 Lcd_Wdat(B2);
  222.                 Lcd_Wdat(B3);
  223.            }
  224. }
  225. //顯示總價(jià),單位為元,四位整數(shù),兩位小數(shù)
  226. void Display_Money()
  227. {
  228.            uint i,j;
  229.            uchar A1,A2,A3,A4;
  230.            uchar B1,B2;
  231.            if (money>999999)         //超出顯示量程
  232.            {
  233.               Lcd_Pos(3,3);
  234.                 Lcd_Wdat('-');
  235.                 Lcd_Wdat('-');
  236.                    Lcd_Wdat('-');
  237.                 Lcd_Wdat('-');
  238.                 Lcd_Wdat('-');
  239.                 Lcd_Wdat('-');
  240.                 Lcd_Wdat('-');
  241.               return;      
  242.            }
  243.            i = money/100;    //得到整數(shù)部分
  244.            j = money - i*100;//得到小數(shù)部分
  245.            A1=i/1000+48;
  246.            A2=i%1000/100+48;
  247.            A3=i%1000%100/10+48;
  248.            A4=i%1000%100%10+48;
  249.            B1=j/10+48;
  250.            B2=j%10+48;
  251.            int2str(i,str1);
  252.            //顯示整數(shù)部分
  253.         if (i>=1000)
  254.            {
  255.               Lcd_Pos(3,3);
  256.                 Lcd_Wdat(A1);
  257.                    Lcd_Wdat(A2);
  258.                 Lcd_Wdat(A3);
  259.                 Lcd_Wdat(A4);
  260.            }
  261.            else if (i>=100)
  262.            {
  263.               Lcd_Pos(3,3);
  264.                 Lcd_Wdat(' ');
  265.                    Lcd_Wdat(A2);
  266.                 Lcd_Wdat(A3);
  267.                 Lcd_Wdat(A4);
  268.            }
  269.            else if (i>=10)
  270.            {
  271.               Lcd_Pos(3,3);
  272.                 Lcd_Wdat(' ');
  273.                 Lcd_Wdat(' ');
  274.                 Lcd_Wdat(A3);
  275.                 Lcd_Wdat(A4);
  276.            }
  277.            else
  278.            {
  279.              Lcd_Pos(3,3);
  280.                 Lcd_Wdat(' ');
  281.                 Lcd_Wdat(' ');
  282.                 Lcd_Wdat(' ');
  283.                 Lcd_Wdat(A4);
  284.            }
  285.            //顯示小數(shù)點(diǎn), 小數(shù)點(diǎn)部分
  286.            int2str(j,str1);
  287.            if(j<10)
  288.            {
  289.         Lcd_Pos(3,5);
  290.                 Lcd_Wdat('.');
  291.                 Lcd_Wdat('0');
  292.                 Lcd_Wdat(B2);          
  293.            }
  294.            else
  295.            {
  296.         Lcd_Pos(3,5);
  297.                 Lcd_Wdat('.');
  298.                 Lcd_Wdat(B1);
  299.                 Lcd_Wdat(B2);
  300.            }
  301. }
  302. //數(shù)據(jù)初始化
  303. void Data_Init()
  304. {
  305.            price = 0;
  306.            DotPos = 0;
  307.            beep = 1;
  308.            alert = 1;
  309. }

  310. //定時(shí)器0初始化
  311. void Timer0_Init()
  312. {
  313.         ET0 = 1;        //允許定時(shí)器0中斷
  314.         TMOD = 1;       //定時(shí)器工作方式選擇
  315.         TL0 = 0x06;     
  316.         TH0 = 0xf8;     //定時(shí)器賦予初值
  317.         TR0 = 1;        //啟動(dòng)定時(shí)器
  318. }
  319. //定時(shí)器0中斷
  320. void Timer0_ISR (void) interrupt 1 using 0
  321. {
  322.         TL0 = 0x06;
  323.         TH0 = 0xf8;     //定時(shí)器賦予初值

  324.         //每0.5秒鐘刷新重量
  325.     Counter ++;
  326.     if (Counter >= 200)
  327.     {
  328.                FlagTest = 1;
  329.                    Counter = 0;
  330.     }
  331. }
  332. //按鍵響應(yīng)程序,參數(shù)是鍵值
  333. //返回鍵值:
  334. //         1          2       3      10(清0)
  335. //         4          5       6      11(刪除單價(jià))
  336. //         7          8       9      12(去皮)
  337. //         14(未定義) 0      15(.)   13(未定義)

  338. void KeyPress(uchar keycode)
  339. {
  340.         switch (keycode)
  341.            {
  342.               case 0:
  343.               case 1:
  344.               case 2:
  345.               case 3:
  346.               case 4:
  347.               case 5:
  348.               case 6:
  349.               case 7:
  350.               case 8:
  351.               case 9:
  352.             //目前在設(shè)置整數(shù)位,要注意price是整型,存儲(chǔ)單位為分
  353.                    if (DotPos == 0)
  354.                 {  
  355.                     //最多只能設(shè)置到千位
  356.                         if (price<100000)
  357.                         {
  358.                               price=price*10+keycode*100;
  359.                         }
  360.                 }
  361.                  //目前在設(shè)置小數(shù)位
  362.                 else if (DotPos==1)  //小數(shù)點(diǎn)后第一位
  363.                 {
  364.                     price=price+keycode*10;
  365.                         DotPos++;
  366.                 }
  367.                 else if (DotPos==2)
  368.                 {
  369.                     price=price+keycode;
  370.                         DotPos++;
  371.                 }
  372.                         Display_Price();
  373.             break;
  374.                
  375.                
  376.       case 10:   //清零鍵
  377.                                 Delay(15);//延時(shí)
  378.                         pricebc=price;
  379.             To_Zero();
  380.                         price=pricebc;
  381.                          Display_Price();
  382.                          DotPos = 0;
  383.                         beep=~beep;
  384.                          break;
  385.                        
  386.                        
  387.                   case 11:        //清楚單價(jià)
  388.                                 Delay(15);//延時(shí)
  389.                                 price=0;
  390.                     DotPos = 0;
  391.                                 Display_Price();
  392.                  break;
  393.                        
  394.                   case 12:                //去皮
  395.                                 Delay(15);//延時(shí)
  396.                         ClearWeighFlag = 1;        //置零傳感器標(biāo)志 置1
  397.                         break;
  398.                        
  399.                        
  400.       case 13:   //微調(diào)
  401.                                 Delay(15);//延時(shí)
  402.                                 if(wtk==0)
  403.                                 RATIO--;//微調(diào)系數(shù)
  404.                         else
  405.                                 RATIO=RATIO-20;//微調(diào)系數(shù)
  406.                         write_eeprom();//存入eerom內(nèi),掉電不丟失系數(shù)數(shù)據(jù)
  407.                   break;
  408.                        
  409.                        
  410.                         case 14:   //微調(diào)減
  411.                                 Delay(15);//延時(shí)
  412.                         if(wtk==0)
  413.                                 RATIO++;//微調(diào)系數(shù)
  414.                         else
  415.                                 RATIO=RATIO+20;//微調(diào)系數(shù)
  416.                         write_eeprom();//存入eerom內(nèi),掉電不丟失系數(shù)數(shù)據(jù)
  417.                   break;
  418.                        
  419.                   case 15:   //小數(shù)點(diǎn)按下
  420.                                 Delay(15);//延時(shí)
  421.                          if (DotPos == 0)  
  422.                          {   
  423.                                 DotPos = 1;      //小數(shù)點(diǎn)后第一位
  424.                          }
  425.                      break;
  426.                    }
  427.            Delay(10);
  428. }



  429. void main()
  430. {
  431.    Lcd_Init();
  432.    EA = 0;
  433.    Data_Init();
  434.    Timer0_Init();
  435.    
  436.          EA = 1;//初始化完成,開(kāi)中斷
  437.          beep=1;
  438.         init_eeprom();

  439.          Lcd_Clear();    //clear all dots
  440.          Lcd_Display1();
  441.          Delay(700);
  442.          To_Zero();
  443.          Lcd_Clear();
  444.          Lcd_Display2();
  445.          Display_Price();   
  446.            while(1)
  447.            {
  448.               //每0.5秒稱(chēng)重一次
  449.                   if (FlagTest==1)
  450.                   {
  451.                      //稱(chēng)重,得到重量值weight,單位為g
  452.                          AdVal=ReadCount();
  453.                          weight=FullScale-AdVal;
  454.                          if (weight>0x8000000) weight=0;
  455.                                 weight=weight*10/RATIO;//物體實(shí)際重量=總量量程對(duì)于的是多少。
  456.                          //weight=10000*weight/FullScale;
  457.                          //weight=weight*RATIO;
  458.                          //如果超量程,則報(bào)警
  459.                          if (weight >= MAX)
  460.                          {
  461.                     beep = 0;
  462.                                 alert = 0;
  463.                                 Lcd_Pos(1,4);
  464.                                 Lcd_Wdat('-');
  465.                                 Lcd_Wdat('-');
  466.                                    Lcd_Wdat('-');
  467.                                 Lcd_Wdat('-');
  468.                                 Lcd_Wdat('-');
  469.                                 Lcd_Wdat('-');

  470.                                    Lcd_Pos(3,3);
  471.                                 Lcd_Wdat('-');
  472.                                 Lcd_Wdat('-');
  473.                                    Lcd_Wdat('-');
  474.                                 Lcd_Wdat('-');
  475.                                 Lcd_Wdat('-');
  476.                                 Lcd_Wdat('-');
  477.                                 Lcd_Wdat('-');
  478.                          }
  479.                          //如果不超量程
  480.                          else
  481.                          {
  482.                     beep = 1;
  483.                                 alert = 1;
  484.               Display_Weight();                 
  485.                     money = weight*price/1000;  //money單位為分                 
  486.                     Display_Money();//顯示總金額
  487.                           if(money>999999)
  488.                                         money=999999;
  489. ……………………

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

所有資料51hei提供下載:
1-程序-10kg.rar (67.55 KB, 下載次數(shù): 144)
回復(fù)

使用道具 舉報(bào)

ID:371269 發(fā)表于 2018-8-11 12:38 | 顯示全部樓層
博主那個(gè)清除0飄是什么意思啊
回復(fù)

使用道具 舉報(bào)

ID:396503 發(fā)表于 2018-9-11 20:12 | 顯示全部樓層
點(diǎn)贊,感覺(jué)收益很大
回復(fù)

使用道具 舉報(bào)

ID:369904 發(fā)表于 2019-8-3 11:24 | 顯示全部樓層
下載一個(gè)看看能不能用上
回復(fù)

使用道具 舉報(bào)

ID:48140 發(fā)表于 2019-9-30 09:17 來(lái)自手機(jī) | 顯示全部樓層
下載一個(gè)看看,這個(gè)還搞不懂。
回復(fù)

使用道具 舉報(bào)

ID:446775 發(fā)表于 2020-5-9 22:37 | 顯示全部樓層
請(qǐng)教一下,您這個(gè)校正的原理是什么呢?程序里 有嗎?
回復(fù)

使用道具 舉報(bào)

ID:638921 發(fā)表于 2020-6-27 11:09 | 顯示全部樓層
大佬,需要用到些什么東西,怎么連接,可以教一下嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 午夜伊人 | 日韩一区二区三区四区五区 | 91免费在线 | 成人av观看 | 欧美日韩一 | 久久精品视频12 | 欧美精品啪啪 | 免费亚洲一区二区 | 亚洲欧美中文日韩在线v日本 | 欧美13videosex性极品 | 日本一区二区不卡 | 男人的天堂中文字幕 | 国产一区二区三区视频 | 成人免费视频网 | 91在线看网站 | 亚洲影视在线 | 亚洲在线成人 | 亚洲欧美激情四射 | 成人亚洲| 亚洲一区在线免费观看 | 亚洲性爰 | 日日夜夜草 | 福利国产 | 天天天操操操 | 国产高清一区二区三区 | 欧美精品乱码久久久久久按摩 | 国产日韩欧美一区二区 | 伊人久久大香线 | 国产日韩欧美在线 | 艹逼网| 美女视频一区二区三区 | 国产91久久久久蜜臀青青天草二 | 欧美精品一区在线 | 一区二区免费 | 久久av一区二区三区 | 国产美女一区 | 国产乱码精品一区二区三区中文 | 99久久99| 色约约视频 | 伊人久久综合影院 | 国产精品99久久免费观看 |