B015 - 电阻电容电感检测仪

任务

初始条件:
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++;
} 
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值