非原創,和大家分享一下
基于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 - /******************************文件Main.c 如下****************************/
- //編譯環境 :keil c51
- //mpu型號:stc89c52rc
- //晶振頻率:12M
- //操作系統:win x
- /*************************************************************************/
- #include "reg51.h"
- #include"intrins.h" //庫函數
-
- #define DATA P0
- sbit RW=P2^1; //1602寫數據
- sbit RS=P2^0; //1602寫地址
- sbit EN=P2^2; //1602工作使能
- sbit b_test=P3^7; //控制小燈的亮滅
- sbit _reset=P3^5; //555時基芯片工作控制信號
- unsigned int T_flag,N,C,i,Dis1,Dis0;
- unsigned int b[6]={0X13,0X0D,0X00,0X00,0X40,0X16}; //顯示C=00pF
-
- /*******************************延時1ms*********************************/
- void Delay1ms(unsigned int mm)
- {unsigned int i;
- for(mm;mm>0;mm--)
- for(i=100;i>0;i--);
- }
- /********************************檢查忙否********************************/
- void Checkstates()
- {
- unsigned char dat;
- RS=0;
- RW=1;
- do{EN=1; //下降沿
- _nop_(); //保持一定間隔
- _nop_();
- dat=DATA;
- _nop_();
- _nop_();
- EN=0;
- }while((dat&0x80)==1);
- }
- /*******************************LCD寫命令函數****************************/
- void wcomd(unsigned char cmd)
- {
- Checkstates();
- RS=0;
- RW=0;
- DATA=cmd;
- EN=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- EN=0;
- }
- /******************************LCD寫數據函數*******************************/
- void wdata(unsigned char dat)
- {
- Checkstates();
- RS=1;
- RW=0;
- DATA=dat;
- EN=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- EN=0;
- }
- /********************************初始化***********************************/
- void LCDINIT()
- {
- Delay1ms(15);
- wcomd(0x38); //功能設置
- Delay1ms(5);
- wcomd(0x38); //功能設置
- Delay1ms(5);
- wcomd(0x01); //清屏
- Delay1ms(5);
- wcomd(0x08); //關顯示
- Delay1ms(5);
- wcomd(0x0c); //開顯示,不開光標
-
- }
-
- /********************************顯示函數********************************/
- void Display(void) //顯示函數
- {
- unsigned char i,j;
- unsigned char a[12]={0X4D,0X45,0X41,0X53,0X55,0X52,0X45,0X4D,0X45,0X4E,0X54,0X53};//顯示measurements
- LCDINIT();
- for(i=0;i<12;i++) //寫顯示第一行
- { wcomd(0x80+i);
- Delay1ms(1);
- wdata(a[i]);
- Delay1ms(1);
- }
-
- for(j=0;j<6;j++) //寫顯示第二行
- {
- wcomd(0xc0+j);
- Delay1ms(1);
- wdata(0x30+b[j]);
- Delay1ms(1);
- }
- Delay1ms(150);
-
- }
- /********************************主程序函數********************************/
-
- void main()
- {
- IE=0x81; //打開全部的中斷控制,并開啟外部中斷允許
- TMOD=0x09; //T0為16位計數工作方式1
- IT0=1; //設置外部中斷的觸發的方式為脈沖觸發
- TH0=0x00;
- TL0=0x00;
- T_flag=0;
- _reset=0;
- b_test=1;
- while(1)
- {
- //while(!b_test) //如果有測量按鍵輸入就往下執行
- //{
- i=0;
- _reset=1; //啟動555時基芯片
- EX0=1; //開啟中斷0
- while(_reset) //超出等待時間,中斷還沒有過來,就退出
- {
- i++;
- if(i>50000) //設置最長等待時間
- {
- _reset=0; //最長等待時間到還沒有中斷,停止555
- }
- }
- if(N<100) //如果計數值小于100,顯示SM,表示應換用小一點的量程
- {
- b[3]=0X1D;
- b[2]=0X23;
- }
- if(N>50000) //如果計數值大于5000,顯示LA,表示應換用大一點的量程
- {
- b[3]=0X11;
- b[2]=0X1C;
- }
- if(N>=100 && N<=50000)
- {
- C=N/100; //計算電容的大小
- b[2]=C/10; //計算電容值的十位
- b[3]=C-b[2]*10; //計算電容值的個位
- }
- //}
- Display(); //顯示電容的大小
- if(C>40)
- b_test=0;
- else
- b_test=1;
- }
-
- /******************************外中斷0服務函數*****************************/
-
- void int0(void) interrupt 0 //第一次中斷開始計數,第二個中斷停止計數
- {
- T_flag=!T_flag;
- if(T_flag==1)
- {
- TR0=1; //開始計時
- }
- if(T_flag==0)
- {
- TR0=0; //停止計時
- EX0=0; //關閉中斷
- _reset=0; //停止發出方
- ^^^^^^^^^^^^^^^^^^
- 余下內容下載附件
-
復制代碼
全部資料51hei下載地址:
啊啊.docx
(214.44 KB, 下載次數: 179)
2019-4-13 22:02 上傳
點擊文件名下載附件
|