欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9813|回復: 5
收起左側

51單片機電容測量電路+程序設計

[復制鏈接]
ID:510819 發表于 2019-4-13 22:02 | 顯示全部樓層 |閱讀模式
非原創,和大家分享一下
基于AT89C51單片機和555芯片構成的多諧振蕩電路設計一電容測量電路,這種測量方法主要是通過一塊555芯片來測量電容大小。讓555芯片工作在直接反饋無穩態的狀態下,555芯片輸出一定頻率的方波,其頻率的大小跟被測量的電容之間的關系是:f=0.772/(R*Cx) ,固定R的大小,其公式就可以寫為:f=k/Cx,只要能夠測量出555芯片輸出的頻率,就可以計算出測量的電容。計算頻率的方法可以利用單片機的計數器T0和中斷INT0配合使用來進行測量。
1.3.1 系統硬件電路設計
該電路主要由單片機AT89C51、按鍵、繼電器、74HC08、LCD16028、555芯片等構成,整體設計電路如圖1-7所示。
圖1-7
555模塊簡介
NE555管腳功能介紹:
1腳為地。2腳為觸發輸入端;3腳為輸出端,輸出的電平狀態受觸發器控制,而觸發器受上比較器6腳和下比較器2腳的控制。
當觸發器接受上比較器A1從R腳輸入的高電平時,觸發器被置于復位狀態,3腳輸出低電平;
2腳和6腳是互補的,2腳只對低電平起作用,高電平對它不起作用,即電壓小于1Ucc/3,此時3腳輸出高電平。6腳為閾值端,只對高電平起作用,低電平對它不起作用,即輸入 電壓大于2Ucc/3,稱高觸發端,3腳輸出低電平,但有一個先決條件,即2腳電位必須大于Ucc/3時才有效。3腳在高電位接近電源電壓Ucc,輸出電流最大可打200mA。
4腳是復位端,當4腳電位小于0.4V時,不管2、6腳狀態如何,輸出端3腳都輸出低電平。5腳是控制端。7腳稱放電端,與3腳輸出同步,輸出電平一致,但7腳并不輸出電流,所以3腳稱為實高(或低)、7腳稱為虛高。
555集成電路的框圖及工作原理:
555集成電路開始是作定時器應用的,所以叫做555定時器或555時基電路。但后來經過開發,它除了作定時延時控制外,還可用于調光、調溫、調壓、調速等多種控制及計量檢測。此外,還可以組成脈沖振蕩、單穩、雙穩和脈沖調制電路,用于交流信號源、電源變換、頻率變換、脈沖調制等。由于它工作可靠、使用方便、價格低廉,目前被廣泛用于各種電子產品中,555集成電路內部有幾十個元器件,有分壓器、比較器、基本R-S觸發器、放電管以及緩沖器等,電路比較復雜,是模擬電路和數字電路的混合體,如圖1所示。
555振蕩器電路(無穩電路):
    由555定時器構成的多諧振蕩器如圖9(a)所示,其工作波形見圖9(b)。
      接通電源后,電源VDD通過R1和R2對電容C充電,當Uc<1/3VDD時,振蕩器輸出Vo=1,放電管截止。當Uc充電到≥2/3VDD后,振蕩器輸出Vo翻轉成0,此時放電管導通,使放電端(DIS)接地,電容C通過R2對地放電,使Uc下降。當Uc下降到≤1/3VDD后,振蕩器輸出Vo又翻轉成1,此時放電管又截止,使放電端(DIS)不接地,電源VDD通過R1和R2又對電容C充電,又使Uc從1/3VDD上升到2/3VDD,觸發器又發生翻轉,如此周而復始,從而在輸出端Vo得到連續變化的振蕩脈沖波形。脈沖寬度TL≈0.7R2C,由電容C放電時間決定;TH=0.7(R1+R2)C,由電容C充電時間決定,脈沖周期T≈TH+TL。
1.3.2系統軟件設計
系統主程序設計流程如圖3-4所示,主要完成定時器的初始化,啟動555芯片工作,等待中斷,若有中斷,則計算電容大小,顯示電容大小,然后等待下一次中斷。

proteus仿真
載入hex文件,如圖1-8
圖1-8
可以改變單刀雙擲開關SW1,切換被測量的電容。LCD1602上即可顯示被測電容的值,仿真時會有誤差。

程序清單如下:
用keil c編譯
本工程包含一個文件
電容測量.c
  1. /******************************文件Main.c 如下****************************/
  2. //編譯環境 :keil c51
  3. //mpu型號:stc89c52rc
  4. //晶振頻率:12M
  5. //操作系統:win x
  6. /*************************************************************************/
  7. #include "reg51.h"
  8. #include"intrins.h"                                                                                                                              //庫函數

  9. #define DATA P0
  10. sbit RW=P2^1;                                                                                                                                            //1602寫數據
  11. sbit RS=P2^0;                                                                                                                                            //1602寫地址
  12. sbit EN=P2^2;                                                                                                                                             //1602工作使能
  13. sbit b_test=P3^7;                                                                                                                                 //控制小燈的亮滅
  14. sbit _reset=P3^5;                                                                                                                                 //555時基芯片工作控制信號
  15. unsigned int T_flag,N,C,i,Dis1,Dis0;
  16. unsigned int b[6]={0X13,0X0D,0X00,0X00,0X40,0X16};                          //顯示C=00pF

  17. /*******************************延時1ms*********************************/
  18. void Delay1ms(unsigned int mm)
  19. {unsigned int i;
  20. for(mm;mm>0;mm--)
  21.    for(i=100;i>0;i--);
  22. }
  23. /********************************檢查忙否********************************/
  24. void Checkstates()
  25. {
  26. unsigned char dat;
  27. RS=0;
  28. RW=1;
  29. do{EN=1;                                                                                                                                                          //下降沿
  30.    _nop_();                                                                                                                                                          //保持一定間隔
  31.               _nop_();
  32.     dat=DATA;
  33.     _nop_();
  34.               _nop_();
  35.     EN=0;
  36. }while((dat&0x80)==1);
  37. }
  38. /*******************************LCD寫命令函數****************************/
  39. void wcomd(unsigned char cmd)
  40. {
  41. Checkstates();
  42. RS=0;
  43. RW=0;
  44. DATA=cmd;
  45. EN=1;
  46. _nop_();
  47. _nop_();
  48. _nop_();
  49. _nop_();
  50. EN=0;
  51. }
  52. /******************************LCD寫數據函數*******************************/
  53. void wdata(unsigned char dat)
  54. {
  55. Checkstates();
  56. RS=1;
  57. RW=0;
  58. DATA=dat;
  59. EN=1;
  60. _nop_();
  61. _nop_();
  62. _nop_();
  63. _nop_();
  64. EN=0;
  65. }
  66. /********************************初始化***********************************/
  67. void LCDINIT()
  68. {
  69. Delay1ms(15);
  70. wcomd(0x38);                                                                                                                              //功能設置
  71. Delay1ms(5);
  72. wcomd(0x38);                                                                                                                              //功能設置
  73. Delay1ms(5);
  74. wcomd(0x01);                                                                                                                              //清屏
  75. Delay1ms(5);
  76. wcomd(0x08);                                                                                                                              //關顯示
  77. Delay1ms(5);
  78. wcomd(0x0c);                                                                                                                              //開顯示,不開光標

  79. }

  80. /********************************顯示函數********************************/
  81. void Display(void) //顯示函數
  82. {
  83. unsigned char i,j;
  84. unsigned char a[12]={0X4D,0X45,0X41,0X53,0X55,0X52,0X45,0X4D,0X45,0X4E,0X54,0X53};//顯示measurements
  85. LCDINIT();
  86. for(i=0;i<12;i++)                                                                                                                              //寫顯示第一行
  87. { wcomd(0x80+i);
  88.     Delay1ms(1);
  89.     wdata(a[i]);
  90.     Delay1ms(1);
  91.    }

  92. for(j=0;j<6;j++)                                                                                                                              //寫顯示第二行
  93. {
  94. wcomd(0xc0+j);
  95.   Delay1ms(1);
  96.   wdata(0x30+b[j]);
  97.   Delay1ms(1);
  98. }
  99. Delay1ms(150);

  100. }
  101. /********************************主程序函數********************************/

  102. void main()
  103. {
  104.   IE=0x81;                                                                                  //打開全部的中斷控制,并開啟外部中斷允許
  105. TMOD=0x09;                                                                  //T0為16位計數工作方式1
  106.   IT0=1;                                                                                    //設置外部中斷的觸發的方式為脈沖觸發
  107.   TH0=0x00;
  108.   TL0=0x00;
  109.   T_flag=0;
  110. _reset=0;
  111.   b_test=1;
  112.   while(1)
  113. {
  114.     //while(!b_test)                                                             //如果有測量按鍵輸入就往下執行
  115.     //{
  116.      i=0;
  117.      _reset=1;                                                                              //啟動555時基芯片
  118.      EX0=1;                                                                                              //開啟中斷0
  119.      while(_reset)                                                                         //超出等待時間,中斷還沒有過來,就退出
  120.       {
  121.        i++;
  122.        if(i>50000)                                                                         //設置最長等待時間
  123.         {
  124.          _reset=0;                                                                                      //最長等待時間到還沒有中斷,停止555
  125.         }
  126.      }
  127.      if(N<100)                                                                               //如果計數值小于100,顯示SM,表示應換用小一點的量程
  128.      {
  129.        b[3]=0X1D;
  130.        b[2]=0X23;
  131.       }
  132. if(N>50000)                                                                              //如果計數值大于5000,顯示LA,表示應換用大一點的量程
  133.       {
  134.        b[3]=0X11;
  135.        b[2]=0X1C;
  136.       }
  137.      if(N>=100 && N<=50000)
  138.       {
  139.        C=N/100;                                                                               //計算電容的大小
  140.        b[2]=C/10;                                                                             //計算電容值的十位
  141.        b[3]=C-b[2]*10;                                                                        //計算電容值的個位
  142.       }
  143.      //}
  144.     Display();                                                                                     //顯示電容的大小
  145.               if(C>40)
  146.                 b_test=0;
  147.                 else
  148.                  b_test=1;
  149.   }

  150. /******************************外中斷0服務函數*****************************/

  151. void int0(void) interrupt 0                                                           //第一次中斷開始計數,第二個中斷停止計數
  152. {
  153.   T_flag=!T_flag;
  154.   if(T_flag==1)
  155.   {
  156.    TR0=1;                                                                                             //開始計時
  157.   }
  158.   if(T_flag==0)
  159.   {
  160.    TR0=0;                                                                                             //停止計時
  161.    EX0=0;                                                                                             //關閉中斷
  162.    _reset=0;                                                                                          //停止發出方

  163. ^^^^^^^^^^^^^^^^^^
  164. 余下內容下載附件
  165.    
復制代碼


全部資料51hei下載地址:
啊啊.docx (214.44 KB, 下載次數: 179)


回復

使用道具 舉報

無效樓層,該帖已經被刪除
ID:722171 發表于 2020-4-6 12:31 來自觸屏版 | 顯示全部樓層
有沒有詳細介紹
回復

使用道具 舉報

ID:724239 發表于 2020-4-7 18:05 | 顯示全部樓層
右下角那個元件是什么啊
回復

使用道具 舉報

ID:819012 發表于 2020-9-14 21:57 | 顯示全部樓層
請問樓主,這個原創出自哪里,急求~~!
回復

使用道具 舉報

6#
無效樓層,該帖已經被刪除
ID:902516 發表于 2021-4-25 11:02 來自觸屏版 | 顯示全部樓層
樓主問個問題,這個程序直接燒錄到主芯片就可以用了嗎?顯示屏需不需要
回復

使用道具 舉報

ID:927124 發表于 2021-5-25 16:55 | 顯示全部樓層
出不來
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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