目录
一、设计任务和要求
1、设计并制作一个元器件参数测量仪。
2、电阻阻值测量,范围:100Ω~1MΩ;
3、电容容值测量,范围:100pF~10000pF;
4、测量精度:±5% ;
5、电感参数的测量;
6、扩大量程;
7、提高测量精度;
二、单元电路设计和参数计算
1、电阻的检测单元电路设计
从而,可以计算得出电阻值的大小。
2、电容的检测单元电路设计
从而,可以计算得出电容值的大小。
3、电感的检测单元电路设计
从而,可以计算得出电感值的大小。
三、总原理图及元器件清单
(2)元器件清单
表1 原理图中所使用的元器件清单
元件序号 型号 数量 备注
U1 STC89C52RC 1 单片机
R3 A103J 1 排阻
R2,R3,R17,R18 10KΩ 4 电位器
X1 11.0592M 1 晶振
C3 25V,10uF 1 电解电容
C1,C2,C11 103(0.01uF) 3 瓷片电容
R1,R13,R18 10KΩ 3 电阻
J1,J2,J3,J4 4 按键
U2 1602 1 液晶
A1,A2 NE555 2 555定时器
R4 300Ω 1 电阻
R5,R6 510KΩ 2 电阻
C4,C5,C6,C7,C8,C9 104(0.1uF) 6 瓷片电容
R7,R9 100KΩ 2 电阻
C10 50V,22uF 1 电解电容
Q1,Q2,Q3 S9108(NPN型) 3 三极管
R10 2KΩ 1 电阻
R8,R11,R14 1KΩ 3 电阻
C12,C13 50V,47uF 2 电解电容
R12,R19 39KΩ 2 电阻
R15,R16 51Ω 2 电阻
C14 25V,470uF 1 电解电容
U3 NE55532 1 运放
四、附录
软件程序
//RCL测量仪程序
//初始化
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define PI 3.1415926
uchar code table1[8]="Welcome! RCL detector";
uchar table2[16]="f(Hz)=";
uchar table3[16]="R(Ohm)=";
uchar table4[16]="C(pF)=";
uchar table5[16]="L(uH)=";
uchar num,a=0,th0,tl0;
uint C,L;
ulong f,R;
sbit lcden=P2^4; //液晶使能端
sbit lcdrs=P2^5; //液晶数据命令选择端
sbit key_R=P1^5; //测量电阻按键
sbit key_C=P1^6; //测量电容按键
sbit key_L=P1^7; //测量电感按键
sbit R_out=P1^2; //测量电阻信号输入
sbit C_out=P1^3; //测量电容信号输入
sbit L_out=P1^4; //测量电感信号输入
//声明子函数
void delayms(uint xms); //延时函数
void write_com(uchar com); //液晶写命令函数
void write_data(uchar date); //液晶写数据函数
void led_init(); //液晶初始化函数
void t_init(); //定时器0初始化函数
void keyscan(); //键盘检测函数(确定被测元件为电阻、电容或电感)
void display_f(ulong f); //频率显示函数
void display_R(ulong R); //电阻显示函数
void display_C(uint C); //电容显示函数
void display_L(uint L); //电感显示函数
//主函数
void main()
{
led_init();
t_init();
keyscan();
write_com(0x01);
while(1)
{
display_f(f);
switch(a)
{
case 1:R=(ulong)(5000000.0/0.6931472/f-150+0.5);display_R(R);break;
case 2:C=(int)(100000000.0/153/0.6931472/f+0.5);display_C(C);break;
case 3:L=(int)(1000000000000.0/0.1/PI/PI/f/f+0.5);display_L(L);break;
}
}
}
//中断函数
void T0_count() interrupt 1
{
switch(a)
{
case 1:while(R_out);
while(!R_out);
TH0=0;
TL0=0;
while(R_out);
while(!R_out);
th0=TH0;
tl0=TL0;
TR0=0;
break;
case 2:while(C_out);
while(!C_out);
TH0=0;
TL0=0;
while(C_out);
while(!C_out);
th0=TH0;
tl0=TL0;
TR0=0;
break;
case 3:while(L_out);
while(!L_out);
TH0=0;
TL0=0;
while(L_out);
while(!L_out);
th0=TH0;
tl0=TL0;
TR0=0;
break;
}
f=1000000.0/1.085069/(th0*256+tl0)+0.5;
}
//延时函数
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
//液晶写命令函数
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
//液晶写数据函数
void write_data(uchar date)
{
lcdrs=1;
P0=date;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
//液晶初始化函数
void led_init()
{
lcden=0;
write_com(0x38); //设置16×2显示,5×7点阵,8位数据接口
write_com(0x0c); //设置开显示,不显示光标
write_com(0x06); //写一个字符后地址指针加1
write_com(0x01); //显示清0,数据指针清0
write_com(0x80); //显示欢迎界面
for(num=0;num<8;num++)
{
write_data(table1[num]);
delayms(5);
}
}
//定时器0初始化函数
void t_init()
{
TMOD=0x01; //设置定时器0工作方式1(M1M0=0x0001)
TH0=0; //装初值
TL0=0;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
//键盘检测函数(确定被测元件为电阻、电容或电感)
void keyscan()
{
if(key_R==0)
{
delayms(10);
if(key_R==0)
a=1;
}
else
if(key_C==0)
{
delayms(10);
if(key_C==0)
a=2;
}
else
if(key_L==0)
{
delayms(10);
if(key_L==0)
a=3;
}
else
while(key_R&&key_C&&key_L); //按键按下时退出死循环
}
//频率显示函数
void display_f(ulong f)
{
uchar count=0;
ulong f0;
f0=f;
while(f)
{
f=f/10;
count++;
}
for(num=5+count;num>5;num--)
{
table2[num]=f0%10+48;
f0=f0/10;
}
write_com(0x80);
for(num=0;num<6+count;num++)
{
write_data(table2[num]);
delayms(5);
}
}
//电阻显示函数
void display_R(ulong R)
{
uchar count=0;
ulong R0;
R0=R;
while(R)
{
R=R/10;
count++;
}
for(num=6+count;num>6;num--)
{
table3[num]=R0%10+48;
R0=R0/10;
}
write_com(0x80+0x40);
for(num=0;num<7+count;num++)
{
write_data(table3[num]);
delayms(5);
}
}
//电容显示函数
void display_C(uint C)
{
uchar count=0;
uint C0;
C0=C;
while(C)
{
C=C/10;
count++;
}
for(num=5+count;num>5;num--)
{
table4[num]=C0%10+48;
C0=C0/10;
}
write_com(0x80+0x40);
for(num=0;num<6+count;num++)
{
write_data(table4[num]);
delayms(5);
}
}
//电感显示函数
void display_L(uint L)
{
uchar count=0;
uint L0;
L0=L;
while(L)
{
L=L/10;
count++;
}
for(num=5+count;num>5;num--)
{
table5[num]=L0%10+48;
L0=L0/10;
}
write_com(0x80+0x40);
for(num=0;num<6+count;num++)
{
write_data(table5[num]);
delayms(5);
}
}
看你的博客好几天了,内容不错,站长能换个链接不,www.photoinhere.com 印象美摄影工作室,谢谢!
大佬,太强了
6666
很好