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

上圖為D/A
接口圖
就從操作2個(gè)管腳 P5 的2腳和3腳有個(gè)跳線帽
短路了 燈會(huì)根據(jù)D/A 亮到滅變化
寫個(gè)程序代碼更好理解
#include
sbit csda = P3^2;
sbit wr = P3^6;
void main(){
csda =0;
//根據(jù)管腳說明操作時(shí)序都是低電平有效
wr
=0;//根據(jù)管腳說明 操作時(shí)序都是低電平有效
P0 = 0xff;
//單片機(jī)輸出全1 燈點(diǎn)亮了
while (1){
P0=
0x00;//單片機(jī)輸出全0 燈熄滅
}
}
//簡(jiǎn)單吧!
好了我們?cè)僮鰝(gè)有點(diǎn)難度的,讓燈2秒中從亮到熄滅 循環(huán)。
//可以用定時(shí)器
也就是 P0 口從輸出0 到255 在
2秒時(shí)間內(nèi)送完 ,可以這樣做 2秒時(shí)間中斷255次每次
//加1,外面判斷下到255 就不加了。
--------------------------------------------------------------------------------------------------
一、A/D
:模擬(analog)到數(shù)字(digit)
A/D轉(zhuǎn)換的原理及主要技術(shù)指標(biāo)

如圖:以電壓舉例。Vin 電壓輸入轉(zhuǎn)換原理 參考電壓通過D/A
轉(zhuǎn)換器(上面講過了D/A原理)依次輸出一個(gè)參考電壓 依次跟Vin比較比如參考電壓大于那么就經(jīng)過運(yùn)算輸出1
通過邏輯控制 到N位寄存器 最終實(shí)現(xiàn)模擬到數(shù)字的轉(zhuǎn)換。如果比較完了 EOC 向單片機(jī)發(fā)一個(gè)中斷,表示比較完了,OE
輸出一個(gè)低電平然后一次讀走數(shù)據(jù)。當(dāng)然還有很多轉(zhuǎn)換方式。
如下圖 雙積分式ADC的轉(zhuǎn)換原理

這就不講了。等學(xué)到數(shù)字電路積分器和微分器的時(shí)候就明白了
二、下面看看A/D轉(zhuǎn)換器的主要技術(shù)指標(biāo)




A/D的速率相對(duì)來說是低,我們平時(shí)也就幾十K 的速率, D/A 很快幾十個(gè)G的速率。
下面是A/D與單片機(jī)接口圖

AD0804的11 到18
接單片機(jī)P1口,0804的第5管腳是中斷就是說AD芯片轉(zhuǎn)換完了得要通知單片機(jī),如果使用中斷需要接單片機(jī)的外部中斷。而我們這邊上圖是沒有用中斷的就是啟動(dòng)轉(zhuǎn)換之后過一段時(shí)間去讀,因?yàn)樗隙?br>
轉(zhuǎn)換完了也給中斷了只不過我們不去讀罷了。 WR
RD 接的單片機(jī)的P3.6 /P3.7口。CSAD
就是片選我們接的鎖存器,鎖存器通過P0口可以控制的(P2.7給個(gè)高電平就行了)。 19
4 腳 外接一個(gè)電阻和電容其實(shí)是一個(gè)RC振蕩電路看datasheet
就給出了這個(gè)典型電路了,我們這樣就行了。內(nèi)部有移位寄存器和D/A轉(zhuǎn)換器需要?jiǎng)恿ΑH绻阒苯咏o4腳接個(gè)時(shí)鐘頻率也可以。這個(gè)腳決定了AD的轉(zhuǎn)換速率當(dāng)然它是有個(gè)上限的。不能超過AD速率的范圍。RC
振蕩跟轉(zhuǎn)換速率的關(guān)系等會(huì)再講啊。 第6
腳和7腳可以輸入一個(gè)差分信號(hào),也就是這2端的電壓值A(chǔ)D用來進(jìn)行比較,而我們直接把7腳接地了。得讓6和7之間有個(gè)變化的電壓,其實(shí)它的作用可以采集橋式電路
,6腳通過一個(gè)電阻(限流電阻防止AD電流損壞)接A/Din
它在板子上有個(gè)跳線帽是短路的有了電位器,調(diào)節(jié)電位器就可改變電壓0----5V變化。8腳 模擬地,10
數(shù)字地、最好分開防止干擾。9腳為1/2的Vref(參考電壓),我們用了2個(gè)電阻分壓(相等的電阻串聯(lián)1K)2.5V左右。
我們看看他的操作時(shí)序圖(Timing Diagrams)開始轉(zhuǎn)換

actual internal 實(shí)際內(nèi)部 status of the convrter 轉(zhuǎn)換狀態(tài) 當(dāng)CS 在低電平期間 WR
來一個(gè)低脈沖 過了1 到8個(gè) *1/晶振頻率個(gè)時(shí)間開始忙 BUSY
(轉(zhuǎn)換)Tc時(shí)間轉(zhuǎn)換完了之后輸出鎖存器DATA IS valid IN OUTPUT
LATCHES 有效數(shù)據(jù). INTR就是轉(zhuǎn)換完了
INT ASSERTED
通知中斷一個(gè)低電平 ,當(dāng)然單片機(jī)讀走數(shù)據(jù)之后INTR就自動(dòng)置高了。
下圖是 輸出使能和復(fù)位 其實(shí)就是讀取數(shù)據(jù)

由上圖可知就4根線,INTR
CS
RD DATA
OUTPUT(數(shù)據(jù)總線)
由于我們直接把CS 接地線所以始終就是低電平,這個(gè)時(shí)序圖是在INTR發(fā)一個(gè)中斷
單片機(jī)案檢測(cè)到中斷,把RD拉低 ,在RD
從低到高變化的一瞬間把數(shù)據(jù)讀走了。由于我們中斷沒有用懸空的,所以只看RD 和DATA OTPUT
數(shù)據(jù)總線,那么就是RD 從高變低
再從從低變高
然后把數(shù)據(jù)讀走。就是設(shè)置個(gè)變量讓這個(gè)變量等于P幾口就行了, tACC
這段時(shí)間就會(huì)RD至少要保持這段時(shí)間也就是到數(shù)據(jù)的出現(xiàn)。看數(shù)據(jù)表得知tACC 也是ns
級(jí)的非常短暫,(單片機(jī)的一條指令時(shí)間都是微秒級(jí)的us 所以可以不用管)。
RC 的選擇可以從數(shù)據(jù)手冊(cè)找到如下圖

由此圖可以得知,RC越大那么這個(gè)AD的fclk越小速度越慢,所以我們單片機(jī)讀的時(shí)候不能太快,還沒轉(zhuǎn)化完呢。好了下面我寫個(gè)程序看看吧!
#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);//燈會(huì)亮,因?yàn)閿?shù)據(jù)管腳不但接單片機(jī)而且還接了 燈。
rd=0;//需要rd也拉低
相當(dāng)于AD芯片的OE
雖然轉(zhuǎn)化完只有OE為低電平使能的時(shí)候數(shù)據(jù)才會(huì)出來
//調(diào)節(jié)電位器 之后按復(fù)位才變化,說明 你再置高,下次轉(zhuǎn)換完了再置低
delay(10);
ru=
1;//這樣既解決了不用復(fù)位鍵就能改變、需要加延時(shí)不然燈會(huì)很暗。
delay(10);
//轉(zhuǎn)化的快慢跟RC 振蕩 和IC 本身都有關(guān)系。可以較少RC 的值
}
}
void init(){
P0 =
0x7f;//片選給個(gè)低電平 高位
}
void start(){
wr
=1;
wr=0
wr=1;
}
//通過以上可以加個(gè)變量 把模擬量變化到數(shù)據(jù)總線端
給數(shù)碼管顯示。
//A/D 輸出 賦值給D/A 來實(shí)現(xiàn) 模擬變化。跟我們的錄音機(jī)聲音的采集A/D 之后D/A 接功放放出去。