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

上圖為D/A
接口圖
就從操作2個(gè)管腳 P5 的2腳和3腳有個(gè)跳線(xiàn)帽
短路了 燈會(huì)根據(jù)D/A 亮到滅變化
寫(xiě)個(gè)程序代碼更好理解
#include
sbit csda = P3^2;
sbit wr = P3^6;
void main(){
csda =0;
//根據(jù)管腳說(shuō)明操作時(shí)序都是低電平有效
wr
=0;//根據(jù)管腳說(shuō)明 操作時(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)換原理 參考電壓通過(guò)D/A
轉(zhuǎn)換器(上面講過(guò)了D/A原理)依次輸出一個(gè)參考電壓 依次跟Vin比較比如參考電壓大于那么就經(jīng)過(guò)運(yùn)算輸出1
通過(guò)邏輯控制 到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ì)來(lái)說(shuō)是低,我們平時(shí)也就幾十K 的速率, D/A 很快幾十個(gè)G的速率。
下面是A/D與單片機(jī)接口圖

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

actual internal 實(shí)際內(nèi)部 status of the convrter 轉(zhuǎn)換狀態(tài) 當(dāng)CS 在低電平期間 WR
來(lái)一個(gè)低脈沖 過(guò)了1 到8個(gè) *1/晶振頻率個(gè)時(shí)間開(kāi)始忙 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根線(xiàn),INTR
CS
RD DATA
OUTPUT(數(shù)據(jù)總線(xiàn))
由于我們直接把CS 接地線(xiàn)所以始終就是低電平,這個(gè)時(shí)序圖是在INTR發(fā)一個(gè)中斷
單片機(jī)案檢測(cè)到中斷,把RD拉低 ,在RD
從低到高變化的一瞬間把數(shù)據(jù)讀走了。由于我們中斷沒(méi)有用懸空的,所以只看RD 和DATA OTPUT
數(shù)據(jù)總線(xiàn),那么就是RD 從高變低
再?gòu)膹牡妥兏?nbsp;
然后把數(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í)候不能太快,還沒(méi)轉(zhuǎn)化完呢。好了下面我寫(xiě)個(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ì)出來(lái)
//調(diào)節(jié)電位器 之后按復(fù)位才變化,說(shuō)明 你再置高,下次轉(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;
}
//通過(guò)以上可以加個(gè)變量 把模擬量變化到數(shù)據(jù)總線(xiàn)端
給數(shù)碼管顯示。
//A/D 輸出 賦值給D/A 來(lái)實(shí)現(xiàn) 模擬變化。跟我們的錄音機(jī)聲音的采集A/D 之后D/A 接功放放出去。