ADC0809模块转换设计
- 格式:doc
- 大小:136.50 KB
- 文档页数:8
ADC0809模块转换设计1、主要特性1)8路8位A/D转换器,即分辨率8位。
2)具有转换起停控制端。
3)转换时间为100μs。
4)单个+5V电源供电。
5)模拟输入电压范围0~+5V,不需零点和满刻度校准。
6)工作温度范围为-40~+85摄氏度7)低功耗,约15mW。
2、内部结构ADC0809是CMOS单片型逐次逼近式A/D转换器,内部结构如上图1所示,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型D/A转换器、逐次逼近3、外部特性(引脚功能)ADC0809芯片有28条引脚,采用双列直插式封装,如图13.23所示。
下面说明各引脚功能。
IN0~IN7:8路模拟量输入端。
2-1~2-8:8位数字量输出端。
ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路ALE:地址锁存允许信号,输入,高电平有效。
START:A/D转换启动信号,输入,高电平有效。
EOC:A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
OE:数据输出允许信号,输入,高电平有效。
当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
CLK:时钟脉冲输入端。
要求时钟频率不高于640KHZ。
REF(+)、REF(-):基准电压。
Vcc:电源,单一+5V。
GND:地。
ADC0809的工作过程是:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。
此地址经译码选通8路模拟输入之一到比较器。
START上升沿将逐次逼近寄存器复位。
下降沿启动A/D转换,之后EOC输出信号变低,指示转换正在进行。
直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。
当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。
4、ADC0809工作的时序图tws: 0.1us twe: 0.1us teoc: 8*T+2us tc:100us f:500khz 5、ADC0809外接电路由于没有选用外部分频器所以应用89S52的定时器2让它产生一个500KHZ的时钟信号。
5、应用ADC0809做一个多探点的0~5V的数字电压表,电路图如下设计要求: 五位数码管动态显示,第一位显示通道状态(0、7)第二位显示C,第三位是个数,第三位和第四位数码管分别显示十分位和百分位;按键SW1选择通道数加1,按键SW2选择通道数减1,并且蜂鸣器短时间鸣叫;用按键选择显示的通道,数码管显示该通道的数值,调节滑动变阻器数码管的示数能在0.00~5.00之间变化。
程序如下:/*********************************************中国民航大学电子信息工程学院Yaye***********************************************/#include<at89x52.h>#include<intrins.h>#define uchar unsigned charsbit ST=P1^7;sbit EOC=P1^6;sbit OE=P1^5;sbit key=P1^4;sbit addC=P1^3;sbit addB=P1^2;sbit addA=P1^1;bit adc_flg; //AD转换控制位bit keydownflg; //按键控制位uchar dat;uchar channel; //通道变量uchar disp_cnt; //显示位变量uchar Beep_cnt; //蜂鸣器时间变量uchar count4ms;uchar P2_buffer; //数码管位uchar keybuffer; //按键uchar disp_buff[5]; //显示缓存uchar code Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x 8E}; //共阳数码表uchar code Tab1[]={0x7f,0xbf,0xdf,0xef,0xf7}; //数码管位选表void FillDispBuffer(void) //显示缓存{disp_buff[0]=channel; //The frist is channeldisp_buff[1]=12; //the secnd is Cdisp_buff[2]=dat/51; //The third is integerdisp_buff[3]=dat%51*10/51; //The forth and fifth is decimaldisp_buff[4]=dat%51*10%51*10/51;}void delaykey(void) //按键处理{keybuffer=P2;if(keydownflg) return; //keydownflg控制位为1,不对按键进行处理if((keybuffer&0x80)!=0x80)channel=channel+1; //通道变量加1直到7if(channel>=7) channel=7;}if((keybuffer&0x40)!=0x40){channel=channel-1;if(channel==255) channel=0; //通道变量减1直到0 }FillDispBuffer(); //数码管显示缓存Beep_cnt=0;keydownflg=1; //keydownflg控制位置1}void delay(void) //延时100us{uchar a,b;for(b=1;b>0;b--)for(a=47;a>0;a--);}void ADC0809(uchar CH) //AD函数{ST=0;EOC=0;if(CH==0) //通道0的地址{addC=0;addB=0;addA=0;}if(CH==1) //通道1的地址{addC=0;addB=0;addA=1;} //通道2的地址if(CH==2){addC=0;addB=1;addA=0;}if(CH==3) //通道3的地址addC=0;addB=1;addA=1;}if(CH==4) //通道4的地址{addC=1;addB=0;addC=0;}if(CH==5) //通道5的地址{addC=1;addB=0;addA=1; //通道6的地址}if(CH==6){addC=1;addB=1;addA=0;} //通道7的地址if(CH==7){addC=1;addB=1;addA=1;} //ST上升沿地址写入ST=1;_nop_();OE=0; //ST下降沿AD转换开始ST=0;_nop_();}void main(void){ //初始化P0=0xff;P2=0xff;dat=0x00;disp_cnt=0;count4ms=0;channel=0;TMOD=0x01; //定时器2外部时钟工作模式T2MOD=0x02;T2CON=0x00;TH0=(65535-4000)/256; //定时器1TL0=(65535-4000)%256;TH2=0xff;TL2=0xfa;RCAP2H=0xff; //定时器2稳定输出500kHz的时钟信号RCAP2L=0xfa;TR0=1;TR2=1;ET0=1;ET2=1;EA=1;while(1){if(adc_flg) //ADC0809转换函数{adc_flg=1;ADC0809(channel);delay();}if(EOC==0) //转换是否完毕{OE=1; //输出允许端置1,允许输出_nop_();dat=P3;_nop_();OE=0;_nop_();FillDispBuffer(); //显示缓存}if(!key) delaykey(); //等待按键}}void T0_service(void) interrupt 1 //定时器0中断子函数{TH0=(65535-4000)/256;TL0=(65535-4000)%256;P2_buffer=Tab1[disp_cnt]; //查表,数码管的位选择if(keydownflg){P2_buffer=P2_buffer&0xfe; //开蜂鸣器Beep_cnt++;if(Beep_cnt==50) keydownflg=0; //蜂鸣器0.2s的短时间鸣叫}P2=P2_buffer;if(disp_cnt==2) //第三位数码管显示小数点P0=Tab[disp_buff[disp_cnt]]&0x7f;elseP0=Tab[disp_buff[disp_cnt]]; //数码管显示数字符号disp_cnt++;if(disp_cnt>4) disp_cnt=0;count4ms++;if(count4ms==200){adc_flg=1; //0.8s AD转换一次count4ms=0;}}。