1. 程式人生 > >51微控制器 同時擴充套件ROM,RAM的具體實現及kiel的具體設定

51微控制器 同時擴充套件ROM,RAM的具體實現及kiel的具體設定

51MCU內部有RAM,ROM,不同於8031。儘管如今的增強行51MCU的內部RAM,ROM可能已經很大的空間。但就技術而言,擴充套件RAM,ROM還是需要學會的。
        對於不同的設計方案需求,擴充套件可能基於以下任何一種設計:
        A,只擴充套件RAM
        B,只擴充套件ROM
        C,擴充套件ROM,RAM
****************************匯流排擴充套件時,P2口是否可用做普通IO口************************************
   這種擴充套件是基於匯流排擴充套件的,所以,P0P2口就已經不可以再做它用了(有網友提供資訊,匯流排擴充套件P2還可以做普通IO口用,有兩種可能:1,P2口複用,如同P1利用373鎖存器。2,在匯流排擴充套件時,只用到了低地址匯流排,P2口未用到。就作為普通IO口應用。由於技術還不到位,不做評論。)
*******************************************擴充套件RAM****程式************************************************

       擴充套件RAM,在程式中定義的xdata型別 XBYTE型別等地址範圍在外部RAM的變數,對其讀寫的過程。用C51語言編寫程式,且使用匯流排擴充套件的RAM,則時序電路不用考慮,WR RD等訊號由編譯器/硬體自動完成。
**************************************編譯器設定*****************************************
       內部RAM:0x00~~0xFF
       外部RAM:0x0000~~0xFFFF
       RAM的地址雖重複,但是兩個RAM是沒有關係的,所以不會造成干擾
       使用了外部RAM,就在工程選項---off-chip xdata memory中設定 start:0x0000 size:0xFFFF(根據具體的RAM大小設定size)。
*******************************擴充套件RAM時的變數定位及連續讀取問題*********************************

       ROM,RAM的擴充套件時,需要用到變數的絕對地址定位,函式定位等。
       變數的絕對地址定位,是由於在程式中可能需要即時讀取某個變數,但變數的型別可能是XDATA,儲存在外部RAM中。這裡有兩個方法:
      1,用 _at_ 定位 關鍵字定位
              unsigned char xdata xxx _at_ 0x1100   //定義變數XXX資料型別xdata,位置0x1100
              [memory_space]tepe variable_name _at_ constant;
              ***絕對地址的變數不可以被初始化;函式或BIT型別的變數是不可以被定義為絕對地址;
       2,用 XBYTE 定位 巨集定義 絕對地址訪問

              #define CBYTE((unsigned char volatile code*)0)
              #define DBYTE((unsigned char volatile idata*)0)
              #define PBYTE((unsigned char volatile pdata*)0)
              #define XBYTE((unsigned char volatile xdata*)0)
              ////////////////////////////////////////////////////////////////////////////
              #define CWORD((unsigned int volatile code*)0)
              #define DWORD((unsigned int volatile idata*)0)
              #define PWORD((unsigned int volatile pdata*)0)
              #define XWORD((unsigned int volatile xdata*)0)