找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 7|回复: 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语言编程. s( ^) _, q. x. i( Z
7 ~; W* I( s/ b1 g4 G/ L

, w& B* z0 x" U; iRAM是程序运行中存放随机变量的数据空间。在keil中编写程序,如果当前模式为small模式,如果总的变量大小未超过128B,则未初始化的变量的初值默认为0.如果所有的变量超过单片机small模式下的128B大小,则必须对变量进行初始化,否则超过RAM大小变量的值是不确定的,在small模式下超过128B大小的变量也必须在编译器中重新设定存储器的存储模式。( o& n$ t- z; E, o4 n8 |

" z+ L2 k% d: _* l; z8 k4 c
! c* ^: g/ @& q& G' V) u在keil中,可选择small,compact,large三种方式存储数据变量:8 A1 k) _/ v+ r# }/ e

7 `) i7 a# o, _1 ]
" z" Q0 P$ K7 z& B: K$ _0 ?1 O; H+ M0 F9 S/ V: I8 r9 v( V2 a6 v9 Z1 j

5 ?! k" B& j& J9 _
1 N0 n% @5 t8 f# K
/ a5 y. u. l* a  R; p0 N在keil中可以用“TargetOptions”来配置这一项:: p( a/ ^2 v- \

" Y+ ^" b  J% \3 o7 v: @, s0 _: G图1 选择数据存储模式
! w) \, K0 R* K/ ]) b. u& ?6 I" K) ?8 ~2 G, U7 L6 T& w

/ [( _& |2 A" j5 r( z6 z+ F, k; {+ E2.片内数据存储区
. _6 t( x# f: G. h1 Y9 I' W
/ m, a2 K5 t2 J3 @6 j' F( N$ W: i. B6 b3 `2 o; A% h
(1) 工作寄存器区1 i0 \6 b0 L+ ~$ t# o  `
! |8 J& G0 R( b1 k7 U& q) H8 ?

1 u. i, U7 U9 G/ _% o- H( E工作寄存器区位于片内数据存储器中的00H~1FH单元,共32字节( 如此说来每个单元是一个字节了 ),分成四组。每组8个字节,分别记为R0~R7.( N8 p$ l- b7 A: W& G

1 C  _/ D. b& ]  Z程序默认在0区工作寄存器组存放中间运算数据。等待中断来时,中断数据工作寄存器组由0区切换到其它区域。- `  L% E3 t  S, M& z! ?" I

1 M. C, T* Y- T" _6 z3 o3 ^
5 u! S5 c/ O3 K+ K选择四组工作寄存器区的哪一组作为R0~R7由位于PSW寄存器的两位RS1,RS0来确定.
- B5 J/ k. T  ]3 M2 ^0 e
7 e# T- ]: |0 A
/ {3 }/ d, b3 g- |8 V' x3 O9 _4 lRS1,RS0称为区开关或组开关,两位就可决定四种状态.4 [+ F0 h% w2 r  `

5 b3 T1 C! `; W& g' Q& H(2)位寻址区; o5 s: `: f5 u! ]: _+ t9 r; l4 i- J

* p3 S# Q4 c+ \- F7 p9 w
5 M( |9 z8 t* B* B  K* [用户存储区位于片内数据存储器中的020H~02FH单元,共16个字节,共128位,每个字节单元的位都有一个单独的地址,分别为00H-07H,如020H.1表示020H单元的bit[1]位。020H~02FH单元可作为位寻址区。这个范围内的存储单元最大的用处就是能进行位操作,在C语言中,只能用位操作运算符(&、|、^、~、<<、>>)来对字节数据进行位操作运算。如果用汇编指令就可以直接对此片存储单片进行位操作。
3 w1 w' T; c! C3 [+ j: N; n# y8 j1 q5 n) B0 K4 l: v
! J: g5 p7 U# p) k: p/ B; u
如 SETB, 020H.1 就将020H的bit[1]置为了1.
0 G0 X6 F0 n  y7 ]/ N
( C. a9 y$ {% T3 O: g5 F
0 [& D3 ~5 e6 e" `1 d除了RAM此片能进行位寻址的用户存储区以外,还有一些特殊的功能寄存器( SFR )也能进行位寻址。; }7 r  n& E) u8 o5 \, ~: O
4 Q  Z) T/ W% o8 A
$ }- ^9 m* m; N, F: v6 T: b4 n
(3)数据缓冲区
# V& Y) w6 R) g" v: }0 G' Z, S* X; y* \! ]
4 @2 }) E" o/ x; y* o7 C  }! U
51系列数据缓冲区地址为30H-7FH,共80字节。只能字节寻址,不能位寻址。由于工作寄存器和位寻址区,数据缓冲区是统一编址的,所以这三者都可以用作数据缓冲区。/ d0 O8 p! S5 y

7 Z7 N7 Y& u3 F2 L) b* E5 G; @
1 c) G# U4 N4 F(4)堆栈$ z( \3 e" d% a/ o& H9 Q% f

1 w' d& P: f# v4 `" m" K0 P( k
' i! o+ o" H7 p3 e" E栈:由系统自动分配释放,存局部值。
6 \1 Z+ g9 l5 y" }5 P/ Q* M, V$ Y! Y* C- p4 M/ Q

* M9 p% l7 b. L堆:一般由程序员分配和释放。
6 b% H. k- _! b- o' R$ A& K2 V# j! {2 c) n3 }2 L& w5 F

% R5 E: u5 ?. P3 C/ G堆栈指针SP:8位寄存器,堆栈最大可达128单元,只可在片内RAM中进行堆栈操作。6 K8 D1 I$ {1 K5 x% }6 W9 L; L2 [2 F
+ Y$ q) g, r7 [! r: x+ N
/ D, _$ t, H/ V1 r
堆栈作用:用来保存地址、数据信息、具有先进后出特性,也是一种能存放二进制数据的空间。
. G( i2 p5 k" l( l6 h3 e* c
# V: Z, S% Z8 T- f, Y
3 t4 f  _, D+ ^MC51堆栈采用满顶法向上生成的软件堆栈。
. g* ]* a# R6 X( g  {' |; B
0 l& y$ n% Y- F# l4 r2 O# [/ O. V+ E1 [
软件堆栈:借助SP进行控制操作。; U2 t- o" [- x; K* U: _$ F+ {! ^

. g' h- j$ n2 a; M8 b
  T9 K7 u7 n  |, U堆栈向上生长:新压栈的数据成为堆栈顶。  y' U1 H& j2 j! C, k" U' Z2 q
7 V: Z" Z2 n# C  q8 H" i  ?

5 T3 d5 s$ p) I9 d- g5 w堆栈向下生长:新压入的数据远离堆栈顶。, O/ C8 w% b4 B( w8 _
2 N7 Y* V1 ^7 y' {! z
" h, [8 |/ V" w' A
地址大小还得看存储方式。1 m0 d0 l* v; J, A, _

2 N8 w" _+ z/ e9 z
! p3 r8 [! v4 u& m; t; }5 i! l5 q(5)专用寄存器区
7 U- y7 w! ~$ j) |, S# A9 X$ t( j

8 B+ U/ M9 }+ S  ~8 i' s; r专用寄存器区,也称特殊功能寄存器区 SFR4 x  P0 k( x4 e8 Q: A

. o7 I9 H& T7 q0 o2 ~" h
) B5 s6 P, A' \5 M' E8 A% ISPECIAL FUNCTIONREGISTER
: U8 A1 I! @; M  L' H1 Z& e
" F* l; _% h$ W2 g, p' B1 I4 s' ?6 j8 ~5 X+ R* a. J- {" f
寻址地址离散地分布在80H~FFH,共128字节的空间.而实际有用的只有21个字节,即在这一空间里只有18个专用功能寄存器,其中有3个专用功能寄存器占用了两个字节.SFR主要用于片内硬件的管理,通常只能以字节为单位借助于MOV指令直接寻址,但也有一些专用功能寄存器可以位寻址。( [! Q: h: I  ]' p
8 {1 T# ]# x8 t7 U0 E; o
8 N, L3 f% a0 R: n$ f
包含程序状态字PSW、数据指针寄存器DPTR、端口地址P0-P0、其它专用寄存器(累加器A、B)
8 j# T2 A- }- x7 y) R6 B# n, m8 x- u: C- @! U

7 C5 ~; T8 |) u( Z9 u( J3.片外数据存储区
5 P+ \+ f" A" T% p: o: {$ C
* j$ X1 t- a* D. T2 X9 _8 Q& [2 ^; I$ O/ n, G* T$ i$ g2 i5 s
片外RAM区:可寻空间为共64K 0000H~FFFFH,; f8 Q" g7 B. d, v0 E# A% g7 P+ P/ c
! s' B% ^& O  h! t; f4 E4 C5 @% q* C

  g( s3 U1 C5 Z4 f0 \6 w总是使用MOVX类指令寻址, g, a/ m1 Z9 p; X- e
$ K. A0 X( G# z- X( z

. X, r$ I  l  y借助于工作寄存器R0或R1间接寻址时,可寻256字节9 Z# H7 o1 E+ C" E* ?# g% w
1 D1 {1 y* x) f) ?  J- s

: {0 M" V4 L; e; b, }0 p" K从片外RAM区取数据: MOVX A,@Ri i=0-1
6 ]3 z! H7 n& T2 g* q8 ]" g  P4 W2 Q7 B+ Y( k1 e1 v# o& k
. ~' ]6 L/ u% o
向片外RAM区存数据: MOVX @Ri,A. @, d! O$ |) _$ K8 i
. x% T- }$ V3 _  P

% p' f8 z& u- n3 k- V% G- [借助16位的数据指针DPTR间接寻址,可寻64K字节:( l1 n* ]3 h, z$ K$ A% G( W

& r0 e; T9 H6 _5 e  s, s4 U, }2 B+ V/ Y6 e( H! Y1 Y+ d
从片外RAM区取数据: MOVX A,@DPTR
+ J9 J- |5 A4 H9 ~5 F5 U
: H! d2 h# |( g  x; F  h
/ |) f' K4 W# }/ ?* y: V7 K向片外RAM区存数据: MOVX @DPTR,A
& P3 ]! Q* O4 a9 f; i& i, @8 w
6 D( V1 r; j! M& S4 b3 B! ]
: v! \  P' h5 m9 Q区分是访问内部存储器还是外部存储器地址靠指令来区分。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-4-6 12:33 , Processed in 0.056476 second(s), 32 queries , Gzip On.

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

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

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