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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7057|回復: 3
打印 上一主題 下一主題
收起左側

51單片機HX711傳感器電子秤設計(原理圖、程序源碼、BOM等)

[復制鏈接]
跳轉到指定樓層
樓主
基于51單片機HX711傳感器電子秤設計制作出來的實物圖如下:


元件型號    元件名稱    元件標號    數量
蜂鳴器    Bell    B1    1
10uF    電容    C1    1
20pF    電容    C2, C3    2
LCD1602    液晶     LCD1    1
Header 2    電源接口    P1    1
9012    三極管    Q5    1
2.7K    電阻    R1    1
10K    電阻    R2    1
SW-PB    按鍵    S1, S3, S4, S5, S6, S7, S8, S9, S10, S11, S12, S13, S14, S15, S16, S17, S18    17
sw-灰色    電源開關    SW1    1
U1    單片機    U1    1
12M    晶振    Y1    1

單片機源程序如下:
  1. #include <reg52.h>                 //調用單片機頭文件
  2. #define uchar unsigned char  //無符號字符型 宏定義        變量范圍0~255
  3. #define uint  unsigned int         //無符號整型 宏定義        變量范圍0~65535

  4. #define ulong unsigned long

  5. #include<intrins.h>

  6. uchar code table_num[]="0123456789abcdefg";

  7. sbit rs=P1^0;         //寄存器選擇信號 H:數據寄存器          L:指令寄存器
  8. sbit rw=P1^1;         //寄存器選擇信號 H:數據寄存器          L:指令寄存器
  9. sbit e =P1^2;         //片選信號   下降沿觸發

  10. sbit hx711_dout=P2^1;
  11. sbit hx711_sck=P2^0;

  12. sbit beep = P1^3;     //蜂鳴器

  13. long weight;

  14. uint temp,qi_weight;
  15. bit chaozhong_flag;
  16. bit leiji_flag;
  17. bit flag_300ms ;

  18. ulong price,z_price;   //單價 總價
  19. uchar flag_p;

  20. /***************
  21. 刪除鍵
  22. 去皮
  23. 價格清零

  24. ***************/

  25. /******1ms延時函數***12M晶振**************/
  26. void delay_1ms(uint q)
  27. {
  28.         uint i,j;
  29.         for(i=0;i<q;i++)
  30.                 for(j=0;j<120;j++);
  31. }

  32. /********************************************************************
  33. * 名稱 : delay_uint()
  34. * 功能 : 小延時。
  35. * 輸入 : 無
  36. * 輸出 : 無
  37. ***********************************************************************/
  38. void delay_uint(uint q)
  39. {
  40.         while(q--);
  41. }

  42. /********************************************************************
  43. * 名稱 : write_com(uchar com)
  44. * 功能 : 1602命令函數
  45. * 輸入 : 輸入的命令值
  46. * 輸出 : 無
  47. ***********************************************************************/
  48. void write_com(uchar com)
  49. {
  50.         e=0;
  51.         rs=0;
  52.         rw=0;
  53.         P0=com;
  54.         delay_uint(3);
  55.         e=1;
  56.         delay_uint(25);
  57.         e=0;
  58. }

  59. /********************************************************************
  60. * 名稱 : write_data(uchar dat)
  61. * 功能 : 1602寫數據函數
  62. * 輸入 : 需要寫入1602的數據
  63. * 輸出 : 無
  64. ***********************************************************************/
  65. void write_data(uchar dat)
  66. {
  67.         e=0;
  68.         rs=1;
  69.         rw=0;
  70.         P0=dat;
  71.         delay_uint(3);
  72.         e=1;
  73.         delay_uint(25);
  74.         e=0;        
  75. }


  76. /***********************lcd1602上顯示這字符函數************************/
  77. void write_string(uchar hang,uchar add,uchar *p)
  78. {
  79.         if(hang==1)   
  80.                 write_com(0x80+add);
  81.         else
  82.                 write_com(0x80+0x40+add);
  83.         while(1)                                                                                                                 
  84.         {
  85.                 if(*p == '\0')  break;
  86.                 write_data(*p);
  87.                 p++;
  88.         }        
  89. }

  90. /***********************lcd1602初始化設置************************/
  91. void init_1602()         //lcd1602初始化設置
  92. {
  93.         write_com(0x38);        //
  94.         write_com(0x0c);
  95.         write_com(0x06);
  96.         delay_uint(1000);
  97. }

  98. ////////////////在指定位置顯示指定字符//////////
  99. void write_zifu(uchar hang,uchar add,uchar dat)
  100. {
  101.         if(hang==1)   
  102.                 write_com(0x80+add);
  103.         else
  104.                 write_com(0x80+0x40+add);
  105.         write_data(dat);
  106. }

  107. /********************************************************************
  108. * 名稱 : write_sfm4_price(uchar hang,uchar add,uchar date)
  109. * 功能 : 顯示價格
  110. * 輸入 : 行,列,需要輸入1602的數據
  111. * 輸出 : 無
  112. ***********************************************************************/
  113. void write_sfm4_price(uchar hang,uchar add,uint date)
  114. {
  115.         if(hang==1)   
  116.                 write_com(0x80+add);
  117.         else
  118.                 write_com(0x80+0x40+add);
  119.         write_data(0x30+date/1000%10);
  120.         write_data(0x30+date/100%10);
  121.         write_data('.');
  122.         write_data(0x30+date/10%10);
  123.         write_data(0x30+date%10);        
  124. }

  125. /****************開機液晶顯示函數 初始化液晶的內容********************************/
  126. void init_1602_dis_csf()  //初始化液晶
  127. {                                                                    
  128.         write_string(1,0,"   W:0.000kg    ");
  129.         write_string(2,0,"P:00.00  Z:00.00");
  130.         write_zifu(2,7,0x5c);        //¥               
  131. //        write_zifu(2,15,0x5c);        //¥               

  132. }

  133. /*******************壓力顯示程序***********************/
  134. void write_1602_yl(uchar hang,uchar add,uint date)
  135. {
  136.         if(hang==1)   
  137.                 write_com(0x80+add);
  138.         else
  139.                 write_com(0x80+0x40+add);
  140.         write_data(0x30+date/1000%10);
  141.         write_data('.');
  142.         write_data(0x30+date/100%10);
  143.         write_data(0x30+date/10%10);
  144.         write_data(0x30+date%10);        
  145.         
  146. }


  147. void Delay__hx711_us(void)
  148. {
  149.         _nop_();
  150.         _nop_();
  151. }

  152. ulong ReadCount(void)        //增益128
  153. {
  154.         ulong count,value = 0;
  155.         uchar i;
  156.           hx711_dout=1;
  157.         Delay__hx711_us();
  158.           hx711_sck=0;
  159.           count=0;
  160.           while(hx711_dout)          ;
  161.           for(i=0;i<24;i++)
  162.         {
  163.                   hx711_sck=1;
  164.                   count=count<<1;
  165.                 hx711_sck=0;
  166.                   if(hx711_dout)
  167.                         count++;
  168.         }
  169.          hx711_sck=0;
  170.         Delay__hx711_us();
  171.         hx711_sck=1;  
  172.         return(count);
  173. }

  174. void get_pizhong()          //獲取皮重,秤盤重量
  175. {
  176.         ulong hx711_dat;
  177.         hx711_dat=ReadCount();                //HX711AD轉換數據處理
  178.         temp=(uint)(hx711_dat/100);        
  179. }

  180. void get_weight()          //獲取被測物體重量
  181. {
  182.         ulong hx711_data,a;
  183.         uint get,aa;        
  184.         hx711_data=ReadCount();                   //HX711AD轉換數據處理
  185.         get=(uint)(hx711_data/100);
  186.         if(get>temp)
  187.         {
  188.                 a=ReadCount();
  189.                 aa=(uint)(a/100)-temp;
  190.                 weight=(uint)((float)aa/4.9+0.05);//重量轉換函數,傳感器型號不同此函數要適當修改
  191.         }
  192. }

  193. /************************************************/
  194. /*  由于稱重傳感器線性度參數的不同,而對獲得的重量數據處理,
  195. 此處可能會根據不同稱重傳感器,程序的代碼會有所不同      */        
  196. /************************************************/


  197. /*************定時器0初始化程序***************/
  198. void time_init()         
  199. {
  200.         EA   = 1;                   //開總中斷
  201.         TMOD = 0X01;          //定時器0、定時器1工作方式1
  202.         ET0  = 1;                  //開定時器0中斷
  203.         TR0  = 1;                  //允許定時器0定時
  204. }

  205. /********************獨立按鍵程序*****************/
  206. uchar key_can;         //按鍵值

  207. void key()         //獨立按鍵程序
  208. {
  209.         static uchar key_new = 0, key_l;
  210.         key_can = 20;                   //按鍵值還原
  211.         P3 = 0x0f;
  212.         if((P3 & 0x0f) != 0x0f)                //按鍵按下
  213.         {
  214.                 delay_1ms(1);                     //按鍵消抖動
  215.                 if(((P3 & 0x0f) != 0x0f) && (key_new == 1))
  216.                 {                                                //確認是按鍵按下
  217.                         key_new = 0;
  218.                         key_l = P3 | 0xf0;   //矩陣鍵盤掃描
  219.                         P3 = key_l;
  220.                         switch(P3)
  221.                         {
  222.                                 case 0xee:  key_can = 1;  break;  //得到按鍵值
  223.                                 case 0xde:  key_can = 4;  break;   //得到按鍵值
  224.                                 case 0xbe:  key_can = 7;  break;   //得到按鍵值
  225.                                 case 0x7e:  key_can = 10;  break;   //得到按鍵值
  226.         
  227.                                 case 0xed:  key_can = 2;  break;  //得到按鍵值
  228.                                 case 0xdd:  key_can = 5;  break;   //得到按鍵值
  229.                                 case 0xbd:  key_can = 8;  break;   //得到按鍵值
  230.                                 case 0x7d:  key_can = 0;  break;   //得到按鍵值
  231.         
  232.                                 case 0xeb:  key_can = 11;  break;  //得到按鍵值
  233.                                 case 0xdb:  key_can = 9;  break;   //得到按鍵值
  234.                                 case 0xbb:  key_can = 6;  break;   //得到按鍵值
  235.                                 case 0x7b:  key_can = 3;  break;   //得到按鍵值
  236.         
  237.                                 case 0xe7:  key_can = 15;  break;  //得到按鍵值
  238.                                 case 0xd7:  key_can = 14;  break;  //得到按鍵值
  239.                                 case 0xb7:  key_can = 13;  break;   //得到按鍵值
  240.                                 case 0x77:  key_can = 12;  break;  //得到按鍵值         
  241.                         }        
  242.                         beep = 0;  //蜂鳴器叫一聲
  243.                         delay_1ms(100);
  244.                         beep = 1;
  245.                 }                        
  246.         }
  247.         else
  248.                 key_new = 1;        
  249. }

  250. /************按鍵控制函數*************/
  251. void key_with()
  252. {
  253.         if(key_can <= 9)   //數字鍵
  254.         {
  255.                 if(flag_p >= 4)
  256.                 {
  257.                         flag_p = 0;
  258.                 }
  259.                 if(flag_p == 0)
  260.                         price = key_can;
  261.                 else
  262.                 {
  263.                         price = price * 10 + key_can;            
  264.                 }           
  265.                 write_sfm4_price(2,2,price);        //顯示單價               
  266.                 flag_p ++;
  267.         }
  268.         if(key_can == 15)   //刪除鍵
  269.         {   
  270.                 if(price != 0 )
  271.                 {
  272.                         flag_p --;
  273.                         price /= 10;                 //刪除
  274.                         write_sfm4_price(2,2,price);//顯示單價                                
  275.                 }
  276.         }
  277.         if(key_can == 14)   //去皮
  278.         {
  279.                 get_pizhong();          //獲取皮重,秤盤重量
  280.         }
  281.         if(key_can == 13)   //價格清零
  282.         {
  283.                 flag_p = 0;
  284.                 price = 0;
  285.                 write_sfm4_price(2,2,price);//顯示單價                                
  286.         }
  287. }

  288. /*****************主函數********************/
  289. void main()
  290. {        
  291.         beep = 0;  //蜂鳴器叫一聲
  292.         delay_1ms(100);
  293.         P0 = P1 = P2 = P3 = 0xff;                //單片機IO口初始化為1
  294.         time_init();                    //初始化定時器
  295. ……………………

  296. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
基于51單片機HX711傳感器電子秤設計(原理圖、程序源碼、BOM等).rar (6.97 MB, 下載次數: 169)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:64765 發表于 2020-4-10 14:35 | 只看該作者
描述很詳細,的確為學習HX711應用的好資料,謝樓主分享。
回復

使用道具 舉報

板凳
ID:510933 發表于 2020-4-20 16:30 | 只看該作者
非常感謝,資料很詳盡,正好需要hx711方面的
回復

使用道具 舉報

地板
ID:582255 發表于 2020-4-20 22:58 來自手機 | 只看該作者
點贊,不知道有木有仿真?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99久久久久久 | 99爱国产| 日韩欧美国产精品综合嫩v 一区中文字幕 | 国产99精品| 欧美精品1区2区3区 免费黄篇 | 久久香蕉网 | 久久久久国产 | 欧美日韩视频在线播放 | 国产精品日韩欧美一区二区三区 | 国产一区不卡 | 国产亚洲精品美女久久久久久久久久 | 久久99精品视频 | 91视频在线看 | 日韩在线视频一区 | 91精品国产乱码麻豆白嫩 | 日韩成人免费视频 | 日本久久视频 | 欧美国产91 | 日韩一级免费看 | av成年人网站 | 丝袜毛片 | 亚洲精品久久久9婷婷中文字幕 | 羞羞视频网站免费看 | 成人在线精品视频 | 欧美成人精品一区二区三区 | 干狠狠 | 欧美中文在线 | 视频1区2区| 久久久久亚洲精品中文字幕 | 久久av资源网 | 亚洲视频免费 | 亚洲精品一区在线 | 求毛片| 国产亚洲欧美另类一区二区三区 | 久久久久久久久久久久久久av | 欧美福利在线 | 91久久精品国产91久久性色tv | 色男人的天堂 | 一级中国毛片 | 夜夜骑天天干 | 成人免费视频观看 |