微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > A/D: 基于STC89C52与ADC0804的A/D设计详解

A/D: 基于STC89C52与ADC0804的A/D设计详解

时间:11-22 来源:互联网 点击:

本次转换已完成。

Vref/2 - 参考电平输入,决定量化单位。

Vcc - 芯片电源5V输入。

b.转换时序图


CS先为低电平,/WR随后置低,经过至少tw(/WR)L时间后,/WR拉高,随着A/D转换器被启动,并且在经过

(1~8个A/D时钟周期+内部Tc)时间后,模数完成转换,转换结果存入数据锁存器,同时INTR自动变为

低电平,通知单片机本次转换已结束。

读取数据时,当/INTR变为低电平后,将/CS先置低,接着再将/RD置低,在/RD置低至少经过tACC时间后,

数字输出口上的数据达到稳定状态,此时直接读取数字输出端口数据便可得到转换后的数字信号,读走

数据后,马上将/RD拉高,然后将/CS拉高,/INTR是自动变化的,当/RD置低tR1时间后,/INTR自动拉高,

我们不必认为去干涉。

上面的时序图是ADC0804启动一次和读取一次数据的时序图,当我们要连续转换并且连续读取数据时,就没有

必要每次都把/CS置低再拉高,因为/CS是片选信号,置低表示该芯片可被操作或处于能够正常工作状态,所以

在写程序时,只有一开始将/CS置低,以后当要启动转换和读取数据时只需操作/WR和/RD即可。

二. 程序设计详解

1. 用单片机控制ADC0804进行模数转换

程序功能:

当拧动实验板上A/D旁边的电位器Re2时,在数码管的前三位以十进制方式动态显示出A/D转换后的数字量(8位A/D转换后数值在0~255变化)。

程序源码:

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit dula = P2 ^ 6;

sbit wela = P2 ^ 7;

sbit adwr = P3 ^ 6;

sbit adrd = P3 ^ 7;

uchar code table[] = {

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71

};

void delayms(uint);

void display(uint);

void main()

{

uchar i, adval;

uint num;

wela = 1;

P0 = 0x7f;

wela = 0;

while (1)

{

adwr = 1;

_nop_();

adwr = 0;

_nop_();

adwr = 1;

for (i = 10; i > 0; i--)

display(num);

P1 = 0xff;

adrd = 1;

_nop_();

adrd = 0;

_nop_();

adval = P1;

adrd = 1;

num = adval;

}

}

void delayms(uint xms)

{

uint i, j;

for (i = xms; i > 0; i--)

for (j = 110; j > 0; j--)

;

}

void display(uint num)

{

dula = 1;

P0 = table[num / 100];

dula = 0;

P0 = 0xff;

wela = 1;

P0 = 0x7e;

wela = 0;

delayms(5);

dula = 1;

P0 = table[num % 100 / 10];

dula = 0;

P0 = 0xff;

wela = 1;

P0 = 0x7d;

wela = 0;

delayms(5);

dula = 1;

P0 = table[num % 100 % 10];

dula = 0;

P0 = 0xff;

wela = 1;

P0 = 0x7b;

wela = 0;

delayms(5);

}

程序小结:

1)刚进入主程序后,首先将U2锁存器的输出口的最高位置低电平,目的是将与之相连的ADC0804的/CS片选端

置低选中,因为是连续读取数据,所以一次选中,以后再不用管它。同时要注意,以后凡是操作U2锁存端的地方

都不要再改变A/D的/CS端,在数码管显示程序中,送出位选信号时,始终保持U2锁存器的最高位为低电平,

上例数码管显示部分程序中“P0=0x7e;P0=0x7d;P0=0x7b;”即是。

2) 进入while(1)大循环后,先启动A/D转换,其中的_nop_()相当于一个机器周期的延时。

3)在启动A/D转换后,还未读取转换结果,就立即先送结果给数码管显示,这样写的目的是为了给A/D转换

留有一定时间,

4)如果拧动电位器时,数码管数字不动,只有复位一次或重新上电一次,数字才会刷新,这时因为转换

时间不够的原因,解决办法将for(a=10;a>0;a--)中的a增大。


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top