找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機電子秤設(shè)計(程序,原理圖分享)

[復(fù)制鏈接]
ID:747209 發(fā)表于 2020-5-8 20:53 | 顯示全部樓層 |閱讀模式
可去皮,重量微調(diào),語音播報重量。

單片機源程序如下:
  1. #include "main.h"
  2. #include "LCD1602.h"
  3. #include "HX711.h"
  4. //#include"eeprom.h"

  5. unsigned long HX711_Buffer = 0;
  6. unsigned int Weight_Maopi = 0,Weight_Shiwu = 0;
  7. char Price_Count = 0;
  8. unsigned char KEY_NUM = 0;
  9. unsigned char Price_Buffer[3] = {0x00,0x00,0x00};
  10. unsigned long Money = 0;
  11. bit Flag_OK = 0;
  12. unsigned int Weight=10,s1num=0; //報警值初始化 按鍵計數(shù)標(biāo)志
  13. float m__1=2.90;


  14. //語音播報程序
  15. sbit MUSIC_REST =P2^2;//語音芯片復(fù)位腳                                       
  16. sbit MUSIC_DATA =P2^1;//語音芯片脈沖識別
  17. sbit bus =P2^0;//語音芯片工作狀態(tài)識別信號  
  18. unsigned char bbh,xm1,xm2,xm0,xm3;

  19. void delay_us(unsigned int us)
  20. {
  21.     while(us--)
  22.     {
  23.             _nop_();
  24.             _nop_();                 
  25.             _nop_();
  26.             _nop_();
  27.     }
  28. }
  29. void Music(unsigned char music_count)
  30. {
  31.     MUSIC_REST=1;
  32.     delay_us(200);
  33.     MUSIC_REST=0;
  34.     delay_us(200);

  35.     while(music_count>0)
  36.     {
  37.         MUSIC_DATA=1;
  38.         delay_us(100);
  39.         MUSIC_DATA=0;
  40.         delay_us(100);
  41.                 music_count--;
  42.     }
  43. }

  44. void Msc()
  45. {
  46.     if((xm0+xm1+xm2+xm3)!=0)                   //當(dāng)超出測量范圍時不進行播報
  47.         {
  48.                 Music(16);                                        //播報:“ 重量    ”
  49.                 while(!bus);
  50.                 if(xm0==0)
  51.                 {
  52.                               Music(2);                         //播報:“千位數(shù)具體值”          0
  53.                         while(!bus);       
  54.                 }                   
  55.                    else Music(xm0+2);                         //播報:“千位數(shù)具體值”
  56.                 while(!bus);
  57. //                Music(14);                                        //播報:“點”
  58. //                while(!bus);

  59.                 if(xm1==0)
  60.                 {
  61.                               Music(2);                         //播報:“百位數(shù)具體值”          0
  62.                         while(!bus);       
  63.                 }                   
  64.                    else Music(xm1+2);                         //播報:“千位數(shù)具體值”
  65.                 while(!bus);

  66.                 if((xm2+xm3)!=0)
  67.                 {          
  68.                        
  69.                         Music(xm2+2);                                //播報:“十分位的具體值”
  70.                         while(!bus);                               
  71.                         Music(xm3+2);                                //播報:“百分位的具體值”
  72.                         while(!bus);                   
  73.                         Music(15);                                //播報:“單位”
  74.                         while(!bus);
  75.                 }
  76.                 else
  77.                 {
  78.                         Music(15);                                //播報:“單位”
  79.                         while(!bus);       
  80.                 }
  81.         }          
  82. }
  83. //****************************************************
  84. //主函數(shù)
  85. //****************************************************
  86. void main()
  87. {
  88.         Init_LCD1602();                                                                        //初始化LCD1602

  89.         LCD1602_write_com(0x80);                                                //指針設(shè)置
  90.         LCD1602_write_word("Welcome to use! ");                        //開機畫面第一行


  91.         Delay_ms(2000);                 //延時2s   

  92.         Price_Buffer[0] = 0;
  93.         Price_Buffer[1] = 0;
  94.         Price_Buffer[2] = 0;
  95.         Flag_OK = 0;

  96.         LCD1602_write_com(0x80);                                                //指針設(shè)置
  97.         LCD1602_write_word("  Test weight   ");//重量檢測儀
  98.         LCD1602_write_com(0x80+0x40);                                //指針設(shè)置
  99.         LCD1602_write_word("weight:    g    ");

  100.        

  101.        
  102.         Get_Maopi();                                //稱毛皮重量

  103.         while(1)
  104.         {
  105.                
  106.                         Get_Weight();                        //稱重
  107.                         KEY_Scan();       
  108.         }
  109. }

  110. //****************************************************
  111. //稱重
  112. //****************************************************
  113. void Get_Weight()
  114. {
  115.         HX711_Buffer = HX711_Read();
  116.         HX711_Buffer = HX711_Buffer/100;
  117.         if(HX711_Buffer > Weight_Maopi)                       
  118.         {
  119.                 Weight_Shiwu = HX711_Buffer;
  120.                 Weight_Shiwu = Weight_Shiwu - Weight_Maopi;                                //獲取實物的AD采樣數(shù)值。
  121.        
  122.                 Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/m__1+0.05);         //計算實物的實際重量
  123.                                                                                                                                                 //因為不同的傳感器特性曲線不一樣,因此,每一個傳感器需要矯正這里的4.30這個除數(shù)。
  124.                                                                                                                                                 //當(dāng)發(fā)現(xiàn)測試出來的重量偏大時,增加該數(shù)值。
  125.                                                                                                                                                 //如果測試出來的重量偏小時,減小改數(shù)值。
  126.                                                                                                                                                 //該數(shù)值一般在4.0-5.0之間。因傳感器不同而定。
  127.                                                                                                                                                 //+0.05是為了四舍五入百分位
  128.        

  129.                    if(Weight_Shiwu >500 )Weight_Shiwu=500;
  130.                         if(Weight_Shiwu < 5)Weight_Shiwu=0;

  131.                         xm0=Weight_Shiwu/1000 ;
  132.                         xm1=Weight_Shiwu%1000/100;
  133.                         xm2=Weight_Shiwu%100/10;
  134.                         xm3=Weight_Shiwu%10;
  135.                         LCD1602_write_com(0x80+0x40+7);
  136.                         LCD1602_write_data(xm0+ 0x30);
  137.                         LCD1602_write_data(xm1 + 0x30);
  138.                         LCD1602_write_data(xm2 + 0x30);
  139.                         LCD1602_write_data(xm3 + 0x30);
  140.                        
  141.         }
  142.                                                   
  143.        
  144. }
  145. void delay(unsigned int x) //毫秒級延時函數(shù)
  146. {
  147.   unsigned int i,j;
  148.   for(i=x;i>0;i--)
  149.      for(j=110;j>0;j--);
  150. }
  151. void KEY_Scan()
  152. {
  153.           while(!k4)
  154.           {
  155.                   bbh=1;
  156.       }
  157.           if(bbh==1)                                        //bb=1調(diào)用一次播報程序
  158.           {
  159.                    bbh=0;
  160.                    Msc();
  161.            }
  162.             if(key1==0)                        //
  163.                 {
  164.                         delay(10);
  165.                         if(key1==0)
  166.                         {       
  167.                                 while(!key1);        //
  168.                                 Get_Maopi();                        //去皮       
  169.                         }
  170.                 }
  171.                 if(key2==0)                        //
  172.                 {
  173.                
  174.                         delay(10);
  175.                         if(key2==0)
  176.                         {       
  177.                                 while(!key2);        //        微調(diào)重量-
  178.                                 m__1=m__1+0.10;
  179.                                 if(m__1>=5.10)m__1=5.00;
  180.                                
  181.                         }
  182.                
  183.                 }
  184.                 if(key3==0)                        //
  185.                 {
  186.                
  187.                         delay(10);
  188.                         if(key3==0)
  189.                         {       
  190.                                 while(!key3);        // 微調(diào)重量+
  191.                                 m__1=m__1-0.10;
  192.                                 if(m__1<=1.10)m__1=2.50;
  193.                                
  194.                         }
  195.        
  196.                 }
  197. }

  198. //****************************************************
  199. //獲取毛皮重量
  200. //****************************************************
  201. void Get_Maopi()
  202. {
  203.         HX711_Buffer = HX711_Read();
  204.         Weight_Maopi = HX711_Buffer/100;               
  205. }

  206. //****************************************************
  207. //MS延時函數(shù)(12M晶振下測試)
  208. //****************************************************
  209. void Delay_ms(unsigned int n)
  210. {
  211.         unsigned int  i,j;
  212.         for(i=0;i<n;i++)
  213.                 for(j=0;j<123;j++);
  214. }
復(fù)制代碼

所有資料51hei提供下載:
電子稱設(shè)計.zip (174.55 KB, 下載次數(shù): 60)


回復(fù)

使用道具 舉報

ID:774657 發(fā)表于 2020-6-12 17:24 | 顯示全部樓層
做的真棒,點個贊
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表