【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
|
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!