基于proteus软件仿真AT89C52的电压表(附工程文件)

通过ADC0808芯片进行高精度的电压转换,再通过LCD显示。
电压范围0-5V,精度0.05V
ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。

ADC0808是ADC0809的简化版本,功能基本相同。一般在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809进行A/D转换。

ADC0808芯片有28条引脚,采用双列直插式封装,各引脚功能如下:
1~5和26~28(IN0~IN7):8路模拟量输入端。
8、14、15和17~21:8位数字量输出端。
22(ALE):地址锁存允许信号,输入,高电平有效。
6(START): A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0808复位,下降沿启动A/D转换)。
7(EOC): A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
9(OE):数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
10(CLK):时钟脉冲输入端。要求时钟频率不高于640KHZ。
12(VREF(+))和16(VREF(-)):参考电压输入端
11(Vcc):主电源输入端。
13(GND):地。
23~25(ADDA、ADDB、ADDC):3位地址输入线,用于选通8路模拟输入中的一路

电路原理图如下:
基于proteus软件仿真AT89C52的电压表(附工程文件)_第1张图片
运行时的截图如下:
基于proteus软件仿真AT89C52的电压表(附工程文件)_第2张图片
源代码如下:

#include "includes.h"

#define TIME0H 0x3C
#define TIME0L 0xB0

unsigned char uc_Clock=0;		//定时器0中断计数

bit b_DATransform=0;

void vShowVoltage(unsigned int uiNumber)
{
	unsigned char ucaNumber[3],ucCount;

	if(uiNumber>999)					
		uiNumber=999;

	ucaNumber[0]=uiNumber/100;								//把计算数字的每个位存入数组。
	ucaNumber[1]=(uiNumber-100*(int)ucaNumber[0])/10;							
	ucaNumber[2]=uiNumber-100*(int)ucaNumber[0]-10*ucaNumber[1];

	for(ucCount=0;ucCount<3;ucCount++)
		{
		vShowOneChar(ucaNumber[ucCount]+48);				//从首位到末位逐一输出。
		if(ucCount==0)
			vShowOneChar('.');
		}

}

//*************************************************************************************************
//*																								  *
//*			  ********************************主函数******************************				  *
//*																								  *
//*************************************************************************************************
void main()
{

	TMOD=0x01;			//定时器0,模式1。
	TH0=TIME0H;
	TL0=TIME0L;
	TR0=1;				//启动定时器。
	ET0=1;				//开定时器中断。

	EA=1;				//开总中断



	vdInitialize();

	vWriteCMD(0x84);	   //写入显示起始地址(第二行第一个位置)

	vShowChar("Voltage:");
	vWriteCMD(0xC9);
	vShowChar("(V)");


	while(1)
		{
		if(b_DATransform==1)
			{
			b_DATransform=0;
			vWriteCMD(0xC4);
			vShowVoltage(uiADTransform());
			}
		}
}


void Time0() interrupt 1
{
	if(uc_Clock==0)
		{
		uc_Clock=5;
		b_DATransform=1;
		}
	else
		uc_Clock--;

	TH0=TIME0H;		   //恢复定时器0。
	TL0=TIME0L;
}



下载链接:资源链接

你可能感兴趣的:(proteus,嵌入式,单片机)