找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 19142|回復: 10
收起左側

單片機控制的電子秤 實物圖,電路圖,pcb及程序全套資料

  [復制鏈接]
ID:253933 發(fā)表于 2017-12-21 00:43 | 顯示全部樓層 |閱讀模式
數(shù)碼管顯示,實物圖,電路圖,pcb及全套資料
擬采取的方法、技術或設計(開發(fā))工具:
本設計主要以MCS-51系列單片機STC89C52為控制核心,它自帶8KFLASH程序存儲器,它的核心處理單元為8位。數(shù)據(jù)處理主要是對壓力傳感器進行AD采集,并進行邏輯判斷,根據(jù)數(shù)據(jù)的具體情況輸出到數(shù)碼管顯示和使蜂鳴器動作。整個單片機應用系統(tǒng)的設計分為硬件電路設計和軟件編程設計兩大部分;其中硬件電路設計包括壓力檢測電路,單片機控制電路顯示電路和報警與控制電路。軟件設計部分包括系統(tǒng)主程序,壓力采集子程序,數(shù)碼管顯示子程序和輸出驅動子程序,均采用51系列C語言編程實現(xiàn)。
## 電子稱  數(shù)碼管實物照片照片.png ## 電子稱  數(shù)碼管實物照片照片.jpg IMG_20171120_171048.png

原理圖:
## 電子稱  數(shù)碼管原理圖截圖格式 雙擊可以打.png
0.png

論文:
0.jpg

元件型號
元件名稱
元件標號
數(shù)量
蜂鳴器
蜂鳴器
B1
1
10uF
電容
C1
1
20PF
電容
C2, C3
2
發(fā)光二極管
發(fā)光二極管
D2
1
SMG04_1
數(shù)碼管
DS1
1
Header 2
電源接口
P2
1
HX711
AD采集芯片
P3
1
9012
三極管
Q1, Q2, Q3, Q4, Q5
5
10K
電阻
R14
1
1K
電阻
R1-R9
9
SW-PB
按鍵
S1, S2, S3, S4
4
sw-灰色
電源開關
SW1
1
STC89C52
單片機
U1
1
12M
晶振
Y1
1


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

  5. //數(shù)碼管段選定義      0     1    2    3    4    5        6         7          8           9        
  6. uchar code smg_du[]={0x28,0xe1,0x32,0xa2,0x54,0xa1,0x21,0xea,0x20,0xa0,
  7.                                            0x60,0x25,0x39,0x26,0x31,0x71,0xff};         //斷碼
  8. //數(shù)碼管位選定義
  9. uchar code smg_we[]={0xef,0xdf,0xbf,0x7f};
  10. uchar dis_smg[8] = {0};        
  11. uchar smg_i = 4;    //顯示數(shù)碼管的個位數(shù)
  12. sbit beep = P2^3;   //蜂鳴器IO口定義

  13. bit flag_lj_en;                 //按鍵連加使能
  14. bit flag_lj_3_en;         //按鍵連3次連加后使能  加的數(shù)就越大了
  15. uchar key_time,key_value;      //用做連加的中間變量
  16. bit key_500ms  ;

  17. bit flag_300ms ;
  18. uchar menu_1;       //菜單設計的變量
  19. uint t_high = 300;           //上限報警值

  20. sbit hx711_dout=P2^7;
  21. sbit hx711_sck=P2^6;

  22. long weight;

  23. unsigned long HX711_Buffer = 0;
  24. unsigned long Weight_Maopi = 0;

  25. uint temp,qi_weight;
  26. bit chaozhong_flag;
  27. bit leiji_flag;
  28. uchar flag_200ms ;

  29. #define GapValue 437.0

  30. uint temp,qi_weight;
  31. bit chaozhong_flag;
  32. bit leiji_flag;

  33. /***********************1ms延時函數(shù)*****************************/
  34. void delay_1ms(uint q)
  35. {
  36.         uint i,j;
  37.         for(i=0;i<q;i++)
  38.                 for(j=0;j<120;j++);
  39. }

  40. /***********************數(shù)碼顯示函數(shù)*****************************/
  41. void display()
  42. {
  43.         static uchar i;   
  44.         i++;
  45.         if(i >= smg_i)
  46.                 i = 0;        
  47.         P1 = 0xff;                         //消隱
  48.         P3 = smg_we[i];                          //位選
  49.         P1 = dis_smg[i];                 //段選               
  50. }


  51. /*************定時器0初始化程序***************/
  52. void time_init()         
  53. {
  54.         EA   = 1;                   //開總中斷
  55.         TMOD = 0X01;          //定時器0、定時器1工作方式1
  56.         ET0  = 1;                  //開定時器0中斷
  57.         TR0  = 1;                  //允許定時器0定時
  58. }

  59. /********************獨立按鍵程序*****************/
  60. uchar key_can;         //按鍵值

  61. void key()         //獨立按鍵程序
  62. {
  63.         static uchar key_new;
  64.         key_can = 20;                   //按鍵值還原
  65.         P2 |= 0x07;
  66.         if((P2 & 0x07) != 0x07)                //按鍵按下
  67.         {
  68.                 if(key_500ms == 1)        //連加
  69.                 {
  70.                         key_500ms = 0;
  71.                         key_new = 1;
  72.                 }
  73.                 delay_1ms(1);                     //按鍵消抖動
  74.                 if(((P2 & 0x07) != 0x07) && (key_new == 1))
  75.                 {                                                //確認是按鍵按下
  76.                         key_new = 0;
  77.                         switch(P2 & 0x07)
  78.                         {
  79.                                 case 0x06: key_can = 3; break;           //得到k2鍵值
  80.                                 case 0x05: key_can = 2; break;           //得到k3鍵值
  81.                                 case 0x03: key_can = 1; break;           //得到k4鍵值
  82.                         }
  83.                         flag_lj_en = 1;         //連加使能
  84.                 }                        
  85.         }
  86.         else
  87.         {
  88.                 if(key_new == 0)
  89.                 {
  90.                         key_new = 1;
  91.                         flag_lj_en = 0;                //關閉連加使能
  92.                         flag_lj_3_en = 0;        //關閉3秒后使能
  93.                         key_value = 0;                //清零
  94.                         key_time = 0;
  95.                         key_500ms = 0;
  96.                 }
  97.         }        
  98. }

  99. /****************按鍵處理數(shù)碼管顯示函數(shù)***************/
  100. void key_with()
  101. {
  102.         if(key_can == 1)          //設置鍵
  103.         {
  104.                 menu_1 ++;
  105.                 if(menu_1 >= 2)
  106.                 {
  107.                         menu_1 = 0;
  108.                         smg_i = 4;                  //數(shù)碼管顯示3位
  109.                         flag_300ms = 1;
  110.                 }
  111.         }
  112.         if(menu_1 == 1)                        //設置高溫報警
  113.         {
  114.                 smg_i = 4;                  //數(shù)碼管顯示4位
  115.                 if(key_can == 2)
  116.                 {
  117.                         if(flag_lj_3_en == 0)
  118.                                 t_high += 10 ;                //按鍵按下未松開自動加三次        
  119.                         else
  120.                                 t_high += 100;        //按鍵按下未松開自動加三次之后每次自動加10
  121.                         if(t_high > 9990)
  122.                                 t_high = 9990;
  123.                 }
  124.                 if(key_can == 3)
  125.                 {
  126.                         if(flag_lj_3_en == 0)
  127.                                 t_high -= 10 ;                //按鍵按下未松開自動減三次        
  128.                         else
  129.                                 t_high -= 100;        //按鍵按下未松開自動減三次之后每次自動減10
  130.                         if(t_high <= 10)
  131.                                 t_high = 10;
  132.                 }
  133.                 dis_smg[0] = smg_du[t_high / 10 % 10];                   //取小數(shù)顯示
  134.                 dis_smg[1] = smg_du[t_high / 100 % 10] ;  //取個位顯示
  135.                 dis_smg[2] = smg_du[t_high / 1000 % 10] & 0xdf;           //取十位顯示
  136.                 dis_smg[3] = 0x64;         //H
  137.         }        
  138. }  

  139. /****************報警函數(shù)***************/
  140. void clock_h_l()
  141. {
  142.         static uchar value;
  143.         if(weight >= t_high)
  144.         {
  145.                 value ++;  //消除實際距離在設定距離左右變化時的干擾
  146.                 if(value >= 2)
  147.                 {
  148.                         beep = ~beep;           //蜂鳴器報警                        
  149.                 }        
  150.         }
  151.         else
  152.         {
  153.                 beep = 1;        
  154.         }                        
  155. }


  156. void Delay__hx711_us(void)
  157. {
  158.         _nop_();
  159.         _nop_();
  160. }

  161. unsigned long HX711_Read(void)        //增益128
  162. {
  163.         unsigned long count;
  164.         unsigned char i;
  165.           hx711_sck=0;
  166.         Delay__hx711_us();
  167.           hx711_dout=1;
  168.           while(hx711_dout==0);
  169.           for(i=0;i<24;i++)
  170.         {
  171.                 hx711_sck=0;
  172.                   count=count<<1;
  173.                   hx711_sck=1;
  174.                   if(hx711_dout)
  175.                         count++;
  176.         }
  177.          hx711_sck=1;
  178.     count=count^0x8000;//下降沿來時,轉換數(shù)據(jù)
  179.         Delay__hx711_us();
  180.         hx711_sck=0;  
  181.         return(count);
  182. }

  183. void get_weight()          //獲取被測物體重量
  184. {
  185.         weight = HX711_Read();
  186.         weight = weight - Weight_Maopi;                //獲取凈重
  187.         if(weight > 0)                        
  188.         {        
  189.                 weight = (unsigned int)((float)weight/GapValue);         //計算實物的實際重量                                                                                                                                       
  190.         }
  191.         else
  192.         {
  193.                 weight = 0;
  194.         }
  195. }


  196. /****************主函數(shù)***************/
  197. void main()
  198. {
  199.         time_init();                    //初始化定時器
  200.         while(1)
  201.         {               
  202.                 key();                                        //按鍵程序
  203.                 if(key_can < 10)
  204.                 {
  205.                         key_with();                        //設置報警壓力        
  206.                 }
  207.                 if(flag_300ms == 1)            //300ms 處理一次壓力程序
  208.                 {           
  209.                         flag_300ms = 0;        
  210.                         get_weight();          //獲取被測物體重量
  211.                         clock_h_l();        //報警函數(shù)
  212.                         if(menu_1 == 0)
  213.                         {        
  214.                                 smg_i = 4;
  215.                                 dis_smg[0] = smg_du[weight % 10];         //取壓力的小數(shù)顯示
  216.                                 dis_smg[1] = smg_du[weight / 10 % 10] ; //取壓力的個位顯示
  217.                                 dis_smg[2] = smg_du[weight / 100 % 10] ;           //取壓力的十位顯示
  218.                                 dis_smg[3] = smg_du[weight / 1000 % 10] & 0xdf;           //取壓力的百位顯示
  219.                         }
  220.                 }
  221.                 display();                //數(shù)碼管顯示函數(shù)
  222.         }
  223. ……………………

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

所有資料51hei提供下載:
1.52單片機電子秤數(shù)碼管顯示.zip (12.01 MB, 下載次數(shù): 288)




評分

參與人數(shù) 3黑幣 +65 收起 理由
zh2773251csb + 5 很給力!
tieq1952 + 10 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:253767 發(fā)表于 2017-12-21 09:12 | 顯示全部樓層
很有價值,可以收藏
回復

使用道具 舉報

ID:216722 發(fā)表于 2017-12-21 11:40 | 顯示全部樓層
文件里怎么沒有pcb圖
回復

使用道具 舉報

ID:264958 發(fā)表于 2017-12-28 18:17 | 顯示全部樓層
這里面沒有用到壓力傳感器吧?
回復

使用道具 舉報

ID:129918 發(fā)表于 2018-3-29 10:29 | 顯示全部樓層
好像沒有PCB圖啊,相對于HX711,我畢業(yè)設計打算做的電子秤可行性分析:懸臂梁+應變片+電橋+51單片機,通過1602或者數(shù)碼管顯示重量

這樣是不是不如HX711精度高啊,在糾結這兩個的差別
回復

使用道具 舉報

ID:406005 發(fā)表于 2018-10-7 20:32 | 顯示全部樓層
VCC幾伏的
回復

使用道具 舉報

ID:442160 發(fā)表于 2018-12-18 12:04 | 顯示全部樓層
感謝樓主
回復

使用道具 舉報

ID:489773 發(fā)表于 2019-3-25 09:47 | 顯示全部樓層
很好,謝謝分享
回復

使用道具 舉報

ID:494226 發(fā)表于 2019-3-28 11:21 | 顯示全部樓層
謝謝 分享
回復

使用道具 舉報

ID:494226 發(fā)表于 2019-3-28 11:21 | 顯示全部樓層

哥們你下載了嗎
回復

使用道具 舉報

ID:336789 發(fā)表于 2019-4-13 15:52 | 顯示全部樓層
請問HX711的接線位置在哪里呢,為什么我在原理圖上沒有見到P3啊
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表