单片机存储器扩展实验
① 51单片机扩展外部数据存储器6264,怎么用C语言实现对其操作
2.扩展RAM编程基础
(1)弄清扩展器件的地址
在图7.2.5中,U3的ABC接单片机A13,A14,A15,所以片选信号对应地址最高位,即:“CBAxxxxx xxxxxxxx”(x为任意)。U4片选接CS1,即Y1,CBA=001,可得U4的地址范围是0x2000~0x3fff。U5接CS3,即Y3,CBA=011,地址为0x6000~0x7fff。U6接CS4,即Y4,CBA=100,地址为0x8000~0x9fff。知道了器件地址,可以利用直接地址、外部数据指针来访问存储器。通过设置,也可以让编译器在扩展RAM中自动分配存储单元。
(2)直接地址访问
①向U4写数据:
XBYTE[0x2000+addr]=dat; //addr为U4内部地址,取值为0~0x1fff;dat为数据。
②读出U4数据:
dat=XBYTE[0x2000+addr];
也可以用页访问方式。页访问方式,实际就是先把16位地址高8位送P2口,通过低8位地址读写。
③按页读写U4:
P2=0x20+page; // page为页,取值为0x00~0x1F。
PBYTE[addr]=dat; // addr为页内地址,取值为0x00~0xFF。
dat=PBYTE[addr];
④读U6
dat=XBYTE[0x8000];//读U6,地址取0x8000~0x9fff任何值,都一样。
⑤写U5
XBYTE[0x6000]=dat; //写U5,地址取0x6000~0x7fff任何值,都一样。
(3)数据指针
如,读写U4,可以这样写:
unsigned char xdata *p=0x3000; //声明指针p,并初始指向0x3000单元
x=*p; //读指针所指向的位置
p=p+1; //指针指向下一单元
*p=0x16; //向指针所指向的位置写入数据
(4)让编译器自动分配存储空间
①为了能让编译器自动分配存储空间,并使用扩展RAM,必须设置扩展RAM地址。在Keil编程软件中,点击工具栏快捷图标“ ”,弹出目标选项对话框。按图7.2.6所示,设置RAM起始地址和长度。
②变量声明时使用xdata关键词。如:
unsigned char xdata a;//变量a使用扩展RAM空间。
特别注意,扩展RAM直接地址访问方式与自动分配存储空间方式最好不要混用,否则可能产生冲突。
摘自《单片机控制装置安装与调试》下册,雷林均主编
② 51单片机的外部存储器扩展
是的。
主流的单片机(不包括51)都已经不支持外部存储器扩展了,单片机自带128K的ROM也很常见。
而且51类中,也有不少是不支持外部存储器扩展的。
最后,做为学习,这部分看看就行,了解一下就好了。
对于trousers所说的。
51的外部存储器扩展是把单片机内部的总线外引化,I/O使用不少于8根线。对于一个你说的要完成不同工作的单片机系统,相对是很复杂的,剩下的IO还够用吗?
按你的意思,一个功能复杂到内部128K都装不下的程序,那还用单片机就太费劲了吧,应该用ARM了,但ARM的程序空间就又是一个量级的了,不过,ARM到还是有不少是保留了外部存储器扩展I/O的。
尽管目的是一样的,都是为了扩展外部存储器但你要知道,51刚出现时ROM贵的和金子似的,英特尔不敢在51结构里放ROM,所以才想出外部扩展的主意,现在FLASH ROM都白菜价了,51也不再是单片机的主力,单片机的外部扩展越来越多的变成了内部自带,就51的外部扩展而言早已是鸡肋了,知道有怎么个东西就行。
而ARM扩展只是以防万一,128M(不是128K)的ROM还不够用吗?
万一(岂止是万一,我想是千万分之一)用到了,不陌生,脸熟就行了。
对kxjs。
大哥,你知道51的外部存储器扩展具体是指什么吗?24C02是I2C通讯,51这个直接就是结内部是总线,不是一会事。
以上!
③ 为单片机拓展外部程序存储器时,多片ROM芯片的容量不同如何拓展
拓展外部存储器,通常都会选择相同容量的芯片,因为这样构建译码电路会比较简单。如果因一些特殊需要,必须使不同容量的器件,那要看扩展的存储空间是否要求连接的地址。若必须是连接地址,地址译码电路比较复杂,适合采用CPLD或FPGA等可编程器件来实现。如果每片扩展存储器之间,并不要求连续地址,也可考虑按最大容量器件的地址范围来设计译码。
④ 在8051单片机片外扩展16K*8bit数据存储器,选用6264(8K*8bit)芯片,74LS138为译码器,
需要2片6264,电路图如下:
⑤ 单片机及存储器扩展的设计
电路如图所示,U3地址范围:0000H~7FFFH,U5地址范围:8000H~FFFFH;CPU用89C52,内有8KROM
⑥ 单片机程序存储器扩展电路问题
答:在设计片外程序存储器之前,首先要决定EA引脚的电平。
EA=0,单片机只访问外部程序存储器,对于8031单片机此引脚必须接地.EA=1,单片机访问内部程序存储器,对于内部有程序存储器的8XX51单片机,此引脚应接高电平,但若地址值超过4KB范围,单片机将自动访问外部程序存储器。
设定好EA后,单片机自动按程序所设定的次序执行。
在编程中不需要专门的语句指定调用的是外部程序存储器。比如设定EA接高电平,则程序在执行完片内的程序存储器指令后自动转入片外程序存储器,而无需特殊命令。这就是所谓的程序存储器是片内外统一编址,而数据存储器则用Mov和Movx分别对待的。
但楼主要知道程序在读取片外指令代码时的过程:先寻址,再取数。单片机会根据PC的值先给P2和p0送一个选通地址(PC的值),接下来从片外程序存储器读取代码。因为PC的值一般是连续的,这就要求片外的程序存储器空间要连续分布,这和数据存储器不同。如果不连续分布,就要用特殊的行号改变PC的值,使它和片外程序存储器分布能够对应。