51单片机简易数字万用表(电阻电流电压测量)仿真设计( proteus仿真+程序+报告+讲解视频)

news2024/11/19 5:30:28

目录

  • 51单片机简易数字万用表(电阻电流电压测量)仿真设计( proteus仿真+程序+报告+讲解视频)
  • 1.主要功能:
  • 2.仿真
  • 3. 程序代码
  • 4. 设计资料内容清单&下载地址

51单片机简易数字万用表(电阻电流电压测量)仿真设计( proteus仿真+程序+报告+讲解视频)

仿真图proteus7.8及以上

程序编译器:keil 4/keil 5

编程语言:C语言

设计编号:S0041

1.主要功能:

运用所学知识,制作一个51单片机简易数字万用表设计

具体功能:万用表能够切换测量电压值、电流值以及电阻值,并且以四位数码显示,短路时会报警

1、电压测量范围0-20V,测量误差0.5V左右

2、电流测量范围0-200mA,测量误差5mA左右

3、电阻测量范围0-1000欧,误差10欧左右

4、短路报警: 将待测两点用导线相接,蜂鸣器发出声音。

5、通过数码管显示测量数值,通过开关选择测量类型。

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

2.仿真

开始仿真

开始仿真后可以通过拨动开关选择测量类型,数码管第一位显示A表示测量电压,B表示测量电阻,C表示测量电流。后三位显示测量的值。如果同时选择了两种测量内容,蜂鸣器报警。

电压档测试:
在仿真时当将电压档开关打开,仿真结果如图3.1所示。改变滑动变阻器相当于改变红黑表笔接的不同回路进行电压测量(可以在重新测量之前按下复位键进行复位后在进行测量)。通过R2,R3进行分压,设测得的电压U,则实际电压U1=(U/R3)*R2;注:所测电压大于20V讲烧坏AD转换器。
img

电阻档测试:
在进行电阻档位仿真时首先进行复位键进行复位,待显示清零以后再进行测量仿真,在仿真过程中改变滑动变阻器的位置相当于改变了红黑表笔所接的不同阻值的电阻。如图4.5所示,设测的电压为U,则电路中电流I=(5-U)/100所测电阻R=U/I=U/((5-U)/100),注:电阻过大,则会造成测量不准确。
img

电流档测试:
在进行电流测量时首先进行电流档复位待显示清零后在进行电流档仿真,改变滑动变阻器相当于改变红黑表笔接的不同回路进行电流测量。如图4.4所示,在测量中若设测得的电压为U:则电路中的电流为I=(U/5)*1000(MA);注:电流过大则会烧坏电阻R4;
img

3. 程序代码

使用keil4或者keil5编译,代码有注释,可以结合报告理解代码含义。

img
主函数代码

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];
									Speak = 0;
			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];					//电压十分位
								
								if(VIN > 160)	  //电压档大于16V报警
									Speak = 1;
								else
									Speak = 0;
			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];					//显示"-"
								}
								
								if(RIN > 800)		 //电阻档大于800报警
									Speak = 1;
								else
									Speak = 0;
			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];					//显示"-"
								}
								
								if(IIN > 80)	 //电流档大于80报警
									Speak = 1;
								else
									Speak = 0;
			break;
			case 4:
							Speak = 1;
						//错误模式		
							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();		//数码管动态扫描
	}
}

概要:
定义了一些变量:

Mode 是一个8位无符号整数,用于存储当前的模式(0-4)。
Read_AD 是一个8位无符号整数,用于存储ADC(模拟到数字转换器)的读取值。
VIN 是一个16位无符号整数,用于存储电压值。
RIN 是一个16位无符号整数,用于存储电阻值。
IIN 是一个16位无符号整数,用于存储电流值。
i 是一个16位无符号整数,用于计数。
主循环(while(1))会一直运行,除非有中断或异常使其停止。

在循环内部,根据按键的状态设置 Mode。这里用到了三个条件判断语句:

如果 Key_V 等于0(表示电压按键被按下),检查其他两个按键是否也被按下。如果是,设置 Mode 为4(错误模式),否则设置 Mode 为1(电压模式)。
如果 Key_R 等于0(表示电阻按键被按下),同样的检查流程,如果其他两个按键没有被按下,设置 Mode 为4,否则设置 Mode 为2(电阻模式)。
如果 Key_I 等于0(表示电流按键被按下),同样的检查流程,如果其他两个按键没有被按下,设置 Mode 为4,否则设置 Mode 为3(电流模式)。
如果所有按键都没有被按下,设置 Mode 为0(空闲模式)。
在读取ADC值时使用了函数 Adc0832(0),这可能是一个硬件相关的函数,用于从ADC设备读取数据。

每300次读取操作后重置计数器,以便重新开始计数。

根据不同的 Mode 执行不同的操作:

在空闲模式下,关闭数码管的显示,并停止声音输出。
在电压模式下,根据从ADC读取的值计算电压,并将其显示在数码管上。如果电压大于160V,发出报警声音。
在电阻模式下,根据从ADC读取的值计算电阻,并将其显示在数码管上。如果电阻大于1000,在百位、十位和个位上都显示"-"。

4. 设计资料内容清单&下载地址

资料设计资料包括仿真,程序代码、讲解视频、功能要求、设计报告、软硬件设计框图。

0、常见使用问题及解决方法–必读!!!!
1、仿真
2、代码
3、讲解视频
4、功能要求
5、设计报告
6、软硬件框图
Altium Designer 软件资料
KEIL 软件资料
Proteus 软件资料
双击打开更多 51 STM32单片机设计.url

img

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/898513.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KeilMDK V5编译器的安装

1、安装原因 目前keil官网最新版本的Keil都是默认安装V6编译器&#xff0c;不再自动安装V5编译器&#xff0c;而V5与V6编译器在编译的时候有很多代码不兼容&#xff0c;导致工程编译失败&#xff0c;所以我们使用新版keil5的时候&#xff0c;要用V5编译器就要自己安装V5编译器。…

微信小程序自定义tabBar详细教程,且自适应尺寸和实现高斯模糊版

IOS示例&#xff1a; 安卓示例&#xff1a; 高斯模糊示例&#xff1a; WXML代码&#xff1a; <view class"tabbar"><view style"{{selectindex&&index0?color: #ef3166;:}}"class"tabbar-item {{ select index ? tabbar-select …

WMS系统条码管理

一、条码的基本概念和应用&#xff1a; WMS系统条码管理是指在仓库管理系统中使用条码技术对货物、物料和库存信息进行标识、跟踪和管理的过程。它基于条码识别和数据采集技术&#xff0c;通过在物料或货物上粘贴或打印条码标签&#xff0c;并使用条码扫描设备进行扫描和读取&…

深入理解内存 —— 函数栈帧的创建与销毁

前言 一位优秀的程序员&#xff0c;必须对内存的分布有深刻的理解&#xff0c;在初学编程的时候&#xff0c;往往有诸如以下很多问题困扰着初学者&#xff0c;而通过今天的分享&#xff0c;我们就可以通过自己的观察&#xff0c;将这些问题统统解决掉 局部变量是怎么创建的&…

架构师必备--高可用高性能分布式数据库Tidb安装部署实践

本文针对分布式、高可用的tidb数据库&#xff0c;从搭建实际生产环境的集群服务&#xff0c;介绍下tidb的安装流程、安装前的环境检测和系统优化、服务访问等方面介绍下具体的流程&#xff0c;希望对大家熟悉和了解tidb数据库有所帮助&#xff0c;减少不必要的弯路。 1.概述 …

图形推理|解题思路汇总

一、图形推理题常见题型 &#xff08;一&#xff09;图形的位置 图形的位置主要是指与图形位置相关的图形推理考点规律。 这类题目的图形特点通常有以下两类: (1)题干图形相似程度很高&#xff0c;只是某些部分的位置有差异-&#xff0c;考虑移动、旋转与翻转。…

自动编码器中的马尔可夫链蒙特卡罗期望最大化 (MCMC-EM):使用贝叶斯推理增强学习

一、介绍 自动编码器 自动编码器是强大的无监督学习算法&#xff0c;用于表示学习和降维。它们的工作原理是将输入数据编码为低维表示形式&#xff0c;然后将其解码回以重建原始数据。训练自动编码器通常涉及优化参数以最小化重建误差。然而&#xff0c;传统的优化技术&#xf…

如何通过MAT排查生产环境服务内存溢出

前言 前段时间&#xff0c;运维反馈生产环境翻译服务某个节点触发内存告警了。运维在重启节点之前&#xff0c;生成了dump快照&#xff0c;这里介绍下如何使用MAT内存分析工具来排查服务内存高占用问题。 MAT简介 MAT是Memory Analyzer的简称&#xff0c;它是一款功能强大的…

前端技术Vue学习笔记--005

Vue学习笔记 一、非父子通信-event bus 事件总线 作用&#xff1a;非父子组件之间&#xff0c;进行简易消息传递。&#xff08;复杂场景用----Vuex&#xff09; 使用步骤&#xff1a; 创建一个都能访问的事件总线 &#xff08;空Vue实例&#xff09;-----utils/EventBus.js /…

浅谈更糟糕的 CS_CLASSDC 标志位的作用

在上一篇文章中&#xff0c;我们了解了 CS_OWNDC 标志位的历史&#xff0c;也说明了设计它的初衷。 这个标志位一开始看起来是个挺好的设计&#xff0c;但是如果你多琢磨一会儿&#xff0c;就会发现它不是一个好主意。今天我们来看看更糟的。 CS_CLASSDC 标志位有点类似 CS_OW…

shell脚本文本三剑客sed

shell脚本文本三剑客sed 一.Sed编辑器1.1sed概述1.2sed工作流程1.3sed基本法1.4sed常用选项1.5sed命令的常用操作 二.sed命令使用2.1打印内容2.2删除内容示例5&#xff1a;先备份内容在删除2.3插入内容2.4取反2.5搜索替代2.6分组调用 一.Sed编辑器 1.1sed概述 sed编辑器是一种…

Linux 虚拟机Ubuntu22.04版本通过远程连接连接不上,输入ifconfig只能看到127.0.0.1的解决办法

之前给虚拟机配置静态IP之后&#xff0c;可以直接通过主机Vscode远程连接。但是前一段时间把主机的TCP/IPV4静态IP设置了一下之后&#xff0c;再连接虚拟机就连不上了&#xff0c;于是参考解决虚拟机不能上网ifconfig只显示127.0.0.1的问题&#xff0c;又可以连接上了&#xff…

Python “贪吃蛇”游戏,在不断改进中学习pygame编程

目录 前言 改进过程一 增加提示信息 原版帮助摘要 pygame.draw pygame.font class Rect class Surface 改进过程二 增加显示得分 改进过程三 增加背景景乐 增加提示音效 音乐切换 静音切换 mixer.music.play 注意事项 原版帮助摘要 pygame.mixer pygame.mix…

SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程

首先&#xff0c;如果在某个类或某个方法被标记为Transactional时&#xff0c;Spring boot底层会在创建这个bean时生成代理对象&#xff08;默认使用cglib) 示例&#xff1a; 当调用studentService的addStudent方法时&#xff0c;会直接跳到CglibAopProxy类去执行intercept方…

vscode里配置C#环境并运行.cs文件

vscode是一款跨平台、轻量级、开源的IDE, 支持C、C、Java、C#、R、Python、Go、Nodejs等多种语言的开发和调试。下面介绍在vscode里配置C#环境。这里以配置.Net SDK v5.0&#xff0c;语言版本为C#9.0&#xff0c;对应的开发平台为VS2019&#xff0c;作为案例说明。 1、下载vsc…

vue3小知识点汇总——基础积累

下面的小知识点比较零散&#xff0c;但是脑子不太好使&#xff0c;只能先记录一下啦&#xff0c;后面知识丰富起来后&#xff0c;慢慢就懂了。 1.最新版node.js已经不兼容vue2的项目了&#xff0c;学习vue3势在必行 node.js的安装及vue的搭建详细步骤&#xff1a;http://t.cs…

比特币暴跌的4个原因

作者&#xff1a;秦晋 加密市场每隔一段时间&#xff0c;就会迎来一次「暴跌」&#xff0c;而且每次暴跌原因各不相同。但归根到底都是「恐慌情绪」在作怪。继「312暴跌」、「519暴跌」之后&#xff0c;又迎来一个「8.18暴跌」。相比前两次暴跌&#xff0c;此次暴跌的原因或许略…

想做赴日程序员 有一定技术经验不学日语可以赴日IT吗?

有的小伙伴问&#xff1a;我有一定的IT技术和经验&#xff0c;不学日语的话&#xff0c;能去做赴日IT工作吗&#xff1f;说实话啊&#xff0c;我感觉如果行的话&#xff0c;那只能说明你运气不错&#xff0c;因为日本的IT行业在日本来说&#xff0c;并不是非常高薪的行业&#…

Redis中的有序集合

前言 本文着重介绍Redis中的有序集合的底层实现中的跳表 有序集合 Sorted Set Redis中的Sorted Set 是一个有序的无重复值的集合&#xff0c;他底层是使用压缩列表和跳表实现的&#xff0c;和Java中的HashMap底层数据结构&#xff08;1.8&#xff09;链表红黑树异曲同工之妙…

【深入了解PyTorch】PyTorch实战项目示例:深入探索图像分类、目标检测和情感分析

【深入了解PyTorch】PyTorch实战项目示例:深入探索图像分类、目标检测和情感分析 PyTorch实战项目示例:深入探索图像分类、目标检测和情感分析项目一:图像分类数据集准备构建模型训练模型模型评估和预测项目二:目标检测数据集准备构建模型训练模型模型评估和预测项目三:情…