标题:
51单片机自动换挡测电容最终版原理图与程序源码
[打印本页]
作者:
lisi9645
时间:
2018-4-21 16:34
标题:
51单片机自动换挡测电容最终版原理图与程序源码
自动测量电容,通过555构成多谐振荡器测量频率,因为频率与555定时器2和6脚的RC有关,固定R大小,来测量电容大小,
所谓换挡是因为51单片机晶振有限不能测太高的频率,则需换固定R为另一个R将频率降低,以便能测出。
电路原理图如下:
图片1.png
(36.32 KB, 下载次数: 69)
下载附件
2018-4-21 16:34 上传
0.jpg
(26.71 KB, 下载次数: 53)
下载附件
2018-4-21 16:43 上传
单片机源程序如下:
#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)
2018-4-21 16:25 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
tlzyytc
时间:
2018-4-21 19:18
附件不能下载啊
作者:
zjz039
时间:
2018-4-21 22:57
楼主厉害啊!
作者:
ljfl150
时间:
2018-12-10 17:11
楼主,有pcb吗
作者:
御羽与鱼
时间:
2019-8-8 15:42
楼主厉害啊,希望自己也可以做出来,不过想问一下这个测电容的可以精确到那个单位啊
作者:
御羽与鱼
时间:
2019-8-8 16:17
楼主,我想知道一下这个单片机stc89c52为什么在proteus里面找不到呢,这个单片机是您自己设计的还是只是我没找到你喜欢,求解答
作者:
97cool
时间:
2020-7-23 15:57
能发下这个的仿真吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1