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

QQ登錄

只需一步,快速開(kāi)始

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

基于AT89C51單片機(jī)和555芯片構(gòu)成的多諧振蕩電路電容測(cè)量

  [復(fù)制鏈接]
ID:63924 發(fā)表于 2015-3-14 19:51 | 顯示全部樓層 |閱讀模式

  1. /*********************************************************************************************************</這種電容測(cè)量方法主要是通過(guò)一塊555芯片來(lái)測(cè)量電容,讓555芯片工作在直接反饋無(wú)穩(wěn)態(tài)的狀態(tài)下,555芯片輸出一定頻率的方波,其頻率的大小跟被測(cè)量的電容之間的關(guān)系是:f=0.772/(R*Cx),我們固定R的大小,其公式就可以寫(xiě)為:f=k/Cx,只要我們能夠測(cè)量出555芯片輸出的頻率,就可以計(jì)算出測(cè)量的電容。計(jì)算頻率的方法可以利用單片機(jī)的計(jì)數(shù)器T0和中斷INT0配合使用來(lái)測(cè)量,這種研究方法相當(dāng)?shù)暮?jiǎn)單。
  2. *********************************************************************************************************/
  3. #include "reg51.h"
  4. #include"intrins.h
  5. #define DATA P0
  6. sbit RW=P2^1;//1602寫(xiě)數(shù)據(jù)
  7. sbit RS=P2^0;//1602寫(xiě)地址
  8. sbit EN=P2^2; //1602工作使能
  9. sbit b_test=P3^7;   //控制小燈的亮滅
  10. sbit _reset=P3^5;   //555時(shí)基芯片工作控制信號(hào)
  11. unsigned int T_flag,N,C,i,Dis1,Dis0;
  12. unsigned int b[6]={0X13,0X0D,0X00,0X00,0X40,0X16};   //顯示C=00pF</FONT></P>
  13. /***********延時(shí)1MS******************/
  14. void Delay1ms(unsigned int mm)
  15. {unsigned int i;
  16. for(mm;mm>0;mm--)
  17.    for(i=100;i>0;i--);
  18. }
  19. /***************檢查忙否*****************/
  20. void Checkstates()
  21. {
  22. unsigned char dat;
  23. RS=0;
  24. RW=1;
  25. do{EN=1;//下降沿
  26.    _nop_();//保持一定間隔
  27. _nop_();
  28.     dat=DATA;
  29.     _nop_();
  30. _nop_();
  31.     EN=0;
  32. }while((dat&0x80)==1);
  33. }
  34. /**************LCD寫(xiě)命令函數(shù)*********/
  35. void wcomd(unsigned char cmd)
  36. {
  37. Checkstates();
  38. RS=0;
  39. RW=0;
  40. DATA=cmd;
  41. EN=1;
  42. _nop_();
  43. _nop_();
  44. _nop_();
  45. _nop_();
  46. EN=0;
  47. }
  48. /**********LCD寫(xiě)數(shù)據(jù)函數(shù)**************/
  49. void wdata(unsigned char dat)
  50. {
  51. Checkstates();
  52. RS=1;
  53. RW=0;
  54. DATA=dat;
  55. EN=1;
  56. _nop_();
  57. _nop_();
  58. _nop_();
  59. _nop_();
  60. EN=0;
  61. }
  62. /*****************初始化********************/
  63. void LCDINIT()
  64. {
  65. Delay1ms(15);
  66. wcomd(0x38);//功能設(shè)置
  67. Delay1ms(5);
  68. wcomd(0x38);//功能設(shè)置
  69. Delay1ms(5);
  70. wcomd(0x01);//清屏
  71. Delay1ms(5);
  72. wcomd(0x08);//關(guān)顯示
  73. Delay1ms(5);
  74. wcomd(0x0c);//開(kāi)顯示,不開(kāi)光標(biāo)</FONT></P>
  75. <P><FONT color=black>}</FONT></P>
  76. <P><FONT color=black>/***********顯示函數(shù)**************/
  77. void Display(void) //顯示函數(shù)
  78. {
  79. unsigned char i,j;
  80. unsigned char a[12]={0X4D,0X45,0X41,0X53,0X55,0X52,0X45,0X4D,0X45,0X4E,0X54,0X53};//顯示measurements
  81. LCDINIT();
  82. for(i=0;i<12;i++)//寫(xiě)顯示第一行
  83. { wcomd(0x80+i);
  84.     Delay1ms(1);
  85.     wdata(a[i]);
  86.     Delay1ms(1);
  87.    }

  88. for(j=0;j<6;j++)//寫(xiě)顯示第二行
  89. {
  90. wcomd(0xc0+j);
  91.   Delay1ms(1);
  92.   wdata(0x30+b[j]);
  93.   Delay1ms(1);
  94. }
  95. Delay1ms(150);</FONT></P>
  96. <P><FONT color=black>}
  97. void main()
  98. {
  99.   IE=0x81;                          //打開(kāi)全部的中斷控制,并開(kāi)啟外部中斷允許
  100. TMOD=0x09;                        //T0為16位計(jì)數(shù)工作方式1
  101.   IT0=1;                            //設(shè)置外部中斷的觸發(fā)的方式為脈沖觸發(fā)
  102.   TH0=0x00;
  103.   TL0=0x00;
  104.   T_flag=0;
  105.   _reset=0;
  106.   b_test=1;
  107.   while(1)
  108. {
  109.     //while(!b_test)                   //如果有測(cè)量按鍵輸入就往下執(zhí)行
  110.     //{
  111.      i=0;
  112.      _reset=1;                      //啟動(dòng)555時(shí)基芯片
  113.      EX0=1;          //開(kāi)啟中斷0
  114.      while(_reset)   //超出等待時(shí)間,中斷還沒(méi)有過(guò)來(lái),就退出
  115.       {
  116.        i++;
  117.        if(i>50000)   //設(shè)置最長(zhǎng)等待時(shí)間
  118.         {
  119.          _reset=0;  //最長(zhǎng)等待時(shí)間到還沒(méi)有中斷,停止555
  120.         }
  121.      }
  122.      if(N<100)         //如果計(jì)數(shù)值小于100,顯示SM,表示應(yīng)換用小一點(diǎn)的量程
  123.      {
  124.        b[3]=0X1D;
  125.        b[2]=0X23;
  126.       }
  127.     if(N>50000)        //如果計(jì)數(shù)值大于5000,顯示LA,表示應(yīng)換用大一點(diǎn)的量程
  128.       {
  129.        b[3]=0X11;
  130.        b[2]=0X1C;
  131.       }
  132.      if(N>=100 && N<=50000)
  133.       {
  134.        C=N/100;         //計(jì)算電容的大小
  135.        b[2]=C/10;       //計(jì)算電容值的十位
  136.        b[3]=C-b[2]*10;  //計(jì)算電容值的各位
  137.       }
  138.      //}
  139.     Display(); //顯示電容的大小
  140. if(C>40)
  141.    b_test=0;
  142.    else
  143.     b_test=1;
  144.    }
  145. }
  146. void int0(void) interrupt 0   //第一次中斷開(kāi)始計(jì)數(shù),第二個(gè)中斷停止計(jì)數(shù)
  147. {
  148.   T_flag=!T_flag;
  149.   if(T_flag==1)
  150.   {
  151.    TR0=1;         //開(kāi)始計(jì)時(shí)
  152.   }
  153.   if(T_flag==0)
  154.   {
  155.    TR0=0;         //停止計(jì)時(shí)
  156.    EX0=0;         //關(guān)閉中斷
  157.    _reset=0;      //停止發(fā)出方波
  158.    N=TH0*256+TL0; //計(jì)算計(jì)數(shù)器的值
  159.    N=N*5/3;
  160.    TH0=0x00;      //恢復(fù)初值
  161.    TL0=0x00;
  162.   }
  163. }[audio]http://play.baidu.com/?__m=mboxCtrl.playSong&__a=233111&__o=song/233111||playBtn&fr=altg3||www.baidu.com#[/audio]
復(fù)制代碼

單片機(jī)電容測(cè)量.rar

70.94 KB, 下載次數(shù): 250, 下載積分: 黑幣 -5

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:162517 發(fā)表于 2017-1-22 09:47 | 顯示全部樓層
謝謝樓主的分享,現(xiàn)在正在研究這個(gè),剛好能用到
回復(fù)

使用道具 舉報(bào)

ID:185575 發(fā)表于 2017-4-2 15:02 | 顯示全部樓層
最近我也在做這個(gè)東西 好東西 值得收藏
回復(fù)

使用道具 舉報(bào)

ID:137653 發(fā)表于 2017-7-2 21:34 | 顯示全部樓層
問(wèn)一下為什么要N=N*5/3呢?
回復(fù)

使用道具 舉報(bào)

ID:502429 發(fā)表于 2019-4-1 22:05 | 顯示全部樓層
R1和R2應(yīng)該多大?
回復(fù)

使用道具 舉報(bào)

ID:726332 發(fā)表于 2020-4-13 23:01 | 顯示全部樓層
有仿真電路嗎
回復(fù)

使用道具 舉報(bào)

ID:813187 發(fā)表于 2020-10-3 09:35 | 顯示全部樓層
可以,橫清楚
回復(fù)

使用道具 舉報(bào)

ID:760449 發(fā)表于 2020-10-9 11:49 | 顯示全部樓層
為什么LCD沒(méi)有顯示
回復(fù)

使用道具 舉報(bào)

ID:948914 發(fā)表于 2021-10-7 20:18 | 顯示全部樓層
樓主,你這個(gè)測(cè)試方法得到的電容值誤差咋樣,我也是用這個(gè)方法測(cè)的,但是誤差有時(shí)候大有時(shí)候小
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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