任务
初始条件:
LM317 LM337
NE555 NE5532
STC89C52 TLC549 ICL7660 1602液晶
要求完成的主要任务:
1、测量范围:电阻 100Ω-1MΩ;
电容 100pF-10000pF;
电感 100μH-10mH。
2、测量精度:5%。
3、制作1602液晶显示器,显示测量数值,并用发光二级管分别指示所测元件的类别。
原理图
实物图
源程序
/*******************************************************************************
* 文件名称:电阻电容电感检测仪
* 实验目的:1.
* 2.
* 程序说明:定制请联系Q:2772272579;@: itworkstation@hotmail.com
* 日期版本:完整源程序,实物测试通过。
*******************************************************************************/
/************************************************
电容:
ln2=0.693
电路震荡周期:
T=(R1+2*R2)*CX*ln2
f=1/T
CX=1/((R1+2*R2)*f*ln2)
=1.443/((R1+2*R2)*f)
************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^7;
sbit RW=P2^6;
sbit E=P2^5;
sbit Key_R=P1^0;
sbit Key_C=P1^1;
sbit Key_L=P1^2;
sbit A0=P1^3;
sbit A1=P1^4;
#define C_R1 510 //510 K ,公式中已约分 22 51
#define C_R2 510
bit R=0,L=1,C=1;
#define LCD_data P0
uchar code table1[11]={"R= R "};
uchar code table2[11]={"C= pF"};
uchar code table3[11]={"L= mH"};
uchar a7,a6,a5,a4,a3,a2,a1;
uchar flag=0;
double cnt=0,cnt1=0;
unsigned long Temp_Cnt1=0;
unsigned long f_cnt=0;
uint Timer_H=0;
uchar timer_num=0;
/********************************/
void delay_us(); //18us
void delay_ms(uint);
void lcd_init();
void lcd_write_com(uchar com);
void lcd_write_dat(uchar dat);
void lcd_init();
void lcd_display(uchar add,uchar dat);
/***********************************/
void delay_us()
{
uchar x;
for(x=0;x<5;x++);
}
void delay_ms(uint z)
{
uint x,y;
for(x=0;x<z;x++)
for(y=0;y<123;y++);
}
void Key_Scan()
{
if(Key_R==0)
{
delay_ms(10);
if(Key_R==0)
{
R=0;C=1;L=1;
}
while(!Key_R);
}
if(Key_C==0)
{
delay_ms(10);
if(Key_C==0)
{
R=1;C=0;L=1;
}
while(!Key_C);
}
if(Key_L==0)
{
delay_ms(10);
if(Key_L==0)
{
R=1;C=1;L=0;
}
while(!Key_L);
}
}
void lcd_write_com(uchar com)
{
E=0;
RS=0;
RW=0;
delay_us();
LCD_data=com;
E=1; //高脉冲写入数据
delay_us();
E=0;
}
void lcd_write_dat(uchar dat)
{
E=0;
RS=1;
RW=0;
delay_us();
LCD_data=dat;
E=1; //高脉冲写入数据
delay_us();
E=0;
}
void lcd_write_string(uchar add,uchar *p)
{
lcd_write_com(add);
while(1)
{
if(*p == '\0') break;
lcd_write_dat(*p);
p++;
}
}
void lcd_init() //lcd初始化
{
delay_ms(15);
lcd_write_com(0x38);
delay_ms(10);
lcd_write_com(0x0c);
lcd_write_com(0x06);
lcd_write_com(0x01);
delay_ms(2);
}
void timer_init(void) //定时器初始化
{
TMOD=0X51;
PT1=1; /*中断优先 ,定时器 1 */
TH0=0x3c;
TL0=0xb0;
TH1=0;
TL1=0;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
EA=1;
}
void lcd_display(uchar add,uchar dat) //lcd显示(地址,数据)
{
lcd_write_com(add);
lcd_write_dat(dat);
delay_us();
}
void real_display(void)
{
if(!R)
{
// while(!R);
A1=A0=0;
lcd_display(0xc0,table1[0]);
lcd_display(0xc0+1,table1[1]);
lcd_display(0xc0+9,table1[9]);
lcd_display(0xc0+10,table1[10]);
}
else if(!C)
{
A1=0;A0=1;
lcd_display(0xc0,table2[0]);
lcd_display(0xc0+1,table2[1]);
lcd_display(0xc0+9,table2[9]);
lcd_display(0xc0+10,table2[10]);
}
else if(!L)
{
A1=1;A0=0;
lcd_display(0xc0,table3[0]);
lcd_display(0xc0+1,table3[1]);
lcd_display(0xc0+9,table3[9]);
lcd_display(0xc0+10,table3[10]);
}
if(a7)
lcd_display(0xc0+2,0x30+a7);
else
lcd_display(0xc0+2,' ');
if(a7||a6)
lcd_display(0xc0+3,0x30+a6);
else
lcd_display(0xc0+3,' ');
if(a7||a6||a5)
lcd_display(0xc0+4,0x30+a5);
else
lcd_display(0xc0+4,' ');
if(a7||a6||a5||a4)
lcd_display(0xc0+5,0x30+a4);
else
lcd_display(0xc0+5,' ');
if(a7||a6||a5||a4||a3)
lcd_display(0xc0+6,0x30+a3);
else
lcd_display(0xc0+6,' ');
if(a7||a6||a5||a4||a3||a2)
lcd_display(0xc0+7,0x30+a2);
else
lcd_display(0xc0+7,' ');
lcd_display(0xc0+8,0x30+a1);
}
void main()
{
timer_init();
lcd_init();
lcd_write_string(0x80," RLC Test ");
while(1)
{
Key_Scan();
if(flag==1)
{
flag=0;
TR0=0;
EA=0;
Timer_H=TH1;
Timer_H<<=8;
Timer_H |=TL1;
Temp_Cnt1=Timer_H+f_cnt*65536;
cnt=(double)Temp_Cnt1;
if(!R)
{
// while(!R);
cnt1=1000000/(0.2*0.693*cnt)-165;
}
else if(!C) //C=1/(ln2*(R1+2R2)*f) 得到的电容值为F =10^12pF
{
cnt1=1442695040/((C_R1+2*C_R2)*cnt); //
// cnt1=6600000.0/Temp_Cnt1;
}
else if(!L)
{
cnt1=(1000000000)/(4*3.14*3.14*cnt*cnt*0.05);
}
Temp_Cnt1=(unsigned long)cnt1;
a7=Temp_Cnt1%10000000/1000000%10;
a6=Temp_Cnt1%10000000/100000%10;
a5=Temp_Cnt1%100000/10000%10;
a4=Temp_Cnt1%10000/1000%10;
a3=Temp_Cnt1%1000/100%10;
a2=Temp_Cnt1%100/10%10;
a1=Temp_Cnt1%10;
TH1=0;
TL1=0;
TH0=0x3c;
TL0=0xb0;
cnt=0;
cnt1=0;
f_cnt=0;
Temp_Cnt1=0;
timer_num=0;
TR0=1;
TR1=1; //打开计数器
EA=1;
real_display();
}
}
}
void timer0() interrupt 1
{
TH0=0x3c; //50ms
TL0=0xb0;
timer_num++;
if(timer_num==20)
{
timer_num=0;
TR1=0; //关闭的计数器
flag=1;
}
}
void int1() interrupt 3
{
f_cnt++;
}