您的位置 首页 模拟

单片机RAM的用法

任何一本单片机的数据都不会不提存储器的问题,但是没有基本能说的让人一下就领悟过来。菜鸟时候的特权也是一知半解的过来的,我想如果读51

任何一本单片机的数据都不会不提存储器的问题,可是没有基本能说的让人一下就领会过来。菜鸟时分的特权也是一知半解的过来的,我想假如读51的存储器(主要是RAM)做一下概括,列一张表,我想一定会让初学者少走许多弯路,期望这张表还有下面的一些个人的经历只谈能给你一些启迪。或许有些当地说的不是很专业,或许说是表达不太适宜,很欢迎各路高手拍砖纠正。EDN这个大家庭便是让咱们互相学习共同进步的乐园!

51单片机存储区别配如下:

存储区

地址规模

功用阐明

内部RAM

(256Byte)

00H-1FH

内部运用DATA区,四个作业寄存器组(4*8=32Byte),用于内部参数传递

20H-2FH1

BDATA区,DATA 区的16 个字节的可位寻址区

30H-7FH2

用户可用非位寻址DATA区,可在一个周期内直接寻址

80H-FFH

IDATA区,用户可用的内部RAM 区的高128 个字节,有必要选用直接寻址

80H-FFH3

能够进行位寻址的特别功用寄存器(SFR)

外部扩展RAM

(最大64KByte)

00H-FFH

PDATA区,外部存储区的256 个字节经过P0 口的地址对其寻址,需求两个指令周期

00H-FFFFH4

XDATA区(外部存储区),运用DPTR 寻址

ROM

(最大64KByte)

00H-FFFFH

CODE区(程序存储区),运用DPTR 寻址

对上表的一些阐明:

1编程界说为: uchar bdata test;

所谓的可位寻址,假如你这么用:if(test^0)…else…;我的经历告诉我编译出来的程序会犯错的。

咱们一般能够这么用:

先做一个位界说:sbit test0 = test^0;

然后再程序中运用:if(test0)…else…;表明判别test的第0bit位的值,然后履行相应程序。其它位的用法相似。

2编程界说为: uchar data test;

由于data区时直接存取存储,也便是说它在编程的时分最快的RAM区,所以咱们往往把运用最频频或许说对实时性要求高的数据都界说在data区(keil C中是能够设置优先寄存RAM区的)。

Data区包含了4个作业寄存器组(32Byte)、位寻址区(16Byte)、用户data区(80Byte)。其实位寻址区也应该归类到用户可用data区中,所以一般用户能够运用的直接寻址的RAM为96Byte。而实际上,一种比较极点的状况,由于单片机作业时只运用4组作业寄存器组中的一组,咱们可编程的data区能够有120Byte(我在keilC下编译测验的结果是,只要在不运用bdata的状况下才能够界说120Byte的data区数据)。

3编程界说为: uchar idata test;

假如你没有彻底弄懂一个MPU的SFR,那么只能说你没有弄懂这个MPU了。所以这儿不细说单片机的SFR,只提一点,它的地址是和IDATA区堆叠的,单片机内部时经过区别所拜访的存储区来处理地址堆叠问题的,由于IDATA 区只能经过直接寻址来拜访。在咱们的实时性要求不那么高,或许DATA区不够用的状况下咱们就应该启用IDATA区。

4编程界说为:ucharxdataLD_at_0x7f;

也能够这么运用:(需包含头文件absacc.h)

A = XBYTE[0x8100]; //从地址8100H读一个字节

B = *((char xdata *) 0x0000); // 从地址0000H读一个字节

XBYTE[0x7500] = 0xf0; // 写一个字节到7500H

P2和P0口为16bit的地址总线接口,P0口为数据总线口,数据和地址时分时传输的。

51单片机的最终一个存储空间为64K, 和CODE 区相同选用16 位寻址,归于外部数据存储区,即XDATA区。这个区一般包含一些RAM器材(如SRAM)或是一些需求经过总线接口的外围器材(特权在曾经的BLOG里屡次谈过这个扩展RAM的问题,这儿也不多触及了)。对XDATA的读写操作需求至少两个处理周期来装入地址,而读写又需求两个处理周期。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/moni/257428.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部