【Proteus仿真】51单片机+ADC0808模数转换数码管显示

【Proteus仿真】51单片机+ADC0808模数转换数码管显示


  • 📺Proteus仿真演示:
    在这里插入图片描述

📗ADC0808主要数据参数简介

  • 8路输入通道,8位A/D转换器,即分辨率为8位:0 - 255。
  • 转换时间为100μs(时钟为640KHz时),130μs(时钟为500KHz时)。
  • 模拟输入电压范围0~+5V,不需零点和满刻度校准。

📓引脚功能简介

在这里插入图片描述

  • IN0~IN7:8路模拟量输入端。
  • OUT1 - OUT8:8位数字量输出端。
  • ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路。
  • ALE:地址锁存允许信号,输入端,产生一个正脉冲以锁存地址。
  • START: A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。
  • EOC: A/D转换结束信号,输出端,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
  • OE:数据输出允许信号,输入端,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
  • CLK:时钟脉冲输入端。时钟频率范围为10KHz-1280KHz。
  • REF(+)、REF(-):基准电压。
  • Vcc:电源,单一+5V。
  • GND:地。

📑工作过程

首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平 时,输出三态门打开,转换结果的数字量输出到数据总线上。

📝程序代码

  • 🔖由于ADC0808采用精度是8位,在4位数码管上显示,将其值扩大16倍,最大值255*16=4080
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <REGX52.H>
#include "intrins.h"

sbit CLOCK = P2 ^ 4;
sbit ST = P2 ^ 5;
sbit EOC = P2 ^ 6;
sbit OE = P2 ^ 7;
sbit PWM = P3 ^ 7;

#define uchar unsigned char
#define uint unsigned int
uint tab1[11] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; //共阴0~9
uchar tab2[] = {0xf7, 0xfb, 0xfd, 0xfe}; //位选
uint disp[] = {0, 0, 0, 0};
unsigned int ADC;
void delay(char x);
void Display\_Result(unsigned char dat);
void Timer0\_INT() interrupt 1
{
CLOCK = !CLOCK;
}

void main()
{
TMOD = 0x02;
TH0 = 0x20;
TL0 = 0x00;
IE = 0x82;
EA = 1; // 总中断开关
ET0 = 1; // T0定时器总中断开关
TR0 = 1;

while(1)
{
ST = 0;//产生启动转换的正脉冲信号
\_nop\_();
ST = 1;
\_nop\_();
ST = 0;
while(EOC == 0);//正在转换
OE = 1;
ADC = P1;//ADC转换结果
OE = 0;
Display\_Result(ADC);
delay(500);
}
}


void Display\_Result(unsigned char dat)
{
unsigned int value=dat\*16;//将ADC结果扩大16倍,最大值:255\*16=4080
P3 = 0xf7;
P0 = tab1[value % 10]; //个位
delay(5);
P3 = 0xfb;
P0 = tab1[value % 100 / 10];//十位
delay(5);
P3 = 0xfd;
P0 = tab1[value%1000/100];//百位4080
delay(5);
P3 = 0xfe;
P0 = tab1[value /1000];// 千位
delay(5);
}
void delay(char x)
{
int i, k;
for(i = 0; i < x; i++)
for(k = 0; k < 120; k++);
}

📚程序源码和仿真资源

1
2
3
链接:https://pan.baidu.com/s/1zbLMul6nr8yVNATzAhpdGg 
提取码:3tfy