找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 8|回复: 0
打印 上一主题 下一主题

[硬件] 51单片机RAM 数据存储区学习笔记

[复制链接]

551

主题

1470

帖子

3万

积分

EDA365管理团队

Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

积分
39487
跳转到指定楼层
1#
发表于 2019-9-27 15:09 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

EDA365欢迎您!

您需要 登录 才可以下载或查看,没有帐号?注册

x
1.RAM keil C语言编程* ~( T' f2 H3 y; @9 r/ B, R

! d+ B* m4 t' I8 ^! V: Q6 |3 ?& w
RAM是程序运行中存放随机变量的数据空间。在keil中编写程序,如果当前模式为small模式,如果总的变量大小未超过128B,则未初始化的变量的初值默认为0.如果所有的变量超过单片机small模式下的128B大小,则必须对变量进行初始化,否则超过RAM大小变量的值是不确定的,在small模式下超过128B大小的变量也必须在编译器中重新设定存储器的存储模式。$ P& ~+ N* d, r, q3 M7 U2 C% l

) y) f! z( u3 K# V; y) G( a, P& Z) R' q8 \' u9 f1 U# g" Q
在keil中,可选择small,compact,large三种方式存储数据变量:# u  ^9 q% L2 H0 I' B6 G

* @, d+ T1 W5 w9 `0 ~' B( Q; P2 U- M: d: Q

% w; s3 q+ i% h0 A2 f8 m
/ h0 |9 }; w# A1 V5 k# j, u. G& z" e; t# v; _) l

  H# }" x, T6 M7 v( r! l" ~在keil中可以用“TargetOptions”来配置这一项:* p- l$ e# z* i  p
# V! n/ k6 [8 }$ z3 A9 u
图1 选择数据存储模式; m6 V# q* V9 z1 L& X
. u- j" u3 Z( q' _8 J

, b  b/ b0 v& Z, e2.片内数据存储区0 S9 }9 ]: D$ l+ ]

9 }& M3 Y6 d, u' o7 X& z, ~0 C9 `% F( g$ x# f* l1 T
(1) 工作寄存器区
1 |6 ?' B! ]# `1 V; L, H. X7 J# I. K9 E  A) I" O. m5 |* O  l
* c9 P5 g* j- G" L/ y
工作寄存器区位于片内数据存储器中的00H~1FH单元,共32字节( 如此说来每个单元是一个字节了 ),分成四组。每组8个字节,分别记为R0~R7.+ w# [& f% `) {8 J

/ C. F; e- ~' s程序默认在0区工作寄存器组存放中间运算数据。等待中断来时,中断数据工作寄存器组由0区切换到其它区域。+ }- k# {+ R2 S  X# _" l
0 ?  V' T( O! p3 O: `; n

% ]7 ]- p# l+ d2 A选择四组工作寄存器区的哪一组作为R0~R7由位于PSW寄存器的两位RS1,RS0来确定.
3 l' r$ L; A/ O8 L5 M2 x1 T+ V8 T4 n3 _9 c# S2 X/ E
, e6 p3 ]0 j  U; i; l. U& T: }
RS1,RS0称为区开关或组开关,两位就可决定四种状态.. R! z/ M/ u- }
. Z( r4 |/ |4 U2 e; {5 n
(2)位寻址区
$ f) X- ?% u( {% M! [8 V- P& B$ t2 Q7 y

1 Y) d: ~8 X9 X+ F5 z* p用户存储区位于片内数据存储器中的020H~02FH单元,共16个字节,共128位,每个字节单元的位都有一个单独的地址,分别为00H-07H,如020H.1表示020H单元的bit[1]位。020H~02FH单元可作为位寻址区。这个范围内的存储单元最大的用处就是能进行位操作,在C语言中,只能用位操作运算符(&、|、^、~、<<、>>)来对字节数据进行位操作运算。如果用汇编指令就可以直接对此片存储单片进行位操作。5 \8 z# C1 Y  [' J0 S9 J

. \# `4 k( ~1 f  M6 J& V
( W+ e' ~7 C' s# d3 O! c* j- |如 SETB, 020H.1 就将020H的bit[1]置为了1.
. ^0 Q& _1 x2 y( y7 n0 n4 `9 s1 v
/ j0 C0 M. i- [& @3 O2 d, F2 C% i& C; H
除了RAM此片能进行位寻址的用户存储区以外,还有一些特殊的功能寄存器( SFR )也能进行位寻址。) |3 L$ U, ?3 r6 e+ M' O5 a' R

7 L9 Y! n& E" W) u6 D
2 i- ?; [5 X5 ^7 u2 [(3)数据缓冲区
9 ?  J$ V: c# [% D5 Z% Q* g. R# W  ^4 i% j& Y& P; t
. {- t6 q( s" v# {+ o
51系列数据缓冲区地址为30H-7FH,共80字节。只能字节寻址,不能位寻址。由于工作寄存器和位寻址区,数据缓冲区是统一编址的,所以这三者都可以用作数据缓冲区。! S/ C8 f7 B2 P5 R* J: c

. X* z* a: W6 e5 S3 F+ M
+ F1 Z" m3 o3 x  c4 Y- O" x(4)堆栈* r- |$ i" u& ?* j, t% r, K

0 h! z) g9 \0 O8 v5 S: }4 n; N
/ @' v- i- J) M" [! h栈:由系统自动分配释放,存局部值。, t7 o- @( R9 _/ R5 t3 i. l
9 T4 S  ^/ X. V2 T: n$ t! U

, Q/ P1 K+ G$ m% X; i堆:一般由程序员分配和释放。/ W  \8 o9 }1 r7 w" z( F
; z! i5 Z/ F: d7 O5 |1 |

( W" u) w' U7 e& `' t堆栈指针SP:8位寄存器,堆栈最大可达128单元,只可在片内RAM中进行堆栈操作。% _3 E% ~8 o7 q
: s' h1 O" D/ i. e5 z0 w8 M9 j) t
8 i8 }2 a9 N1 D4 z
堆栈作用:用来保存地址、数据信息、具有先进后出特性,也是一种能存放二进制数据的空间。8 w1 M" v8 ?: y# ~! K! q" M
0 k; m2 k. M) V

) s" B/ R% H3 n+ ~6 U( b# iMC51堆栈采用满顶法向上生成的软件堆栈。
2 p- {1 M3 f, s! q' \! I
7 X8 s; H) g; S$ k+ A# m( Z8 s$ g9 d( ]* u* x; \
软件堆栈:借助SP进行控制操作。( U3 N9 l+ W) ?

5 y* P8 K! s8 P5 n7 B; r9 I% }9 P
5 X# K& q6 \4 L% W) a: w堆栈向上生长:新压栈的数据成为堆栈顶。+ v) ~+ u* W6 z7 H* O2 [6 Q3 P

7 c$ O% X+ h, }( S# j
! i* L: d; f$ R. \- ^- U堆栈向下生长:新压入的数据远离堆栈顶。
8 b: G( v$ Z/ l# z
6 u& K! T5 I/ J+ D
$ m; g$ S, y1 f% A& |$ }7 @地址大小还得看存储方式。
, E3 G# |) q4 I7 a2 }" ]4 q9 }- B0 _# x

7 r* v5 t- G" c4 ]! j9 L(5)专用寄存器区' j! h/ r6 O" h0 S

' U0 z6 a0 {: q# l! e/ o4 A9 H8 j7 _
专用寄存器区,也称特殊功能寄存器区 SFR
5 N2 R3 J' A( C' X; w$ U  i& f$ ~
* D/ c3 n0 v4 }- G1 [
# x3 ?" i- x( Q- |2 p7 P8 ySPECIAL FUNCTIONREGISTER" A. s& \* K0 t) S' C" i
9 B' g/ t7 T8 f; S- m. y

/ G$ x) z3 D' s5 B% f. d" y; Z寻址地址离散地分布在80H~FFH,共128字节的空间.而实际有用的只有21个字节,即在这一空间里只有18个专用功能寄存器,其中有3个专用功能寄存器占用了两个字节.SFR主要用于片内硬件的管理,通常只能以字节为单位借助于MOV指令直接寻址,但也有一些专用功能寄存器可以位寻址。! j- P% R. U0 b$ y/ @* _9 p1 X" P

' K. R( C  M) N# k. W& e* f' t- ]  l6 d
包含程序状态字PSW、数据指针寄存器DPTR、端口地址P0-P0、其它专用寄存器(累加器A、B)# G- m+ Z: q: _/ u: h, d, M

+ J  I1 J9 k1 C. p& W. G5 K+ r- r1 B! {7 L  i9 ?+ k3 s$ l4 R9 ~
3.片外数据存储区" n9 W5 L  w9 D& e3 x2 w. s

4 Z6 I* D5 T! U( v' s8 t
$ x" A5 t' X' a1 R片外RAM区:可寻空间为共64K 0000H~FFFFH,
( M3 U8 t% l0 l  ~3 Q
  \9 D1 S( ?3 ]: P) V8 v; v6 g( ?. N/ d7 ?! E8 ?6 |
总是使用MOVX类指令寻址
1 u2 N8 Y! X2 ]7 a+ k' ]5 Y
  j2 C# u, V$ \, k
" s) [( H4 F2 `: n3 \9 k借助于工作寄存器R0或R1间接寻址时,可寻256字节; i( o# X- r/ h4 D  \' K6 n
1 E1 S, y' U, T: U$ `. |

+ _3 m3 p6 L8 G1 Q- O  S/ X8 x从片外RAM区取数据: MOVX A,@Ri i=0-10 P8 V, J4 i9 a. o
5 O7 Q, K$ ?7 q4 s" K

4 _1 r+ W/ S: @向片外RAM区存数据: MOVX @Ri,A9 j4 [  q: e  ]; @% ?: r
8 V8 w3 x& t; w' M. v0 e

. z& j: R3 \% y  f- O借助16位的数据指针DPTR间接寻址,可寻64K字节:
3 n# k6 S4 S$ `; L+ }
# m& W% L- m/ z* L
5 {: v# u# B- h. H: e从片外RAM区取数据: MOVX A,@DPTR
  R" X7 G! w% e! o4 y1 J: p  q7 p% r% p  k5 y  {! {

6 V: S( e+ L: ^9 f$ r# o* r向片外RAM区存数据: MOVX @DPTR,A
6 o) Z* J5 ~- u& Q' u
8 `9 ~, C1 b) e: B, |  b# q, B  f$ @1 R7 _6 n
区分是访问内部存储器还是外部存储器地址靠指令来区分。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2025-4-7 08:35 , Processed in 0.055971 second(s), 33 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表