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