STC89C52


關於STC89C52:

1、STC89C52只有512字節的的RAM,包括2部份,一是256字節的內部RAM,二是256字節的外部RAM;STC89C54以上的芯片才有1K的RAM(內256+外1024)。

2、1K的EEPROM(應為2K)出廠時內置有支持串行下載功能的代碼,配合官方下載軟件完成代碼的串口下載。這個區域在實際應用當中也可用於可保存斷電后不能丟失的數據,但實際操作上不能像RAM那樣直接讀寫,需要通過專門的寄存器操作來完成讀寫。

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等,倒過來做。如果嫌麻煩直接使用大模式也行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM