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)
            

你可能感兴趣的:(c51)