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