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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1549|回復: 2
收起左側

單片機HX711+WT588D語音電子秤程序電路原理圖

[復制鏈接]
ID:1101484 發表于 2024-1-13 12:23 | 顯示全部樓層 |閱讀模式
原理圖+程序+圖片+設計資料
請下載看完整版

制作出來的實物圖如下:
照片 (1).png 照片 (2).png

電路原理圖如下:
截圖格式  雙擊可以打開.png WT588D引腳.png

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

  4. #define ulong unsigned long
  5.   
  6. sbit rs=P1^0;         //寄存器選擇信號 H:數據寄存器          L:指令寄存器
  7. sbit rw=P1^1;         //寄存器選擇信號 H:數據寄存器          L:指令寄存器
  8. sbit e =P1^2;         //片選信號   下降沿觸發

  9. sbit hx711_dout = P2^1;         //hx711 IO口定義
  10. sbit hx711_sck  = P2^0;         //hx711 IO口定義

  11. sbit beep = P2^7;     //蜂鳴器 IO口定義

  12. long weight;        //重量變量

  13. unsigned long Weight_Maopi;           //皮重變量

  14. #define GapValue 437.0

  15. uchar flag_300ms ;          //300毫秒的變量

  16. ulong price,z_price;   //單價 總價
  17. uchar flag_p;

  18. uchar menu_1,menu_2;  //設置不同參數的變量


  19. /***********************語音模塊控制IO口的定義************************/
  20. sbit  VRST  = P1^3;          //復位腳
  21. sbit  VBUSY = P1^4;            //忙腳
  22. sbit  VDATA = P1^5;         //數據輸入腳
  23. sbit  VCS   = P1^6;     //片選腳
  24. sbit  VCLK  = P1^7;            //時鐘腳  


  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. void Send_threelines(unsigned char addr)
  34. {
  35.    unsigned char i;
  36.         VRST=0;                 //復位腳  低電平
  37.          VRST=1;                 //復位腳  高電平
  38.          VCS=0;                  //片選腳 低電平
  39.      for(i=0;i<8;i++)   //8位的數據 要循環8次1位1位的寫入
  40.         {
  41.                 VCLK=0;                 //時鐘腳 低電平
  42.                 if(addr&0x01 == 0x01)
  43.                 {
  44.                         VDATA=1;                 //數據輸入腳 寫數據1
  45.                 }
  46.                 else
  47.                         VDATA=0;                 //數據輸入腳 寫數據0
  48.                 addr>>=1;          //數據左移一位
  49.                 VCLK=1;                   //時鐘腳   高電平
  50.         }
  51.         VCS=1;            //片選腳 高電平
  52.         while(VBUSY == 0);          //忙等待
  53. }


  54. /********************************************************************
  55. * 名稱 : delay_uint()
  56. * 功能 : 小延時。
  57. * 輸入 : 無
  58. * 輸出 : 無
  59. ***********************************************************************/
  60. void delay_uint(uint q)
  61. {
  62.         while(q--);
  63. }

  64. /********************************************************************
  65. * 名稱 : write_com(uchar com)
  66. * 功能 : 1602指令函數
  67. * 輸入 : 輸入的指令值
  68. * 輸出 : 無
  69. ***********************************************************************/
  70. void write_com(uchar com)
  71. {
  72.          rs=0;             //寫指令
  73.         rw=0;             //對1602寫操作
  74.         P0=com;             //P0口對1602寫指令數據
  75.         delay_uint(25);
  76.         e=1;                 //e=1使能信號
  77.         delay_uint(100);   //延時一下等1602完成操作
  78.         e=0;
  79. }

  80. /********************************************************************
  81. * 名稱 : write_data(uchar dat)
  82. * 功能 : 1602寫數據函數
  83. * 輸入 : 需要寫入1602的數據
  84. * 輸出 : 無
  85. ***********************************************************************/
  86. void write_data(uchar dat)
  87. {
  88.          rs=1;             //寫數據
  89.         rw=0;             //對1602寫操作
  90.         P0=dat;                  //P0口對1602寫數據
  91.         delay_uint(25);
  92.         e=1;                 //e=1使能信號
  93.         delay_uint(100);   //延時一下等1602完成操作
  94.         e=0;        
  95. }

  96. /********************************************************************
  97. * 名稱 : write_string(uchar hang,uchar add,uchar *p)
  98. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調用該函數如下
  99.                   write_string(1,5,"ab cd ef;")
  100. * 輸入 : 行,列,需要輸入1602的數據
  101. * 輸出 : 無
  102. ***********************************************************************/
  103. void write_string(uchar hang,uchar add,uchar *p)
  104. {
  105.         if(hang==1)   
  106.                 write_com(0x80+add);           //1602寫第一行的地址
  107.         else
  108.                 write_com(0x80+0x40+add);   //1602寫第二行的地址
  109.         while(1)                                                                                                                 
  110.         {
  111.                 if(*p == '\0')  break;        //\0字符串的結尾標志  break結束while循環 結束寫字符
  112.                 write_data(*p);            //寫數據
  113.                 p++;                    //指針地址加1  
  114.         }        
  115. }

  116. ////////////////在指定位置顯示指定字符//////////
  117. void write_zifu(uchar hang,uchar add,uchar dat)
  118. {
  119.         if(hang==1)   
  120.                 write_com(0x80+add);           //1602寫第一行的地址
  121.         else
  122.                 write_com(0x80+0x40+add);   //1602寫第二行的地址
  123.         write_data(dat);
  124. }

  125. /********************************************************************
  126. * 名稱 : write_lcd4_price(uchar hang,uchar add,uchar date)
  127. * 功能 : 顯示價格
  128. * 輸入 : 行,列,需要輸入1602的數據
  129. * 輸出 : 無
  130. ***********************************************************************/
  131. void write_lcd4_price(uchar hang,uchar add,uint date)
  132. {
  133.         if(hang==1)   
  134.                 write_com(0x80+add);           //1602寫第一行的地址
  135.         else
  136.                 write_com(0x80+0x40+add);   //1602寫第二行的地址
  137.         write_data(0x30+date/1000%10);         //顯示千位數
  138.         write_data(0x30+date/100%10);    //顯示百位數
  139.         write_data('.');                             //顯示小數點
  140.         write_data(0x30+date/10%10);     //顯示十位數
  141.          write_data(0x30+date%10);             //顯示個位數        
  142. }

  143. /***********************lcd1602初始化設置************************/
  144. void init_1602()         //lcd1602初始化設置
  145. {
  146.         write_com(0x38);        //
  147.         write_com(0x0c);
  148.         write_com(0x06);
  149.         write_string(1,0,"   W:0.000kg    ");        //初始化1602顯示
  150.         write_string(2,0,"P:00.00  Z:00.00");        //初始化1602顯示
  151.         write_zifu(2,7,0x5c);        //¥               
  152. }

  153. /*******************重量顯示程序***********************/
  154. void write_1602_yl(uchar hang,uchar add,uint date)
  155. {
  156.         if(hang==1)   
  157.                 write_com(0x80+add);           //1602寫第一行的地址
  158.         else
  159.                 write_com(0x80+0x40+add);  //1602寫第二行的地址
  160.         write_data(0x30+date/10000%10);         //顯示萬位數
  161.         write_data(0x30+date/1000%10);         //顯示千位數
  162.         write_data('.');                             //顯示小數點
  163.         write_data(0x30+date/100%10);    //顯示百位數
  164.         write_data(0x30+date/10%10);     //顯示十位數
  165.          write_data(0x30+date%10);             //顯示個位數        
  166.         write_data('K');
  167.         write_data('g');
  168. }

  169. /*********************AD采集程序*********************/
  170. unsigned long HX711_Read(void)        //增益128
  171. {
  172.         unsigned long count;
  173.         unsigned char i;
  174.           hx711_dout=1;
  175.           hx711_sck=0;
  176.           count=0;
  177.           for(i=0;i<24;i++)
  178.         {
  179.                   hx711_sck=1;
  180.                   count=count<<1;
  181.                 hx711_sck=0;
  182.                   if(hx711_dout)
  183.                         count++;
  184.         }
  185.          hx711_sck=1;
  186.     count=count^0x800000;//第25個脈沖下降沿來時,轉換數據
  187.         hx711_sck=0;  
  188.         return(count);
  189. }


  190. void get_pizhong()          //獲取皮重,秤盤重量
  191. {
  192.         Weight_Maopi = HX711_Read();        
  193. }

  194. void get_weight()          //獲取被測物體重量
  195. {
  196.         weight = HX711_Read();
  197.         weight = weight - Weight_Maopi;                //獲取凈重
  198.         if(weight > 0)                        
  199.         {        
  200.                 weight = (unsigned int)((float)weight/GapValue);         //計算實物的實際重量                                                                                                                                       
  201.         }
  202.         else
  203.         {
  204.                 weight = 0;
  205.         }
  206. }

  207. /*****************語音報價********************/
  208. void bojia()  //語音報價
  209. {
  210.         Send_threelines(z_price / 1000 % 10);           //語音播放
  211.         Send_threelines(10);
  212.         Send_threelines(z_price / 100 % 10);           //語音播放
  213.          Send_threelines(11);             //點
  214.         Send_threelines(z_price / 10 % 10);           //語音播放
  215.         Send_threelines(z_price % 10);           //語音播放
  216.         Send_threelines(93);   //元
  217. }

  218. /*****************語音函數********************/
  219. void yuying()  //語音函數
  220. {
  221.          long z_p;
  222.         if(weight != 0)
  223.         if(weight == z_p)          //重量穩定
  224.         {
  225.                  bojia();  //語音報價
  226.          }
  227.          z_p = weight;
  228. }

  229. /********************獨立按鍵程序*****************/
  230. uchar key_can;         //按鍵值

  231. void key()         //獨立按鍵程序
  232. {
  233.         static uchar key_new = 0, key_l;
  234.         key_can = 20;                   //按鍵值還原
  235.         P3 = 0x0f;
  236.         if((P3 & 0x0f) != 0x0f)                //按鍵按下
  237.         {
  238.                 delay_1ms(1);                     //按鍵消抖動
  239.                 if(((P3 & 0x0f) != 0x0f) && (key_new == 1))
  240.                 {                                                //確認是按鍵按下
  241.                         key_new = 0;
  242.                         key_l = P3 | 0xf0;   //矩陣鍵盤掃描
  243.                         P3 = key_l;
  244.                         switch(P3)
  245.                         {
  246.                                 case 0xee:  key_can = 1;  break;  //得到按鍵值
  247.                                 case 0xde:  key_can = 4;  break;   //得到按鍵值
  248.                                 case 0xbe:  key_can = 7;  break;   //得到按鍵值
  249.                                 case 0x7e:  key_can = 10;  break;   //得到按鍵值
  250.         
  251.                                 case 0xed:  key_can = 2;  break;  //得到按鍵值
  252.                                 case 0xdd:  key_can = 5;  break;   //得到按鍵值
  253.                                 case 0xbd:  key_can = 8;  break;   //得到按鍵值
  254.                                 case 0x7d:  key_can = 0;  break;   //得到按鍵值
  255.         
  256.                                 case 0xeb:  key_can = 11;  break;  //得到按鍵值
  257.                                 case 0xdb:  key_can = 9;  break;   //得到按鍵值
  258.                                 case 0xbb:  key_can = 6;  break;   //得到按鍵值
  259.                                 case 0x7b:  key_can = 3;  break;   //得到按鍵值
  260.         
  261.                                 case 0xe7:  key_can = 15;  break;  //得到按鍵值
  262.                                 case 0xd7:  key_can = 14;  break;  //得到按鍵值
  263.                                 case 0xb7:  key_can = 13;  break;   //得到按鍵值
  264.                                 case 0x77:  key_can = 12;  break;  //得到按鍵值         
  265.                         }        
  266.                         beep = 0;  //蜂鳴器叫一聲
  267.                         delay_1ms(100);
  268.                         beep = 1;
  269.                 }                        
  270.         }
  271.         else
  272.                 key_new = 1;        
  273. }

  274. /************按鍵控制函數*************/
  275. void key_with()
  276. {
  277.         if(key_can <= 9)   //數字鍵
  278.         {
  279.                 if(flag_p >= 4)
  280.                 {
  281.                         flag_p = 0;
  282.                 }
  283.                 if(flag_p == 0)
  284.                         price = key_can;
  285.                 else
  286.                 {
  287.                         price = price * 10 + key_can;            
  288.                 }           
  289.                 write_lcd4_price(2,2,price);        //顯示單價               
  290.                 flag_p ++;
  291.         }
  292.         if(key_can == 15)   //刪除鍵
  293.         {   
  294.                 if(price != 0 )
  295.                 {
  296.                         flag_p --;
  297.                         price /= 10;                 //刪除
  298.                         write_lcd4_price(2,2,price);//顯示單價                                
  299.                 }
  300.         }
  301.         if(key_can == 14)   //去皮
  302.         {
  303.                 get_pizhong();          //獲取皮重,秤盤重量
  304.         }
  305.         if(key_can == 13)   //價格清零
  306.         {
  307.                 flag_p = 0;
  308.                 price = 0;
  309.                 write_lcd4_price(2,2,price);//顯示單價                                
  310.         }
  311. }

  312. /*****************主函數********************/
  313. void main()
  314. {        
  315.         beep = 0;  //蜂鳴器叫一聲
  316.         delay_1ms(100);
  317.         P0 = P1 = P2 = P3 = 0xff;                //單片機IO口初始化為1
  318.          init_1602();                 //lcd1602初始化
  319.          get_pizhong();          //獲取皮重,秤盤重量
  320.         while(1)
  321.         {
  322.                 key();         //獨立按鍵程序
  323.                 if(key_can < 20)
  324.                         key_with();
  325.                 flag_300ms++;  
  326.                 if(flag_300ms >= 300)        //300毫秒執行一次里面的程序
  327.                 {
  328.                         flag_300ms = 0;
  329.                         get_weight();          //獲取被測物體重量
  330.                          if(weight >= 0 )
  331.                                 write_1602_yl(1,5,weight);              //顯示重量
  332.                         z_price = weight * price / 1000;   //總價等于重量*單價
  333.                         write_lcd4_price(2,11,z_price);        //顯示總價                                       
  334.                         if(weight >= 5000)  //超重報警
  335.                                 beep = ~beep;        //蜂鳴器報警
  336.                         else
  337.                                 beep = 1;
  338.                         yuying();  //語音函數        
  339.                 }
  340.                 delay_1ms(1);
  341.         }
  342. }
復制代碼
原理圖: 見網頁頂部
PCB:無
仿真: 無
代碼: 程序,原理圖.7z (351.88 KB, 下載次數: 43)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:291549 發表于 2024-1-13 18:24 | 顯示全部樓層
全套資料,謝謝樓主。
回復

使用道具 舉報

ID:433219 發表于 2024-1-16 17:24 | 顯示全部樓層
模塊式組合啊 HX711+WT588
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久夜视频 | 国产精品久久久久久婷婷天堂 | 国产午夜精品久久久久 | 一区二区三区精品 | 97人人超碰| 日韩中文字幕在线不卡 | 亚洲一区二区日韩 | 懂色av一区二区三区在线播放 | 国产激情视频网站 | 精品国产综合 | 天天躁日日躁狠狠的躁天龙影院 | 精品国产一区二区国模嫣然 | 成人av免费播放 | 欧美一区在线看 | 久久一级 | 国产男女视频网站 | 国产午夜精品一区二区三区 | 精品国产一区一区二区三亚瑟 | 国产欧美一区二区精品久导航 | 天天干天天色 | 国产精品一区在线观看 | 五月激情综合 | 亚洲国产成人精品女人久久久野战 | 日韩中文一区二区三区 | 91秦先生艺校小琴 | 亚卅毛片| 中文字幕免费观看 | 国产一级片免费看 | 国产中文视频 | 一区二区三 | 色视频在线免费观看 | 久久精品久久久久久 | 亚洲韩国精品 | 国产精品久久久久久久久久久新郎 | 老司机精品福利视频 | 国产精品久久久久久久久免费樱桃 | 日韩免费高清视频 | 国产激情在线 | 99热在线免费 | 免费一级毛片 | 热久久久久 |