51單片機 | 使用D/A轉換器實現三角波發生器


————————————————————————————————————————————

D/A轉換器

  • CS=0ILE=1時,WR1信號有效時將數據總線上的信號寫入8位輸入鎖存器
  • XFER=0時,WR2信號有效時將輸入寄存器的數據轉移到8DAC寄存器中,輸出量隨之改變

工作方式:

  • 直通工作方式(如下實驗)
    • 當某一根地線或地址譯碼器的輸出線使CS有效(低電平),ILE高電平,同時WR1/XFER/WR2為低電平時,單片機數據線上的數據字節直通D/A轉換器,被轉換並輸出
    • CSWR1接引腳,通過軟件置低電平
    • VCCVREFILEPOWER
    • WR2XFERRFBGND*2GND
  • 單緩沖方式
    • 僅適用於只有一路模擬量輸出或幾路模擬量輸出但並不要求同步的系統
    • ILEVCCPOWER
    • CSXFER接單片機引腳,輸入寄存器和DAC寄存器地址都是7FFFH
    • WR1WR2接單片機WR引腳,單片機寫信號
    • 當單片機對DAC0832執行一次寫操作,則把一個字節數據直接寫入DAC寄存器中,輸出的模擬量隨之變化

  • 雙緩沖方式
    • 當多路D/A轉換接口要求同步進行D/A轉換輸出時必須采用雙緩沖方式。DAC0832數字量的輸入鎖存和D/A轉換輸出時分兩步完成的。即CPU的數據總線分時輸出數字量並鎖存在各D/A轉換器的輸入寄存器中;然后CPU對所有D/A轉換器發出控制信號,各輸入寄存器→DAC寄存器,實現同步轉換輸出。
    • 每一路模擬輸出量需要一片DAC0832
    • DAC0832 1 )的輸出鎖存器地址 0DFFFH

      DAC08322)的輸出鎖存器地址0BFFFH

      兩個DAC0832DAC寄存器地址同為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

WR2XFER始終低電平

  

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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM