前边介绍单片机资源的时候,我们提到过 STC89C52 共有 512 字节的 RAM,是用来保存数据的,比如我们定义的变量都是直接存在 RAM 里边的。但是单片机的这 512 字节的 RAM在地位上并不都是平等的,而是分块的,块与块之间在物理结构和用法上都是有区别的,因此我们在使用的时候,也要注意一些问题。
51 单片机的 RAM 分为两个部分,一块是片内 RAM,一块是片外 RAM。标准 51 的片内 RAM 地址从 0x00H~0x7F 共 128 个字节,而现在我们用的 51 系列的单片机都是带扩展片内 RAM 的,即 RAM 是从 0x00~0xFF 共 256 个字节。片外 RAM 最大可以扩展到 0x0000~0xFFFF 共 64K 字节。这里有一点大家要明白,片内 RAM 和片外 RAM 的地址不是连起来的,片内是从 0x00 开始,片外也是从 0x0000 开始的。还有一点,片内和片外这两个名词来自于早期的 51 单片机,分别指在芯片内部和芯片外部,但现在几乎所有的 51 单片机芯片内部都是集成了片外 RAM 的,而真正的芯片外扩展则很少用到了,虽然它还叫片外 RAM,但实际上它现在也是在单片机芯片内部的,我们的 STC89C52 就是这样。以下是几个 Keil C51 语言中的关键字,代表了 RAM 不同区域的划分,大家先记一下。
data:片内 RAM 从 0x00~0x7F
idata:片内 RAM 从 0x00~0xFF
pdata:片外 RAM 从 0x00~0xFF
xdata:片外 RAM 从 0x0000~0xFFFF
大家可以看出来,data 是 idata 的一部分,pdata 是 xdata 的一部分。为什么还这样去区分呢?因为 RAM 分块的访问方式主要和汇编指令有关,因此这块内容大家了解一下即可,只需要记住如何访问速度更快就行了。
我们定义一个变量 a,可以这样:unsigned char data a=0,而我们前边定义变量时都没有加 data 这个关键字,是因为在 Keil 默认设置下,data 是可以省略的,即什么都不加的时候变量就是定义到 data 区域中的。data 区域 RAM 的访问在汇编语言中用的是直接寻址,执行速度是最快的。如果你定义成 idata,不仅仅可以访问 data 区域,还可以访问 0x80H~0xFF 的范围,但加了 idata 关键字后,访问的时候 51 单片机用的是通用寄存器间接寻址,速度较 data会慢一些,而且我们平时大多数情况下不太希望访问到 0x80H~0xFF,因为这块通常用于中断与函数调用的堆栈,所以在绝大多数情况下,我们使用内部 RAM 的时候,只用 data 就可以了。
对于外部 RAM 来说,使用 pdata 定义的变量存到了外部 RAM 的 0x00~0xFF 的地址范围内,这块地址的访问和 idata 类似,都是用通用寄存器间接寻址,而如果你定义成 xdata,可以访问的范围更广泛,从 0 到 64K 的地址都可以访问到,但是它需要使用 2 个字节寄存器DPTRH 和 DPTRL 来进行间接寻址,速度是最慢的。
我们的 STC89C52 共有 512 字节的 RAM,分为 256 字节的片内 RAM 和 256 字节的片外RAM。一般情况下,我们是使用 data 区域,data 不够用了,我们就用 xdata,如果希望程序执行效率尽量高一点,就使用 pdata 关键字来定义。其它型号有更大的 RAM 的 51 系列单片机,如果要使用更大的 RAM,就必须得用 xdata 来访问了。
关键字:51单片机 片内RAM 片外RAM
引用地址:
51单片机的片内RAM和片外RAM的区别
推荐阅读最新更新时间:2024-11-06 09:04
基于51单片机和FPGA的简易数字存储示波器设计
l 引言 与传统模拟示波器相比.数字存储示波器不仅具有可存储波形、体积小、功耗低,使用方便等优点,而且还具有强大的信号实时处理分析功能。在电子测量领域,数字存储示波器正在逐渐取代模拟示波器。但目前我国使用高性能数字存储示波器主要依靠国外产品,而且价格昂贵。因此研究数字存储示波器具有重要价值。借于此,提出了一种简易数字存储示波器的设计方案,经测试,性能优良。 2 数字存储示波器基本工作原理 数字存储示波器与模拟示波器不同在于信号进入示波器后立刻通过高速A/D转换器将模拟信号前端快速采样,存储其数字化信号。并利用数字信号处理技术对所存储的数据进行实时快速处理,得到信号的波形及其参数,并由示波器显示,从而实现模拟示波器功能
[单片机]
AT89S51单片机的详细资料介绍
很多初学51单片机的网友会有这样的问题:AT89S51是什么 书上和网络教程上可都是8051,89C51等!没听说过有89S51 ! 这里,初学者要澄清单片机实际使用方面的一个产品概念,MCS-51单片机是美国INTE公司于1980年推出的产品,典型产品有 8031(内部没有程序存储器,实际使用方面已经被市场淘汰),8051(芯片采用HMOS,功耗是630mW,是89C51的5倍,实际使用方面已经被市场淘汰)和8751等通用产品,一直到现在, MCS-51内核系列兼容的单片机仍是应用的主流产品(比如目前流行的89S51,已经停产的89C51等),各高校及专业学校的培训教材仍与MCS-51单片机作为代表进行理论基础学习。 有
[单片机]
51单片机矩阵键盘例程
#include reg52.h code unsigned char table ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //表:共阳数码管 0-9
#define DAT P1 /按键值数据口
sbit key0=P1^0; sbit key1=P1^1; sbit key2=P1^2; sbit key3=P1^3; sbit key4=P1^4; sbit key5=P1^5; sbit key6=P1^6; sbit key7=P1^7;
#define DATA_number P2 //数码管数据口
//------
[单片机]
基于51单片机的电子记分牌C程序编程
#include reg52.h sbit r1=P2^0; sbit r2=P2^1; sbit h1=P3^0; sbit h2=P3^1; void delay(unsigned char x); char scank(); void display(char); unsigned char dispcode ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90}; void main() { char num=0,keynum; while(1) { keynum=scank(); num=num+keynum; if(num 0) n
[单片机]
51单片机DHT11温湿度传感器
DHT11是一款有已校准数字信号输出的温湿度传感器。 精度湿度+-5%RH, 温度+-2℃,量程湿度20-90%RH, 温度0~50℃。 一.电路连接分析 1.引脚图 2.接线图 DHT11 器件采用简化的单总线通信。单总线即只有一根数据线,系统中的数据交换、控制均由单总线完成。单总线通常要求外接一个约 5.1kΩ 的上拉电阻,这样,当总线闲置时,其状态为高电平。由于它们是主从结极,只有主机呼叫从机时,从机才能应答,因此主机访问器件都必须严格遵循单总线序列,如果出现序列混乱,器件将不响应主机。 二.数据采集分析 1.数据总时序 用户主机(MCU)发送一次开始信号后,DHT11 从低功耗模式转换到高速模式,待主机
[单片机]
51单片机——EEPROM
24C02:256 个字节的 EEPROM。一般情况下,EEPROM 拥有 30 万到 100 万次的寿命。基于 I2C 通信协议的器件。I2C 是一个通信协议,它拥有严密的通信时序逻辑要求,而EEPROM 是一个器件,只是这个器件采样了 I2C 协议的接口与单片机相连而已,二者并没有必然的联系,EEPROM 可以用其它接口, I2C 也可以用在其它很多器件上。 1、EEPROM写数据流程 第一步,首先是 I2C 的起始信号,接着跟上首字节,也就是我们前边讲的 I2C 的器件地 址,并且在读写方向上选择“写”操作。 第二步,发送数据的存储地址。24C02一共 256 个字节的存储空间,地址从 0x00~0xFF,我们想把数据存
[单片机]
51单片机开发系列之1602字符液晶显示
从51单片机入门,对流水灯有了一定的认识后,就可以进入学习显示类的外设驱动,因为学习时往往需要直接验证、跟踪结果,显示类的外设可以把代码运行情况以非常直观的方式反馈回来。因此,笔者此处首先分析讲解1602字符型液晶的使用。 1. 1602字符型液晶概述 1602字符型液晶能够同时显示16列2行共32个字符信息。其内部已经存储了不同的点阵字符图形,包括阿拉伯数字、英文大小写、常用符号等。每个点阵字符图形都有一个固定的代码,与我们使用的ASCII码是一致的。例如大写英文字母’A’的代码为0x41,只需在需要显示的地址位置写入数据0x41即可显示出字符’A’。可用于一些简单信息交互的设计。 2. 硬件原理图 1602需三根
[单片机]
89C51单片机定时器控制的流水灯
/*************************************************** Copyright: 2014-02-11.version1.0 File name: timer.c Description: 定时中断控制的流水灯 Author: lxl Version: version1.0 Date: 2014.02.11 History: 无 ****************************************************/ #include reg51.h char a=0xff; int num=0; /**********************************
[单片机]