找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 10|回复: 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语言编程& @1 \5 z9 K- d+ M

5 j/ J4 o. ^5 b7 \" D7 r8 `+ q  I7 B( u
RAM是程序运行中存放随机变量的数据空间。在keil中编写程序,如果当前模式为small模式,如果总的变量大小未超过128B,则未初始化的变量的初值默认为0.如果所有的变量超过单片机small模式下的128B大小,则必须对变量进行初始化,否则超过RAM大小变量的值是不确定的,在small模式下超过128B大小的变量也必须在编译器中重新设定存储器的存储模式。: ?& R$ H' c7 w3 k9 C4 b
2 z0 F( k6 ?# T/ R5 c
1 T% ]+ x/ |; P  I  ]# O0 K' J
在keil中,可选择small,compact,large三种方式存储数据变量:
" E  H  q9 F6 i" Q5 l4 B$ P6 y- V7 z$ Y6 H% ]$ o9 A( p! x

  g- ?# `; J" H2 n  f* B& e( c4 p! G7 ]

! Z- P9 W: G2 ]: y
+ G  ~4 D; G: y. X. P9 m/ G6 N- b* N2 R% Y
在keil中可以用“TargetOptions”来配置这一项:
3 M7 g% z" a) ~8 K8 p/ b
/ V% z7 J  x$ {6 ?; \5 P图1 选择数据存储模式# @5 F# I! M% V* g

7 j8 L3 R7 K7 u1 M7 D/ J7 k! o: B( h# K' G2 ^% I
2.片内数据存储区( {" T$ F2 o3 J' C" C; z) j4 y0 n% |( b

2 b6 ]2 t& C* j
% ^. u7 P% Y' K/ @, A7 }: S(1) 工作寄存器区
6 G' Q6 o9 w7 h; c# M: ~
, M3 x: b0 y% U. B5 j* d; A1 E. A
4 h$ c+ d7 S4 s1 u8 A" ~& n4 o* q4 q工作寄存器区位于片内数据存储器中的00H~1FH单元,共32字节( 如此说来每个单元是一个字节了 ),分成四组。每组8个字节,分别记为R0~R7.. Y3 o! m  |* B# W  v# }& J
- i* o: _, p0 p; `& D# A% k5 d& e
程序默认在0区工作寄存器组存放中间运算数据。等待中断来时,中断数据工作寄存器组由0区切换到其它区域。: h- O2 R# |0 ?3 |* q5 r
& b6 V, j8 w4 |% g0 p. w

' n) E, V( M) I( o& u7 [选择四组工作寄存器区的哪一组作为R0~R7由位于PSW寄存器的两位RS1,RS0来确定.
+ G* X+ F; c) Z
5 d! `- {( D; O, A& F7 \7 G
& U& X+ G7 v- B% _' n) d3 c5 `% KRS1,RS0称为区开关或组开关,两位就可决定四种状态., a* m  ^+ F2 q- o; P9 q' z

- D4 a: o7 _1 ~. {+ j6 \  ?(2)位寻址区
) v/ t1 J7 U: {0 e! }, Y
' ^, }; P/ T: x
! l1 {/ L0 c2 l' b用户存储区位于片内数据存储器中的020H~02FH单元,共16个字节,共128位,每个字节单元的位都有一个单独的地址,分别为00H-07H,如020H.1表示020H单元的bit[1]位。020H~02FH单元可作为位寻址区。这个范围内的存储单元最大的用处就是能进行位操作,在C语言中,只能用位操作运算符(&、|、^、~、<<、>>)来对字节数据进行位操作运算。如果用汇编指令就可以直接对此片存储单片进行位操作。
! `* J6 q7 V! ^" o5 u( A8 D* Q$ B
0 p. {; O+ V+ x; ~
% F8 L- E+ K' j+ k0 e" l7 D; l如 SETB, 020H.1 就将020H的bit[1]置为了1.
! {% h0 {  Q0 |6 r3 t+ b0 \* p$ I+ l0 M; j7 V, J: U4 u) m
) }2 Q- T; m; ~3 F4 u9 l
除了RAM此片能进行位寻址的用户存储区以外,还有一些特殊的功能寄存器( SFR )也能进行位寻址。) J- n3 n/ I. E" p0 x3 l
( S. A, U# V' b, M1 ?% |
2 H- c. ^2 }; E9 p  Y8 N1 D
(3)数据缓冲区% v. t2 v" _) S/ T8 O3 e
! F3 ~4 h- @  }) H, ]* B$ y

' U8 I* }4 H# C+ }" k3 x8 {8 S" ~51系列数据缓冲区地址为30H-7FH,共80字节。只能字节寻址,不能位寻址。由于工作寄存器和位寻址区,数据缓冲区是统一编址的,所以这三者都可以用作数据缓冲区。. l) ?/ T) E1 O% ?: U
& ?$ a8 w' |% e8 d, G% P7 \

% c0 S% o. O4 n  c(4)堆栈
! G: K' n& F( y# o! f( P+ m. z- H$ c/ H# `8 ?, _1 w7 |
  e! B. B* Z) w9 N+ g  s3 h; T
栈:由系统自动分配释放,存局部值。! `- B# b. o8 e0 w

6 ?$ W6 y' |+ f
* i5 h) a4 x0 Q( Y+ A4 L堆:一般由程序员分配和释放。
4 F' r9 D: K- s- w/ o7 ^# ^$ S4 N" k" E) U/ g+ `. p& V

5 y) b; a7 O+ u$ y. ]* _& Z# e堆栈指针SP:8位寄存器,堆栈最大可达128单元,只可在片内RAM中进行堆栈操作。- I. T7 F5 w9 m; ?* {1 K1 T: p9 L# S3 I" Y
# C. [" g% W8 I+ y8 ^5 U8 n2 Z

, i3 P- L% T9 q: |堆栈作用:用来保存地址、数据信息、具有先进后出特性,也是一种能存放二进制数据的空间。
( u6 W! H, G& t. S
# n& @. j1 \2 y# M# f* O% A+ V( d+ g1 W
MC51堆栈采用满顶法向上生成的软件堆栈。; F6 {' g$ u* N$ j" Y( G$ X* O
" n/ e8 o3 a1 t; n6 B
9 v7 a& v) ?. [; R" |: v( |2 k
软件堆栈:借助SP进行控制操作。
! B5 s" Q2 H$ x& A; r
8 }/ R- l( E/ F0 t
% K) ?" o% p& H) u堆栈向上生长:新压栈的数据成为堆栈顶。& v2 V  l6 K1 f1 B* w
' R6 [% O& t0 h5 A

! n- a. e4 P, T% \7 t; s堆栈向下生长:新压入的数据远离堆栈顶。7 G, R  O; v& P6 x) c
) \8 D3 y; d2 P& A- y- x
# i) \3 T6 @! Y! x6 _
地址大小还得看存储方式。% B2 m& h* v, ]9 d  R! i
! p) W$ [7 r1 s1 w0 \

. k1 ]2 v) N: F# \. ]; X# L(5)专用寄存器区) f, V  D& @* ]: g# B; [

0 ^& s5 V  }  F* B7 I" E/ @6 ]$ Q  L* b+ u) ]! G9 ]# g
专用寄存器区,也称特殊功能寄存器区 SFR! l* l! y. _" d# @  i  R5 J
1 c8 }3 d2 B# k0 O* z) B" k+ m* J

  h0 ]" |% r7 B" q. lSPECIAL FUNCTIONREGISTER6 I: t* U$ V8 t: I9 h$ _* e2 P
6 i& z! K6 N) L' R7 g
7 d3 c3 g2 Z; b; q* M5 F1 X4 D
寻址地址离散地分布在80H~FFH,共128字节的空间.而实际有用的只有21个字节,即在这一空间里只有18个专用功能寄存器,其中有3个专用功能寄存器占用了两个字节.SFR主要用于片内硬件的管理,通常只能以字节为单位借助于MOV指令直接寻址,但也有一些专用功能寄存器可以位寻址。# |5 b# E. a: \! D7 w
9 ^! X, O2 {: F/ T0 A) o

0 ^* N6 J. T3 X; V包含程序状态字PSW、数据指针寄存器DPTR、端口地址P0-P0、其它专用寄存器(累加器A、B)( n/ K, \2 C) m1 q' u0 N
. ^% ~  f8 `9 S, Y3 q
# A* Q7 R. l( f
3.片外数据存储区
$ w( m1 l" U4 p8 R5 }6 ~8 i. Q' w5 w, c! v4 _/ Y/ N
0 {# u( B! n1 U: q
片外RAM区:可寻空间为共64K 0000H~FFFFH,; u7 u' P% J  Q, y

! y/ C" T6 P! I: s$ O* `5 J2 G* {( T1 x; y
总是使用MOVX类指令寻址2 h3 D5 ~( G4 ]) S* B0 i6 p
& L/ e. |  G+ P+ ^
  R& w$ x( _1 ?/ ]$ Y) f
借助于工作寄存器R0或R1间接寻址时,可寻256字节; ?: @& l+ c/ [6 e7 ?- L. X7 a: Z
" W; ^  T" o$ y# N, ^

% W6 u9 v( G: A+ H  J" a6 T) Z从片外RAM区取数据: MOVX A,@Ri i=0-1/ R9 |1 m; t& B+ ^
) o: S2 g3 j  l, R; q/ n" i" Z% e2 l
& ~0 N1 N$ a4 J. i6 o
向片外RAM区存数据: MOVX @Ri,A
# U: d  Q$ E7 v
6 `* {+ s- [9 i3 h6 A& N
1 S+ ~, F6 I/ k6 C$ e7 R借助16位的数据指针DPTR间接寻址,可寻64K字节:
  o: _" R" k" G* e9 C1 [5 t$ m. A6 D4 ]' }6 ~; q7 r8 m- o

# \$ N% M" o/ B; v# [从片外RAM区取数据: MOVX A,@DPTR
% y+ y8 @2 {9 R7 g% [8 C: a. H& m1 Q* l0 \
, Q: Z- F# M3 l7 H' l
向片外RAM区存数据: MOVX @DPTR,A
" V0 G* q9 f1 |5 C) K% X
* s, b- p- s( |: ~3 d; A% G
0 w& t2 N7 ]8 {* r/ J, ~区分是访问内部存储器还是外部存储器地址靠指令来区分。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-4-9 17:38 , Processed in 0.059787 second(s), 32 queries , Gzip On.

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

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

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