完整程序与仿真文件见文章末尾
一、设计任务和要求
- 设计并制作一个元器件参数测量仪
- 电阻阻值测量,范围:100Ω ~ 1MΩ
- 电容容值测量,范围:100pF ~ 10000pF
- 测量精度:±5%
- 电感参数的测量
- 扩大量程
- 提高测量精度
二、方案设计与论证
2.1 系统总设计框图

图1 系统总设计框图
在测量各元件参数时,采用首先把电感、电容、电阻的参数转化为频率[1],再送至单片机检测,检测结束后,送至 LCD1602 进行显示。
2.2 方案一:电桥平衡原理
① 电阻的测量:直流电桥平衡原理

图2 直流电桥平衡电路图
根据电路平衡原理,不断调节电位器 R3,使得电表指针指向正中间,再测量电位器电阻值。
② 电容的测量:交流电桥平衡原理

图3 交流电桥平衡电路图
通过调节 Z1、Z2 使电桥平衡。这时电表的读数为零。通过读取 Z1、Z2、Zn 的值,即可得到被测电容的值。
③ 电感的测量:交流电桥平衡原理

图4 交流电桥平衡电路图
2.3 方案二:频率转换法(本设计采用)
① 电阻的测量:555 构成单稳态

图5 555 定时器构成单稳态电路图
根据 555 定时器构成单稳态,产生脉冲波形,通过单片机读取高低电平得出频率,通过公式换算得到电阻阻值。
② 电容的测量:555 构成单稳态

图6 555 定时器构成单稳态电路图**
根据 555 定时器构成单稳态,产生脉冲波形,通过单片机读取高低电平得出频率,通过公式换算得到电容值。
③ 电感的测量:电容三点式正弦波振荡

图7 电容三点式正弦波振荡电路图
由电容三点式正弦波振荡电路得出频率,通过单片机读取高低电平得出频率,通过公式换算得到电感值。
2.4 方案对比与选择
| 对比项 | 方案一(电桥法) | 方案二(频率法) |
|---|---|---|
| 测量精度 | 受人为调节影响大 | 单片机数字化,精度高 |
| 操作难度 | 调节麻烦,不易操作 | 自动测量,一键显示 |
| 电感测量 | 不易测得准确值 | 振荡电路,相对稳定 |
| 数字化 | 不易数字化 | 便于单片机处理 |
结论: 方案二通过单片机读取转化,精确度会明显提高,且便于数字化显示。故本设计选择方案二。
三、单元电路设计和参数计算
3.1 电阻的检测单元电路设计

图8 555 定时器构成单稳态电路图
由 555 单稳态触发公式:
$$f=\frac{1}{\ln2(R_{1}+2R_x)C}$$
得:
$$R_x=\frac{1}{2}(\frac{1}{\ln2fC}-R_{1})$$
从而,可以计算得出电阻值的大小。
3.2 电容的检测单元电路设计

图9 555 定时器构成单稳态电路图
根据 555 定时器构成单稳态,产生脉冲波形,通过单片机读取高低电平得出频率,通过公式换算得到电容值[2]。
由:
$$f=\frac{1}{\ln2^*(R_1+2R_2)^*C_x}$$
若 R1 = R2,得:
$$C_x=\frac{1}{3\ln2^*f^*R_1}$$
从而,可以计算得出电容值的大小。
3.3 电感的检测单元电路设计

图10 电容三点式正弦波振荡电路图
由 LC 振荡频率公式:
$$f=\frac{1}{2\pi\sqrt{\frac{C_1*C_2}{C_1+C_2}*L_x}}$$
得:
$$L_x=\frac{1}{\left(2\pi f\right)^2\frac{C_1*C_2}{C_1+C_2}}$$
从而,可以计算得出电感值的大小。
四、总原理图及元器件清单
4.1 总原理图

图11 电阻、电容、电感参数测试总原理图
图12 测量电阻、电容部分的原理图
图13 测量电感以及 ±5V 发生原理图
4.2 元器件清单
| 元件序号 | 型号 | 数量 | 备注 |
|---|---|---|---|
| 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~C9 | 104 (0.1uF) | 6 | 瓷片电容 |
| R7, R9 | 100KΩ | 2 | 电阻 |
| C10 | 50V, 22uF | 1 | 电解电容 |
| Q1~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 | 运放 |
五、程序设计
5.1 程序流程图
图14 中断程序流程图
图15 主程序流程图
初始化 (led_init, t_init, keyscan)
↓
清屏
↓
循环:
├── 显示频率 display_f(f)
└── 根据 a 值分支:
├── case 1: 计算电阻 R,显示 display_R(R)
├── case 2: 计算电容 C,显示 display_C(C)
└── case 3: 计算电感 L,显示 display_L(L)5.2 核心代码
中断函数(频率测量)
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 main()
{
led_init(); // 液晶初始化
t_init(); // 定时器初始化
keyscan(); // 按键检测
write_com(0x01); // 清屏
while(1)
{
display_f(f);
switch(a)
{
case 1: // 电阻: R = (T/0.693 - 150) 换算
R = (ulong)(5000000.0 / 0.6931472 / f - 150 + 0.5);
display_R(R);
break;
case 2: // 电容: C = 换算公式
C = (int)(100000000.0 / 153 / 0.6931472 / f + 0.5);
display_C(C);
break;
case 3: // 电感: L = 1/(4π²f²C) 换算
L = (int)(1000000000000.0 / 0.1 / PI / PI / f / f + 0.5);
display_L(L);
break;
}
}
}显示函数
// 频率显示
void display_f(ulong f)
{
uchar count = 0;
ulong 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 = 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 = 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 = 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);
}
}键盘检测函数
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); // 等待按键按下
}5.3 完整程序清单及protues仿真文件(附录)
见文末附录部分。
六、安装与调试
6.1 仿真调试
(1)电阻测量电路仿真
图16 电阻测量的仿真电路图
图17 电阻测量的仿真输出波形
(2)电容测量电路仿真
图18 电容测量的仿真电路图
图19 电容测量的仿真输出波形
(3)电感测量电路仿真
图20 电感测量的仿真电路图
图21 电感测量的仿真输出波形
调试要点
- 接通电源,用示波器观察输出波形,若为方波,则电路焊接无误,否则检查电路[3]
- 在调试过程中发现,若改变电源电压,输出方波的频率会发生变化,计算出的数值存在一定误差
- 当 VCC 为 3.25V 左右时误差较小
液晶显示电路调试
- 将测量电路的输出分别与单片机的 P1^5、P1^6、P1^7 相接,观察液晶是否显示测量结果
- 在调试过程中发现,电阻、电容的测量误差较小
- 由于电容三点式震荡电路的频率不稳定,电感测量的误差较大
仿真整体显示
图22 电阻测量显示
图23 电容测量显示
图24 电感测量显示
图25 电源生成模块显示
6.2 实物调试
实物按照仿真电路搭建,通电显示 "Welcome! RCL detector"。
图26 实物开机界面
电阻检测
- 插入 2.7KΩ 电阻
- 若显示不准确,调节仿真中 R2 对应的电位器即可改变输出频率,使得检测精准
- 检测显示 2735Ω,可见调试准确
图27 电阻检测显示
电容检测
- 插入 0.1uF 电容
- 若显示不准确,调节仿真中 R3 对应的电位器即可改变输出频率,使得检测精准
- 检测显示 101pF,可见调试准确[4]
图28 电容检测显示
电感检测
- 插入 65mH 电感
- 若显示不准确,调节程序计算公式5,即可改显示结果,使得检测精准
- 检测显示 65535uH,可见调试准确
图29 电感检测显示
八、参考文献
[1]杨沁佳.浅谈电感传感器微位移检测仪的原理与设计[J].数字通信世界,2019(09):143+159.
[2]张璐雅,阮景.一种基于555时基电路的振荡器设计[J].集成电路应用,2019,36(12):12-13.
[3]谢琪林.浅谈STC89S51单片机时序[J].电子测试,2020(24):139-140.
[4]黄江.基于STM32的高精度电容测量仪设计[J].信息技术与信息化,2020(11):140-141.
[5]王晓辉,王智永,韩智伟,胡帅可,谢印庆.基于三极管放大原理的电容三点式LC振荡器的设计[J].电子世界,2020(03):206.
[6] E. L. Pankratov. An approach to model manufacturing of an enhanced swing differential Colpitts oscillator based on heterostructures to increase density of their elements with account mismatch-induced stress: on optimization of annealing. 2020, :1-19.
九、附录-完整软件程序与protues仿真文件
// ============================================
// RCL 测量仪程序
// 基于 STC89C52RC + NE555 + LCD1602
// ============================================
#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)=";


















