找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 8637|回復: 6
打印 上一主題 下一主題
收起左側

51單片機自動換擋測電容最終版原理圖與程序源碼

  [復制鏈接]
跳轉到指定樓層
樓主
ID:313175 發(fā)表于 2018-4-21 16:34 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
自動測量電容,通過555構成多諧振蕩器測量頻率,因為頻率與555定時器2和6腳的RC有關,固定R大小,來測量電容大小,
所謂換擋是因為51單片機晶振有限不能測太高的頻率,則需換固定R為另一個R將頻率降低,以便能測出。

電路原理圖如下:




單片機源程序如下:
  1. #include<reg52.h>
  2. #include "lcd1602.h"

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit Key1M=P1^0;
  6. sbit Key1K=P1^1;
  7. sbit  Key1=P1^2;
  8. sbit  Key2=P1^3;
  9. sbit  Key3=P1^4;

  10. uchar plv[]={"        Hz"};
  11. uchar cap1[]={"0000000000 uF"};
  12. uchar cap2[]={"0000000 nF"};
  13. uchar cap3[]={"000 pF"};
  14. uchar    n[]={"             "};

  15. unsigned long Frequency;
  16. unsigned long C1,C2;
  17. uchar num;
  18. uchar T1count;
  19. uchar D1M,D1K,ZD;
  20. bit flag;

  21. void dangwei();
  22. void display();
  23. void main()
  24. {
  25.    init_lcd1602();
  26.         Key1M=1;
  27.         Key1K=0;
  28.     TMOD=0x51;

  29.         TH0=(65536-50000)/256;
  30.         TL0=(65536-50000)%256;

  31.     TH1=0;
  32.         TL1=0;

  33.         EA=1;
  34.         TR0=1;                                                                                  
  35.         ET0=1;
  36.         TR1=1;
  37.         ET1=1;
  38.         while(1)
  39.         {
  40.           dangwei();
  41.           if(flag==1)
  42.            {
  43.                     flag=0;
  44.                     Frequency=T1count*65536+TH1*256+TL1;

  45.                     plv[0]=Frequency/1000000+48;
  46.                         plv[1]=Frequency/100000%10+48;
  47.                         plv[2]=Frequency/10000%10+48;
  48.                         plv[3]=Frequency/1000%10+48;
  49.                         plv[4]=Frequency/100%10+48;
  50.                         plv[5]=Frequency/10%10+48;
  51.                         plv[6]=Frequency%10+48;
  52.                         display_lcd1602_text(1,0,plv);

  53.                         if(D1K==1)
  54.                            {
  55.                              Key1M=0;
  56.                                  Key1K=1;
  57.                                  C1=1.4398*1000000/(1000+2*1000)/Frequency*1000000;
  58.                                  display();  
  59.                            }
  60.                         if(D1M==1)
  61.                            {
  62.                              Key1M=1;
  63.                                  Key1K=0;
  64.                                  C1=1.4398*1000000/(1000+2*1000000)/Frequency*1000000;
  65.                                  display();
  66.                            }
  67.                
  68.                          if(ZD==1)
  69.                            {
  70.                               if(Frequency>50 && Key1M==1)         //一旦頻率大于50HZ,且為1M檔   
  71.                                           {
  72.                                                 C1=1.4398*1000000/(1000+2*1000000)/Frequency*1000000;
  73.                                         display();                 //將頻率用1M阻值換算               
  74.                                           }
  75.                                                                        
  76.                                   if(Frequency<50000 && Key1K==1)         //一旦頻率小于50000HZ,且為1k檔         
  77.                                          {
  78.                                                 C1=1.4398*1000000/(1000+2*1000)/Frequency*1000000;
  79.                                         display();                 //將頻率用1k阻值換算       
  80.                                          }
  81.                                
  82.                                   if(Frequency<50 && Key1M==1)         //一旦頻率小于50HZ,且為1M檔       因為6800pf  真實頻率比100HZ小,但比50HZ大
  83.                                          {                                                                                                                   //從而避免一直切換
  84.                                                 Key1M=0;
  85.                                         Key1K=1;                          //切換為1M檔,讓頻率重新更新?lián)Q算
  86.                                          }
  87.                                
  88.                                   if(Frequency>50000 && Key1K==1)         //一旦頻率大于50000HZ,且為1k檔           因為10000pf  真實頻率比48000HZ大,但比50000小
  89.                                                                                                                                                                                    //從而避免一直切換
  90.                                          {
  91.                                                 Key1M=1;                          //切換為1M檔,讓頻率重新更新?lián)Q算
  92.                                         Key1K=0;                                         
  93.                                          }            
  94.                  }
  95.                                 num=0;           
  96.                                 T1count=0;                                            
  97.                                 TH1=0;              
  98.                                 TL1=0;            
  99.                                 TR1=1;
  100.               }
  101.      }
  102. }

  103. void display()
  104. {
  105.     if(C1<1000)
  106.           {
  107.                 C2=C1;
  108.                 C2=C2-26;               
  109.                 cap3[0]=C2/100+48;
  110.                 cap3[1]=C2/10%10+48;
  111.                 cap3[2]=C2%10+48;
  112.                 display_lcd1602_text(0,0,n);
  113.             display_lcd1602_text(0,0,cap3);       
  114.            }
  115.          if(C1>=1000&&C1<1000000)
  116.            {
  117.                  C2=C1;
  118.                  C2=C2-26;
  119.                  cap2[0]=C2/100000+48;
  120.                  cap2[1]=C2/10000%10+48;
  121.                  cap2[2]=C2/1000%10+48;
  122.                  cap2[3]='.';
  123.                  cap2[4]=C2/100%10+48;
  124.                  cap2[5]=C2/10%10+48;
  125.                  cap2[6]=C2%10+48;
  126.                  display_lcd1602_text(0,0,n);
  127.                  display_lcd1602_text(0,0,cap2);
  128.            }
  129.          if(C1>=1000000&&C1<=600000000)
  130.                 {
  131.                   C2=C1;
  132.                   C2=C2-26;
  133.                   cap1[0]=C2/100000000+48;
  134.                   cap1[1]=C2/10000000%10+48;
  135.                   cap1[2]=C2/1000000%10+48;
  136.                   cap1[3]='.';
  137.                   cap1[4]=C2/100000%10+48;
  138.                   cap1[5]=C2/10000%10+48;
  139.                   cap1[6]=C2/1000%10+48;
  140.                   cap1[7]=C2/100%10+48;
  141.                   cap1[8]=C2/10%10+48;
  142.                   cap1[9]=C2%10+48;
  143.                   display_lcd1602_text(0,0,n);
  144.                   display_lcd1602_text(0,0,cap1);
  145.                 }
  146. }

  147. void dangwei()
  148. {
  149. //         D1K=0;
  150. //         D1M=0;
  151. //         ZD=1;
  152.     if(Key1==0)        //1K檔位
  153.            {
  154.                  delay(20);
  155.                  if(Key1==0)
  156.                    {
  157.                      D1K=1;
  158.                          D1M=0;
  159.                          ZD=0;
  160.                    }
  161.            }
  162.         if(Key2==0)        // 1M檔位
  163.            {
  164.                  delay(20);
  165.                  if(Key2==0)
  166.                    {
  167.                      D1K=0;
  168.                          D1M=1;
  169.                          ZD=0;
  170.                    }
  171.            }
  172.         if(Key3==0)         //        自動換檔位
  173.            {
  174.                  delay(20);
  175.                  if(Key3==0)
  176.                    {
  177.                      D1K=0;
  178.                          D1M=0;
  179.                          ZD=1;
  180.                    }
  181.            }
  182. }

  183. void jishu() interrupt 3 using 0   //定時器1 計數(shù)
  184. {
  185.      T1count++;
  186. }

  187. void timer0() interrupt 1  using 0 //定時0 定時1s
  188. {
  189.       num++;
  190. ……………………

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

所有資料51hei提供下載:
自動換擋測電容最終版.zip (50 KB, 下載次數(shù): 161)



評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:258743 發(fā)表于 2018-4-21 19:18 | 只看該作者
附件不能下載啊
回復

使用道具 舉報

板凳
ID:313428 發(fā)表于 2018-4-21 22:57 | 只看該作者
樓主厲害��!
回復

使用道具 舉報

地板
ID:443448 發(fā)表于 2018-12-10 17:11 | 只看該作者
樓主,有pcb嗎
回復

使用道具 舉報

5#
ID:597781 發(fā)表于 2019-8-8 15:42 | 只看該作者
樓主厲害啊,希望自己也可以做出來,不過想問一下這個測電容的可以精確到那個單位啊
回復

使用道具 舉報

6#
ID:597781 發(fā)表于 2019-8-8 16:17 | 只看該作者
樓主,我想知道一下這個單片機stc89c52為什么在proteus里面找不到呢,這個單片機是您自己設計的還是只是我沒找到你喜歡,求解答
回復

使用道具 舉報

7#
ID:807126 發(fā)表于 2020-7-23 15:57 | 只看該作者
能發(fā)下這個的仿真嗎
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

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