电容、电感、电阻参数测量系统设计
我的学记|刘航宇的博客

电容、电感、电阻参数测量系统设计

刘航宇
4年前发布 /正在检测是否收录...
温馨提示:
本文最后更新于2022年11月29日,已超过853天没有更新,若内容或图片失效,请留言反馈。

目录

一、设计任务和要求

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);
  }
}
© 版权声明
THE END
喜欢就支持一下吧
点赞 3 分享 赞赏
评论 共5条
取消
  1. 头像
     · 
    回复

    看你的博客好几天了,内容不错,站长能换个链接不,www.photoinhere.com 印象美摄影工作室,谢谢!

  2. 头像
    哈哈
     · 
    回复

    大佬,太强了

  3. 头像
    make
     · 
    回复

    ::(真棒)

  4. 头像
    hand
     · 
    回复

    6666

  5. 头像
    hand
     · 
    回复

    很好