51单片机A/D转换器实现数字电压表实例

网络游戏 2017-06-10

————————————————————————————————————————————

ADC0809

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

工作原理:

ADDA/ADDB/ADDC 输入3位地址,并使ALE=1,将地址存入地址锁存器中

ALE:地址锁存允许信号接入端,高电平时允许改变CBA的值,低电平时锁死,防止在A/D转换过程中切换通道

地址经译码选通8路模拟输入IN0~IN7之一到比较器,输入与被选通道关系

通道 C B A
IN0 0 0 0IN1 0 0 1IN2 0 1 0IN3 0 1 1IN4 1 0 0IN5 1 0 1IN6 1 1 0IN7 1 1 1

START端上升沿将逐次逼近寄存器复位,下降沿启动A/D转换 EOC输出信号变低电平,表示正在转换;当A/D转换完成,EOC变为高电平,结果数据已存入锁存器。 OE输入高电平,输出三态门打开,转换结果的数字量输出到数据总线上。

OE=1时,D0-D7引脚上为转换后的数据,当OE=0时,D0-D7为对外呈现高阻状态

p.s.

其他引脚:

51单片机A/D转换器实现数字电压表实例

IN0~IN7:8路模拟量输入引脚

CLK:时钟信号输入端

V_(REF(+)):参考电压正端

V_(REF(-)):参考电压负端

————————————————————————————————————————————

数字电压表实验

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

实现效果:

检测外部模拟电压,并用数字量将其电压值表示出来

51单片机A/D转换器实现数字电压表实例

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

实现思路:

A/D转换

  • 初始化时启动A/D转换,转换结束后OE自动置位
  • 检查OE状态,为高电平时读取数据口数据并转换成对应的电压值
  • 显示结束后启动下一次A/D转换
数码管显示
  • 读入数据并转换成电压值后,通过数码管显示,百位数值后显示小数点

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

连接说明:

ADC0808 OUT1-OUT8 89C51 P0.0-0.7 转换后数据输出到单片机
   START    P3.0      EOC    P3.1      OE    P3.2      IN0 POT-HG + 输入模拟信号   ADDA/ADDB/ADDC/VREF(-) GND    0 0 0 选择通路IN0   ALE/VREF(+) POWER    将地址存入地址锁存器中数码管 1/2/3/4/5/6/7 89C51 P2 控制数码管显示位数   A/B/C/D/E/F/G/DP    P1 控制显示段码

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

实现代码:

1 #include <reg52.h>
 2 typedef unsigned char uchar;
 3 typedef unsigned int uint;
 4 uchar code table[] =
 5 {
 6     0xfc, 0x60, 0xda, 0xf2, 0x66, 0xb6, 0xbe, 0xe0, 0xfe, 0xf6, 0xee, 0x3e, 0x9c, 0x7a, 0x9e, 0x8e
 7 };
 8 sbit start = P3 ^ 0; //控制start引脚
 9 sbit eoc = P3 ^ 1; //查询eoc引脚情况
10 sbit oe = P3 ^ 2; //输出允许控制端
11 sbit dot = P1 ^ 0; //数码管小数点
12 void Delay(uchar m)
13 {
14     while(m--);
15 }
16 void main()
17 {
18     uint temp;
19     start = 0;
20     oe = 0; //oe为高阻状态
21     start = 1; //start下降沿开始转换
22     start = 0;
23     while(1)
24     {
25         if (eoc == 1) //当eoc为1时转换结束
26         {
27             /*读入状态*/
28             oe = 1; //打开oe,数据读入引脚
29             temp = P0;
30             temp = temp * 1.0 / 255 * 500; //读入的数值转换成模拟电压对应的电压值
31             oe = 1; //oe呈高阻
32             /*数码管显示*/
33             P2 = 0xfe; //数码管选择最后一位
34             P1 = table[temp % 10];
35             Delay(500);
36             P2 = 0xfd; //数码管选择十位
37             P1 = table[temp / 10 % 10];
38             Delay(500);
39             P2 = 0xfb; //数码管选择百位
40             P1 = table[temp / 100 % 10];
41             dot = 1; //显示小数点
42             Delay(500);
43             /*启动下一次转换*/
44             start = 1;
45             start = 0;
46         }
47     }
48 }

51单片机A/D转换器实现数字电压表实例

相关推荐