STC89C52微控制器的內外的RAM,ROM的討論

2021-07-04 01:19:57 字數 3260 閱讀 6155

關於stc89c52: 

1、stc89c52只有512位元組的的ram,包括2部份,一是256位元組的內部ram,二是256位元組的外部ram;stc89c54以上的晶元才有1k的ram(內256+外1024)。

3、eeprom不是rom,也不是ram,eeprom也沒有用作ram--你先這樣記,這個問題說起來內容比較多,後面細談。

4、flash程式儲存器8k就是當rom用(這句話嚴格的講應該說成「flash程式儲存器8k就是當程式儲存器用」)

:基本上是這樣。關於rom、falsh後面細說。 是否需要1k的ram:可在編譯完成後觀察編譯結果,如果能編譯成功,應該有類似下面的資訊:「program size:data=9.0,xdata=1,code =2345」,其中data的整數部份就是你實際需要的內部ram位元組數,xdata是你實際需要的外部ram位元組數,code是**長度。你可以根據這個資訊選擇最合適的stc微控制器型號。具體到stc89c52:data<256,xdata<256,code<8192就行對上述的一些概念補充說明(包括_at_)

1、51微控制器的c語言中有個需要關注的概念就是變數或資料的儲存模式(pc機是否有類似的情況我不了解)。在c51中的儲存模式是data、bdata、idata、pdata、xdata、code共6種:

data、bdata、idata:就是說變數或資料位於微控制器的內部ram中(st89c52有256位元組),訪問速度最快。

pdata、xdata:就是說變數或資料位於擴充套件的外部ram中(st89c52內整合了256位元組),相對內部ram訪問速度要慢。

code:就是程式**,位於微控制器的程式儲存其中(st89c52內含8192位元組)

keil c編譯時在有個選項叫資料儲存模式(memory model),如果

選擇小模式,則程式中的變數一般會放在內部ram(data)中,選擇其它模式則會放在外部ram(xdata或pdata

,採用這兩種儲存模式的變數在物理上都放在外部ram中,只是定址方式有所不同,整體上pdata更快些);當然,如果在定義變數時就宣告了儲存模式,編譯時會根據宣告決定該變數在哪個區。比如:char data flag就是指定將flag放在內部ram中;char xdata flag _at_0x0000則指定放在外部ram中,而且位址是0x0000。 "_at_" 用於指定變數在記憶體中的位址。指定位址的方法優點在於除錯方便,比如**單步執行時可以直接到該位址去更直觀的觀察變數的實際變化情況,若不指定則編譯器會自己決定放在什麼地方,只能通過.m51檔案去獲取該變數的位址了。其缺點則是容易出錯,由於人為的因素,可能會成各變數的位址重疊。所以實際應用中一般都不指定位址,編譯器會自動安排的,除非是特殊要求。 這裡針對內部ram和外部ram再說幾句:早先的微控制器(8031、8032)外部ram和程式儲存器都需要通過p0口p2口來擴充套件的,51微控制器本身沒有哪怕是1個位元組的外部ram,擴充套件起來很麻煩。後來隨著發展才演變到現在幾乎所有的微控制器都或多或少的整合了ram和程式儲存器,這樣大多數應用只需要設計功能電路就可以了,不需要再去擴充套件,這就降低了不少成本。

2、關於flash、rom、prom、eprom、eeprom、ram 我們現在一般都會把微控制器的程式儲存器叫rom,早先的硬體程式**確實是放在rom型的器件中(包括電腦的bios),所以rom就是程式、程式就是rom,大家都理解,就成習慣了。其實這是不對的,真正的rom現在很少用了。

下面就這幾個名詞解釋一下: 

ram:一般都叫記憶體,特點是讀寫速度快,但斷電後資料丟失(後5種斷電後資料不丟失)

rom:唯讀儲存器。特點是只能讀,其內容在晶元出廠時就已經固化,如果有錯只能扔掉

prom:可程式設計唯讀儲存器。特點是實際應用中只能讀,但應用產品生產環節可由使用者來完成對晶元的程式設計,只能寫1次,有錯的話下場同rom。 

eprom:可重複擦寫的唯讀儲存器。特點是實際應用中只能讀,但可以通過紫外線擦除(也有電擦除的),從而實現再程式設計,只是程式設計時一般需要將晶元取下來在專用裝置上擦除、程式設計(電擦除的雖然可以在使用者系統上實現擦除及程式設計,但必須設計專門的擦除程式設計電路)。上世紀90年代基本上都採用的是這種模式,如果你看到某個晶元上有個小玻璃窗,一般就是這種工藝的晶元。紫外線擦除需要15分鐘的時間,也很麻煩,而且映像中程式設計次數只有1000次。

eeprom:可重複擦寫的非易失性儲存器。特點是可讀可寫,且斷電後資料不丟失。採取這種工藝的晶元大多數都是通過iic匯流排模式來訪問的。但其容量一般都不大,適合於資料不多的應用。

flash:可重複擦寫的非易失性儲存器。特點是可讀可寫,且斷電後資料不丟失。

與eeprom的主要區別在於口線更多、儲存容量更大、速度更快,還有就是擦寫方式不同:eeprom可按位元組擦寫,而flash是塊擦寫模式

,所以速度上falsh的讀寫更快。 stc微控制器為什麼要採取eeprom的模式而不採用flash我不知道,可能是因為eeprom相對成本較低,而且可以直接用作非易失性儲存,不需要使用者外擴eeprom了

在stc89c52非常感謝你,我說下我的理解:在memory model下設定compact,程式中就可以直接char i;預設的就是用的xram?不設定memory model,預設small,不過我在程式裡面用pdata,編譯後,也會使用xram?program size: data=159.1 xdata=0 code=5628這個data=159.1是不是編譯時候檢測到的變數定義使用ram情況,不包含程式處理中堆疊和區域性變數的使用?我要使用xram用idata還是pdata?data不夠我要儲存陣列怎麼用?

1、在memory model下設定compact,程式中就可以直接char i;預設的就是用的xram? 對。就是在外部ram,不過應該是pdata,只是訪問方式和xdata不一樣,這點可以不用關心。2、不設定memory model,預設small,不過我在程式裡面用pdata,編譯後,也會使用xram? 沒錯!3、program size: data=159.1 xdata=0 code=5628這個data=159.1是不是編譯時候檢測到的變數定義使用ram情況,不包含程式處理中堆疊和區域性變數的使用? 區域性變數肯定包含在裡面,堆疊我說不大好,沒有在如此的極限狀態下用過。不過如果編譯能通過說明堆疊、區域性變數等都夠用。所以在建立工程前應選擇好晶元。4、我要使用xram用idata還是pdata? 用xram應使用pdata或xdata。idata和data都屬於內部ram,只是idata採用的是間接訪問模式,data是直接訪問模式,效率上後者更高。 5、data不夠我要儲存陣列怎麼用 編譯時可以選擇small模式,然後宣告陣列是用比如:uchar xdata xx[100],就行了,這樣的話其它的變數都會使用內部ram,只有陣列由於宣告了xdata會放到外部ram中。其實這也是常規做法,只有內部變數不夠的時候才會選用中模式或大模式,然後相提高**效率時,再將那些區域性變數什麼的去宣告為data、idata等,倒過來做。如果嫌麻煩直接使用大模式也行。

STC89C52微控制器RAM模式

stc89c52 微控制器內變數 函式引數等資料在ram中的儲存模式 small compact large 前邊介紹微控制器資源的時候,我們提到過 stc89c52 共有 512 位元組的 ram,是用來儲存資料的,比如我們定義的變數都是直接存在 ram 裡邊的。但是微控制器的這 512 位元組的...

微控制器 STC89C52的最小單元

stc89c52rc是stc公司生產的一種低功耗 高效能cmos8位微控制器,具有 8k位元組系統可程式設計flash儲存器。stc89c52使用經典的mcs 51核心,但做了很多的改進使得晶元具有傳統51微控制器不具備的功能。在單晶元上,擁有靈巧的8 位cpu 和在系統可程式設計flash,使得s...

51微控制器(一) 初學STC89C52微控制器

1.cpu運算器和控制器 微控制器的核心構成部分之一 2.內部資料儲存器存放可讀的資料,如程式中的定義。3.程式儲存器8kb,0000h 1fffh 存放程式,原始資料。4.定時 計算器3個定時器 計算器,即可設定成計數方式用於外部事件計數,也可以設定成定時模式,用於對微控制器的計時控制。5.並行埠...