標(biāo)題: 基于51單片機(jī)HX711壓力檢測程序及手機(jī)藍(lán)牙APP控制 [打印本頁]

作者: 51hei圓圓    時(shí)間: 2025-5-23 19:25
標(biāo)題: 基于51單片機(jī)HX711壓力檢測程序及手機(jī)藍(lán)牙APP控制
HX711壓力檢測,用LCD1602,包含app的e4a文件源碼
通過51單片機(jī)檢測壓力,將數(shù)據(jù)通過編寫的藍(lán)牙APP發(fā)送到手機(jī)顯示,同時(shí)手機(jī)可以控制設(shè)定的壓力值。

電路原理圖如下:


e4a源碼:

制作出來的HX711壓力檢測實(shí)物圖如下:


單片機(jī)源程序如下:
  1. #include<reg51.h>
  2. #include "HX711.h"
  3. #include "LCD1602.h"
  4. #include "eeprom52.h"

  5. // char UART_data;
  6. // char shuju;
  7. /**********按鍵定義*********/
  8. sbit SKY_1=P1^3;//校準(zhǔn)
  9. sbit SKY_2=P1^4;//加
  10. sbit SKY_3=P1^5;//減
  11. bit  SKY_1_flag=0;//防抖標(biāo)志位
  12. bit  SKY_2_flag=0;
  13. bit  SKY_3_flag=0;
  14. sbit SKY_4=P1^6;//減
  15. /*********蜂鳴器***********/
  16. sbit BEEP=P1^0;
  17. /***********稱重定義區(qū)***********/
  18. unsigned long Weight_Maopi = 0;
  19. long Weight_Shiwu = 0;
  20. long Weight_Warn=2000;//報(bào)警值
  21. /********向app發(fā)送數(shù)據(jù)字符串定義區(qū)****/
  22. uchar see_add=0;//
  23. bit sendFlag=0;
  24. uchar saa[13];
  25. uchar UART_data; //定義串口接收數(shù)據(jù)變量
  26. //校準(zhǔn)參數(shù)
  27. //因?yàn)椴煌膫鞲衅魈匦郧不是很一致,因此,每一個(gè)傳感器需要矯正這里這個(gè)參數(shù)才能使測量值很準(zhǔn)確。
  28. //當(dāng)發(fā)現(xiàn)測試出來的重量偏大時(shí),增加該數(shù)值。
  29. //如果測試出來的重量偏小時(shí),減小改數(shù)值。
  30. //該值可以為小數(shù)
  31. #define GapValue 410
  32. //****************************************************
  33. //MS延時(shí)函數(shù)(12M晶振下測試)
  34. //****************************************************
  35. void Delay_ms(unsigned int n)
  36. {
  37.         unsigned int  i,j;
  38.         for(i=0;i<n;i++)
  39.                 for(j=0;j<123;j++);
  40. }
  41. void sendChar(uchar Value)  //發(fā)送一個(gè)字節(jié)數(shù)據(jù)  
  42. {  
  43.      SBUF = Value;      
  44.             while(!TI);
  45.                 TI=0;
  46. }
  47. void sendAll(uchar *pValue) //發(fā)送一組數(shù)據(jù)  
  48. {  
  49.     while((*pValue) != '\0')   //如果沒有發(fā)送完畢就繼續(xù)發(fā)  
  50.     {  
  51.         sendChar(*pValue);      //發(fā)送1字節(jié)數(shù)據(jù)  
  52.         pValue++;                 //指向下1個(gè)字節(jié)  
  53.     }  
  54. }
  55. //****************************************************
  56. //獲取毛皮重量
  57. //****************************************************
  58. void Get_Maopi()
  59. {
  60.         Weight_Maopi = HX711_Read();        
  61. }
  62. //****************************************************
  63. //稱重
  64. //****************************************************
  65. void Get_Weight()
  66. {
  67.         Weight_Shiwu = HX711_Read();
  68.         Weight_Shiwu = Weight_Shiwu - Weight_Maopi;                //獲取凈重
  69.         if(Weight_Shiwu > 0)                        
  70.         {        
  71.                 Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/GapValue);         //計(jì)算實(shí)物的實(shí)際重量
  72.                                                                                                                                                 
  73.                                                                                                                                                 
  74.                 if(Weight_Shiwu > Weight_Warn)                //超重報(bào)警
  75.                 {
  76.                         BEEP = 0;        
  77.                 }
  78.                 else
  79.                 {
  80.                         BEEP = 1;
  81.                 }
  82.         }
  83.         else
  84.         {
  85.                 Weight_Shiwu = 0;
  86.         }
  87.         
  88. }
  89. //1602顯示函數(shù)
  90. void dis_play()
  91. {
  92.         LCD1602_write(0,0x80);
  93.         LCD1602_writebyte("weighting:");
  94.         LCD1602_write(1,Weight_Shiwu/1000 + 0X30);
  95.         LCD1602_write(1,Weight_Shiwu%1000/100 + 0X30);
  96.         LCD1602_write(1,Weight_Shiwu%100/10 + 0X30);
  97.         LCD1602_write(1,Weight_Shiwu%10 + 0X30);
  98.         LCD1602_writebyte("g  ");
  99.         LCD1602_write(0,0xc0);
  100.         LCD1602_writebyte("warning: ");
  101.         if(Weight_Warn/1000==0) LCD1602_writebyte("0");  else LCD1602_write(1,Weight_Warn/1000+ 0X30);
  102.         if(Weight_Warn%1000/100==0) LCD1602_writebyte("0"); else LCD1602_write(1,Weight_Warn%1000/100+ 0X30);
  103.         if(Weight_Warn%100/10==0) LCD1602_writebyte("0"); else LCD1602_write(1,Weight_Warn%100/10+ 0X30);
  104.         if(Weight_Warn%10==0) LCD1602_writebyte("0"); else LCD1602_write(1,Weight_Warn%10+ 0X30);
  105.         LCD1602_writebyte("g  ");

  106. }
  107. //按鍵控制
  108. void sky_kg()
  109. {
  110.         if(SKY_1==0||UART_data==0x31)
  111.         {
  112.                 UART_data=0;
  113.                 if(SKY_1_flag==1)
  114.                 {
  115.                         SKY_1_flag=0;
  116.                         Get_Maopi();                        //去皮
  117.                 }
  118.         }
  119.         else
  120.                  SKY_1_flag=1;

  121.         if(SKY_2==0||UART_data==0x32)
  122.         {
  123.                 UART_data=0;
  124.                 if(SKY_2_flag==1)
  125.                 {
  126.                         SKY_2_flag=0;
  127.                         Weight_Warn+=100;
  128.                         if(Weight_Warn>5000)
  129.                                 Weight_Warn=5000;
  130.                         SectorErase(0x2000);
  131.                         byte_write(0x2000,Weight_Warn);
  132.                 }
  133.         }
  134.         else               
  135.         {
  136.                 SKY_2_flag=1;
  137.         }
  138.          if(SKY_3==0||UART_data==0x33)
  139.                 {
  140.                         UART_data=0;
  141.                         if(SKY_3_flag==1)
  142.                         {
  143.                                 SKY_3_flag=0;
  144.                                 Weight_Warn-=100;
  145.                                 if(Weight_Warn<0)
  146.                                         Weight_Warn=0;
  147.                                 SectorErase(0x2000);
  148.                                 byte_write(0x2000,Weight_Warn);
  149.                         }
  150.                 }
  151.                 else
  152.                 {
  153.                          SKY_3_flag=1;
  154.                 }
  155. }
  156. /***********上電讀取************/
  157. void eeprom_red()
  158. {
  159.         Weight_Warn=byte_read(0x2000);
  160.         if(Weight_Warn>5000||Weight_Warn<0)
  161.                 Weight_Warn=2000;
  162. }

  163.   void chushihua()
  164.   {
  165.     TMOD=0X20;                        //定時(shí)器工作方式設(shè)計(jì),方式2,自動重裝初值的8位定時(shí)器
  166.         TH1=0XFA;                        //設(shè)置波特率4800,此處晶振頻率是按12MHZ計(jì)算的
  167.         TL1=0XFA;
  168.         SCON=0X50;                         //設(shè)置串行口工作方式1,串行口允許接收
  169.         PCON=0X80;                        //波特率加倍
  170.         ES=1;                            //打開串行口中斷允許位
  171.         EA=1;                                 //打開總中斷
  172.         TR1=1;                                 //開啟定時(shí)器
  173.   }
  174. /********數(shù)據(jù)包發(fā)送函數(shù)**********/
  175. void steed()
  176. {
  177.                 saa[0]='d';
  178.                 saa[1]='a';
  179.                 saa[2]='t';
  180.                 saa[3]=Weight_Shiwu/1000 + 0X30;
  181.                 saa[4]=Weight_Shiwu%1000/100 + 0X30;
  182.                 saa[5]=Weight_Shiwu%100/10 + 0X30;
  183.                 saa[6]=Weight_Shiwu%10 + 0X30;

  184.                 saa[7]=Weight_Warn/1000+0X30;
  185.                 saa[8]=Weight_Warn%1000/100 + 0X30;
  186.                 saa[9]=Weight_Warn%100/10 + 0X30;
  187.                 saa[10]=Weight_Warn%10 + 0X30;

  188.                 saa[11]='t';
  189.                 saa[12]='a';
  190.                 SKY_4=0;
  191.                 sendAll(saa);
  192. }
  193.   /*主函數(shù)*/
  194.   void main()
  195.   {
  196. ……………………

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

單片機(jī)代碼和apk文件e4a文件 51hei附件下載:
信號采集控制器源碼.7z (5.33 MB, 下載次數(shù): 0)





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