技术热线: 4007-888-234

如何使用8051单片机制作一个数字电压表?

更新时间: 2019-11-05
阅读量:3991

在现实生活中,我们经常使用到电器产品,电磁炉、微波炉、热水壶、冰箱等等。为了安全性,使用8051单片机的电压表测量的电压为0V至25V。所以,输入电压为直流电压,在LCD上也能获得准确、稳定的输出。如果你施加交流电压作为输入,则随着交流电压的不断变化,LCD上将显示的数字并不是稳定的,这也是市电的常见状态。

该方案的主要组件是8051单片机,电压传感器模块和IC ADC0804。在这个方案中,我们使用模拟到数字的转换过程中显示的电压。

一、数字电压表模数转换原理图


Interfacing.png

此处,ADCIC根据输入电压生成输出数字值。8051单片机读取该数字值并将其显示在LCD上。

1.传感器:传感器或传感器用于将物理量转换为电能。光相关电阻器,温度传感器,湿度传感器,气体传感器等是换能器的例子。

2.ADC(模数转换器):ADC将输入电压转换为数字值。

3.数字系统:该系统读取输入的数字数据并在LCD上显示物理量以供理解。

二、使用8051单片机的数字电压表电路图


Digital-Voltmeter1.png

三、使用8051单片机数字电压表所需电路元件

(1)AT89C51单片机;
(2)ADC0804集成电路;
(3)25V电压传感器(如下图);
(4)AT89C51编程板;
(5)可变电阻;
(6)直流适配器或电池。

QQ截图20191105112053.png


四、使用8051单片机的数字电压表电路设计

在上述电路中,模数转换器IC数据位连接到PORT2。LCD数据引脚连接到控制器的POTR3,控制引脚RS和EN分别连接到P1.6和P1.7。

什么是ADC0804?

ADC0804是一个8位模数转换器。该IC使用逐次逼近法将模拟值转换为数字。它只能接受一个模拟数据作为输入。该IC的步长大小通过改变引脚9上的参考电压来改变。如果未连接此引脚,则VCC将作为参考电压。

对于每19.53mV的输入电压,当步长为5V时,输出将增加1值。该IC的转换时间取决于时钟源。

ADC功能:(1)0至5V模拟输入电压;(2)内置时钟发生器;(3)差分模拟输入;(4)可调参考电压。


五、8051单片机的数字电压表源代码


#define lcd P3    
#define dat P2    
sbit rs=P1^6;    
sbit e=P1^7;    
void delay (int);    
void display (unsigned char);    
void cmd (unsigned char);    
void init (void);    
void string (char *);    
void intro (void);    
char i=0;    
void delay (int d)    
{    
	unsigned char i=0;    
	for(;d>0;d--)    
	{    
		for(i=250;i>0;i--);    
for(i=248;i>0;i--);    
	}    
}    
void cmd (unsigned char c)    
{    
	lcd=c;    
	rs=0;    
	e=1;    
	delay(10);    
	e=0;    
}    
void display (unsigned char c)    
{    
	lcd=c;    
	rs=1;    
	e=1;    
	delay(10);    
	e=0;    
}    
void string (char *c)    
{    
	while(*c)    
	{    
		display(*c++);    
	}    
}    
void init (void)    
{    
	cmd(0x38);    
	cmd(0x01);    
cmd(0x0c);    
	cmd(0x80);    
}    
void intro (void)    
{    
	string("  Electronics  ");    
	cmd(0xc0);    
	string("      Hub      ");    
	delay(2000);    
	cmd(0x01);    
	string("    Digital    ");    
	cmd(0xc0);    
	string("   Voltmeter   ");    
	delay(2000);    
	cmd(0x01);    
	cmd(0x80);    
}    
void main()    
{    
	unsigned int temp=0;    
	unsigned int temp1=0;    
	float val=0.0;    
	init();    
	intro();    
	dat=0xff;    
	while(1)    
	{    
		if(i==0)    
		{    
			string(" Volts - ");    
			i++;    
		}    
		val=dat*0.02;  // 0.02 is resolution of adc    
		val=val/0.2;   // 0.2 is nothing but (R2/(R1+R2)) resistor values in the voltage sensor    
  	cmd(0x89);    
		if((val>=1.0) && (val<10.0))    
		{    
			display(' ');    
	 	temp=val*1000;    
 		temp1=((temp/1000)+48);    
 		display(temp1);    
			display('.');    
	 	temp1=(((temp/100)%10)+48);    
	 	display(temp1);    
		}    
		else if((val>=10.0) && (val<100.0))    
		{    
	 		temp=val*100;    
 		temp1=((temp/1000)+48);    
 		display(temp1);    
			temp1=(((temp/100)%10)+48);    
	 	display(temp1);    
			display('.');    
			temp1=(((temp/10)%10)+48);    
	 	display(temp1);    
		}    
		else    
		{    
			display(' ');    
			string("0.0");    
		}    
		delay(1000);    
}    
	while(1);    
}#include<reg51.h>

以上就是英锐恩单片机开发工程师分享的使用8051单片机制作的数字电压表。