【STC开源项目】STC51单片机LRC万用表表制作程序+PCB文件

【STC开源项目】STC51单片机LRC万用表表制作程序+PCB文件


本篇文章将提供制作所需的资料。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

原作者使用的驱动屏幕是带字库的ST7920作为液晶驱动,主控芯片采用的是STC89C52,屏幕是整个项目中成本占比最大的物料,你可以修改为LCD1602屏幕,或者LCD1602+PCF8574驱动这样可以减少接线,自己打板制作的话就使用LCD1602成本最低。

功能介绍

主要实现的功能:测量电阻、电容、电感三个中元器件。其他的晶体管测量不能进行测量。

项目资源列表

在这里插入图片描述

  • 程序源码
  • 原理图和PCB文件
  • 物料清单

程序资源

链接:https://pan.baidu.com/s/1WAaq6l7xWroYfFVOs_tdVA 
提取码:kjqa

主程序代码

#include <reg52.h>
#define uchar unsigned char
#define uint  unsigned	int
#define C1  0.045

uchar code WenDu1[]="数\xfd字万用表   ";
uchar code WenDu2[]="欢迎使用        ";
uchar code code_L[]="电感:          ";	
uchar code code_R[]="电阻:          ";
uchar code code_C[]="电容:          ";
uchar code code_e[]="错误:          ";
uchar  num;


sbit key1  =P1^0;
sbit key2  =P1^1;
sbit key3  =P1^2;
//unsigned long LZ=0;
//float f=0;

float LZ=0;
float RX=0;
float CX=0;

float f=0;

float temp_f[4];

unsigned int tt,th1,tl1;
unsigned int pluse=0;	
bit flag=0;	
unsigned char key_num=0;

#define  L 1
#define  R 2
#define  C 3

sbit aa1 =P2^0;
sbit bb1 =P2^1;

#include<Lcd12864.h>

void cd4051(unsigned char num)
{
		switch(num){
				case 1: bb1=0;aa1=0;break;
				case 2: bb1=0;aa1=1; break;
				case 3: bb1=1;aa1=0; break;
				default : aa1=1;aa1=1;break;
		}
}

void scan_key()
{
		if(!key1){
				if(!key1){
						while(!key1);
						key_num=1;
						cd4051(L);
					//	aa1=0;bb1=0;
					    Lcd_ShowSring(4,0,code_L);
						Lcd_ShowSring(1,15,"L");
				}
		}
		if(!key2){
				if(!key2){
						while(!key2);
						key_num=2;
						cd4051(R);
					//aa1=0;bb1=1;
						Lcd_ShowSring(4,0,code_R);
						Lcd_ShowSring(1,15,"R");
				}
		}
		if(!key3){
				if(!key3){
						while(!key3);
						key_num=3;
						cd4051(C);
					   //aa1=1;bb1=0;
						Lcd_ShowSring(4,0,code_C);
						Lcd_ShowSring(1,15,"C");
				}
		}
}


	//中断初始化
  void init()
  {	  
 //	TMOD=0x11;		//定时器0和定时器1都是方式1,16位定时器

	//定时器设置
    TMOD=0x51; 		//设置定时器0,方式1:16位定时器

	TH1=0x00;	 //定时器1高位装初值
	TL1=0x00;	 //定时器1低位装初值
	ET1=1;	//定时器1	  使能位
	
	TH0=(65535-50000)/255;	  //定时器1高位装初值
	TL0=(65535-50000)%255;;	  //定时器1高位装初值
	ET0=1;   定时器0	  使能位

	TR0=1;
	TR1=1;

	EA=1;//	总中断
 }

void Measurement_L();//电感测量
void Measurement_R();//电阻测量
void Measurement_C();//电容测量
unsigned char gather_num=0;
 unsigned char m_second=0;
void main ()
{

	LCDInit();		
	Lcd_ShowSring(1,0,WenDu1);
	Lcd_ShowSring(2,0,WenDu2);
//	Lcd_ShowSring(4,0,code_R);
	init();
//	cd4051(R);
//	key_num=2;
	while(1){
		
		
	    scan_key();
		if(flag){
			flag=0;

			//在十ms里面记了这么多个脉冲
			// 那么一个脉冲的周期就是  50ms/tt/1000  (s)   化简得到  f  20tt
			if(gather_num<4) {
					temp_f[gather_num]=pluse*65536+256*TH1+TL1;	  //1000000000000 12  100000000 8
					gather_num++;

			}
			else{
					gather_num=0;
					f=(temp_f[0]+temp_f[1]+temp_f[2]+temp_f[3])/4.0;	
				//	Lcd_Display(3,0,f);
					switch(key_num)	 {
		
							case 1:Measurement_L();	break;
							case 2:Measurement_R(); break;
							case 3:Measurement_C(); break;
							default :break;
					
					} 
			}
	


			TH0=(65535-50000)/255;	  //定时器1高位装初值
			TL0=(65535-50000)%255;;	  //定时器1高位装初值 						
			TH1=0;	                  //清零开始重新计数
			TL1=0;
			pluse=0;
			TR0=1;//开定时器计时10ms;//使能位外部中断0 数10内有多少个脉冲
			TR1=1;//进行新一轮的计数
			m_second=0;	
			
			     
//		    num++;
//			Lcd_Display(4,4,num);
		}
					 				
	}
}


 void time0()interrupt 1		//定时器0 服务
{	
//	TR1=0;//关掉定时器1

	
//	TH0=(65535-50000)/255;	  //定时器1高位装初值
//	TL0=(65535-50000)%255;;	  //定时器1高位装初值 */
	TH0=60;	  //定时器1高位装初值
	TL0=235;;	  //定时器1高位装初值
	m_second++;
	if(m_second==20){
			TR1=0;//关掉定时器1
			TR0=0; // 关掉定时器0
		m_second=0;	
		flag=1;
	}
			
}

 void time1()interrupt 3		//定时器1 服务
 {
   		pluse++;
		TH1=0;
		TL1=0;
 }

void Measurement_L()
{

			if(f==0){
				LZ=0;
				Lcd_ShowSring(4,0,code_L);
			}
			else {
				LZ=5.63466627*10e10/f/f;
				LZ=LZ/1.0727272727272727272727272727273;
				Lcd_ShowSring(4,0,"电感:");
			  Lcd_Display_u(4,4,LZ);
			} 
			
			if(LZ>99999999)	{
			// 	Lcd_ShowSring(4,0,code_e);
			}
																	  			
			
	
}
void Measurement_R()//电阻测量
{
			
			if(f==0){
							
					RX=0;	
						
			}

			else if(  0< f&& f<30) {								   //1M   7

				   	RX=	14400000.0/f;
					RX= RX-3000;
					RX  =RX/2/0.95;  //修正
					
			}
			else if(f <700) {								   //10k   650

				   	RX=	14400000.0/f;
					RX= RX-3000;
					RX  =RX/2/0.95;  //修正
					 //
			}
			else if(f <1500) {								   //4.7k  1209

				   	RX=	14400000.0/f;
					RX= RX-3000;
					RX  =RX/2/0.94;  //修正
					
			}
 			else if(f <3000) {								 //1k	2983

				   	RX=	14400000.0/f;
					RX= RX-3000;
				 	RX  =RX/2/0.91;  //修正
					//0.91286863270777479892761394101877
					
			}
			else if(f <4500) {

				   	RX=	14400000.0/f;
					RX= RX-3000;
				                                                //修正  200   4372
					RX  =RX/2/0.74;  //修正
					
			}
			else if(f <5000) {

				   	RX=	14400000.0/f;
					RX= RX-3000;
				                                                //修正  100  
					RX  =RX/2/0.50;  //修正
					
			}

			if(RX==0){
					Lcd_ShowSring(4,0,code_R);
			} else{
					Lcd_ShowSring(4,0,"电阻:");
					Value_to_ASCII1(4,3, RX);

			}

			if(RX>99999999)	{
			//	Lcd_ShowSring(4,0,code_e);	
			}
							
		
}
void Measurement_C()//C测量
{
			if(f==0){
							
					CX=0;
					Lcd_ShowSring(4,0,code_C);			
			}
			else if(f>5000){

				   CX=0;
				   Lcd_ShowSring(4,0,code_C);
			}
			else {
				CX=48100.00/f/1.0276595744680851063829787234043;//修正	
				Lcd_ShowSring(4,0,"电容:");
			    Value_to_ASCIIC(4,3,CX);					
			}
//			Lcd_ShowSring(4,0,"电容:");
//			Value_to_ASCIIC(4,3,CX);				
			if(CX>99999999)	{
//				Lcd_ShowSring(4,0,code_e);	
			}
			
}

版权声明:本文为CSDN博主「perseverance52」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42880082/article/details/122520783

生成海报
点赞 0

perseverance52

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

基于8051单片机实现电子时钟+数字秒表设计

概述 电子时钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显 示直观、无机械传动装置等优点,因而得到广泛应用。随着人们生活环境的不断改善和美化,在许

【电子系统综合实践】--2021电赛F题智能送药小车

主要内容     设计并制作智能送药小车,模拟完成在医院药房与病房间药品的送取作业。院区结构示意如图1所示。院区走廊两侧的墙体由黑实线表示。走廊地面上画有居中的红实线,并放置标识病房号的黑色数字可移动纸张。药房和近端