原创 51单片机RAM的用法(转)

2009-2-11 11:36 3773 1 1 分类: MCU/ 嵌入式
单片机RAM这样用

任何一本单片机的数据都不会不提存储器的问题,但是没有基本能说的让人一下就领悟过来。菜鸟时候的特权也是一知半解的过来的,我想如果读51的存储器(主要是RAM)做一下归纳,列一张表,我想一定会让初学者少走很多弯路,希望这张表还有下面的一些个人的经验只谈能给你一些启迪。也许有些地方说的不是很专业,或者说是表达不太合适,很欢迎各路高手拍砖指正。EDN这个大家庭就是让我们互相学习共同进步的乐土! PC +lt H  
Uf K7r  
^y?\?  
;Qc}Ns {u  
51单片机存储区分配如下:
J-LHHke-  
%j_zhXt:k  
存储区
v,,N< -k"  
地址范围
HDLJ`KJu  
功能说明
Pfm@md  
YOE'1~P  
sK$?dBZK  
QbVvU&Iy`  
|a [Yn%"y  
`QO&l]T?)  
@}\E~xo'  
r>L\1e \Y  
DJ\oz%;  
$G80'^>kg  
内部RAM
_%|_wk!J_  
ajO(9JP)  
(256Byte)
"6Yjt2  
00H-1FH
xN]T:%j  
内部使用DATA区,四个工作寄存器组(4*8=32Byte),用于内部参数传递
at)6` 4{~  
*I.s%d  
20H-2FH1
S}I|q`g  
_@UO"N3_  
,pK8~+`  
BDATA区,DATA 区的16 个字节的可位寻址区
,T1-[y4C!Z  
|QAX:n'20  
30H-7FH2
U 1B{g`t  
用户可用非位寻址DATA区,可在一个周期内直接寻址
(-Q_w)H  
G_T7Ths/XF  
80H-FFH
L(T/^P ]  
IDATA区,用户可用的内部RAM 区的高128 个字节,必须采用间接寻址
1em<)G1y!  
Z[LG x  
80H-FFH3
N^A?T<xh&p  
可以进行位寻址的特殊功能寄存器(SFR)
kM4dyr]HR  
g8Pb}B3:'  
_(=H?N T  
j^,_4s K  
外部扩展RAM
!atH JOI#  
plL5y@!  
(最大64KByte)
}< y+ni6F  
00H-FFH
F$r-sr.-  
PDATA区,外部存储区的256 个字节通过P0 口的地址对其寻址,需要两个指令周期
,^Lzx1+L|  
RLh5AY'U  
00H-FFFFH4
Nu@FsGT  
XDATA区(外部存储区),使用DPTR 寻址
uccR@pQR  
0M2(vq%F  
ROM
=BzLBZ+  
2>z8k3  
(最大64KByte)
qP e@*h{H  
00H-FFFFH
o?>'Y#Q  
CODE区(程序存储区),使用DPTR 寻址
4#Bv%r  
nJQ|0p[  
K%K"v0l1  
5]x'Fit  
=ULe*On/  
  对上表的一些说明:
6&;>c2F  
sB-AO=|A  
1编程定义为: uchar bdata test;
sW)[o-w  
7L?+ )#6  
  所谓的可位寻址,如果你这么用:if(test^0)…else…;我的经验告诉我编译出来的程序会出错的。
3#I1jF>6%  
+)1d,q@  
我们一般可以这么用:
pAHG,I'+  
C^Abwx?dy/  
先做一个位定义:sbit test0 = test^0;
)YZx)Sd8]V  
Iiu  
然后再程序中使用:if(test0)…else…;表示判断test的第0bit位的值,然后执行相应程序。其它位的用法类似。
""nF[z  
pDpsd_L  
2编程定义为: uchar data test;
?1:~g2Kc  
`!'> o-KG  
  因为data区时直接存取存储,也就是说它在编程的时候最快的RAM区,所以我们往往把使用最频繁或者说对实时性要求高的数据都定义在data区(keil C中是可以设置优先存放RAM区的)。
ky(z"zMb  
pA}M_TkfT  
  Data区包括了4个工作寄存器组(32Byte)、位寻址区(16Byte)、用户data区(80Byte)。其实位寻址区也应该归类到用户可用data区中,所以一般用户可以使用的直接寻址的RAM为96Byte。而实际上,一种比较极端的情况,因为单片机工作时只使用4组工作寄存器组中的一组,我们可编程的data区可以有120Byte(我在keilC下编译测试的结果是,只有在不使用bdata的情况下才可以定义120Byte的data区数据)。
j#HyX7  
c-t-  
3编程定义为: uchar idata test;
~cYE=r  
)2DU p+}  
如果你没有完全弄懂一个MPU的SFR,那么只能说你没有弄懂这个MPU了。所以这里不细说单片机的SFR,只提一点,它的地址是和IDATA区重叠的,单片机内部时通过区分所访问的存储区来解决地址重叠问题的,因为IDATA 区只能通过间接寻址来访问。在我们的实时性要求不那么高,或者DATA区不够用的情况下我们就应该启用IDATA区。
!7iB+2?*  
X\E5w]:k  
4编程定义为:uchar   xdata   LD   _at_   0x7f;
V>*Vm'Uq8  
,A KsFUuH  
也可以这么使用:(需包含头文件absacc.h)
Y:p1_i=>U  
NM,}Ns1'6  
A = XBYTE[0x8100]; //从地址8100H读一个字节
$qOauqZ7  
u/HMc#MF  
B = *((char xdata *) 0x0000); // 从地址0000H读一个字节
XB1PuHgpM  
]zB2NTj  
XBYTE[0x7500] = 0xf0; // 写一个字节到7500H
l@#OqQZ  
@tn,kWs  
  P2和P0口为16bit的地址总线接口,P0口为数据总线口,数据和地址时分时传输的。
f&B4Y8{Gg  
5 >\g z\:|  
51单片机的最后一个存储空间为64K, 和CODE 区一样采用16 位寻址,属于外部数据存储区,即XDATA区。这个区通常包括一些RAM器件(如SRAM)或是一些需要通过总线接口的外围器件(特权在以前的BLOG里多次谈过这个扩展RAM的问题,这里也不多涉及了)。对XDATA的读写操作需要至少两个处理周期来装入地址,而读写又需要两个处理周期。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
1
关闭 站长推荐上一条 /1 下一条