|
自動測量電容,通過555構(gòu)成多諧振蕩器測量頻率,因為頻率與555定時器2和6腳的RC有關(guān),固定R大小,來測量電容大小,
所謂換擋是因為51單片機晶振有限不能測太高的頻率,則需換固定R為另一個R將頻率降低,以便能測出。
電路原理圖如下:
單片機源程序如下:
- #include<reg52.h>
- #include "lcd1602.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit Key1M=P1^0;
- sbit Key1K=P1^1;
- sbit Key1=P1^2;
- sbit Key2=P1^3;
- sbit Key3=P1^4;
- uchar plv[]={" Hz"};
- uchar cap1[]={"0000000000 uF"};
- uchar cap2[]={"0000000 nF"};
- uchar cap3[]={"000 pF"};
- uchar n[]={" "};
- unsigned long Frequency;
- unsigned long C1,C2;
- uchar num;
- uchar T1count;
- uchar D1M,D1K,ZD;
- bit flag;
- void dangwei();
- void display();
- void main()
- {
- init_lcd1602();
- Key1M=1;
- Key1K=0;
- TMOD=0x51;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- TH1=0;
- TL1=0;
- EA=1;
- TR0=1;
- ET0=1;
- TR1=1;
- ET1=1;
- while(1)
- {
- dangwei();
- if(flag==1)
- {
- flag=0;
- Frequency=T1count*65536+TH1*256+TL1;
- plv[0]=Frequency/1000000+48;
- plv[1]=Frequency/100000%10+48;
- plv[2]=Frequency/10000%10+48;
- plv[3]=Frequency/1000%10+48;
- plv[4]=Frequency/100%10+48;
- plv[5]=Frequency/10%10+48;
- plv[6]=Frequency%10+48;
- display_lcd1602_text(1,0,plv);
- if(D1K==1)
- {
- Key1M=0;
- Key1K=1;
- C1=1.4398*1000000/(1000+2*1000)/Frequency*1000000;
- display();
- }
- if(D1M==1)
- {
- Key1M=1;
- Key1K=0;
- C1=1.4398*1000000/(1000+2*1000000)/Frequency*1000000;
- display();
- }
-
- if(ZD==1)
- {
- if(Frequency>50 && Key1M==1) //一旦頻率大于50HZ,且為1M檔
- {
- C1=1.4398*1000000/(1000+2*1000000)/Frequency*1000000;
- display(); //將頻率用1M阻值換算
- }
-
- if(Frequency<50000 && Key1K==1) //一旦頻率小于50000HZ,且為1k檔
- {
- C1=1.4398*1000000/(1000+2*1000)/Frequency*1000000;
- display(); //將頻率用1k阻值換算
- }
-
- if(Frequency<50 && Key1M==1) //一旦頻率小于50HZ,且為1M檔 因為6800pf 真實頻率比100HZ小,但比50HZ大
- { //從而避免一直切換
- Key1M=0;
- Key1K=1; //切換為1M檔,讓頻率重新更新?lián)Q算
- }
-
- if(Frequency>50000 && Key1K==1) //一旦頻率大于50000HZ,且為1k檔 因為10000pf 真實頻率比48000HZ大,但比50000小
- //從而避免一直切換
- {
- Key1M=1; //切換為1M檔,讓頻率重新更新?lián)Q算
- Key1K=0;
- }
- }
- num=0;
- T1count=0;
- TH1=0;
- TL1=0;
- TR1=1;
- }
- }
- }
- void display()
- {
- if(C1<1000)
- {
- C2=C1;
- C2=C2-26;
- cap3[0]=C2/100+48;
- cap3[1]=C2/10%10+48;
- cap3[2]=C2%10+48;
- display_lcd1602_text(0,0,n);
- display_lcd1602_text(0,0,cap3);
- }
- if(C1>=1000&&C1<1000000)
- {
- C2=C1;
- C2=C2-26;
- cap2[0]=C2/100000+48;
- cap2[1]=C2/10000%10+48;
- cap2[2]=C2/1000%10+48;
- cap2[3]='.';
- cap2[4]=C2/100%10+48;
- cap2[5]=C2/10%10+48;
- cap2[6]=C2%10+48;
- display_lcd1602_text(0,0,n);
- display_lcd1602_text(0,0,cap2);
- }
- if(C1>=1000000&&C1<=600000000)
- {
- C2=C1;
- C2=C2-26;
- cap1[0]=C2/100000000+48;
- cap1[1]=C2/10000000%10+48;
- cap1[2]=C2/1000000%10+48;
- cap1[3]='.';
- cap1[4]=C2/100000%10+48;
- cap1[5]=C2/10000%10+48;
- cap1[6]=C2/1000%10+48;
- cap1[7]=C2/100%10+48;
- cap1[8]=C2/10%10+48;
- cap1[9]=C2%10+48;
- display_lcd1602_text(0,0,n);
- display_lcd1602_text(0,0,cap1);
- }
- }
- void dangwei()
- {
- // D1K=0;
- // D1M=0;
- // ZD=1;
- if(Key1==0) //1K檔位
- {
- delay(20);
- if(Key1==0)
- {
- D1K=1;
- D1M=0;
- ZD=0;
- }
- }
- if(Key2==0) // 1M檔位
- {
- delay(20);
- if(Key2==0)
- {
- D1K=0;
- D1M=1;
- ZD=0;
- }
- }
- if(Key3==0) // 自動換檔位
- {
- delay(20);
- if(Key3==0)
- {
- D1K=0;
- D1M=0;
- ZD=1;
- }
- }
- }
- void jishu() interrupt 3 using 0 //定時器1 計數(shù)
- {
- T1count++;
- }
- void timer0() interrupt 1 using 0 //定時0 定時1s
- {
- num++;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
自動換擋測電容最終版.zip
(50 KB, 下載次數(shù): 161)
2018-4-21 16:25 上傳
點擊文件名下載附件
|
評分
-
查看全部評分
|