普通 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
阅读(5156) | 评论(2) | 转发(0) |