基于51单片机简易电阻电感电容RLC测量仪仿真( proteus仿真+程序+讲解视频)

仿真图proteus7.8及以上

程序编译器:keil 4/keil 5

编程语言:C语言

设计编号:S0040

1.主要功能

运用所学知识,制作一个51单片机电阻电感电容测量仪

1、测量范围:电阻 100Ω-100KΩ;

电容 1000pF-1uF;

电感 1mH-1000mH。

2、测量精度:5%。

3、制作1602液晶显示器,显示测量数值,通过开关选择测量类型。

资料下载链接(可点击):

【腾讯文档】S0040 网盘链接
https://docs.qq.com/doc/DS3RPaGNlVGNGSndQ

以下为本设计资料展示图:

2.仿真

开始仿真

开始仿真后可以通过滑动变阻器改变测了电阻值,改动后长按测量按键显示。

测量电阻10000Ω测量值10156Ω

测量电感100mH测量值86mH

测量电容5016pF测量值5000pF

img

img

3. 程序

img

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int	    
sbit RS=P2^6;
sbit RW=P2^5;
sbit E=P2^7;
sbit R=P1^0;
sbit C=P1^1;
sbit L=P1^2;
sbit A1=P1^3;
sbit A0=P1^4;

#define LCD_data  P0					
uchar   code  table1[10]={"R=      R"};
uchar   code  table2[10]={"C=      pF"};
uchar   code  table3[10]={"L=      mH"};

uchar code f_table[88]={13,14,15,16,17,	18,	19,	20,	21,	22,	23,	24,	25,	26,	27,	28,	29,	30,	31,	32,	33,	34,	35,	36,	37,	38,	39,	40,	41,	42,	43,	44,	45,	46,	47,	48,	49,	50,	51,	52,	53,	54,	55,	56,	57,	58,	59,	60,	61,	62,	63,	64,	65,	66,	67,	68,	69,	70,	71,	72,	73,	74,	75,	76,	77,	78,	79,	80,	81,	82,	83,	84,	85,	86,	87,	88,	89,	90,	91,	92,	93,	94,	95,	96,	97,	98,	99,	100};
uchar code f_correct[88]={9,10,	11,	12,	12,	12,	13,	14,	15,	16,	17,	18,	18,	18,	19,	20,	21,	21,	22,	23,	24,	25,	25,	26,	26,	27,	28,	29,	29,	30,	30,	31,	32,	33,	33,	34,	35,	35,	36,	37,	38,	38,	39,	40,	41,	41,	42,	42,	43,	44,	45,	45,	46,	47,	48,	49,	49,	50,	51,	51,	52,	53,	54,	54,	55,	55,	56,	57,	57,	58,	59,	60,	60,	62,	62,	63,	64,	64,	65,	66,	66,	67,	67,	68,	69,	70,	71,	71,};

uchar a6,a5,a4,a3,a2,a1;
uchar flag;
unsigned long cnt,cnt1;
uchar f_cnt;


/********************************/

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 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_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;
        PT0=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)		 //LCD显示
{
            if(!R)
			 {
//			 while(!R);
			 A1=A0=0;	
	                lcd_display(0x80,table1[0]);
			lcd_display(0x80+1,table1[1]);
			lcd_display(0x80+8,table1[8]);
			lcd_display(0x80+9,table1[9]);
			  }
			else if(!C)
			{
			A0=0;A1=1;
			lcd_display(0x80,table2[0]);
			lcd_display(0x80+1,table2[1]);
			lcd_display(0x80+8,table2[8]);
			lcd_display(0x80+9,table2[9]);
			}
			else if(!L)
			{
			A0=1;A1=0;
			lcd_display(0x80,table3[0]);
			lcd_display(0x80+1,table3[1]);
			lcd_display(0x80+8,table3[8]);
			lcd_display(0x80+9,table3[9]);
			}
			if(a6)
			  lcd_display(0x80+2,0x30+a6);
			else
			lcd_display(0x80+2,' '); 


			if(a6||a5)
			lcd_display(0x80+3,0x30+a5);
			else
			 	lcd_display(0x80+3,' ');


			if(a6||a5||a4)
			lcd_display(0x80+4,0x30+a4);	
			else
		   lcd_display(0x80+4,' ');


			if(a6||a5||a4||a3)
			lcd_display(0x80+5,0x30+a3);	
			else
		    lcd_display(0x80+5,' ');


			if(a6||a5||a4||a3||a2)
			lcd_display(0x80+6,0x30+a2);
			else
			lcd_display(0x80+6,' ');

			
			lcd_display(0x80+7,0x30+a1);
		

}

void correct(void)			//误差修正函数
{
	uchar i,k;
	unsigned long wucha;
	if(cnt<100000)		   //100KHz以内的修正
	{
		if(cnt>980&&cnt<2100)     cnt-=1;
		if(cnt>=2100&&cnt<3900)   cnt-=2;
		if(cnt>=3900&&cnt<4800)   cnt-=3;
		if(cnt>=4800&&cnt<5700)   cnt-=4;
		if(cnt>=5700&&cnt<8000)   cnt-=5;
		if(cnt>=8000&&cnt<9100)	  cnt-=6;
		if(cnt>=9100&&cnt<10900)  cnt-=7;
		if(cnt>=10900&&cnt<11900) cnt-=8;
		if(cnt>=11900&&cnt<13000) cnt-=9;
		if(cnt>=13000&&cnt<=100000)
		{
			k=cnt/1000;
			for(i=0;i<88;i++)
			{
				if(k==f_table[i])
				{
					cnt-=f_correct[i];
				}
			}
		}
		
		
	}
	if(cnt>100000)	 
	{
		wucha=(cnt/1000)*73065/100000;
		cnt-=wucha;
	}
}

void main()
{

    timer_init();
	lcd_init();
	while(1)
	{		
		   if(flag==1)
		   {
			real_display();
			flag=0;
			}
		
	
	}
	
}
void timer0() interrupt 1
{
	uchar timer0;
	
	TH0=0x3c;	  //50ms
	TL0=0xb0;
	timer0++;
	if(timer0==20)	 //一秒测试一次
	{
		TR1=0;	  //关闭的计数器
		EA=0;
		cnt=TL1+TH1*256+f_cnt*65536; 
		correct();
	    //cnt1=(1e+9)/(2*0.693 *cnt)-20000/2;
		if(!R)						   //测量电阻
		{
//		while(!R);
		cnt1=1000000/(0.2*0.693*cnt)-165;
		}
		else if(!C)						 //测量电容
		{
		cnt1=1000000000/(0.693*3*510*cnt);
		}
		else if(!L)
		{
		 cnt1=(1e+9)/(4*3.14*3.14*cnt*cnt*0.05);  //测量电感
		}
		timer0=0;
	
		a6=cnt1%10000000/100000;
		a5=cnt1%100000/10000;
		a4=cnt1%10000/1000;
		a3=cnt1%1000/100;
		a2=cnt1%100/10;
		a1=cnt1%10;  
		flag=1;
     	        TH1=0;
		TL1=0;
		TH0=0x3c;
     	        TL0=0xb0;
		cnt=0;
		f_cnt=0;
		EA=1;
		TR1=1;	   //打开计数器
	
	
	}
	

}	

void int1() interrupt 3
{
	 f_cnt++;
} 

4.设计资料内容清单

下载方式见文章开头视频

img

资料下载链接(可点击):

https://docs.qq.com/doc/DS3RPaGNlVGNGSndQ

更多资源 点击下方链接:

https://docs.qq.com/sheet/DS0xIa0llTmtNakRW

微信公众号:嘉盛单片机

img