首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

51单片机片外扩展RAM

51单片机片外扩展RAM

.概述

普通51单片机可以片外扩展ROMRAM64K字节的空间,在实际应用中很少扩展外部ROM,一般都是扩展RAM,因为普通51单片机的内部RAM实在太少,只有128-256字节,处理数据量较大时往往不够用。而片外扩展RAM需要占用P0口、P2口和P3.6、P3.7,消耗了18IO口,导致IO口又不够用。为了解决以上矛盾,大容量的51单片机(增强型51单片机)应运而生,这种单片机一般内置1K-16KRAM16K-64KROM,价格也相对昂贵。在某些情况下,用普通51单片机通过片外扩展RAM要比直接使用增强型51单片机更能节约成本。所以,学习51单片机片外扩展RAM是很有必要的。

.电路设计

WSF-51DB开发板上,扩展了32K RAMHM62256B),地址锁存芯片用74HC573。如果片外扩展RAMP0口作为数据和地址低字节的复用端口,不需要加上拉排阻,当然,加上拉排阻也没有影响。需要注意的是,当使用片外扩展RAM时,P0口和P2口最好不要接有其他资源。访问外部扩展的32K RAM只用到15根地址线,所以用P2.7作为地址锁存器74HC573的使能引脚和HM62256B的片选。如下图,为了减少交叉连线,74HC573作了向下翻转,看起来有些别扭。








.软件设计

/**************************************************************************

*程序名称: 51单片机片外扩展RAM测试

*程序功能: 把数据写入片外RAM,再从片外RAM读取数据,点亮P1口的8LED

*开发工具:WSF-51DB开发板

* MCU型号:AT89S52-24PU

*时钟频率:12MHZ

*程序作者: 吴师傅

*版权说明:吴师傅版权所有,转载请注明来源地址和作者。

**************************************************************************/

#include<reg52.h>

#include <ABSACC.h>//包含片外存储空间绝对地址访问函数:XBYTE[]

sbit oe=P2^7;//片外RAM芯片片选和地址锁存器74HC573使能

unsigned char code ramdata[100]= //定义100个数据

{

     0,1,2,3,4,5,6,7,8,9,

        10,11,12,13,14,15,16,17,18,19,

        20,21,22,23,24,25,26,27,28,29,

        30,31,32,33,34,35,36,37,38,39,

        40,41,42,43,44,45,46,47,48,49,

        50,51,52,53,54,55,56,57,58,59,

        60,61,62,63,64,65,66,67,68,69,

        70,71,72,73,74,75,76,77,78,79,

        80,81,82,83,84,85,86,87,88,89,

        90,91,92,93,94,95,96,97,98,99

};

//延时ms函数:

void Delayms(unsigned int t)

{

          unsigned int i,j;

          for(i=t;i>0;i--)

                   for(j=120;j>0;j--);

}



//主函数:

int main(void)

{

         unsigned char i;

         oe=0;//使能RAM芯片片选和地址锁存器

         for(i=0;i<100;i++)

                     XBYTE[300+i]=ramdata;

//100个数据写入片外RAM,起始地址为:300

         while(1)

         {

                for(i=0;i<100;i++)

                {

                       P1=XBYTE[300+i];//从片外RAM读取数据,点亮P1口的8LED

                       Delayms(500);

                }

          }

          return 0;

}
返回列表