這是51單片機內置的功能,可以讓我們少寫很多時序,讓代碼變的整潔好看。
這里先拓展點小知識:RAM,ROM的區別,地址數據總線,控制總線。
1.RAM是一種掉電會丟失數據的可讀可寫的存儲器。//其實題目上寫的是外擴ram,但很多時候我們很少來外擴ram, 都是外擴各種外圍器件,比如ADC,DAC,等等等
2.ROM是掉電不丟失,只讀的存儲器。
3.51單片機P0口是低8地址和數據總線復用。P2口是高8位地址總線。
4.數據總線是用來傳輸數據的,地址總線是用來選擇地址的,51單片機地址總線是16根,也就是外擴最大內存為 2^16=64K;
5.控制總線就是單片機發出的各種控制信號線,比如讀寫時序產生WR/RD,低8位地址鎖存信號線ALE等...
然后我們進入正題。如果是學過單片機原理的小伙伴們應該知道這兩個操作指令 MOVX,MOVC,如果用我們用匯編寫外擴RAM、ROM,就是用這兩個操作指令,當出現這兩個操作指令的時候,單片機的相關引腳就會產生對應的時序,這樣我們把相關外擴器件與之相連的時候,就不用去管時序的問題了。
MOVX A,@DPTR //讀外擴ram,產生讀時序,由WR/p3.6產生
MOVX @DPTR,A //寫外擴ram,產生寫時序,由RD/p3.7產生
MOVC A,@DPTR //讀外擴rom,產生讀時序,由PSEN產生
我這里這介紹RAM的讀寫。當我們發出一條MOVX指令的時候,先發出16位地址,產生控制時序,然后在寫(讀)數據,這個時候,我們低8位地址總線就與數據總線沖突了(因為都是用的P0口),使用如果我們要時候低8位地址去限定的時候,就可以就一個鎖存器,來鎖存低8位地址(這個時候要用到鎖存信號引腳ALE),再比如我們外圍器件不多的時候,或者外擴ram不超過2^8=256B的時候,完全可以不管低8位。
然后就是我們讀寫控制線都有效時序都是由高到低,當數據讀寫完后,在變為高電平,你們要注意自己控制的外圍器件的時序,看要不要加非門處理一下讀寫時序,比如控制LCD1602的時候。
我們大致了解了這個控制過程(想詳細了解的建議去看書,單片機原理),我們在開發的過程中很少用匯編寫項目,下面我們就來看看C語言的寫法。
首先我們來看一看下面的關鍵字:
code 以MOVC @A+DPTR 讀取的程序內存
data 可以直接存取的內部數據存儲器
idata 以 MOV@Rn 存取的內部數據存儲器
bdata 可以位尋址(BitAddressable)的內部存儲器
xdata 以MOVX @DPTR 存取的外部數據存儲器
pdata 以MOVX @Rn 存取的外部數據存儲器
我們一般都只用到 xdata,我們在頭文件<absacc.h>中可以看到這樣一個定義
#define XBYTE ((unsigned char voalite xdata*)0)
這樣一個宏定義,這個宏定義我按我自己的理解去演示一遍,
當我們用XBYTE[0X1000]=1;
想當于 MOV @DPTR,1000H
MOV A,#1
MOVX @DPTR,A
把1寫到外部ram地址位0x1000中,如果是 i=XBYTE[0X1000];這就是讀了,意思是差不多的。
這個地址0x1000,就是通過地址總線發出去的,P0發送0x00也就是低8位,P2發送0x10也就是高8位,發送地址后,控制線發出對應的控制時序,ALE發送鎖存,WR發出一個下降沿,這個時候在通過數據總線P0發送1出去。WR在復位到高電平。這就是大概流程。
當我們不是外擴ram的時候 XBYTE[]中的地址應該怎么去填呢,我們來舉的DAC0832的例子,借用的別人的圖
20180314211646764.png (39.34 KB, 下載次數: 49)
下載附件
2018-7-7 18:27 上傳
我們0832是在片選CS為低的時候,給WR低電平就可以工作了。
上圖我們可以明顯體會到用外擴ram這種編程方法的便利,以及節省很多資源了(用i/o直接操作的話,不加額外的器件,連接兩個DAC起碼要16個引腳)。
當我們想讓dac0832(1)工作,但片2不工作,就要讓P2.7=0,P2.6=0,P2.5=1。是不是這樣的。
所以我們片1的地址高3位就出來了,其余的地址都影響不到它,所以我們稱為地址無關位,我們任意填什么都可以,為了方便,我就填0。那么片1的地址 是不是就是XBYTE[0X2000] (001 0 0000 0000 0000),是不是就是這樣的,
同理片2的就為 XBYTE[0X8000] (100 0 0000 0000 0000) 。
當我們寫 XBYTE[0x2000]=0xff;這句話,是不是就啟動了dac0832,并寫入了0xff。
其實大家可以去看書上單片機外擴程序存儲器的工作時序圖,多想想這個過程,就可以很輕松的去運用他了,可以讓自己輕松很多,并且玩法有很多很多。
|