基于51单片机的数字万用表设计

本文详细介绍了基于51单片机的数字万用表的设计,包括功能模块如电压、电流、电阻测量,短路报警,以及使用ADC0832进行数据采集。还提供了硬件选型、电路图和程序代码示例,以及设计报告和相关资料链接。
摘要由CSDN通过智能技术生成

基于51单片机的数字万用表设计

(仿真+程序+原理图+PCB+设计报告)

功能介绍

具体功能:

1.能够切换测量电压、电流、电阻;

2.数码管实时显示测量值;

3.短路报警;

4.测量范围:电压0-20v(误差0.05),电流0-200mA(误差0.5),电阻0-1000欧(误差2);

​演示视频:

基于51单片机的数字万用表设计 

/*
功能:数字万用表

#include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "intrins.h"											   

#define     u8  			unsigned char
#define     u16   		unsigned int
#define     uchar  			unsigned char
#define     uint   		unsigned int

//按键                 
sbit Key_V=P3^0;				 //电压模式键
sbit Key_R=P1^4;				 //电阻模式键
sbit Key_I=P3^5;				 //电流模式键

#define KEY_V 		1		//电压模式
#define KEY_R			2		//电阻模式
#define KEY_I			3		//电流模式

/***********************************************************************************************************
数码管显示相关函数
***********************************************************************************************************/

#define   SMG_NUM   4
u8 code DisplayNum[16]={
0xc0,		//0
0xf9,		//1
0xa4,		//2
0xb0,		//3
0x99,		//4
0x92,		//5
0x82,		//6
0xf8,		//7
0x80,		//8
0x90,		//9
0x88,		//A
0x83,		//b
0xc6,		//C
0xa1,		//d
0x86,		//E
0x8e		//F
};
//
u8 code DisplayOther[]={
0xff, 		//0		空
0x7f, 		//1		"."
0xbf,			//2		"-"
0xa7			//3		c
};
/*void delay_ms(uint q)
{
	uint i,j;
	for(i=0;i<q;i++)
		for(j=0;j<110;j++);
}
*/
//数码管位选定义
sbit smg_we1 = P2^0;	    //东西数码管2
sbit smg_we2 = P2^1;			//东西数码管1
sbit smg_we3 = P2^2;			//南北数码管2
sbit smg_we4 = P2^3;			//南北数码管1


void smg_we_switch(uchar i)
{
	switch(i)
	{
		case 0: smg_we1 = 0;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 1; break;
		case 1: smg_we1 = 1;  smg_we2 = 0; smg_we3 = 1;  smg_we4 = 1; break;
		case 2: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 0;  smg_we4 = 1; break;
		case 3: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 0; break;
	}	
}

/*
void delay_1ms(uint q)
{
	uint i,j;
	for(i=0;i<q;i++)
		for(j=0;j<110;j++);
}
*/
#define LED_a		0	//数码管段选的a段接在段选IO口的第0位
#define LED_b		2
#define LED_c		6
#define LED_d		4
#define LED_e		3
#define LED_f		1
#define LED_g		7
#define LED_dp	5

u8 ChangeFor(u8 dat)
{
	u8 temp=0;
	if(dat&0x01)		//判断数据的第一位是否为1
		temp|=0x01<<LED_a;//如果为1,放到控制数码管a段的位置
	if(dat&0x02)
		temp|=0x01<<LED_b;
	if(dat&0x04)
		temp|=0x01<<LED_c;
	if(dat&0x08)
		temp|=0x01<<LED_d;
	if(dat&0x10)
		temp|=0x01<<LED_e;
	if(dat&0x20)
		temp|=0x01<<LED_f;
	if(dat&0x40)
		temp|=0x01<<LED_g;
	if(dat&0x80)
		temp|=0x01<<LED_dp;
	return temp;
}
uchar dis_smg[SMG_NUM];						//显示缓存数组

void DisplayScan()
{
	static uchar i;
	P0 = 0xff;	          //消隐 
		smg_we_switch(i);  	  			//位选
	P0 =	ChangeFor(dis_smg[i]);		  //段选	  
	i++;
	if(i>=SMG_NUM)
		i=0;
}


/***********************************************************************************************************
ADC0832相关函数
***********************************************************************************************************/
sbit ADCS 	=P1^2; //ADC0832 片选
sbit ADCLK  =P1^0; //ADC0832 时钟
sbit ADDI 	=P1^1; //ADC0832 数据输入		/*因为单片机的管脚是双向的,且ADC0832的数据输入输出不同时进行,
sbit ADDO 	=P1^1; //ADC0832 数据输出		/*为节省单片机引脚,简化电路所以输入输出连接在同一个引脚上

unsigned int Adc0832(unsigned char channel)
{
	uchar i=0;
	uchar j;
	uint dat=0;
	uchar ndat=0;
	uchar  Vot=0;

	if(channel==0)channel=2;
	if(channel==1)channel=3;
	ADDI=1;
	_nop_();
	_nop_();
	ADCS=0;//拉低CS端
	_nop_();
	_nop_();
	ADCLK=1;//拉高CLK端
	_nop_();
	_nop_();
	ADCLK=0;//拉低CLK端,形成下降沿1
	_nop_();
	_nop_();
	ADCLK=1;//拉高CLK端
	ADDI=channel&0x1;
	_nop_();
	_nop_();
	ADCLK=0;//拉低CLK端,形成下降沿2
	_nop_();
	_nop_();
	ADCLK=1;//拉高CLK端
	ADDI=(channel>>1)&0x1;
	_nop_();
	_nop_();
	ADCLK=0;//拉低CLK端,形成下降沿3
	ADDI=1;//控制命令结束
	_nop_();
	_nop_();
	dat=0;
	for(i=0;i<8;i++)
	{
		dat|=ADDO;//收数据
		ADCLK=1;
		_nop_();
		_nop_();
		ADCLK=0;//形成一次时钟脉冲
		_nop_();
		_nop_();
		dat<<=1;
		if(i==7)dat|=ADDO;
	}
	for(i=0;i<8;i++)
	{
		j=0;
		j=j|ADDO;//收数据
		ADCLK=1;
		_nop_();
		_nop_();
		ADCLK=0;//形成一次时钟脉冲
		_nop_();
		_nop_();
		j=j<<7;
		ndat=ndat|j;
		if(i<7)ndat>>=1;
	}
	ADCS=1;//拉低CS端
	ADCLK=0;//拉低CLK端
	ADDO=1;//拉高数据端,回到初始状态
	dat<<=8;
	dat|=ndat;

	return(dat);            //return ad data
}



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

硬件设计

使用元器件:

单片机:STC89C52;

(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)

ADC0832;11.0592M晶振;

共阳数码管;30pF普通电容;

10uF电解电容;4.7k电阻;

18Ω电阻;2.2k电阻;

10k电阻;30k电阻;

18Ω电阻;100Ω电阻;

5Ω电阻;三极管S9012;

四孔排针;按键开关;

蜂鸣器;自锁开关;

导线:若干;

流程图:

设计资料

01 仿真图

注意:本仿真用的是lcd1602显示,有对应的仿真程序;设计使用proteus8.9版本设计,资料里有安装教程,无需担心!具体如图!

02 原理图

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

03 程序

本设计使用软件keil5版本编程设计,资料里有安装教程,无需担心!具体如图!

04 设计报告

一万字设计报告,具体如下!

05 设计资料

        资料获取请关注同名公众号,全部资料包括仿真源文件 、程序(含注释)、AD原理图、PCB电路图、参考论文、流程图、任务书、元件清单、仿真视频等。具体内容如下,全网最全!

资料获取请观看前面演示视频!

点赞分享一起学习成长。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值