找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4706|回复: 0
打印 上一主题 下一主题
收起左侧

数模转换ADC0809数字电压表

[复制链接]
跳转到指定楼层
楼主
项目数模转换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端。

单片机源程序如下:



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

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

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

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

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

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表