————————————————————————————————————————————
D/A转换器
- CS=0、ILE=1时,WR1信号有效时将数据总线上的信号写入8位输入锁存器
- XFER=0时,WR2信号有效时将输入寄存器的数据转移到8位DAC寄存器中,输出量随之改变
工作方式:
-
直通工作方式(如下实验)
- 当某一根地线或地址译码器的输出线使CS有效(低电平),ILE高电平,同时WR1/XFER/WR2为低电平时,单片机数据线上的数据字节直通D/A转换器,被转换并输出
- CS、WR1接引脚,通过软件置低电平
- VCC、VREF、ILE接POWER
- WR2、XFER、RFB、GND*2接GND
-
单缓冲方式
- 仅适用于只有一路模拟量输出或几路模拟量输出但并不要求同步的系统
- ILE、VCC接POWER
- CS、XFER接单片机引脚,输入寄存器和DAC寄存器地址都是7FFFH
- WR1、WR2接单片机WR引脚,单片机写信号
- 当单片机对DAC0832执行一次写操作,则把一个字节数据直接写入DAC寄存器中,输出的模拟量随之变化
-
双缓冲方式
- 当多路D/A转换接口要求同步进行D/A转换输出时必须采用双缓冲方式。DAC0832数字量的输入锁存和D/A转换输出时分两步完成的。即CPU的数据总线分时输出数字量并锁存在各D/A转换器的输入寄存器中;然后CPU对所有D/A转换器发出控制信号,各输入寄存器→DAC寄存器,实现同步转换输出。
- 每一路模拟输出量需要一片DAC0832
-
DAC0832 ( 1 )的输出锁存器地址 0DFFFH
DAC0832(2)的输出锁存器地址0BFFFH
两个DAC0832的DAC寄存器地址同为7FFFH
————————————————————————————————————————————
基于DAC0832的三角波发生器实验
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
实验说明:
- 用DAC0832芯片制作一个信号发生器,输出一个三角波信号
- 采用直通工作方式
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
接线说明:
DAC0832 | DI0-DI7 | 89C51 | P0.0-P0.7 | 8位数据输入输出 |
| CS |
| P3.7/RD | 输入寄存器选择信号 |
| WR1 |
| P3.6/WR | 输入寄存器写选通信号 |
| WR2/XFER/GND*2/ | 其他 | GND | WR2和XFER始终低电平 |
| VREF/VCC/ILE |
| POWER | ILE始终允许锁存 |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
实现代码:
1 #include <reg52.h> 2 typedef unsigned char uchar; 3 typedef unsigned int uint; 4 sbit cs = P3 ^ 7; 5 sbit wr = P3 ^ 6; 6 void Delay(uchar m) 7 { 8 while(m--); 9 } 10 void main() 11 { 12 uchar k = 0; //设置k的初始值为0 13 cs = 0; //当CS与WR1端置低电平时做好写数据的准备,只要P0口有数据输出,DAC0832将会转换成模拟信号 14 wr = 0; 15 while(1) //通过输出值在 0-255和255-0之间变化,通过示波器可以看到模拟信号的情况 16 { 17 while(1) //输出值在0-255之间变化 18 { 19 P0 = k++; //输出k且k+1 20 Delay(1); 21 if (k == 0xff) //到达255时结束循环 22 break; 23 } 24 while(1) //输出值在255-0之间变化 25 { 26 P0 = k--; //输出k且k-1 27 Delay(1); 28 if (k == 0x00) //到达0时结束循环 29 break; 30 } 31 } 32 }