logo资料库

51单片机AD0809电路设计程序+原理图.doc

第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
资料共9页,剩余部分请下载后查看
AD0809在51单片机中的应用
1、AD0809的逻辑结构
IN0-IN7:8条模拟量输入通道
AD0809 在 51 单片机中的应用 我们在做一个单片机系统时,常常会遇到这样那样的数据采集,在这些被采 集的数据中,大部分可以通过我们的 I/O 口扩展接口电路直接得到,由于 51 单 片机大部分不带 AD 转换器,所以模拟量的采集就必须靠 A/D 或 V/F 实现。下现 我们就来了解一下 AD0809 与 51 单片机的接口及其程序设计。 1、AD0809 的逻辑结构 ADC0809 是 8 位逐次逼近型 A/D 转换器。它由一个 8 路模拟开关、一个地址 锁存译码器、一个 A/D 转换器和一个三态输出锁存器组成(见图 1)。多路开关 可选通 8 个模拟通道,允许 8 路模拟量分时输入,共用 A/D 转换器进行转换。三 态输出锁器用于锁存 A/D 转换完的数字量,当 OE 端为高电平时,才可以从三态 输出锁存器取走转换完的数据。 2、AD0809 的工作原理 IN0-IN7:8 条模拟量输入通道
ADC0809 对输入模拟量要求:信号单极性,电压范围是 0 -5V,若信号太小,必须进行放大;输入的模拟量在转换 过程中应该保持不变,如若模拟量变化太快,则需在输入 前增加采样保持电路。 地址输入和控制线:4 条 ALE 为地址锁存允许输入线,高电平有效。当 ALE 线为高电平时,地址锁存与译 码器将 A, B,C 三条地址线的地址信号进行锁存,经译码后被选中的通道的模 拟量进转换器进行转换。A,B 和 C 为地址输入线,用于选通 IN0-IN7 上的一路 模拟量输入。通道选择表如下表所示。 C 0 0 0 0 1 1 1 1 B 0 0 1 1 0 0 1 1 A 0 1 0 1 0 1 0 1 选择的通道 IN0 IN1 IN2 IN3 IN4 IN5 IN6 IN7 数字量输出及控制线:11 条 ST 为转换启动信号。当 ST 上跳沿时,所有内部寄存器清零;下跳沿时,开始进 行 A/D 转换;在转换期间,ST 应保持低电平。EOC 为转换结束信号。当 EOC 为高 电平时,表明转换结束;否则,表明正在进行 A/D 转换。OE 为输出允许信号, 用于控制三条输出锁存器向单片机输出转换得到的数据。OE=1,输出转换得到 的数据;OE=0,输出数据线呈高阻状态。D7-D0 为数字量输出线。 CLK 为时钟输入信号线。因 ADC0809 的内部没有时钟电路,所需时钟信号必须由 外界提供,通常使用频率为 500KHZ, VREF(+),VREF(-)为参考电压输入。 3、 ADC0809应用说明 (1). ADC0809 内部带有输出锁存器,可以与 AT89S51 单片机直接相连。 (2). 初始化时,使 ST 和 OE 信号全为低电平。 (3). 送要转换的哪一通道的地址到 A,B,C 端口上。 (4). 在 ST 端给出一个至少有 100ns 宽的正脉冲信号。 (5). 是否转换完毕,我们根据 EOC 信号来判断。
(6). 当 EOC 变为高电平时,这时给 OE 为高电平,转换的数据就输出 给单片机了。 4、AD0809 的应用 了解完 A/D 转换芯片,下面我们以图 2 为例来完成它的程序设计。 电路说明: 电路见图(2),主要由 AD 转换器 AD0809,频率发生器 SUN7474,单片机 AT89S51 及显示用数码管组成。 AD0809 的启动方式为脉冲启动方式,启动信号 START 启动后开始转换,EOC 信号在 START 的下降沿 10us 后才变为无效的低电平。这要求查询程序待 EOC 无 效后再开始查询,转换完成后,EOC 输出高电平,再由 OE 变为高电平来输出转 换数据。我们在设计程序时可以利用 EOC 信号来通知单片机(查询法或中断法) 读入已转换的数据,也可以在启动 AD0809 后经适当的延时再读入已转换的数据。 AT89S51 的输出频为晶振频的 1/6(2MHZ),AT89S1 与 SUN7474 连接经与 7474 的 ST 脚提供 AD0809 的工作时钟。AD0809 的工作频范围为 10KHZ-1280KHZ,当频 率范围为 500KHZ 时,其转换速度为 128us。 AD0809 的数据输出公式为:Dout=Vin*255/5=Vin*51,其中 Vin 为输入模拟电 压,Vout 为输出数据。 当输入电压为 5V 时,读得的数据为 255 再乘以 2,得 510。我们用 510*98% 得 499,再将百位数码管的小数点点亮,显示为4.99V,显示值与输入值基本吻 合。 软件设计思路及程序流程 编程思路: (1) (2) (3) (4) 向 AD0809 写入通道号并启动转换 延时 1ms 后等待 EOC 出现高电平(JNB EOC,$) 给 OE 置高并读入转换数据存入数据地址或数组中。 显示
( 5 ) 初始化 1、 写入通道号 2、 延时 20us 后等待 EOC 变高
3、读入采集到的数据并存入数组存入下一 通道 #include #define ucharunsigned char #define uint unsigned int sbit st=P3^2; sbit oe=P3^1; sbit eoc=P3^0; uchar codetab[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x 09};//数码管显示段码 ucharcode td[]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70};// 通道先择数组 uint ad_0809,ad_data1,ad_data2,ad_data3,ad_data0; uchar m,number; uchar x[8];//八通道数据待存数组 void delaynms(uint x);//nms 延时程序 void display();//显示程序 void ad0809();//芯片启动程序 voidkey();//键扫描程序 main() {
number=1; P1=0x00; while(1) { ad0809();//调 AD0809 启动子程序 key();//调按键子程序 ad_0809=x[number];//把相关通道数据给 ad_0809,用做显示 display();//调显示 }} //nms 延时程序 voiddelaynms(uint x) { uchari; while(x-->0) { for(i=0;i<125;i++) {;}}} void display() { uchar a; ad_data1=(ad_0809*49/25)/100;//读得的数据乘以 2 再乘以 98%除 以 100 得百位
ad_data2=((ad_0809*49/25)%100)/10;//读得的数据乘以 2 再乘以 98%再分出十位 ad_data3=(((ad_0809*49/25)%100)%10);//读得的数据乘以 2 再乘 以 98%再分出个位 for(a=0;a<10;a++) { P0=tab[ad_data3];//送小数点后第二位显示 P2=0x07;//选通第一个数码管 delaynms(3); P0=tab[ad_data2];//送小数点后第一位显示 P2=0x0b;//选通第二个数码管 delaynms(3); P0=tab[ad_data1];//送整数显示 P0_7=0;//点亮第三个数码管小数点 P2=0x0d;//选通第三个数码管 delaynms(3); P0=tab[number];//送通道号显示 P2=0x0e; delaynms(3); }} void ad0809() {
uchari,m=1; for(i=0;i<8;i++) { P0=td[i];//选通通道 oe=0; //OE:输出允许信号; //用于控制三态输出锁存器向单片机输出转换得到的数据。OE=0,输 出数据线呈高电阻;OE=1,输出转换//得到的数据; //以下三条指令为起动 AD0809 //注:st 与 ALE 连载一起 //ALE 为地址锁存允许输入线,当 ALE=1,地址锁存与译码器将 A, B,C 三条 //地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进 转换器进行 //转换。 st=0; //ST 为转换启动信号。 st=1;// 当 ST 上跳沿时,所有内部寄存器清零; st=0; //下跳沿时,开始进行 A/D 转换;在转换期间,ST 应保持低 电平。 delaynms(1);// EOC 信号在 START 的下降沿 10us 后才变为无效的 低电平。
分享到:
收藏