找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

基于51單片機(jī)HX711+WT588D智能語音電子秤程序電路原理圖設(shè)計(jì)

[復(fù)制鏈接]
ID:1108110 發(fā)表于 2024-3-6 17:27 | 顯示全部樓層 |閱讀模式
本系統(tǒng)采用單片機(jī) + LCD1602液晶   + HX711AD模塊   + 5 kg電阻應(yīng)變式壓力傳感器 +蜂鳴器+矩陣鍵盤+WT588D語音模塊而成。
1.單片機(jī)型號(hào):STC89C52/51、AT89C52/51、AT89S52/51可以任選,都是51單片機(jī)。
2.稱重傳感器采用電子秤專用模擬/數(shù)字(A/D)轉(zhuǎn)換器芯片hx711對(duì)傳感器信號(hào)進(jìn)行調(diào)理轉(zhuǎn)換,提供更高的精度。
3.采用液晶LCD1602顯示屏顯示,第一行顯示當(dāng)前重量(單位為kg),第二行單價(jià)和總價(jià)(單位為元)。
4.按鍵具有提示聲,具有超量程報(bào)警功能當(dāng)超出壓力傳感器的量程時(shí)蜂鳴器會(huì)發(fā)出報(bào)警聲。
5.采用高精度電阻應(yīng)變式壓力傳感器,測(cè)量量程0 -5kg,測(cè)量精度可達(dá)3g。
6.采用4*4矩陣鍵盤進(jìn)行人機(jī)交互,可以實(shí)現(xiàn)直接輸入單價(jià)、刪除單價(jià)、去皮、清零等功能操作非常方便。
7.采用WT588D語音模塊實(shí)現(xiàn)語音播報(bào)功能。

4*4矩陣鍵盤定義如下
       1          2          3            15(刪除鍵)
       4          5          6            14(去皮或是清零)
       7          8          9            13(清除單價(jià))
10(未定義)   0    11(未定義)    12(未定義)

  鍵0—9為數(shù)字鍵,用于單價(jià)輸入。
  鍵13為單價(jià)一鍵清零,按下該鍵則單價(jià)清為0。
  鍵14為去皮鍵,按下后當(dāng)前重量清為0。
  鍵15為刪除鍵,當(dāng)我們單價(jià)輸入錯(cuò)誤時(shí)可以逐位刪除輸錯(cuò)的單價(jià),刪除后可以繼續(xù)輸入單價(jià)。

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
截圖格式  雙擊可以打開.png 帶語音.png

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

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

  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;   //單價(jià) 總價(jià)
  17. uchar flag_p;

  18. uchar menu_1,menu_2;  //設(shè)置不同參數(shù)的變量


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


  25. /******1ms延時(shí)函數(shù)***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;                 //復(fù)位腳  低電平
  37.          VRST=1;                 //復(fù)位腳  高電平
  38.          VCS=0;                  //片選腳 低電平
  39.      for(i=0;i<8;i++)   //8位的數(shù)據(jù) 要循環(huán)8次1位1位的寫入
  40.         {
  41.                 VCLK=0;                 //時(shí)鐘腳 低電平
  42.                 if(addr&0x01 == 0x01)
  43.                 {
  44.                         VDATA=1;                 //數(shù)據(jù)輸入腳 寫數(shù)據(jù)1
  45.                 }
  46.                 else
  47.                         VDATA=0;                 //數(shù)據(jù)輸入腳 寫數(shù)據(jù)0
  48.                 addr>>=1;          //數(shù)據(jù)左移一位
  49.                 VCLK=1;                   //時(shí)鐘腳   高電平
  50.         }
  51.         VCS=1;            //片選腳 高電平
  52.         while(VBUSY == 0);          //忙等待
  53. }


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

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

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

  96. /********************************************************************
  97. * 名稱 : write_string(uchar hang,uchar add,uchar *p)
  98. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個(gè)字符開始顯示"ab cd ef" ,調(diào)用該函數(shù)如下
  99.                   write_string(1,5,"ab cd ef;")
  100. * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
  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字符串的結(jié)尾標(biāo)志  break結(jié)束while循環(huán) 結(jié)束寫字符
  112.                 write_data(*p);            //寫數(shù)據(jù)
  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. * 功能 : 顯示價(jià)格
  128. * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
  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);         //顯示千位數(shù)
  138.         write_data(0x30+date/100%10);    //顯示百位數(shù)
  139.         write_data('.');                             //顯示小數(shù)點(diǎn)
  140.         write_data(0x30+date/10%10);     //顯示十位數(shù)
  141.          write_data(0x30+date%10);             //顯示個(gè)位數(shù)        
  142. }

  143. /***********************lcd1602初始化設(shè)置************************/
  144. void init_1602()         //lcd1602初始化設(shè)置
  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. /*********************AD采集程序*********************/
  156. unsigned long HX711_Read(void)        //增益128
  157. {
  158.         unsigned long count;
  159.         unsigned char i;
  160.           hx711_dout=1;
  161.           hx711_sck=0;
  162.           count=0;
  163.           for(i=0;i<24;i++)
  164.         {
  165.                   hx711_sck=1;
  166.                   count=count<<1;
  167.                 hx711_sck=0;
  168.                   if(hx711_dout)
  169.                         count++;
  170.         }
  171.          hx711_sck=1;
  172.     count=count^0x800000;//第25個(gè)脈沖下降沿來時(shí),轉(zhuǎn)換數(shù)據(jù)
  173.         hx711_sck=0;  
  174.         return(count);
  175. }


  176. void get_pizhong()          //獲取皮重,秤盤重量
  177. {
  178.         Weight_Maopi = HX711_Read();        
  179. }

  180. void get_weight()          //獲取被測(cè)物體重量
  181. {
  182.         weight = HX711_Read();
  183.         weight = weight - Weight_Maopi;                //獲取凈重
  184.         if(weight > 0)                        
  185.         {        
  186.                 weight = (unsigned int)((float)weight/GapValue);         //計(jì)算實(shí)物的實(shí)際重量                                                                                                                                       
  187.         }
  188.         else
  189.         {
  190.                 weight = 0;
  191.         }
  192. }

  193. /*****************語音報(bào)價(jià)********************/
  194. void bojia()  //語音報(bào)價(jià)
  195. {
  196.         Send_threelines(z_price / 1000 % 10);           //語音播放
  197.         Send_threelines(10);
  198.         Send_threelines(z_price / 100 % 10);           //語音播放
  199.          Send_threelines(11);             //點(diǎn)
  200.         Send_threelines(z_price / 10 % 10);           //語音播放
  201.         Send_threelines(z_price % 10);           //語音播放
  202.         Send_threelines(93);   //元
  203. }

  204. /*****************語音函數(shù)********************/
  205. void yuying()  //語音函數(shù)
  206. {
  207.          long z_p;
  208.         if(weight != 0)
  209.         if(weight == z_p)          //重量穩(wěn)定
  210.         {
  211.                  bojia();  //語音報(bào)價(jià)
  212.          }
  213.          z_p = weight;
  214. }

  215. /********************獨(dú)立按鍵程序*****************/
  216. uchar key_can;         //按鍵值

  217. void key()         //獨(dú)立按鍵程序
  218. {
  219.         static uchar key_new = 0, key_l;
  220.         key_can = 20;                   //按鍵值還原
  221.         P3 = 0x0f;
  222.         if((P3 & 0x0f) != 0x0f)                //按鍵按下
  223.         {
  224.                 delay_1ms(1);                     //按鍵消抖動(dòng)
  225.                 if(((P3 & 0x0f) != 0x0f) && (key_new == 1))
  226.                 {                                                //確認(rèn)是按鍵按下
  227.                         key_new = 0;
  228.                         key_l = P3 | 0xf0;   //矩陣鍵盤掃描
  229.                         P3 = key_l;
  230.                         switch(P3)
  231.                         {
  232.                                 case 0xee:  key_can = 1;  break;  //得到按鍵值

  233.                                 case 0x77:  key_can = 12;  break;  //得到按鍵值         
  234.                         }        
  235.                         beep = 0;  //蜂鳴器叫一聲
  236.                         delay_1ms(100);
  237.                         beep = 1;
  238.                 }                        
  239.         }
  240.         else
  241.                 key_new = 1;        
  242. }

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

  281. /*****************主函數(shù)********************/
  282. void main()
  283. {        
  284.         beep = 0;  //蜂鳴器叫一聲
  285.         delay_1ms(100);
  286.         P0 = P1 = P2 = P3 = 0xff;                //單片機(jī)IO口初始化為1
  287.          init_1602();                 //lcd1602初始化
  288.          get_pizhong();          //獲取皮重,秤盤重量
  289.         while(1)
  290.         {
  291.                 key();         //獨(dú)立按鍵程序
  292.                 if(key_can < 20)
  293.                         key_with();
  294.                 flag_300ms++;  
  295.                 if(flag_300ms >= 300)        //300毫秒執(zhí)行一次里面的程序
  296.                 {
  297.                         flag_300ms = 0;
  298.                         get_weight();          //獲取被測(cè)物體重量
  299.                          if(weight >= 0 )
  300.                                 write_1602_yl(1,5,weight);              //顯示重量
  301.                         z_price = weight * price / 1000;   //總價(jià)等于重量*單價(jià)
  302.                         write_lcd4_price(2,11,z_price);        //顯示總價(jià)                                       
  303.                         if(weight >= 5000)  //超重報(bào)警
  304.                                 beep = ~beep;        //蜂鳴器報(bào)警
  305.                         else
  306.                                 beep = 1;
  307.                         yuying();  //語音函數(shù)        
  308.                 }
  309.                 delay_1ms(1);
  310.         }
  311. }
復(fù)制代碼

程序+原理圖+PCB 51hei附件下載:
電子秤.7z (505.64 KB, 下載次數(shù): 61)





評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:1118403 發(fā)表于 2024-5-10 10:59 | 顯示全部樓層
這個(gè)pcb不太對(duì)啊
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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