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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8230|回復: 6
收起左側

51單片機hx711簡易電子秤源程序

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

單片機源程序如下:
  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. //定義量程系數
  14. //#define RATIO     2356/1000
  15. uint RATIO;  

  16. //定義標識
  17. volatile bit FlagTest = 0;                //定時測試標志,每0.5秒置位,測完清0
  18. volatile bit FlagKeyPress = 0;  //有鍵按下標志,處理完畢清0
  19. volatile bit FlagSetPrice = 0;  //價格設置狀態標志,設置好為1?
  20. volatile bit ClearWeighFlag = 0; //傳感器調零標志位,清除0漂?
  21. volatile bit wtk = 0; //稱重/時間模式

  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. //稱重用變量
  30. ulong idata FullScale; //滿量程AD值/1000
  31. ulong AdVal;     //AD采樣值
  32. ulong weight;    //重量值,單位g
  33. ulong idata price;     //單價,長整型值,單位為分   
  34. ulong idata money;     //總價,長整型值,單位為分
  35. ulong idata pricebc;   //單價,長整型值,單位為分  

  36. //鍵盤處理變量
  37. uchar keycode;
  38. uchar DotPos;                                   //小數點標志及位置
  39. uchar wttime;//

  40. //函數聲明
  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();  //單價寫入屏函數
  49. void Display_Weight(); //重量寫入屏函數
  50. void Display_Money();  //總價寫入屏函數


  51. //整型轉字符串的函數,轉換范圍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. //重新找回零點,每次測量前調用
  71. void To_Zero()
  72. {
  73.            FullScale=ReadCount();
  74.            price=0;
  75. }


  76. /******************把數據保存到單片機內部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. /******************把數據從單片機內部eeprom中讀出來*****************/
  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. /**************開機自檢eeprom初始化*****************/
  97. void init_eeprom()
  98. {
  99.         read_eeprom();                //先讀
  100.         if(a_a != 1)                //新的單片機初始單片機內問eeprom
  101.         {
  102.                 RATIO = 3500;
  103.                 a_a = 1;
  104.                 write_eeprom();           //保存數據
  105.         }       
  106. }

  107. //顯示單價,單位為元,四位整數,兩位小數
  108. void Display_Price()
  109. {
  110.            uint i,j;
  111.         uchar A1,A2,A3,A4;
  112.         uchar B1,B2;
  113.            i = price/100;    //得到整數部分
  114.            j = price - i*100;//得到小數部分
  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.            //顯示整數部分
  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.    //顯示小數點, 小數點部分
  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,兩位整數,三位小數
  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;    //得到整數部分
  182.            j = weight - i*1000;//得到小數部分
  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. //顯示總價,單位為元,四位整數,兩位小數
  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;    //得到整數部分
  244.            j = money - i*100;//得到小數部分
  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.            //顯示整數部分
  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.            //顯示小數點, 小數點部分
  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. //數據初始化
  303. void Data_Init()
  304. {
  305.            price = 0;
  306.            DotPos = 0;
  307.            beep = 1;
  308.            alert = 1;
  309. }

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

  324.         //每0.5秒鐘刷新重量
  325.     Counter ++;
  326.     if (Counter >= 200)
  327.     {
  328.                FlagTest = 1;
  329.                    Counter = 0;
  330.     }
  331. }
  332. //按鍵響應程序,參數是鍵值
  333. //返回鍵值:
  334. //         1          2       3      10(清0)
  335. //         4          5       6      11(刪除單價)
  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.             //目前在設置整數位,要注意price是整型,存儲單位為分
  353.                    if (DotPos == 0)
  354.                 {  
  355.                     //最多只能設置到千位
  356.                         if (price<100000)
  357.                         {
  358.                               price=price*10+keycode*100;
  359.                         }
  360.                 }
  361.                  //目前在設置小數位
  362.                 else if (DotPos==1)  //小數點后第一位
  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);//延時
  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:        //清楚單價
  388.                                 Delay(15);//延時
  389.                                 price=0;
  390.                     DotPos = 0;
  391.                                 Display_Price();
  392.                  break;
  393.                        
  394.                   case 12:                //去皮
  395.                                 Delay(15);//延時
  396.                         ClearWeighFlag = 1;        //置零傳感器標志 置1
  397.                         break;
  398.                        
  399.                        
  400.       case 13:   //微調
  401.                                 Delay(15);//延時
  402.                                 if(wtk==0)
  403.                                 RATIO--;//微調系數
  404.                         else
  405.                                 RATIO=RATIO-20;//微調系數
  406.                         write_eeprom();//存入eerom內,掉電不丟失系數數據
  407.                   break;
  408.                        
  409.                        
  410.                         case 14:   //微調減
  411.                                 Delay(15);//延時
  412.                         if(wtk==0)
  413.                                 RATIO++;//微調系數
  414.                         else
  415.                                 RATIO=RATIO+20;//微調系數
  416.                         write_eeprom();//存入eerom內,掉電不丟失系數數據
  417.                   break;
  418.                        
  419.                   case 15:   //小數點按下
  420.                                 Delay(15);//延時
  421.                          if (DotPos == 0)  
  422.                          {   
  423.                                 DotPos = 1;      //小數點后第一位
  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;//初始化完成,開中斷
  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秒稱重一次
  449.                   if (FlagTest==1)
  450.                   {
  451.                      //稱重,得到重量值weight,單位為g
  452.                          AdVal=ReadCount();
  453.                          weight=FullScale-AdVal;
  454.                          if (weight>0x8000000) weight=0;
  455.                                 weight=weight*10/RATIO;//物體實際重量=總量量程對于的是多少。
  456.                          //weight=10000*weight/FullScale;
  457.                          //weight=weight*RATIO;
  458.                          //如果超量程,則報警
  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. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

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


回復

使用道具 舉報

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

使用道具 舉報

ID:396503 發表于 2018-9-11 20:12 | 顯示全部樓層
點贊,感覺收益很大
回復

使用道具 舉報

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

使用道具 舉報

ID:48140 發表于 2019-9-30 09:17 來自手機 | 顯示全部樓層
下載一個看看,這個還搞不懂。
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精品va在线看黑人 | 在线免费91 | 国产精品久久久久久久午夜片 | 色橹橹欧美在线观看视频高清 | 一本岛道一二三不卡区 | 激情六月丁香婷婷 | 久久久91精品国产一区二区精品 | 精品中文字幕一区 | 久久99久久 | 欧美xxxx做受欧美 | 91九色在线观看 | 国产精品久久久久久久久久久久 | 国产高清一二三区 | www.日本在线播放 | 国产日产精品一区二区三区四区 | h视频免费看 | av在线伊人 | 欧美国产视频 | 久久99国产精一区二区三区 | 成人1区2区 | 国产视频中文字幕 | 欧美一区在线视频 | 日本三级电影在线观看视频 | 亚洲国产一区在线 | 亚洲欧洲成人 | 日韩在线免费 | 91精品久久久久久久久久小网站 | 日韩成人在线电影 | 天天爽夜夜爽精品视频婷婷 | 人人鲁人人莫人人爱精品 | av网址在线播放 | 亚洲不卡一 | 亚洲视频中文 | 亚洲+变态+欧美+另类+精品 | 日韩在线小视频 | 91精品国产综合久久久亚洲 | 九九热这里只有精品在线观看 | 久草综合在线 | 日日摸夜夜添夜夜添特色大片 | 99精品热视频 | 精品综合久久久 |