
上图为D/A 接口图 就从操作2个管脚 P5 的2脚和3脚有个跳线帽 短路了 灯会根据D/A 亮到灭变化
写个程序代码更好理解
#include
sbit csda = P3^2;
sbit wr = P3^6;
void main(){
csda =0; //根据管脚说明操作时序都是低电平有效
wr =0;//根据管脚说明 操作时序都是低电平有效
P0 = 0xff; //单片机输出全1 灯点亮了
while (1){
P0= 0x00;//单片机输出全0 灯熄灭
}
}
//简单吧! 好了我们再做个有点难度的,让灯2秒中从亮到熄灭 循环。
//可以用定时器 也就是 P0 口从输出0 到255 在 2秒时间内送完 ,可以这样做 2秒时间中断255次每次
//加1,外面判断下到255 就不加了。
--------------------------------------------------------------------------------------------------
一、A/D :模拟(analog)到数字(digit)
A/D转换的原理及主要技术指标

如图:以电压举例。Vin 电压输入转换原理 参考电压通过D/A 转换器(上面讲过了D/A原理)依次输出一个参考电压依次跟Vin比较比如参考电压大于那么就经过运算输出1 通过逻辑控制 到N位寄存器 最终实现模拟到数字的转换。如果比较完了 EOC 向单片机发一个中断,表示比较完了,OE 输出一个低电平然后一次读走数据。当然还有很多转换方式。
如下图 双积分式ADC的转换原理

这就不讲了。等学到数字电路积分器和微分器的时候就明白了
二、下面看看A/D转换器的主要技术指标




A/D的速率相对来说是低,我们平时也就几十K 的速率, D/A 很快几十个G的速率。
下面是A/D与单片机接口图

AD0804的11 到18 接单片机P1口,0804的第5管脚是中断就是说AD芯片转换完了得要通知单片机,如果使用中断需要接单片机的外部中断。而我们这边上图是没有用中断的就是启动转换之后过一段时间去读,因为它肯定
转换完了也给中断了只不过我们不去读罢了。 WR RD 接的单片机的P3.6 /P3.7口。CSAD 就是片选我们接的锁存器,锁存器通过P0口可以控制的(P2.7给个高电平就行了)。19 4 脚 外接一个电阻和电容其实是一个RC振荡电路看datasheet 就给出了这个典型电路了,我们这样就行了。内部有移位寄存器和D/A转换器需要动力。如果你直接给4脚接个时钟频率也可以。这个脚决定了AD的转换速率当然它是有个上限的。不能超过AD速率的范围。RC 振荡跟转换速率的关系等会再讲啊。 第6 脚和7脚可以输入一个差分信号,也就是这2端的电压值AD用来进行比较,而我们直接把7脚接地了。得让6和7之间有个变化的电压,其实它的作用可以采集桥式电路 ,6脚通过一个电阻(限流电阻防止AD电流损坏)接A/Din 它在板子上有个跳线帽是短路的有了电位器,调节电位器就可改变电压0----5V变化。8脚 模拟地,10 数字地、最好分开防止干扰。9脚为1/2的Vref(参考电压),我们用了2个电阻分压(相等的电阻串联1K)2.5V左右。
我们看看他的操作时序图(Timing Diagrams)开始转换

actual internal 实际内部 status of the convrter 转换状态 当CS 在低电平期间 WR 来一个低脉冲 过了1 到8个 *1/晶振频率个时间开始忙 BUSY (转换)Tc时间转换完了之后输出锁存器DATA IS valid IN OUTPUT LATCHES有效数据. INTR就是转换完了 INT ASSERTED 通知中断一个低电平,当然单片机读走数据之后INTR就自动置高了。
下图是 输出使能和复位 其实就是读取数据

由上图可知就4根线,INTR CS RD DATA OUTPUT(数据总线)
由于我们直接把CS接地线所以始终就是低电平,这个时序图是在INTR发一个中断 单片机案检测到中断,把RD拉低 ,在RD 从低到高变化的一瞬间把数据读走了。由于我们中断没有用悬空的,所以只看RD 和DATA OTPUT 数据总线,那么就是RD 从高变低 再从从低变高 然后把数据读走。就是设置个变量让这个变量等于P几口就行了,tACC 这段时间就会RD至少要保持这段时间也就是到数据的出现。看数据表得知tACC也是ns 级的非常短暂,(单片机的一条指令时间都是微秒级的us 所以可以不用管)。
RC 的选择可以从数据手册找到如下图

由此图可以得知,RC越大那么这个AD的fclk越小速度越慢,所以我们单片机读的时候不能太快,还没转化完呢。好了下面我写个程序看看吧!
#include
#define uint unsigned int
#define ucar unsigned char
//sbit csad //连的锁存器 所以我们不用定义
sbit wr =P3^6;
sbi rd = P3^7;
void delay(uint z){
uint t1,y;
for (t =z;;t1>0;t1--)
for(y=110;y>0;y--);
}
void init();
void start();
void main(){
init();
while(1){
start();
delay(50);//灯会亮,因为数据管脚不但接单片机而且还接了 灯。
rd=0;//需要rd也拉低 相当于AD芯片的OE 虽然转化完只有OE为低电平使能的时候数据才会出来
//调节电位器 之后按复位才变化,说明 你再置高,下次转换完了再置低
delay(10);
ru= 1;//这样既解决了不用复位键就能改变、需要加延时不然灯会很暗。
delay(10);
//转化的快慢跟RC振荡 和IC 本身都有关系。可以较少RC 的值
}
}
void init(){
P0 = 0x7f;//片选给个低电平 高位
}
void start(){
wr =1;
wr=0
wr=1;
}
//通过以上可以加个变量 把模拟量变化到数据总线端 给数码管显示。
//A/D 输出 赋值给D/A 来实现 模拟变化。跟我们的录音机声音的采集A/D 之后D/A 接功放放出去。