项目:数模转换ADC0809数字电压表
51单片机做的数模转换ADC0809芯片的数字电压表的proteus仿真原理图如下:
ADC0808芯片 介绍是含8 位A/D 转换器、8 路多路开关,以及与微型计算机兼容的控制逻辑的CMOS组件,其转换方法为逐次逼近型。ADC0808的精度为 1/2LSB。在AD 转换器内部有一个高阻抗斩波稳定比较器,一个带模拟开关树组的256 电阻分压器,以及一个逐次通近型寄存器。8 路的模拟开关的通断由地址锁存器和译码器控制,可以在8 个通道中任意访问一个单边的模拟信号。
内部结构
ADC0808是CMOS单片型逐次逼近式A/D转换器,它有8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器。
引脚功能(外部特性)
ADC0808芯片有28条引脚,采用双列直插式封装,如右图所示。各引脚功能如下:
1~5和26~28(IN0~IN7):8路模拟量输入端。
8、14、15和17~21:8位数字量输出端。
22(ALE):地址锁存允许信号,输入,高电平有效。
6(START): A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动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路模拟输入中的一路
极限参数
电源电压(Vcc):6.5V
控制端输入电压:-0.3V~15V
其它输入和输出端电压:-0.3V~Vcc+0.3V
贮存温度:-65℃~+150℃
功耗(T=+25℃):875mW
引线焊接温度:①气相焊接(60s):215℃;②红外焊接(15s):220℃
抗静电强度:400V
输出端
out8为最低位out1为最高位,out8-out1分别接单片机的P0.0到P0.7端。 单片机源程序如下:
单片机源程序如下:
- #include <reg52.h> //头文件
- #define uchar unsigned char //宏定义无符号字符型
- #define uint unsigned int //宏定义无符号整型
- code uchar seg7code[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //显示段码 数码管字跟
- uchar wei[4]={0XEf,0XDf,0XBf,0X7f}; //位的控制端 //位控制码
- sbit ST=P3^0; //A/D启动转换信号
- sbit OE=P3^1; //数据输出允许信号
- sbit EOC=P3^2; //A/D转换结束信号
- sbit CLK=P3^3; //时钟脉冲
- uint z,x,c,v,AD0809, date; //定义数据类型
- /******************************************************************
- 延时函数
- ******************************************************************/
- void delay(uchar t)
- {
- uchar i,j;
- for(i=0;i<t;i++)
- {
- for(j=13;j>0;j--);
- { ;
- }
- }
- }
- /**********************************************************************
- 数码管动态扫描
- *********************************************************************/
- void xianshi() //显示函数
- {
- uint z,x,c,v;
- z=date/1000; //求千位
- x=date%1000/100; //求百位
- c=date%100/10; //求十位
- v=date%10; //求个位
- P2=0XFF;
- P0=seg7code[z]&0x7f;
- P2=wei[0];
- delay(10);
- P2=0XFF;
- P0=seg7code[x];
- P2=wei[1];
- delay(10);
- P2=0XFF;
- P0=seg7code[c];
- P2=wei[2];
- delay(10);
- P2=0XFF;
- P0=seg7code[v];
- P2=wei[3];
- delay(10);
- P2=0XFF;
- }
- /*************************************************************************
- CLK振荡信号
- **************************************************************************/
- void timer0( ) interrupt 1 //定时器0工作方式1
- {
- TH0=(65536-2)/256; //重装计数初值
- TL0=(65536-2)%256; //重装计数初值
- CLK=!CLK; //取反
- }
- /*************************************************************************
- 主函数
- **************************************************************************/
- void main()
- {
- TMOD=0X01; //定时器中断0
- CLK=0; //脉冲信号初始值为0
- TH0=(65536-2)/256; //定时时间高八位初值
- TL0=(65536-2)%256; //定时时间低八位初值
- EA=1; //开CPU中断
- ET0=1; //开T/C0中断
- TR0=1;
- while(1) //无限循环
- {
- ST=0; //使采集信号为低
- ST=1; //开始数据转换
- ST=0; //停止数据转换
- while(!EOC); //等待数据转换完毕
- OE=1; //允许数据输出信号
- AD0809=P1; //读取数据
- OE=0; //关闭数据输出允许信号
- if(AD0809>=251) //电压显示不能超过5V
- AD0809=250;
- date=AD0809*20; //数码管显示的数据值,其中20为采集数据的毫安值
- xianshi(); //数码管显示函数
-
- }
- }
复制代码
|