基于51单片机的简易电容值测量仪proteus仿真设计

这篇具有很好参考价值的文章主要介绍了基于51单片机的简易电容值测量仪proteus仿真设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

51单片机简易电感测量仪仿真设计( proteus仿真+程序+讲解视频)

仿真图proteus7.8及以上

程序编译器:keil 4/keil 5

编程语言:C语言

设计编号:S0039

51单片机最小系统的相关知识

单片机最小系统,或者称为 最小应用系统,是指用最少的元件组成的单片机可以工作的系统。对51系列单片机来说,最小系统一般应该包括:单片机、晶振电路、复位电路。下面给出一个51单片机的最小系统电路图。

单片机测电容,51单片机,单片机,51单片机,proteus

复位电路:

一、复位电路的用途:单片机复位电路就好比电脑的重启部分,当电脑在使用中出现死机,按下重启按钮电脑内部的程序从头开始执行。单片机也一样,当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。单片机复位电路如下图:

二、复位电路的工作原理在书本上有介绍,51单片机要复位只需要在第9引脚接个高电平持续2US就可以实现,那这个过程是如何实现的呢?在单片机系统中,系统上电启动的时候复位一次,当按键按下的时候系统再次复位,如果释放后再按下,系统还会复位。所以可以通过按键的断开和闭合在运行的系统中控制其复位。

开机的时候为什么会复位:在电路图中,电容的的大小是10uF,电阻的大小是10k。所以根据公式,可以算出电容充电到电源电压的0.7倍(单片机的电源是5V,所以充电到0.7倍即为3.5V),需要的时间是10K*10UF=0.1S。也就是说在单片机启动的0.1S内,电容两端的电压时在03.5V增加。这个时候10K电阻两端的电压为从51.5V减少(串联电路各处电压之和为总电压)。所以在0.1S内,RST引脚所接收到的电压是5V~1.5V。在5V正常工作的51单片机中小于1.5V的电压信号为低电平信号,而大于1.5V的电压信号为高电平信号。所以在开机0.1S内,单片机系统自动复位(RST引脚接收到的高电平信号时间为0.1S左右)。

按键按下的时候为什么会复位:在单片机启动0.1S后,电容C两端的电压持续充电为5V,这是时候10K电阻两端的电压接近于0V,RST处于低电平所以系统正常工作。当按键按下的时候,开关导通,这个时候电容两端形成了一个回路,电容被短路,所以在按键按下的这个过程中,电容开始释放之前充的电量。随着时间的推移,电容的电压在0.1S内,从5V释放到变为了1.5V,甚至更小。根据串联电路电压为各处之和,这个时候10K电阻两端的电压为3.5V,甚至更大,所以RST引脚又接收到高电平。单片机系统自动复位。

晶振电路:

晶振电路:晶振是晶体振荡器的简称 在电气上它可以等效成一个电容和一个电阻并联再串联一个电容的二端网络 电工学上这个网络有两个谐振点 以频率的高低分其中较低的频率是串联谐振 较高的频率是并联谐振 由于晶体自身的特性致使这两个频率的距离相当的接近 在这个极窄的频率范围内 晶振等效为一个电感 所以只要晶振的两端并联上合适的电容它就会组成并联谐振电路 这个并联谐振电路加到一个负反馈电路中就可以构成正弦波振荡电路 由于晶振等效为电感的频率范围很窄 所以即使其他元件的参数变化很大 这个振荡器的频率也不会有很大的变化

晶振有一个重要的参数 那就是负载电容值 选择与负载电容值相等的并联电容 就可以得到晶振标称的谐振频率

一般的晶振振荡电路都是在一个反相放大器(注意是放大器不是反相器)的两端接入晶振 再有两个电容分别接到晶振的两端 每个电容的另一端再接到地 这两个电容串联的容量值就应该等于负载电容 请注意一般IC的引脚都有等效输入电容 这个不能忽略

一般的晶振的负载电容为15pF或12.5pF 如果再考虑元件引脚的等效输入电容 则两个22pF的电容构成晶振的振荡电路就是比较好的选择

如上图:晶振是给单片机提供工作信号脉冲的 这个脉冲就是单片机的工作速度 比如 12M晶振 单片机工作速度就是每秒12M 当然 单片机的工作频率是有范围的 不能太大 一般24M就不上去了 不然不稳定

晶振与单片机的脚XTAL0和脚XTAL1构成的振荡电路中会产生偕波(也就是不希望存在的其他频率的波) 这个波对电路的影响不大 但会降低电路的时钟振荡器的稳定性 为了电路的稳定性起见 ATMEL公司只是建议在晶振的两引脚处接入两个10pf-50pf的瓷片电容接地来削减偕波对电路的稳定性的影响 所以晶振所配的电容在10pf-50pf之间都可以的 没有什么计算公式

P0口的上拉电阻:

P0口作为I/O口输出的时候时 输出低电平为0 输出高电平为高组态(并非5V,相当于

悬空状态)。也就是说P0 口不能真正的输出高电平,给所接的负载提供电流,因此必须接上拉电阻(一电阻连接到VCC),由电源通过这个上拉电阻给负载提供电流。 由于P0口内部没有上拉电阻,是开漏的,不管它的驱动能力多大,相当于它是没有电源的,需要外部的电路提供,绝大多数情况下P0口是必需加上拉电阻的。

1.一般51单片机的P0口在作为地址/数据复用时不接上拉电阻。

2.作为一般的I/O口时用时,由于内部没有上拉电阻,故要接上上拉电阻!!

3.当p0口用来驱动PNP管子的时候,就不需要上拉电阻,因为此时的低电平有效; 4.当P0口用来驱动NPN管子的时候,就需要上拉电阻的,因为此时只有当P0为1时候,才能够使后级端导通。

31脚EA/Vpp接电源:

STC89C51/52或其他51系列兼容单片机特别注意:对于31脚(EA/Vpp),当接高电平时,单片机在复位后从内部ROM的0000H开始执行,当接低电平时,复位后直接从外部ROM的0000H开始执行,这一点是初学者容易忽略的。

视频

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

1.主要功能:

利用51单片机设计一个简易电容测量仪
1.利用51单片机和555芯片构成的多谐振荡电路设计一电容测量电路
2.通过按键切换测量量程,量程由LED指示灯显示,测量数值通过LCD1602显示。
3.量程10pf-500uf

2.仿真

开始仿真

测量300nF 实测数值269nF

测量30uF 实测数值26.85uF

单片机测电容,51单片机,单片机,51单片机,proteus

单片机测电容,51单片机,单片机,51单片机,proteus

3. 程序

单片机测电容,51单片机,单片机,51单片机,proteus

#include <reg52.h>
#include "1602.h"
#include "delay.h"

sbit vo = P3^2;	     // 用于检测P3.2口的值,计算时间。  计时器0的开与断
sbit tr = P3^7;								 // 产生一个低电平脉冲
 										 // 超量程提示灯
sbit ledclc = P2^0;

sbit con1 = P1^5;                            // 用于控制继电器,实现档位选择
sbit con2 = P1^6;								
sbit con3 = P1^7;								

sbit key1 = P1^0;							  // 独立按键部分,用于用户选择量程
sbit key2 = P1^1;
sbit key3 = P1^2;
sbit key4 = P1^3;

sbit led1 = P2^1;							  // 量程提示灯
sbit led2 = P2^2;
sbit led3 = P2^3;
sbit led4 = P2^4;


unsigned int tw;                                // 用于获取定时器的数值

float ftemp;									 // 用于计算电容值的中间变量

unsigned long int c;								// 存放电容值

unsigned char need;							 // 需要测量时置1,一次测量结束置0
unsigned char R;                            // 表示不同的档位
unsigned char flag;	                          // 数据处理结束置1
unsigned char temp[8];                        // 存放电容值的各个位	 
unsigned char zimu1[] = " range is higher";		   //量程太高
unsigned char zimu2[] = "The value of Cap";
unsigned char zimu3[] = "please press key";
unsigned char zimu4[] = "     to measure ";
unsigned char zimu5[] = " range is lower ";	
void process(unsigned long int c);	                 // 数据处理函数
void keyscan();								 // 键盘扫描函数
void ledlight(unsigned char R);					 //	量程指示灯函数
void init_timer0()	                             // 定时器0  初始化    
{
	TMOD = 0x09;		   // gate置1,方式1,16位计时,定时器由P3.2控制开断
	TH0 = 0x00;
	TL0 = 0x00;
	EA   = 1;
	ET0 = 1;	                                    
	TR0 = 1;
}
void init_INT1 ()								    // 定时器0  初始化
{
	EA = 1;
	IT1 = 1;                                      // 下降沿触发
	EX1 = 1;
}		  
void main()
{
 	ledclc = 1;								    // 超量程提示灯熄灭
 	need = 0;		                                // 一开始无需测量
    con1 = con2 = con3 = 1;
	flag = 0;
  	init_timer0();								    // 初始化
	init_INT1();
	LCD_init();
 	dispchar1(zimu3);
	dispchar2(zimu4);
	while(1)
	{
	  	if(need == 1)
		{											// 当需要测量时
			if(vo == 0 ) //vo == 0时检测计数器的值可能还没开始计数,可能计数结束
			{
				 if(TH0 != 0x00 || TL0 != 0x00) // 是计数结束 若有读数,用tw 存下 
				 {
				 	 tw = TH0 << 8;
					 tw = tw | TL0;	
					 TH0 = 0x00;		               // 一次结束,计时器清零
					 TL0 = 0x00;
                     need = 0;    // 需要再次测量时,need置1.避免tw的值被更//改   即不需要测量时,一直保持
					 EX1 = 1;		 				// 开外部中断1
				 }
				 else 	 // 反之,证明没有计数,无电容,默认值tw置0
				 {
				 	tw = 0;
				 }
			}

			ftemp = tw / 1.1  ; // 计算电容值   根据公式 tw = 1.1 * R * C

			c = (unsigned long int)(ftemp )*100;    //扩大了一百倍   便于后续程序
//取两位小数点
			process(c);		 // 调用数据处理函数,根据不同的R值进行处理																			
		}							 
		if(flag == 1 ) // 数据处理结束   每次处理结束,证明需要更新显示的数据
		{
			if(tw>=50000 || ledclc == 0)			// 量程超出
			{
				dispchar3(zimu1);               // 量程太高
				ledclc = 0;
			}						
			else if(tw<=100 && ledclc == 1)		   //量程太低
			{
				dispchar3(zimu5);
				ledclc = 0;
			}
			else   
      		{
				dispchar1(zimu2);
				disp(temp);
			}		  					
			flag = 0;
		}		
	}    
}
 
void timer0()  interrupt 1	              // 定时器0中断  用于超量程提示
{
 	ledclc = 0;
}

void exint1	() interrupt 2	  // 外部中断0  用于产生低脉冲,启动555定时器
{
	unsigned char a;
	tr = 1;				                            // tr端一个负脉冲
	a = 1;
	while(--a);
	tr = 0;
	a = 20;
	while(--a);
	tr = 1;		               // tr端负脉冲结束	   大约40us的负脉冲
	need = 1;										// 表示需要测量
	ledclc = 1;									    // 关闭先前的超量程提示
	EX1 = 0;		 // 暂时关闭外部中断,一次测量结束,再开放外部中断
}

void process(unsigned long int c)
{
		if(R == 1)	  // 10M	 的电阻		   量程10pf ~ 5000pf
		{
			c = c /10;		  
 			lcd_pos(0x4a);
		   	LCD_write_Data(' ');
			LCD_write_Data('p');
			LCD_write_Data('f');
			LCD_write_Data(' ');
			LCD_write_Data(' ');
		}
		if(R == 2)		  // 100k 的电阻	       量程5nf~ 500nf
		{
			c = c /100;		  
 			lcd_pos(0x4a);
		   	LCD_write_Data(' ');
			LCD_write_Data('n');
			LCD_write_Data('f');
			LCD_write_Data(' ');
			LCD_write_Data(' ');			
		}
		if(R == 3)		      //1k欧姆 的电阻		   量程0.5uf ~ 50uf
		{
			c = c /1000;		 // 扩大了一百倍 单位  c = tw/500   uf
 			lcd_pos(0x4a);
		   	LCD_write_Data(' ');
			LCD_write_Data('u');
			LCD_write_Data('f');
			LCD_write_Data(' ');
			LCD_write_Data(' ');     		
		}
		if(R == 4)		 //100欧姆 的电阻		   量程50uf ~ 500uf
		{
			c = c /100;		  // 扩大了一百倍 单位  c = tw/500   uf
 			lcd_pos(0x4a);
		   	LCD_write_Data(' ');
			LCD_write_Data('u');
			LCD_write_Data('f');
			LCD_write_Data(' ');
			LCD_write_Data(' ');				        		
		}
		temp[0] = c / 100000;		                // 千位
		temp[1] = c / 10000 % 10;	                // 百位					
		temp[2] = c / 1000 % 10;   	                // 十位
		temp[3] = c / 100 %10;	                    // 个位	
		temp[4] = c / 10 % 10;	    
		temp[5] = c  % 10;
		flag = 1;
}
void keyscan()
{
	if(key1 == 0)
	{
		delay_ms(10);
		if(key1 == 0)		                        //  b3按下
		{
			while(key1==0);
			R = 1;        // 10M 的电阻	       量程10pf~ 5000pf(5nf)
			con1 = 0;
			con2 = 0;
			con3 = 0;
			ledclc = 1;
			dispchar1(zimu3);
			dispchar2(zimu4);
		}
	}
	if(key2 == 0)									   //  b4按下
	{
		delay_ms(10);
		if(key2 == 0)
		{
			while(key2==0);
			R = 2;             // 100k 的电阻	       量程5nf~ 500nf
			con1 = 1;
			con2 = 1;
			con3 = 0;
			ledclc = 1;
			dispchar1(zimu3);
			dispchar2(zimu4);
		}
	}

	if(key3 == 0)									     //  b5按下
	{
		delay_ms(10);
		if(key3 == 0)
		{
			while(key3==0);
			R = 3; 
			con1 = 0;       // 1k欧姆 的电阻		   量程0.5uf ~ 50uf
			con2 = 1;
			con3 = 1;
			ledclc = 1;
			dispchar1(zimu3);
			dispchar2(zimu4);
		}
	}
	if(key4 == 0)									     //  b6按下
	{
		delay_ms(10);
		if(key4 == 0)
		{
			while(key4==0);
			R = 4;
			con1 = 0;       // 100欧姆 的电阻	   量程50uf ~ 500uf
			con2 = 0;
			con3 = 1;
			ledclc = 1;
			dispchar1(zimu3);
			dispchar2(zimu4);
		}
	}
	ledlight(R);
}	
void ledlight(unsigned char R)
{
	if(1 == R)
	{
		led1 = 1;
		led2 = 1;
		led3 = 1;
		led4 = 0;
	}
	if(2 == R)
	{
		led1 = 1;
		led2 = 1;
		led3 = 0;
		led4 = 1;
	}
	if(3 == R)
	{
		led1 = 1;
		led2 = 0;
		led3 = 1;
		led4 = 1;
	}
	if(4 == R)
	{
		led1 = 0;
		led2 = 1;
		led3 = 1;
		led4 = 1;
	}
 }

4.百度云分享链接

下载方式见文章开头视频

单片机测电容,51单片机,单片机,51单片机,proteus文章来源地址https://www.toymoban.com/news/detail-658117.html

到了这里,关于基于51单片机的简易电容值测量仪proteus仿真设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机汽车胎压大气气压测量仪仿真设计_数码管显示(代码+仿真+设计报告+讲解)

    (代码+仿真+设计报告+讲解) 仿真原版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0018 本课程设计用MPX4115传感器来检测压力参数,ADC0832进行模数转换后,利用单片机AT89C52进行数据处理后,用四个八段数码管显示压力值。压力测量的量程在15.3KPA~114.9KPA,

    2024年02月08日
    浏览(43)
  • 基于单片机的一种风速测量仪的设计与制作

    收藏和点赞,您的关注是我创作的动力     风速、风向的测量在气象预报、环境监测、风力发电、航空航天等领域中有着重要意义。随着传感器技术、微处理器技术和网络通信技术的发展,相比传统的人工观测,数字化、智能化的气象仪器在观测精度、速度和稳定性等方

    2024年01月17日
    浏览(47)
  • 51单片机项目(7)——基于51单片机的温湿度测量仿真

    本次做的设计,是利用DHT11传感器,测量环境的温度以及湿度,同时具备温度报警的功能:利用两个按键,设置温度阈值的加和减,当所测温度大于温度阈值的时候,蜂鸣器就会响起,进行报警提示。 同时系统还有一个LCD1602屏幕,用于显示实时的温度湿度,还可以显示温度阈

    2024年02月10日
    浏览(51)
  • 基于51单片机的555定时器测电容proteus仿真

    一、555定时器构成多谐振荡器 由555定时器构成的多谐振荡器如下图所示,   工作原理:电路没有稳态,只有两个暂稳态,也不需要外加触发信号,利用电源VCC通过R1和R2向电容器C充电,使Uc逐渐升高,升到2VCC/3时,Uo跳变到低电平,放电端D导通,这时,电容器C通过电阻R2和

    2024年02月06日
    浏览(52)
  • 基于51单片机的简易电梯系统的设计

      系统概述 设计要求 根据所学的知识以及技能,利用MCS-51系列单片机为中心设计一个简易电梯系统,实现四层电梯的无故障运行,并用数码管和指示灯显示对应楼层和运行方向等基本信息。设计所用的单片机为STC89C52为主要的控制器,自带AD转换,当一边有按键按下时,另一

    2024年02月09日
    浏览(52)
  • 基于51单片机的简易红绿灯电路

            单片机P1口控制数码管段选,P2口控制数码管位选,P0口控制两边的灯光。         首先是数码管控制函数,声明一个变量shift作为数码管位移量,首先进行位选,这里数码管使用的是共阴极数码管,所以位选脚为低时点亮,因为位移时除了置1的位保持1,其他的

    2024年02月11日
    浏览(39)
  • 基于51单片机的简易交通灯仿真代码讲解

    J028 51单片机简易交通灯易懂版_仿真+代码+报告讲解 仿真图proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 51单片机简易交通灯易懂版仿真代码讲解 状态1:南北方向绿灯通行12秒,东西红灯禁止通行15秒,分别倒计时; 状态2:南北方向黄灯提醒3秒,东西继续红灯倒计时;

    2024年02月02日
    浏览(61)
  • 29、基于51单片机简易电子琴(有存储功能)系统设计

     随着社会的发展进步,音乐逐渐成为我们生活中很重要的一部分,有人曾说喜欢音乐的人不会向恶。我们都会抽空欣赏世界名曲,作为对精神的洗礼。本论文设计一个基于单片机的简易电子琴。我们对于电子琴如何实现其功能,如音色选择、声音强弱控制、节拍器等等也很

    2024年02月03日
    浏览(50)
  • 基于51单片机LCD1602的简易矩阵键盘密码锁

    初次开始写博客,表达方面也许会有很多不足,希望自己能通过这种方式巩固自己的学习和锻炼表达能力,同时也是对于自己学习的记录。 四位密码锁,密码可更改,输入仅四次以内有效 矩阵键盘定义为1-16,顺序为从左上到右下,1-10号为密码输入键位,对键码取余,输入

    2024年01月23日
    浏览(61)
  • 基于AT89C51单片机的简易计算机设计

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87715642?spm=1001.2014.3001.5503 源码获取 主要内容: 本设计是以单片机AT89C51为核心的简易计算器设计,要通过芯片AT89C51实现计算器程序运行来完成加、减、乘和除的简单计算功能。 基本要求: 1、采

    2024年02月08日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包