Chinaunix首页 | 论坛 | 博客

分类: LINUX

2013-01-06 18:52:41

    普通 89C51,89C52 系列单片机的内部 RAM 只有 128(89C51)/256(89C52) 供用户使用。
(1)低 128 字节的内部RAM(地址:00H-7FH),可直接寻址或间接寻址(data/idata)
(2)高 128 字节的内部RAM(地址:80H-FFH),只能间接寻址(普通89C51没有)。(idata)
(3)特殊功能寄存器 SFR(地址:80H-FFH),只能直接寻(data)
    特殊功能寄存器 SFR 和高 128 字节的内部 RAM 是通过寻址方式来区分的,传统的 8051 系列单片机只有 128-256 字节 RAM 供用户使用。STC 在一些单片机内部增加了RAM。STC89C58RD+ 系列单片机扩展了 1024 个字节 RAM,STC89C52RC 系列单片机扩展了 256 个字节 RAM。
   
  
    对于一个大型系统显然这点 RAM 是不够用的,因此需要考虑外扩 RAM,这里我选用 DS1230Y 系列芯片,总共可以扩展 32K SRAM。对于 STC 系列单片机,片内已经扩展了一些 RAM,如果地址有重叠,应将片内扩展的 RAM 禁止掉。

单片机外扩 RAM 原理图:

   
           
AT89C51 测试程序:
unsigned char xdata table[20] = "ds1230y test!";
/* 外部晶振11.0592M,设置波特率9600 */
void uart_init(void)
{
    SM0 = 0;
    SM1 = 1;
    TMOD = 0x20;
    TH1 = 0xfd;
    TL1 = 0xfd;
    TR1 = 1;
    REN = 1;
}
void send_char(unsigned char dat)
{
    SBUF = dat;
    while(!TI);
    TI = 0;
}
void send_str(unsigned char *p)
{
    while(*p != '\0')
    {
        send_char(*p);
        p++;
    }
}   
void main()
{
    uart_init();
    send_str(table);    //输出定义在外部扩展 RAM 上的数据
    while(1);       
}
   
STC89C52RC 测试程序:

unsigned char xdata table[20] = "ds1230y test!";
/* 外部晶振11.0592M,设置波特率9600 */

void uart_init(void)
{
    SM0 = 0;
    SM1 = 1;
    TMOD = 0x20;
    TH1 = 0xf3;
    TL1 = 0xf3;
    TR1 = 1;
    REN = 1;
}
void send_char(unsigned char dat)
{
    SBUF = dat;
    while(!TI);
    TI = 0;
}
void send_str(unsigned char *p)
{
    while(*p != '\0')
    {
        send_char(*p);
        p++;
    }
}   
void main()
{
    uart_init();
    AUXR |= (3<<0);     //禁止片内扩展的 RAM
   
send_str(table);    //输出定义在外部扩展 RAM 上的数据   
    while(1);       
}

                       ——忠于梦想 勇于实践    linux_xpj@opencores.org
阅读(5097) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

skyfox_lai2013-01-21 19:16:57

skyfox_lai2013-01-21 19:16:57