———————————————————————————————————————————— D/A轉換器 CS=0、ILE=1時,WR1信號有效時將數據匯流排上的信號寫入8位輸入鎖存器 XFER=0時,WR2信號有效時將輸入寄存器的數據轉移到8位DAC寄存器中,輸出量隨之改變 工作方式: 直通工作方式( ...
————————————————————————————————————————————
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 }