标题: 数模转换ADC0809数字电压表的proteus仿真及源码 [打印本页]

作者: 51黑ff    时间: 2016-10-10 16:22
标题: 数模转换ADC0809数字电压表的proteus仿真及源码
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转换器,内部结构如图13.22所示,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型D/A转换器、逐次逼近  ADC0809内部结构框图 寄存器、三态输出锁存器等其它一些电路组成。因此,ADC0809可处理8路模拟量输入,且有三态输出能力,既可与各种微处理器相连,也可单独工作。输入输出与TTL兼容。   

3.外部特性(引脚功能)   ADC0809芯片有28条引脚,采用双列直插式封装,下面说明各引脚功能。       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输入高电平 时,输出三态门打开,转换结果的数字量输出到数据总线上。


51单片机做的数模转换ADC0809芯片的数字电压表的proteus仿真原理图如下:

单片机源程序:
  1. /********************************************************************
  2. 51黑电子论坛
  3. *********************************************************************/
  4. #include <reg52.h>             //头文件
  5. #define uchar unsigned char           //宏定义无符号字符型
  6. #define uint  unsigned  int           //宏定义无符号整型
  7. code uchar seg7code[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //显示段码 数码管字跟
  8. uchar wei[4]={0XEf,0XDf,0XBf,0X7f};  //位的控制端                                                                 //位控制码
  9. sbit ST=P3^0;   //A/D启动转换信号
  10. sbit OE=P3^1;   //数据输出允许信号
  11. sbit EOC=P3^2;  //A/D转换结束信号
  12. sbit CLK=P3^3;  //时钟脉冲  
  13. uint z,x,c,v,AD0809, date;        //定义数据类型
  14. /******************************************************************
  15. 延时函数
  16. ******************************************************************/
  17. void delay(uchar t)
  18. {
  19.   uchar i,j;
  20.    for(i=0;i<t;i++)
  21.    {
  22.             for(j=13;j>0;j--);
  23.          { ;
  24.          }
  25.    }
  26. }
  27. /**********************************************************************
  28.                 数码管动态扫描
  29. *********************************************************************/
  30. void xianshi() //显示函数
  31. {
  32. uint z,x,c,v;
  33.   z=date/1000;                         //求千位
  34.   x=date%1000/100;                 //求百位
  35.   c=date%100/10;                 //求十位
  36.   v=date%10;                         //求个位

  37.       P2=0XFF;
  38.           P0=seg7code[z]&0x7f;
  39.           P2=wei[0];
  40.           delay(80);
  41.           P2=0XFF;  
  42.       P0=seg7code[x];
  43.           P2=wei[1];
  44.           delay(80);
  45.           P2=0XFF;  
  46.              P0=seg7code[c];
  47.           P2=wei[2];
  48.           delay(80);
  49.           P2=0XFF;  
  50.       P0=seg7code[v];
  51.           P2=wei[3];
  52.           delay(80);
  53.           P2=0XFF;
  54.   }
  55. /*************************************************************************
  56.                                 CLK振荡信号        
  57. **************************************************************************/
  58. void timer0( ) interrupt 1 //定时器0工作方式1
  59. {

  60. TH0=(65536-2)/256;          //重装计数初值
  61. TL0=(65536-2)%256;          //重装计数初值
  62. CLK=!CLK;                          //取反
  63. }

  64. /*************************************************************************
  65.                                 主函数        
  66. **************************************************************************/
  67. void main()
  68. {
  69. TMOD=0X01;                          //定时器中断0

  70. CLK=0;                                  //脉冲信号初始值为0
  71. TH0=(65536-2)/256;          //定时时间高八位初值
  72. TL0=(65536-2)%256;          //定时时间低八位初值
  73. EA=1;                                  //开CPU中断
  74. ET0=1;                                  //开T/C0中断
  75. TR0=1;
  76. while(1)                           //无限循环
  77.         {
  78.         ST=0;                                //使采集信号为低
  79.         ST=1;                                //开始数据转换
  80.         ST=0;                                //停止数据转换
  81.         while(!EOC);                //等待数据转换完毕
  82.         OE=1;                                //允许数据输出信号
  83.         AD0809=P1;                    //读取数据
  84.         OE=0;                                //关闭数据输出允许信号
  85.         if(AD0809>=251)                //电压显示不能超过5V
  86.         AD0809=250;
  87.         date=AD0809*20;                //数码管显示的数据值,其中20为采集数据的毫安值
  88.         xianshi();                        //数码管显示函数
  89.    
  90.     }
  91. }        
复制代码



ADC0809数字电压表仿真工程文件及所有完整程序等资料下载地址(压缩包一共有45个单片机仿真,全部下载后找到第012个项目即可):
http://www.51hei.com/bbs/dpj-56298-1.html
作者: ING-sh    时间: 2017-12-21 21:23
厉害了
作者: 天之蓝1994    时间: 2017-12-25 21:28
很厉害
作者: 山贼甲    时间: 2017-12-27 17:12
赞了,非常有用
作者: 7486203    时间: 2018-1-4 16:20
谢谢楼主分享哈
作者: 忖腹食水    时间: 2018-1-17 00:31
借了lz的程序为什么数码管显示的有问题
作者: advantech    时间: 2018-1-18 22:25
51黑有你更精彩!!!
作者: opop1988    时间: 2018-1-19 21:19
不错,学习中,对我有用
作者: 2649676585    时间: 2018-3-4 18:17
HAO真心不错的帖子
作者: jary1314    时间: 2018-4-5 21:49
真的很不错,很有借鉴作用
作者: 柳果果    时间: 2018-4-16 13:04
电路图怎么打开?
作者: 柳果果    时间: 2018-4-16 17:02
程序在keil怎么通过编译?

作者: 单片机AT89C51    时间: 2018-4-24 09:34
数码管为啥数字是一位一位的显示,怎么可以让四位同时显示
作者: opop1988    时间: 2018-4-24 10:26
很好很不错
作者: 范总    时间: 2018-6-11 12:47
为什么侧的值只有某个准确,代码是不是有问题
作者: 渺宇宙    时间: 2019-7-9 14:13
赞一个
作者: 我就凶猛    时间: 2019-7-15 14:02
想问下楼主这个电压表的量程是多少
作者: pangjineng    时间: 2019-10-7 08:43
得分。有用。谢谢了。
作者: colorb    时间: 2020-3-9 11:24
eoc是可以直接接到单片机上的吗

作者: sxr2912719    时间: 2020-3-11 22:07
太给力,谢谢分享
作者: Wleiloaf    时间: 2020-4-19 15:29
资料很全。
作者: 闫YZH    时间: 2020-4-28 09:44
真厉害呀
作者: asdpoi    时间: 2020-5-13 16:06
做设计急需,谢谢楼主分享
作者: 马大佬    时间: 2020-6-23 21:00
厉害了,很有用

作者: Jeff_BlindCat    时间: 2020-6-24 21:23
谢谢楼主分享,再温习下数模转换。
作者: superlc    时间: 2020-6-25 00:22
厉害了

作者: cuibaigao    时间: 2021-3-11 12:23
范总 发表于 2018-6-11 12:47
为什么侧的值只有某个准确,代码是不是有问题

感觉程序的时序有问题吧,值都不对啊
作者: nyzhoujinshuai    时间: 2021-5-31 12:03
数码管显示有问题




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1