51单片机同时外扩RAM,ROM的具体实现及Keil的具体设置

发布者:未来架构师最新更新时间:2016-05-27 来源: eefocus关键字:51单片机  外扩RAM  ROM  Keil 手机看文章 扫描二维码
随时随地手机看文章
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)
              以上是宏定义的原型函数,定义在 #include 头文件中
              #defme xxx XBYTE[0x8000]    //变量类型为unsigned char 类型的数据xxx,位置xdata 0x8000
              yyy=XBYTE[0x8000];              //变量类型为unsigned char 类型的数据yyy,位置xdata 0x8000
        (在这里,有网友提到,当编译器优化时,用绝对地址定位的变量,可能导致变量在连续读取时出
          错,采用解决方法:
          a,将编译器优化调整为0,即不优化,程序不用修改,做以下操作
               >>选择project窗口的Target,然后打开"OptionsforTarget” 设置对话框,选择“C5l”选项卡,
               将“Code Optimiztaion”中的“Level”选择为“0:Costant folding”。再次编译<<
          b,修改变量定义,增加“volatile”关键字说明其特征:就是说明该变量具有‘挥发’性,每次的读取都一
               有意义的,这样编译器即使在优化时,编译后的代码也不会省略掉重复读取的过程。如:
                unsigned char volatile xdata xxx_at_0x8000;
               由上文XBYTE等的宏定义函数原型可以看出,该宏定义已经说明了变量具有volatile特性,因此,
                                                                                                    也可以直接用XBYTE定义所需要的变量
          c,硬件解决办法
               以上解决方法为参考网络文章)
*扩展ROM时的函数定位函数一部分在内部ROM,一部分在外部ROM中
        函数定位,个人理解:当一个完整功能的程序存储在外部内部ROM中时,即利用了内部ROM,可能由于内部ROM空间不够,部分函数在外部中,这时,如果要执行整个功能,就需要告诉编译器,其他功能函数的地址(函数在外部ROM中的地址),此时就要用到函数定位功能。解决方法如下:
....待续.....
        51内部ROM地址范围0x0000~0x0FFF,所以外部ROM的地址为0x1000~~最大0xFFFF。
                c51bbs有详细介绍
        编写完整的程序(如果建立两个工程,堆栈等可能分配位置不同,导致地址重复或多个地址出错),
编译后查看.M51文件,找到需要定位的函数名称信息(如?PR?_BCD2HEX?TOOLS),在KEIL51工程选项---BL51 lacate中code项中加入:?PR?_BCD2HEX?TOOLS(0x1000)再次编译工程,打开.M51文件会发现?PR?_BCD2HEX?TOOLS已经定位在了0x1000位置了。
        如果有多个程序需要定位,方法同上,找出函数的名称信息,添加到BL51 locate的CODE项中,每个函数之间用逗号隔开。而且要注意,所要定位的多个函数根据定位设置之前的地址高低安排,仍旧是低地址函数在前,高地址函数在后。
        程序分为两部分存储,需要做的设置等如下:
....待续.....
        完成函数定位设置后,由于函数是要烧录在两个ROM中,需要将HEX文件分割成两个,内部ROM空间范围与外部ROM空间范围是不一样的,自然就应该将内部ROM的地址范围的HEX代码存储为一个文件,将剩余部分的代码存储为另一个文件,就完成了分割。
       例如HEX文件的0x0000~~0x0FFF地址划分为一个文件,0x1000~~0xFFFF划分为另一个文件。
       这一点,如果所用的MCU的内部ROM大小不一致,就需要根据具体的大小划分分割HEX文件。
*编译器设置
        由于是内部ROM和外部扩展ROM同时使用,在工程选项off-chip memory中需要设置外部ROM地址范围,如eprom start:0x1000 size:0xFFFF(根据具体ROM大小设置size,同时use on-chip memory选项不选,电路中EA接高电平)
*扩展ROM,所有程序都在外部ROM中
        51内部ROM不够用,但外部扩展的ROM应该足够了,所以,在扩展了ROM之后,尽量避免编程麻烦,所有功能均放在外部ROM中,此时需要的设置操作等如下:
....待续.....
        由于程序代码只用到了外部ROM,程序编译等不需要特殊的设置,按正常编译。然后将整个代码烧录到外部ROM就可以了。也就不存在HEX文件分割的问题了。
*编译器设置
        由于只用到了外部ROM,在工程选项off-chip memory中需要设置外部ROM地址范围,如eprom start:0x0000 size:0xFFFF(根据具体ROM大小设置size,同时use on-chip memory选项不选,电路中EA接低电平),这里的设置不同与内外部ROM都用的情况,没有使用内部ROM的情况下需要地址从0x0000开始,程序的开始地址中断向量等都在这里(具体参考内部ROM地址的使用)。EA接低电平表示程序是从外部ROM开始读起的,即不用内部ROM。
扩展ROM,RAM时,总线地址如何安排*
在扩展了ROM,RAM时,总线地址要如何安排,具体怎样设置呢?操作如下:
......待续.......
       在程序设计时,要考虑硬件连接。例如,在外部ROM,RAM的地址设置时(keil工程选项中),假设P15初始化置1了或在程序中,P15为1时WR RD信号才时序正常(使用了74门电路),则keil工程选项中的地址设置就要考虑工作状态P15是0或1的情况了。页选信号就是从这里这样而来的,P15页选或地址线高字节页选。
*硬件连接,需要考虑的问题
扩展ROM,RAM时,硬件需要则样连接?总线上的时续,总线设备的速度匹配问题?
.......待续........
       使用总线方式连接扩展设备时,51总线有固定的时序,时序也就决定了速度。比如每个读写的过程,相应的信号持续时间长短,扩展设备能否在这个周期内完成工作,是需要51的总线时序和扩展设备的时序匹配才可以的。
关键字:51单片机  外扩RAM  ROM  Keil 引用地址:51单片机同时外扩RAM,ROM的具体实现及Keil的具体设置

上一篇:51单片机ROM与RAM
下一篇:与51单片机扩展有关的知识点

推荐阅读最新更新时间:2024-03-16 14:55

DDR3内存销售进入倒计时 三星下月开始量产
5月15日消息,据国外媒体报道,三星电子公司正在为DDR3内存芯片的发布做最后准备,三星将在今年晚些时候正式销售DDR3内存芯片。 三星公司周一称,英特尔公司已经校验了一部分DDR3内存芯片和模块。这种校验旨在检测新内存芯片与英特尔电脑芯片组的兼容性,它是芯片发布前的最后步骤之一。 DDR3是人们期待已久的DDR2内存芯片的更新换代产品,现在绝大多数电脑采用DDR2。新芯片将提供高达1.6Gbps的数据传输速度,是DDR内存带宽的两倍。这意味着可以更好地发挥多内核处理器的3D图形和多线程应用功能。DDR3芯片消耗的电力也更少,芯片电压约为1.5伏,低于DDR2的1.8伏,这意味着可以延长笔记本电池的工作时间。 三星公司表示,它
[焦点新闻]
基于8051单片机制作一个酒精测试仪
我们经常看到交警在查司机酒驾的时候,会使用酒精测试仪来检查他们是否受酒精影响。其实,酒精测试仪其实很容易制作,以下是如何自制具有3位显示输出的酒精测试仪。当然,毕竟是作为简单案例使用,所以准确度要差点。 在本文中,使用8051单片机的呼吸分析仪电路,它从呼吸中输出血液酒精含量(BAC)。“酒精含量的百分比”在3位七段显示器上以百分比显示。使用的单片机是8051系列的AT89S51和酒精传感器MQ135气体传感器。 一、MQ135气体传感器电路 MQ135是一款稳定灵敏的气体传感器,可检测氨、二氧化碳、酒精、烟雾、二氧化氮等。该传感器由氧化铝微管内的二氧化锡敏感层、测量电极和管状铝壳内的加热元件组成。传感器的前端用不锈钢网覆
[单片机]
基于80<font color='red'>51单片机</font>制作一个酒精测试仪
keil 5 如何安装stm32f4的库
最近要用stm32f407芯片写程序,但是我的keil5之前只用过stm32f1系列的库,因此需要下载安装 单击下面图标 然后按下图操作: 最后点击install(安装),这时下载,但是有可能很慢,因此也可以直接用下面百度网盘的资源,下载下来直接安装即可。 链接:http://pan.baidu.com/s/1kV5M4gn 密码:s58x 参考:http://bbs.elecfans.com/forum.php?mod=viewthread&ordertype=2&tid=1149749
[单片机]
<font color='red'>keil</font> 5 如何安装stm32f4的库
C51单片机的定时器计数器怎么用?
方法有很多的,给你一个,你可以调试一下,你可以通过不同的晶振去计算定时器初值,如果你懂定时器这部分很好调通的 #include sbit p1_0=P1^0; int i; //全局变量 void timing(void) //晶振为3.6864M { TMOD|=0x01; //定时器T0,工作方式1 TH0=0xC3; TL0=0xC7; //这两个寄存器存的是计数器的计数开始的值,这两个值累加至溢出后正好是50ms ET0=1; //使T0中断可以溢出 EA=1; //开启总中断 TF0=0; //溢出位清零 TR0=1; //开启T0 } /********定时中断
[单片机]
诺基亚5新版上架:3GB内存+骁龙430
 在今年的MWC移动通信大会上,HMD带来了一款入门手机诺基亚5,它的定位低于诺基亚6。   配置方面,它采用了5.2英寸720P显示屏,搭载高通骁龙430处理器,配备2GB内存+16GB存储,前置800万+后置1300万像素摄像头,电池容量为3000mAh。   该机上市价格为189欧元,约合人民币1400元。如今时隔大半年,HMD带来了新版诺基亚5。   据外媒GSMArena报道,今天印度电商Flipkart上架了诺基亚5新版,它比普通版多了1GB内存,其它规格保持不变,售价为13499卢比,约合人民币1400元。   从规格和配置来看,该机性价比一般。当然,它不会在国内市场开卖,我们看看就好。   目前HMD已确认,诺基
[手机便携]
技巧 1 -- 在 Keil C51 中增加 STC 型号
有的单片机是 STC 型号的,在 Keil C51 中建立工程的时候,没有对应的芯片型号 解决办法: 去 STC 官网,下载 STC 型号插件,这里给出 115 网盘的提取码作为备用: 对于 Keil uVision2(简称 uv2),插件提取码:bewxzw9o# 对于 Keil uVision3(简称 uv3),插件提取码:bewxzsp6# 对于 Keil uVision4(简称 uv4),官网没有,使用 uv3 的就可以 使用方法: 在 Keil C51 安装路径中的 UV2(或 UV3、UV4)文件夹内,有 uv2.cdb(或 uv3.cdb、uv4.cdb)文件; 对于 uv2 版本:备份 uv
[单片机]
技巧 1 -- 在 <font color='red'>Keil</font> C51 中增加 STC 型号
51单片机教程:按键输入、矩阵按键(按键巧用)proteus仿真+keil
IO口原理 (P1口最简单,所以这里只介绍P1,其他IO口原理类似) P1口原理 可以看到的是P1口的工作原理比较简单,首先用P1口做输入输出较为好理解。 1、内部总线:就是内部P1.X位寄存器的值,比如说内部总线P1.0上电压为0V,那么对应P1.0=0;内部总线P1.0上电压为5V,那么对应P1.0=1; 2、P1.X引脚:对应单片机引脚接口 3、读锁存器:读锁存器为1,允许读锁存器。为0,不允许读锁存器。 4、读引脚:为0不允许读引脚,为1允许读引脚 5、写锁存器:提供一个上升沿锁存数据(写数据到单片机IO口上时自动提供一个脉冲) 几个核心问题: 1、读锁存器与读引脚区别是什么? 读锁存器:读锁存器Q的电平 读引脚:
[单片机]
<font color='red'>51单片机</font>教程:按键输入、矩阵按键(按键巧用)proteus仿真+<font color='red'>keil</font>
8051单片机中的寄存器是算CPU还是RAM
问题:单片机8051中的一些寄存器到底算CPU的还是RAM的? 请高手指点,像累加器DPTR,A,PSW等一些寄存器是属于CPU的,但书上又说他们都属于RAM中的特殊功能寄存器(SFR),这是什么道理? 另外,存储器和寄存器不是两个功能,结构都不同的东西么?为什么RAM中存在许多寄存器组,即二者在此是相同的? 综合理解:有以下几种可能: 1、CPU是一个抽象的概念,如同操作系统这个概念一样没有明确的界线;(cpu是由人划分出来的一块区域不明确) 2、CPU这个概念不适用与51; 3、51可以划分CPU和RAM部分,但CPU和RAM有交叉的部分(比如寄存器组等) 4、CPU部分寄存器是和RAM统一编址,访问该RAM地址即等于
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved