與單片機接口原理1
D/A
:的操作我們最關心的是,串行還是并行,接口的說明,然后是轉換位數和轉換速率,完了看操作時序,看接法,DAC0832有好幾種,但是一般芯片只有一種接法,接法不同當然操作方法也不同。

上圖為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至少要保持這段時間也就是到數據的出現?磾祿淼弥猼ACC 也是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 接功放放出去。