前兩期內(nèi)容已經(jīng)對(duì)單片機(jī)的存儲(chǔ)器做了一部分的講解,這一期就把剩余部分的內(nèi)容分享給大家,如有對(duì)相關(guān)知識(shí)有需要了解的朋友可以查看我主頁(yè)翻找一下可以看到前兩期的分享。
有同學(xué)51單片機(jī)或者是單片機(jī)在編程的時(shí)候,怎么樣去區(qū)分這兩個(gè)里面的內(nèi)容,它怎么樣能夠識(shí)別呢?同樣的地址,我來(lái)尋址的時(shí)候它怎么識(shí)別呢?它是靠指令,我們?yōu)閷ぶ酚形粚ぶ分噶?,那字?jié)尋址有字節(jié)尋址指令,這個(gè)是不一樣的,大家知道就行了,從30H到7FH才是我們的用戶RAM區(qū),也就是大家知道我們定義的一些變量,定義的變量,包括我們?cè)诔绦蛘{(diào)用,包括中斷調(diào)用的時(shí)候,做了一些這種RAM的一些堆棧,都是在這一塊,所以大家可以發(fā)現(xiàn),實(shí)際上我們雖然講有128個(gè)字節(jié),但是你看你需要去掉16個(gè)字節(jié),這邊又去掉了32個(gè)字節(jié),也就你需要去掉48個(gè)字節(jié),128啊,去掉48個(gè)字節(jié),實(shí)際上我們的用戶RAM區(qū)只有幾十個(gè)字節(jié),所以為什么前面編程的時(shí)候一直強(qiáng)調(diào),在定義變量的時(shí)候,能定義成骯臟的差類型就不要定義成整型的,能定義成整型的,不要定義成長(zhǎng)整型的,能定義成無(wú)符號(hào)的,不要定義成有符號(hào)的,就是因?yàn)槲覀兊腞AM太小了,只有幾十個(gè)字節(jié),對(duì)應(yīng)的數(shù)太大了太多了變量太多了,一個(gè)ROM就不夠用。
大家打游戲的時(shí)候都知道,如果說(shuō)你的內(nèi)存不夠,你加載一個(gè)很大的3D游戲,你的計(jì)算機(jī)立馬就卡死了,所以大家要時(shí)時(shí)刻刻提醒自己,我們51單片機(jī)的內(nèi)部RAM非常小,但適用于我們這種控制領(lǐng)域,它是足夠了,所以也不要去追求RAM越大越好,越大越好,不同的器件它有它不同的特定的應(yīng)用場(chǎng)合,這個(gè)是第一個(gè)區(qū)域就是叫做工作寄存器,大概知道就行了,大概知道就行了,以往講匯編語(yǔ)言的時(shí)候,這一塊兒是重點(diǎn)來(lái)講的,因?yàn)槲覀兒芏嗟闹噶町?dāng)中都牽扯到R0到R7寄存器,但是我們現(xiàn)在講C語(yǔ)言這一塊,大家可能不太能能夠理解透徹,先清楚這一塊有這一塊存儲(chǔ)空間,工作寄存器這個(gè)名字很形象,也就是在我們程序運(yùn)行的過(guò)程當(dāng)中,在CPU工作的時(shí)候,肯定是在一直發(fā)揮作用的,這個(gè)大家在前面我教大家去調(diào)試程序的時(shí)候,回頭我們?cè)谡{(diào)試程序的時(shí)候,也可以帶它來(lái)看一下,在你調(diào)試程序點(diǎn)擊那個(gè)放大器的那個(gè)按鈕的時(shí)候,你可以發(fā)現(xiàn)草莓的側(cè)邊欄那邊出現(xiàn)了這個(gè)程序運(yùn)行狀態(tài)就可以明確的看到R0到R7的寄存器,就在我們CPU運(yùn)行的過(guò)程當(dāng)中,一些中間數(shù)據(jù),它都會(huì)不停的和它之間進(jìn)行交換或者是存儲(chǔ)。
工作寄存器區(qū)一共有四組,這四組當(dāng)中,在當(dāng)前的時(shí)候,CPU在運(yùn)行的時(shí)候,當(dāng)前的時(shí)候只能使用其中的一組,并不是這四組同時(shí)在用的,它只能使用其中的一組,你可以發(fā)現(xiàn)在不同的組的它的名字我們都可以用R1到R7,但是我們?cè)诋?dāng)前使用的時(shí)候,只能使用其中的一組,就是說(shuō)只能選當(dāng)前的一組作為當(dāng)前工作寄存器組,可以去切換它在不同的里面,比如說(shuō)你CPU在執(zhí)行主程序的時(shí)候用了一組,到中斷程序的時(shí)候想切換到另一組是可以的,切換的話我們可以用特殊功能寄存器PSW當(dāng)中有兩個(gè)位正好可以選擇這四組工作寄存器。
第二區(qū)域是我們這個(gè)20到2F,我們叫位尋址區(qū),一共占了16個(gè)字節(jié),128個(gè)位,每個(gè)位再對(duì)它進(jìn)行編碼,從20到2F是16個(gè)字節(jié),每個(gè)字節(jié)比如說(shuō)20的地方,每一個(gè)字節(jié)正好我們?cè)俳o它一個(gè)位地址,從00開(kāi)始編碼,一直編到最后,你就變到最后那邊到這個(gè)地方的時(shí)候還沒(méi)有編完,因?yàn)槲覀冞€有特殊功能寄存器取,也就是我們前面定義的一些位變量,比如說(shuō)我們用比特來(lái)定一個(gè)位變量,這個(gè)時(shí)候編譯器會(huì)把它分配在我們的位尋址區(qū)里面,位尋址區(qū)里面的這些字節(jié)除了可以進(jìn)行位尋址,還可以進(jìn)行字節(jié)尋址,但是其它區(qū)域的只能進(jìn)行字節(jié)尋址,就不能進(jìn)行位尋址,就是說(shuō)它既然是位尋址區(qū),它就既可以進(jìn)行位尋址,也可以進(jìn)行字節(jié)尋址,但是這個(gè)地方它就只能進(jìn)行字節(jié)尋址,不能進(jìn)行位尋址,要想進(jìn)行位尋址,要用C語(yǔ)言來(lái)得到不同的。
第三個(gè)是我們的這個(gè)用戶RAM區(qū),這個(gè)區(qū)域里面一共有80個(gè)存儲(chǔ)單元,每一個(gè)單元都有一個(gè)字節(jié)地址,但是它沒(méi)有位地址,而且也沒(méi)有寄存器名,這個(gè)區(qū)域我們主要用來(lái)存放我們的中間的數(shù)據(jù)的一個(gè)結(jié)果,也就是大家定義的變量,大多數(shù)都是存放在這個(gè)用戶RAM區(qū)或者我們叫做數(shù)據(jù)緩沖區(qū),所以需要大家注意,就是第一個(gè)區(qū)工作寄存器區(qū)和第三區(qū)用戶數(shù)據(jù)緩沖區(qū),它只能按字節(jié)進(jìn)行數(shù)據(jù)的存儲(chǔ),但是位尋址區(qū)既可以按字節(jié)也可以按位進(jìn)行存取操作,用內(nèi)部的RAM當(dāng)中,除了低128個(gè)字節(jié),還有高128個(gè)字節(jié),高128個(gè)字節(jié)當(dāng)中特殊功能寄存器區(qū),也就是從80H到FFH,但是51單片機(jī)實(shí)際上只使用了其中的21個(gè)單元,并沒(méi)有用的特別多,有同學(xué)說(shuō)其它單元留著干什么呢?預(yù)留是干什么呢?其它高性能單片機(jī)可以做擴(kuò)展,它會(huì)增加特殊功能寄存器,就像我們做了一個(gè)產(chǎn)品一樣,我們也要預(yù)留,你不能做了一個(gè)你設(shè)計(jì)的一個(gè)產(chǎn)品,比如說(shuō)你寫的代碼正好是兩塊,你不能選一個(gè)存儲(chǔ)空間,就是兩開(kāi)存儲(chǔ)空間,要適當(dāng)?shù)牧粢稽c(diǎn)余地,多留一點(diǎn)防止程序的升級(jí),這樣的話就是說(shuō)我會(huì)預(yù)留一些,所以單片機(jī)發(fā)明的時(shí)候,它只使用了當(dāng)中的21個(gè)單元,也就是定義了21個(gè)特殊功能寄存器,其它的單元都沒(méi)有使用,也就是預(yù)留的,預(yù)留給后續(xù)的單片機(jī),現(xiàn)在高性能單片機(jī)都可以用到更多,而且這21個(gè)單元還是不連續(xù)的,這個(gè)大家也要理解一下。
我們對(duì)單片機(jī)的編程實(shí)際上都是主要通過(guò)這個(gè)特殊功能寄存器的編程來(lái)對(duì)我們51單片機(jī)的內(nèi)部資源進(jìn)行一個(gè)管理,所以像我們管理RO口就是使用的特殊功能寄存器當(dāng)中的P1P0 P2P3,就是通過(guò)它來(lái)控制我們單片機(jī)的內(nèi)部資源,控制RO通過(guò)特殊功能寄存器來(lái)控制的,后續(xù)我們會(huì)陸陸續(xù)續(xù)的介紹其它的特殊功能寄存器,這個(gè)特殊功能寄存器具體的分布,大家感興趣的可以自己再去看看書啊,我們后面陸陸續(xù)續(xù)的會(huì)介紹到不同的特殊功能寄存器,你也可以等著我介紹到的時(shí)候再跟著來(lái)看。
另外一個(gè)需要注意的就是在特殊功能寄存器,它每一個(gè)也都有一個(gè)字節(jié)地址,比如說(shuō)像P0口,它是80向我們的P1口,它是90H,P2口是A0,P3口的話是B0H,大家要注意,就是說(shuō)在字節(jié)地址末位是0或者8的這些特殊功能寄存器,它可以進(jìn)行位尋址,也就是說(shuō)我們剛才講過(guò)低128個(gè)字節(jié)的內(nèi)部RAM當(dāng)中的20到2F可以進(jìn)行位尋址,高128個(gè)字節(jié)當(dāng)中的哪些地址可以進(jìn)行為尋址,是這個(gè)里面字節(jié)地址為第一位為0或者是第一位為8的這些單元,也可以進(jìn)行位尋址,講計(jì)算機(jī),單片機(jī)的這些特殊功能,寄存器用的時(shí)候,我還會(huì)再給大家強(qiáng)調(diào)。
原來(lái)內(nèi)部有兩片的內(nèi)部的這個(gè)RAM,內(nèi)部RAM當(dāng)中有兩個(gè)空間,一個(gè)是低于88個(gè)字節(jié)是我們的用戶這一塊的,另外還有高128個(gè)字節(jié)是保留給單片機(jī)來(lái)用的,而且這高128個(gè)字節(jié)里面只用到了其中的21個(gè)單元,這21個(gè)單元我們每一個(gè)給它起了另外一個(gè)名字,所以幫我們?nèi)グ堰@個(gè)字節(jié)地址給定義了,方便用戶來(lái)使用,而且這21個(gè)單元的又是不連續(xù)的,這21個(gè)單元當(dāng)中,末位地址為0和8的,就是字節(jié)地址低位為0,為0H和8H的,還可以進(jìn)行位尋址,我們51單片機(jī)的整個(gè)的一個(gè)控制管理,或者說(shuō)對(duì)它的單片機(jī)的內(nèi)部資源的操作,都是通過(guò)對(duì)特殊功能機(jī)的操作而操作。
特殊功能寄存器它是一般來(lái)說(shuō)每一個(gè)特殊功能寄存器都是8位,每一個(gè)為我們可以對(duì)它進(jìn)行寫0和寫1,你理解一下特殊功能寄存器這里面寫0和寫7,就相當(dāng)于是我們這個(gè)每一個(gè)為這個(gè)里面做了一個(gè)人,這個(gè)地方里面是有一個(gè)開(kāi)關(guān),做了個(gè)小人幫你去撥開(kāi)關(guān),你給它寫0和寫1,它會(huì)把這個(gè)開(kāi)關(guān)給你接通和斷開(kāi),就是這個(gè)作用,所以我們編程的時(shí)候,實(shí)際上就是這個(gè)里面就是告訴這個(gè)特殊功能寄存器里面這個(gè)每一位里面這個(gè)小人,把開(kāi)關(guān)給我斷開(kāi),還是把開(kāi)關(guān)給我閉合,從而達(dá)到對(duì)我們特殊功能計(jì)算機(jī)的控制,從而通過(guò)對(duì)特殊功能寄存器的控制,達(dá)到對(duì)我們單片機(jī)內(nèi)部資源的一個(gè)控制。
所以把特殊功能寄存器的概念理解清楚了,單片機(jī)的編程就不難了,整個(gè)的單片機(jī)的存儲(chǔ)空間的一個(gè)結(jié)構(gòu)圖,這也就是我要求大家掌握的一張圖,把這個(gè)圖刻到腦子當(dāng)中,并且深刻的領(lǐng)悟我這篇內(nèi)容講的單片機(jī)存儲(chǔ)空間的相關(guān)內(nèi)容,這樣的話,你對(duì)單片機(jī)的這個(gè)理解就會(huì)更深一步,前面理解的單片機(jī)的硬件結(jié)構(gòu)那個(gè)圖,再理解了它的存儲(chǔ)空間的一個(gè)圖,包括RAM內(nèi)部的低128個(gè)字節(jié)的RAM,高180個(gè)自己RAM,也就是我們的特殊功能寄存器,同時(shí)又對(duì)ROM有了一個(gè)深入的理解,內(nèi)部ROM和外部ROM,同時(shí)還要知道這兩個(gè)存儲(chǔ)器,無(wú)論是ROM還是RAM,它的最大的存儲(chǔ)空間,也就是最大擴(kuò)展最大最大不能超過(guò)64K,這個(gè)是因?yàn)槲覀?1單片機(jī)的地址總線是16位的,只能選擇的地址空間分布的范圍是從16個(gè)0到16個(gè)1,所以是不能超過(guò)64K,這個(gè)大家一定要理解。
好了,這一期是單片機(jī)存儲(chǔ)器相關(guān)知識(shí)點(diǎn)的第三期,,也是最后一期內(nèi)容,感興趣可以翻查一下以往的發(fā)文記錄可以找到,喜歡的幫忙收藏點(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健康,萬(wàn)事順利
審核編輯:符乾江
評(píng)論
查看更多