目录

具体实现功能

设计介绍

51单片机简介

资料内容

原理图和PCB(AD19)

仿真实现(protues8.7)

程序(Keil5)

全部资料

资料获取


具体实现功能

由51单片机+AD0832模块+按键模块+LCD1602显示屏+报警模块等构成
具体功能:
(1)能够切换测量电压值、电流值以及电阻值,并用四位数码显示,短路时会报警;
(2)电压测量范围0-20V,电流测量范围0-200mA,电阻测量范围0-1000欧;
(3)测短路:将待测两点用导线相接,蜂鸣器发出声音则为短路。

仿真/实物演示视频:

51单片机数字万用表设计

设计介绍

51单片机简介

51单片是一种低功耗、高性能CMOS-8位微控制器,拥有灵巧的8位CPU和可编程Flash,使得51单片机为众多嵌入式控制应用系统提供灵活、高效的解决方案。

本设计所使用的芯片可兼容以下所有的51系列单片机(包括AT系列和STC系列)。

资料内容

原理图和PCB(AD19)

本系统原理图和PCB设计采用Altium Designer19,具体如图。

注1:请使用Altium Designer19直接打开资料中的工程文件(资料中已说明打开方式)!

注2:此设计需按照原理图制作实物,不可直接烧录到任何开发板中运行(需要修改程序)!

仿真实现(protues8.7)

本设计利用protues8.7软件实现仿真设计,具体如图。

注1:请使用protues8.7直接打开资料中的工程文件(资料中已说明打开方式)!

注2:由于仿真软件限制,仿真设计和实物设计无法百分百对应!!

程序(Keil5)

本设计利用KEIL5软件实现程序设计。

主函数如下:

////////////////
/***********************************************************************************************************
主函数
***********************************************************************************************************/
void main (void)
{
	u8 Mode;
	uchar Read_AD;	//用于读取ADC数据
	uchar VIN;			//电压值变量
	u16 RIN;				//电阻值变量
	u16 IIN;				//电流值变量
	u16 i=0;;
	while (1)      				//主循环
	{		
		if(Key_V==0)				//电压按键按下
		{
			Key_V=1;					//清除按下标记
			if((Key_R==0)||(Key_I==0))//电阻电流按键也有按下
			{
				Key_I=1;
				Key_R=1;
				Key_V=1;
				Mode=4;					//标记为错误模式
			}
			else							//电阻电流键都没有按下
			Mode=1;						//标记为电压模式
		}
		if(Key_R==0)				//同电压键
		{
			Key_R=1;
			if((Key_V==0)||(Key_I==0))
			{
				Key_I=1;
				Key_R=1;
				Key_V=1;
				Mode=4;
			}
			else
			Mode=2;
		}
		if(Key_I==0)				//同电压键
		{
			Key_I=1;
			if((Key_V==0)||(Key_R==0))
			{
				Key_I=1;
				Key_R=1;
				Key_V=1;
				Mode=4;
			}
			else
			Mode=3;
		}
		if((Key_V==1)&&(Key_R==1)&&(Key_I==1))//都没有按下
		{
			Mode=0;			//标记为空闲模式
		}
		if(i==0)
		{
		Read_AD=Adc0832(0);				//读取AD值
		}
		i++;
		if(i>300)
			i=0;
			switch(Mode)
		{
			case 0:
						//空闲模式
								dis_smg[0]=DisplayOther[2];//关闭数码管显示
								dis_smg[1]=DisplayOther[2];
								dis_smg[2]=DisplayOther[2];
								dis_smg[3]=DisplayOther[2];
			break;
			case 1:
						//电压模式
								VIN=Read_AD*200/255;										//换算出电压值
								dis_smg[0]=DisplayNum[0xa];							//显示电压标志
								dis_smg[1]=DisplayNum[VIN/100%10];			//电压十位
								dis_smg[2]=DisplayNum[VIN/10%10]&0x7f;	//电压个位
								dis_smg[3]=DisplayNum[VIN%10];					//电压十分位
			break;
			case 2:
						//电阻模式		
								RIN=Read_AD*100/(255-Read_AD);				//换算出电阻值
								dis_smg[0]=DisplayNum[0xb];       		//显示电阻标志
								dis_smg[1]=DisplayNum[RIN/100%10];    //电阻百位
								dis_smg[2]=DisplayNum[RIN/10%10];     //电阻十位
								dis_smg[3]=DisplayNum[RIN%10];        //电阻个位
								if(RIN>=1000)													//超过或等于1000;
								{
									dis_smg[1]=DisplayOther[2];					//显示"-"
									dis_smg[2]=DisplayOther[2];					//显示"-"
									dis_smg[3]=DisplayOther[2];					//显示"-"
								}
			break;
			case 3:
						//电流模式		
								IIN=4*Read_AD;//单位mA								//换算出电流值
								dis_smg[0]=DisplayNum[0xc];           //显示电流标志
								if(IIN<=200)													//没有超过范围
								{
									dis_smg[1]=DisplayNum[IIN/100%10];	//电流百位
									dis_smg[2]=DisplayNum[IIN/10%10]; 	//电流十位
									dis_smg[3]=DisplayNum[IIN%10];    	//电流个位
								}
								else
								{
									dis_smg[1]=DisplayOther[2];					//显示"-"
									dis_smg[2]=DisplayOther[2];					//显示"-"
									dis_smg[3]=DisplayOther[2];					//显示"-"
								}
			break;
			case 4:
						//错误模式		
							dis_smg[0]=DisplayNum[0xe];					//显示"E"
							dis_smg[1]=DisplayNum[0xe];         //显示"E"
							dis_smg[2]=DisplayNum[0xe];         //显示"E"
							dis_smg[3]=DisplayNum[0xe];         //显示"E"
			break;
			default	:	
			break;
		}
		DisplayScan();		//数码管动态扫描
	}
}

程序运行结果如图:

注:请使用KEIL C51直接打开资料中的工程文件(资料中已说明打开方式)!

全部资料

全部资料包括原理图和PCB源文件(AD19)、程序(Keil5)、protues仿真(protues8.7)、设计报告(仅供参考)、仿真视频、开发资料、仿真视频、单片机最小系统介绍等,全网最全!资料内容如下图所示!!

资料获取

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

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐