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

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

如果使用內(nèi)部ROM方案可以不可以擴(kuò)展外部?也可以擴(kuò)展外部的,當(dāng)內(nèi)部用完的時(shí)候會(huì)自動(dòng)跳到外部去,但是如果我們使用的是外部ROM這種方案,把一些接通了的電平,這樣的話,如果說(shuō)外部沒(méi)有擴(kuò)展ROM,這個(gè)芯片就用不了,必須要快擴(kuò)展外部ROM,也就是說(shuō)當(dāng)接成高電平的時(shí)候,可以同時(shí)使用片內(nèi)和片外,如果接成低電平的時(shí)候,你僅能使用片外的ROM,片外的ROM就不可以缺少了,這個(gè)大家注意,片內(nèi)片外它是采取統(tǒng)一編制的,所以可以把它看作一個(gè)邏輯存儲(chǔ)空間,這樣的話實(shí)際上我們51單片機(jī)四個(gè)存儲(chǔ)空間,相當(dāng)于三個(gè)邏輯存儲(chǔ)空間,因?yàn)槲覀兊腞OM就是說(shuō)ROM這相當(dāng)于是一個(gè)邏輯空間,因?yàn)樗钠瑑?nèi)和片外采取的是統(tǒng)一編制的辦法,雖然它物理上是兩個(gè),但實(shí)際上在邏輯上我們是一個(gè),所以我們51單片機(jī)有四個(gè)物理存儲(chǔ)空間,但是相當(dāng)于是三個(gè)邏輯存儲(chǔ)空間,它們最大的擴(kuò)展容量都不能超過(guò)64K,這個(gè)是由它的地址總線決定的,這個(gè)大家一定要理解。

接下來(lái)看ROM當(dāng)中的幾個(gè)特殊的單元,在ROM當(dāng)中,它實(shí)際上還有幾個(gè)比較重要的或者是叫特殊的單元,從0000H這個(gè)地址,這個(gè)地址要注意,這個(gè)地址是單片機(jī)上電的時(shí)候,PC指針指向的一個(gè)首地址,所以單片機(jī)上電的時(shí)候,永遠(yuǎn)都是指向這,當(dāng)單片機(jī)指向這的時(shí)候第一條指令這個(gè)地方是主程序的跳轉(zhuǎn)指令。

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

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

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