1.ADC0809简介
IN0~IN7 : 8路模拟量输入端;
D0~D7:8位数字量输出端;
ADDA、ADDC、ADDC:3位地址输入线,用于选择8路模拟通道中的一路;
ALE:地址锁存允许信号,输入,高电平有效;
START:A/D转换启动信号,输入,高电平有效;
EOC:A/D转换结束信号,输出。当启动转换时,高引脚为低电平,当A/D结束转换时,高引脚输出高电平;
OE:数据输出允许信号,输入,高电平有效。当转换结束后,如果从该引脚输入高电平,则打开输出三态门,输出锁存器的数据从D0~D7送出;
CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ;
REF+、REF-:基准电压输入端;
VCC:电源,接+5V;
GND:地;
2.程序代码
#include<reg52.h>
#define Duan_Port P0//定义数码管端口
#define ADC0809_Data P1//定义端口接收ADC0809数据转换结果
/*引脚定义*/
sbit Bit1=P2^3;
sbit Bit2=P2^2;
sbit Bit3=P2^1;
sbit Bit4=P2^0;
sbit OE=P3^1;
sbit Start=P3^2;
sbit EOC=P3^3;
sbit Dp=P0^7;//小数点
sbit CLK=P3^0;
unsigned int dat=0;
unsigned char Buf[4];//存放数码管显示数字的数组
unsigned char code smg_Duan[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,
};//共阳极数码管编码
/**************函数声明***************/
void delay_xms(unsigned int t);//延时xms函数
unsigned char ADC0809_Read();//ADC0809读取数据,输出为0-255
void ConvertVoltage();//将0-255转换为0.00-5.00V
void smg_Display();//数码管显示
void main()//主函数
{
unsigned int n=0,sum;
while(1)
{
for(n=0;n<3;n++)
{
sum=sum+ADC0809_Read();
smg_Display();
}
dat=sum/3;
ConvertVoltage();
sum=0;
smg_Display();
}
}
void delay_xms(unsigned int t)
{
unsigned int i,j;
for(i=t;i>0;i--)
for(j=123;j>0;j--);
}
unsigned char ADC0809_Read()
{
unsigned char Temp=0X00;
OE=0;//输出设为高阻态
Start=0;
Start=1;//提供上升沿启动AD转换
Start=0;//提供下降沿
while(!EOC);//等待转换结束
OE=1;//连接数据线输出
Temp=ADC0809_Data;
OE=0;//断开数据线
return Temp;//返回结果
}
void ConvertVoltage()
{
unsigned int Vo;
Vo=dat*19.608; // 5/255=0.01960784313
Buf[0]=Vo/1000%10;
Buf[1]=Vo/100%10;
Buf[2]=Vo/10%10;
Buf[3]=Vo/1%10;
}
void smg_Display()
{
Bit1=0;
Duan_Port=smg_Duan[Buf[0]];//选通第一位数码管并赋段码
Dp=0;
delay_xms(1);
Bit1=1;
Duan_Port=0xff;//关闭消影
Bit2=0;
Duan_Port=smg_Duan[Buf[1]];
delay_xms(1);
Bit2=1;
Duan_Port=0xff;
Bit3=0;
Duan_Port=smg_Duan[Buf[2]];
delay_xms(1);
Bit3=1;
Duan_Port=0xff;
Bit4=0;
Duan_Port=smg_Duan[Buf[3]];
delay_xms(1);
Bit4=1;
Duan_Port=0xff;
}
3.仿真电路