1. 程式人生 > >51微控制器外擴RAM,ROM操作。

51微控制器外擴RAM,ROM操作。

      這是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   以 [email protected] 存取的內部資料儲存器

                        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的例子大笑,借用的別人的圖

  

        我們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。

            其實大家可以去看書上微控制器外擴程式儲存器的工作時序圖,多想想這個過程,就可以很輕鬆的去運用他了,可以讓自己輕鬆很多,並且玩法有很多很多。

相關推薦

51微控制器RAMROM操作

      這是51微控制器內建的功能,可以讓我們少寫很多時序,讓程式碼變的整潔好看。      這裡先拓展點小知識:RAM,ROM的區別,地址資料匯流排,控制匯流排。                1.RAM是一種掉電會丟失資料的可讀可寫的儲存器。//其實題目上寫的是外擴r

STC89C52微控制器的內外的RAMROM的討論

源地址:http://www.360doc.com/content/13/0204/10/6973384_264152196.shtml 關於STC89C52:  1、STC89C52只有512位元組的的RAM,包括2部份,一是256位元組的內部RAM,二是256位元組的外部RAM;STC89C5

Linux下的RAMROM虛擬記憶體介紹

其實RAM就是快取記憶體,通電就具有記憶功能,斷電就失去,也就是執行記憶體,就是用來存放臨時檔案,而“記憶體”就是RAM的 一種物理硬體,廣義來說兩者也可以說是同一概念。而虛擬記憶體是系統利用硬碟分出來的具有輔助記憶體工作的虛擬RAM,不是 硬體,但又依靠硬碟。 簡單的說 RAM是你一般

ROM,RAM,記憶體,外存硬碟BIOS(手機和計算機中RAMROM中區別)

從電腦來說一般比較好理解,RAM就是我們平時所說的執行記憶體,它的確是隨時可讀寫的。因為CPU處理的資料都是以執行記憶體為中介的。斷電後資訊是不儲存的。那麼對於ROM來說,是不是就是硬碟呢?不是說ROM只可以讀嗎?硬碟卻是可以修改的。的確,必須明確一點,RAM與ROM都是記憶體,而硬碟是外存,所以ROM不等於

input點擊鏈接另一個頁面各種操作

llb ret onclick 同時 CA www PE eight window 1.鏈接到某頁<input type="button" name="Submit" value="確 定" class="btn" onclick="location.href=‘fi

字串陣列擷取操作 substring和substr以及slice和splicecharAt()的用法

slice可運算元組和字串,但substring和substr只能操作字串,splice只能運算元組。 1.substr() substr() 方法可在字串中抽取從 start 下標開始的指定數目的字元。 語法 stringObject.substr(st

QT學習之QPushButton按鈕操作

對於QT中的按鈕QPushButton類的學習,一聽見按鈕這個詞我們就想到,一按下就做什麼事,彈起來又做別的事。確實也是這樣,要想在QT中用好按鈕,就要對QPushButton類進行深入的學習。 eg: QPushButton *button = new

51微控制器 同時擴充套件ROMRAM的具體實現及kiel的具體設定

51MCU內部有RAM,ROM,不同於8031。儘管如今的增強行51MCU的內部RAM,ROM可能已經很大的空間。但就技術而言,擴充套件RAM,ROM還是需要學會的。         對於不同的設計方案需求,擴充套件可能基於以下任何一種設計:         A,只擴充套件

sqlalchemy操作----鍵關聯relationship

huang integer -- password sql 通過 ext kref day ... #!_*_coding:utf-8_*_ #__author__:"Alex huang" import sqlalchemy from sqlalchemy import

雲龍51微控制器視訊教程+課件+程式程式碼+課後作業零基礎入門視訊教程

教程巧妙地將對微控制器原理的講述與硬體實驗裝置結合起來,以通俗易懂的語言、現場互動的教學風格獲得了廣大讀者的一致好評,已被大量的培訓機構採用。只要你認真看,認真聽,保證讓你學會微控制器應用和C語言程式設計。全部資料打包下載地址:http://www.yunlon

零基礎入門學習51微控制器教程教材書籍+視訊教程+例程程式碼+學習資料+掃碼應用

[本書特色: 本書巧妙地將對微控制器原理的講述與硬體實驗裝置結合起來,列舉了大量有趣易懂的小例子,深入淺出地用實操案例來講述微控制器的工作原理、擴充套件知識、程式設計技巧,講授微控制器專案開發的流程及方法。綜合王老師多年專案經驗及教研成果,內容細緻、風格突出、是一本全面講述51微控制器

51微控制器【二】LED閃爍及流水燈附帶c語言位操作

void main(void) { while (1) { gLed1 = 0; // 點亮LED Delay(); // 延時一段時間 gLed1 = 1; // 熄滅LED Delay(); // 延時一段時間 } } voi

51微控制器:每次按S1鍵流水燈移位演示

原理圖 //原始碼 #include <reg52.h> #include <intrins.h> //包含移位函式 #define uint unsigned

利用51微控制器矩陣鍵盤按鍵顯示0--F在數碼管

程式碼如下:       #include <reg52.h> #define uchar unsigned char #define uint  unsigned int sbit we = P2^7; sbit du = P2^

RAMROM、記憶體還有硬碟它們到底有什麼區別

    RAM要求每時每刻都不斷地供電,否則資料會丟失。如果在關閉電源以後RAM中的資料也不丟失就好了,這樣就可以在每一次開機時都保證電腦處於上一次關機的狀態,而不必每次都重新啟動電腦,重新開啟應用程式了。但是RAM要求不斷的電源供應,那有沒有辦法解決這個問題呢?隨著技術的進步,人們想到了一個辦法,即給RAM

CC253051微控制器 延時一秒程式 迴圈次數 演算法

//計算 //微控制器每秒執行的指令數:頻率*1                 (例:cc2530頻率為)32MHz //8051效率是PC的12分之一 //迴圈需要執行5條指令//公式為  32*1024*1024/5/12 = 559240.533 所以寫一個for迴

怎麼檢視微控制器程式佔多少RAMROM

Code = 121550 位元組——程式程式碼段的 flash 大小 RO-data = 12154 位元組——程式中所定義的指令和常量大小( read only ) RW-data = 1896  位元組——程式中已初始化的變數大小( read/w

51微控制器中將變數、陣列、函式設定在固定位置定位到絕對地址

一、不帶初值的變數或陣列 直接使用_at_ 關鍵字加上地址就行。 如:  unsigned char idata myvar _at_ 0x40;  unsigned char code myvar[10] _at_ 0x40; _at_ 關鍵字

ARM中ROMRAMFLASH區別

RAM(Random Access Memory)的全名為隨機存取記憶體,它相當於PC機上的移動儲存,用來儲存和儲存資料的。它在任何時候都可以讀寫,RAM通常是作為作業系統或其他正在執行程式的臨時儲存介質(可稱作系統記憶體)。        不過,當電源關閉時RAM不能

51微控制器的dataxdatacode區別詳解

dATa: 固定指前面0x00-0x7f的128個RAM,可以用acc直接讀寫的,速度最快,生成的程式碼也最小。 idATa:固定指前面0x00-0xff的256個RAM,其中前128和dATa的128完全相同,只是因為訪問的方式不同。 idATa是用類似C中的指標方式訪問的。 彙編中的語句為:mox ACC