自动测量电容,通过555构成多谐振荡器测量频率,因为频率与555定时器2和6脚的RC有关,固定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档,让频率重新更新换算
- }
-
- if(Frequency>50000 && Key1K==1) //一旦频率大于50000HZ,且为1k档 因为10000pf 真实频率比48000HZ大,但比50000小
- //从而避免一直切换
- {
- Key1M=1; //切换为1M档,让频率重新更新换算
- 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 计数
- {
- T1count++;
- }
- void timer0() interrupt 1 using 0 //定时0 定时1s
- {
- num++;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
自动换挡测电容最终版.zip
(50 KB, 下载次数: 161)
|