接著上一期內容我們繼續(xù)來認識一下單片機存儲器,學習一些相關知識。
片內的ROM和片外的ROM有兩種組合方案,第一個方案是51單片機內部的ROM一共有4K,4K是它的存儲容量,它的存儲空間分布地址分布式從0000H到0FFFH,大家要理解什么叫做存儲容量,什么叫做地址分布,比如說一個空間里面可以容納4085個人,這4085個人指這個空間的容量是4085個人,把十進制的4085轉換成這個二進制轉換成二進制的這種方式稱之為4K,也就是按照二進制進行編碼,一共會占到12個1,就是2的平方乘以2的10次方,這樣的話它的地址空間就是從0000H到0FFFH,也就相當于是這個空間一共是4096個座位,每個座位上可以做一個8位的二進制數(shù),這個座位我們不按十進制進行編碼,而是按照二進制進行編碼,需要多少個多少位的二進制呢?需要12位的二進制,這樣的話這12位的二進制,它的范圍就是從12個0到12個1,我們按照16進制來表示,那這個地址空間的分布就是從0000H到0FFFH,大家一定要能夠理解這個空間和地址分布的一個概念就是地址實際上是對每一個單元的一個編碼,只不過是按照二進制進行編碼,以16進制的方式呈現(xiàn),這個和空間的概念把它深刻地領會一下。

51單片機內部的ROM一共是4K,也就是存儲空間是4K,同時如果說你的單片機內部ROM不夠用,也可以使用外部room,這個時候我們有兩種方案可以配置,這兩種方案的配置是由什么來決定?是由這個我們單片機當中有一個引腳,叫做EA引腳,這個上一篇文章,單片機引腳的時候提到過引腳,當EA引腳如果說結成高電平的時候,我們使用的是內部ROM,這個時候就相當于我們用的是這個方案一,如果說是內部ROM的話,比如說寫了一個程序寫了8K,內部ROM只有4K,這個時候你必然要做外部的擴展,就是外部會擴展4k,比如說外部擴展了4K,這樣的話加上內部的4K一共是8K。
這個程序如果說把EA引腳接成高電平,它這個程序應該怎么走呢?那就是說在程序存儲的時候,它是剛開始肯定是先存在內部ROM,當內部ROM4k存滿了之后,它會自動的跳到外部的入幕當中進行存儲,也就是跳到外部擴展的那4K進行存儲,那這個是EA接成高電平的時候,如果說EA接成低電平的時候采用方案二,這個時候內部ROM就沒有用了,這個時候我們程序存儲的時候是從外部ROM開始存儲,這個時候外部ROM,比如說就要擴一個8K的外部ROM,這個程序就是只存在外部ROM當中,就不會再燒到內部ROM當中,這個大家要注意的這兩種方案,我們目前常用的方案都是直接把EA引腳接成高電平,使用內部的ROM,因為我們現(xiàn)在集成電路的發(fā)展速度很快的吧,ROM空間已經(jīng)可以全部做到內部去了,它最大可以做到多少呢?最大不能超過64K,這個的原因主要是由我們51單片機它的地址總線決定的,它的地址總線是16位的,所以它的最大的空間是2的16次方,也就是不能超過64K,它的尋址的一個地址范圍已經(jīng)確定了,就是說它不能超過64k,原來可以使用內部ROM的方案,也可以使用外部ROM的方案。

如果使用內部ROM方案可以不可以擴展外部?也可以擴展外部的,當內部用完的時候會自動跳到外部去,但是如果我們使用的是外部ROM這種方案,把一些接通了的電平,這樣的話,如果說外部沒有擴展ROM,這個芯片就用不了,必須要快擴展外部ROM,也就是說當接成高電平的時候,可以同時使用片內和片外,如果接成低電平的時候,你僅能使用片外的ROM,片外的ROM就不可以缺少了,這個大家注意,片內片外它是采取統(tǒng)一編制的,所以可以把它看作一個邏輯存儲空間,這樣的話實際上我們51單片機四個存儲空間,相當于三個邏輯存儲空間,因為我們的ROM就是說ROM這相當于是一個邏輯空間,因為它的片內和片外采取的是統(tǒng)一編制的辦法,雖然它物理上是兩個,但實際上在邏輯上我們是一個,所以我們51單片機有四個物理存儲空間,但是相當于是三個邏輯存儲空間,它們最大的擴展容量都不能超過64K,這個是由它的地址總線決定的,這個大家一定要理解。

接下來看ROM當中的幾個特殊的單元,在ROM當中,它實際上還有幾個比較重要的或者是叫特殊的單元,從0000H這個地址,這個地址要注意,這個地址是單片機上電的時候,PC指針指向的一個首地址,所以單片機上電的時候,永遠都是指向這,當單片機指向這的時候第一條指令這個地方是主程序的跳轉指令。

所以通過這個圖你就可以了解我們單片機的一個執(zhí)行過程,比如說你寫了一段代碼,這段代碼從什么地方開始存呢?從0030H開始存,也就是說我們之前文章寫流水燈的代碼,從這個地方開始順序往上存,那單片機上電的時候,它怎么樣來找到這段代碼來執(zhí)行的呢?是因為我們在0000這個H當中做了一條跳轉指令,也就是PC指針附列復位的時候,永遠指向這,有了這條跳轉指令上面之后,就會立馬跳到這個位置去順序執(zhí)行我們的代碼,在執(zhí)行代碼的過程當中,如果說發(fā)生了中斷,這幾塊就發(fā)揮了作用,那你可以發(fā)現(xiàn)從0003H到0023H這幾個字節(jié),是我們的中斷向量的入口地址,那這一塊兒主要適用于程序的引導,是比較特殊的單元,我們存放代碼的時候盡量的是不要存放在這個位置,當然了,我們用C語言或者用Kail編寫51單片機的程序,就是編C語言的程序,我們的編譯器會幫我們做處理,所以大家大概了解一下程序存儲的過程,就是我們程序的控制是靠PC指針,PC指針上面的時候指向我們放一條跳轉指令,為什么放跳轉呢?因為我們的主程序真正的存放是從這開始存的,那為什么不存在這一塊呢,因為這一塊兒是我們的中斷向量的入口地址是中斷的,這個我們到時候講中斷的時候再給大家具體來分析,先記住有五個中斷,有五個中斷源,所以有五個中斷向量的入口地址,每一個中斷向量入口地址占了是8個字節(jié)的存儲空間,所以可以發(fā)現(xiàn),從0003到從03到這個地方,000一共只有三個字節(jié)用于存放跳轉指令,所以這邊一般是不足以存放一段代碼,只能存跳轉指令,具體的這個程序的執(zhí)行,我們講中斷的時候再給大家分析,但是你要先記住這幾個關鍵的單元,這個關于我們叫做中斷向量的入口地址,這個0000H是主程序的入口地址,中斷的話,我們后面再給大家具體來講。

接著看片內的數(shù)據(jù)存儲器,數(shù)據(jù)存儲器主要是用來存放程序運行的中間結果,8051單片機,它的RAM片內的數(shù)據(jù)存儲器RAM一共是由兩部分組成的,一個是低于128個字節(jié),第128個字節(jié)也就相當于這個空間有128個座位,按照十進制進行編碼的話,是從0到127的把它按照二進制進行編碼,就是從00H到7FH,這個是低128個字節(jié)的用戶RAM,接著還有一個高128個字節(jié)的RAM,但是需要注意的是我們用戶能夠使用的是128個字節(jié),高128個字節(jié),我們叫做特殊功能寄存器區(qū),是我們單片機特殊的一些單元,我們叫特殊功能寄存器,SFR那些單元全部在,高128個字節(jié)里面,所以我們通常講51單片機的內部的RAM是多大,我們通常指的是128個字節(jié),而沒有講是256個字節(jié),但實際上它內部是256個字節(jié),只不過這高128個字節(jié)是我們的特殊功能寄存器區(qū),這個大家要把它理解清楚,就是低128個字節(jié)是我們的普通RAM區(qū),高128個字節(jié)是特殊功能寄存器區(qū)。

低128個字節(jié)同時它又畫了好幾個區(qū)域,低128個字節(jié)主要分為三個區(qū)域,第一個區(qū)域也就是從00H到1FH,這個地方一共分了四組,每組八個,一共占了32個字節(jié),我們叫做工作寄存器區(qū)從20H到2FH,我們叫做位尋址區(qū),在位尋址區(qū)里面,我們對每一個位又進行了編碼,進行了位的地址編碼,大家可以發(fā)現(xiàn),從20H到2FH一共占了16個字節(jié),一個字節(jié)是八位,正好是128個位,那這128個位我們又給它做了一個啊,地址的一個啊定義,那就是說我們重新對這128個為,每一個未進行一個地址編碼,相當于是我們這個空間可以坐128個人,但這個時候這128個人不再是128個字結束了,而是什么呢?而是一個位,就是一個比特,這128個位,我們還是把它按照地址的方法進行編碼,按照二進制進行編碼,那正好還是00到7FH地址空間,這個叫做位地址,這個大家要和字節(jié)地址區(qū)分開,大家可以發(fā)現(xiàn)這個RAM的字節(jié)地址也是從0到7F,那這個位地址它也是從0到7F,但是它里面做的數(shù)不一樣。
對文章內容感興趣的朋友可以進入我的主頁翻看一下以往的相關內容,喜歡的幫忙收藏點個贊哦,以上文章內容僅代表個人觀點,不喜勿噴,謝謝大家的支持與鼓勵!
想學單片機的朋友,可以私信我,我可以發(fā)一些資料給大家作為參考學習的內容,有問題的朋友也可以在評論區(qū)評論,或者私信我,盡量幫大家解決朋友們提出的問題,謝謝大家,最后祝看帖的各位朋友身體健康,萬事順利
審核編輯:符乾江
評論