EDA365电子工程师网
标题:
51单片机RAM 数据存储区学习笔记
[打印本页]
作者:
admin
时间:
2019-9-27 15:09
标题:
51单片机RAM 数据存储区学习笔记
1.RAM keil C语言编程
( P/ O* T( Y8 M( Y! h
2 M$ K& `% R3 t2 I
- c/ x+ F$ ~# Z' p' ?. i, N( x
RAM是程序运行中存放随机变量的数据空间。在keil中编写程序,如果当前模式为small模式,如果总的变量大小未超过128B,则未初始化的变量的初值默认为0.如果所有的变量超过单片机small模式下的128B大小,则必须对变量进行初始化,否则超过RAM大小变量的值是不确定的,在small模式下超过128B大小的变量也必须在编译器中重新设定存储器的存储模式。
! S f1 P7 C9 l: @: r. D+ n& W+ S
7 \* S1 K: E! @! s
: P, b; p1 G& t
在keil中,可选择small,compact,large三种方式存储数据变量:
- f$ W* m0 C# e$ ^" _" B; {2 x( o
& B0 U( l. R0 C. t! j$ I! l
: P. D) ^6 s, j7 O, T. v& j
& Y1 D% Q* n0 H
! c& K K4 _5 G: X* x
7 U2 |" R0 Z0 \0 }$ V$ J
7 E$ W5 D: c3 [7 R
在keil中可以用“TargetOptions”来配置这一项:
+ [6 k& w! H8 n
2 A- ]* G/ `5 O2 r2 d4 _+ F/ k
图1 选择数据存储模式
4 H' F! X- H6 Y: ~
# j! y3 r: o# p3 S& Z
, F/ b( S0 w" F, p$ Z- A7 d
2.片内数据存储区
& N8 d0 z5 x% }; R: x
5 Z8 R+ y' I4 @
2 x" S! g# J* z) m8 t: {; P
(1) 工作寄存器区
, R) q3 s. A! p# \9 i- x
0 @% d: X6 K- S G" @/ H* O7 G
5 T% C3 G7 E1 j) l2 h: L# U3 t
工作寄存器区位于片内数据存储器中的00H~1FH单元,共32字节( 如此说来每个单元是一个字节了 ),分成四组。每组8个字节,分别记为R0~R7.
/ M) W+ b, I) i3 g& W9 x" j
; U7 d+ _& L: o0 ~& V
程序默认在0区工作寄存器组存放中间运算数据。等待中断来时,中断数据工作寄存器组由0区切换到其它区域。
$ f9 U; c1 h; _- ^- R4 ?, l3 v
* Q& ]4 R, w F, Y: I
. ^4 B3 s$ V9 A3 J& x8 a" Y6 N
选择四组工作寄存器区的哪一组作为R0~R7由位于PSW寄存器的两位RS1,RS0来确定.
& g3 h' o% x" _; {4 Y: J9 d
8 D W& g2 ~% u" z7 u/ k
9 r4 w' k' L. |) x4 n% b( M
RS1,RS0称为区开关或组开关,两位就可决定四种状态.
7 ?, O! O, N/ i
3 E' b% ~/ i3 y1 l) `
(2)位寻址区
" K+ H L8 f% W
" d( }9 {' X3 p1 w. n s* k
1 b+ K2 T# \1 a' S2 D% B0 I- b
用户存储区位于片内数据存储器中的020H~02FH单元,共16个字节,共128位,每个字节单元的位都有一个单独的地址,分别为00H-07H,如020H.1表示020H单元的bit[1]位。020H~02FH单元可作为位寻址区。这个范围内的存储单元最大的用处就是能进行位操作,在C语言中,只能用位操作运算符(&、|、^、~、<<、>>)来对字节数据进行位操作运算。如果用汇编指令就可以直接对此片存储单片进行位操作。
' F1 E2 R. I& y! I; T8 }" m8 U: U
' L' f6 V% R0 r% ^1 } ~' Y
5 H" C8 s! Q4 Q; j) {
如 SETB, 020H.1 就将020H的bit[1]置为了1.
$ D# ?& E; m0 I. s) c$ K/ V
8 R% J! S$ Q, [& q
. j3 X7 W5 ^7 B
除了RAM此片能进行位寻址的用户存储区以外,还有一些特殊的功能寄存器( SFR )也能进行位寻址。
$ B7 D: R |! k/ J0 Z, g. l
4 `: K- ?0 S! ?. R. m
( p1 V/ A. U# a2 d- [$ f
(3)数据缓冲区
! P1 Y# M& B# v; |. t
4 j' ?6 H O) O4 h" `6 ^8 J k
# F* \" A2 _2 Z& m4 S. W
51系列数据缓冲区地址为30H-7FH,共80字节。只能字节寻址,不能位寻址。由于工作寄存器和位寻址区,数据缓冲区是统一编址的,所以这三者都可以用作数据缓冲区。
% k$ }" I& a& n
+ k; Z8 M- F/ L. U+ l! O! J
- b& e* K0 R+ g$ N
(4)堆栈
2 H* J6 v3 K7 K; J: X
3 g4 k1 Y" z) D9 Y
1 ?: ?* e) W9 k9 U: N
栈:由系统自动分配释放,存局部值。
! o& T* h( y3 b" D$ p/ p9 {
" a- R$ B U% L6 A' s% ]+ B: j
& ~8 e5 |" @! B$ }; i1 V
堆:一般由程序员分配和释放。
2 i m$ u" i c6 `9 A1 a- A- j
' d# K M8 p5 N
; [& `/ a% q: t7 J- O% g
堆栈指针SP:8位寄存器,堆栈最大可达128单元,只可在片内RAM中进行堆栈操作。
: G4 [) K6 t# C
3 G; O [$ W# ]2 ]; |
* o6 Q$ O9 ?7 M7 `
堆栈作用:用来保存地址、数据信息、具有先进后出特性,也是一种能存放二进制数据的空间。
# G7 ~/ b* ]+ Y+ @
, \. k. l3 b% l, a4 A' E# O5 G9 X
& J2 O9 S0 k& t4 X+ Y
MC51堆栈采用满顶法向上生成的软件堆栈。
6 @7 R& M4 q8 H6 O9 I) T
. E; O- w6 v d, h2 f
5 \+ x1 f( D/ {! [& I7 h* _9 i
软件堆栈:借助SP进行控制操作。
$ e# F; a% Q7 I6 t
) j: {! Q B6 K% m' }! Q& j
4 }' E# e2 J; G \
堆栈向上生长:新压栈的数据成为堆栈顶。
' w+ ?7 o& d% F: ~7 p
. i- c) M* b @- I; Z
; i- k5 _5 j/ O* |5 K% W8 F6 L$ j
堆栈向下生长:新压入的数据远离堆栈顶。
) A% r: |" h4 A9 |# d+ V8 R
. f7 a- y9 a I: u& E/ d$ n
4 `6 Q) D: y2 R$ o \
地址大小还得看存储方式。
' [1 H, |$ j# N& U
6 G5 |$ e) h& J; K
% ~/ C, v" `5 ]
(5)专用寄存器区
# W% p4 `7 K. l8 V" a9 E
8 a0 q/ C8 _9 j9 H
$ i# g* t7 W' o& B& K( H5 n6 n$ Q
专用寄存器区,也称特殊功能寄存器区 SFR
5 `/ a7 o( G9 N5 ?8 _4 S# c% y+ p
+ k+ l O0 N' Y" o! Y0 a
* ], C* l! k- [/ G
SPECIAL FUNCTIONREGISTER
; D8 b" U, Z: a+ w, ~+ V- @% P
- K+ P9 d9 L' m# y% c
" }0 j" U9 i2 W; k0 x' g J
寻址地址离散地分布在80H~FFH,共128字节的空间.而实际有用的只有21个字节,即在这一空间里只有18个专用功能寄存器,其中有3个专用功能寄存器占用了两个字节.SFR主要用于片内硬件的管理,通常只能以字节为单位借助于MOV指令直接寻址,但也有一些专用功能寄存器可以位寻址。
; t" B, I3 `& q% w1 d1 x
" L# x) s# E0 ]# Q3 A3 L: c6 C% [% @
' @/ S8 r, {, \& ?6 X! n; k
包含程序状态字PSW、数据指针寄存器DPTR、端口地址P0-P0、其它专用寄存器(累加器A、B)
3 {: u8 y/ S+ X0 O
' |# K! t D0 O3 h$ S# s
( F. a% `7 F( @2 p' {' B$ r1 A
3.片外数据存储区
3 O4 j3 N l# U! I: ~
; m" U8 }& E- C4 M6 G
1 h `/ j; y1 |, t5 C; U. g" I
片外RAM区:可寻空间为共64K 0000H~FFFFH,
5 @8 b F! I+ Q# _
) ~/ l( o* r% ]1 ?5 F
$ U1 k7 H/ h" G: b T' U! K
总是使用MOVX类指令寻址
i- }+ ^7 j3 ~# w6 r5 P6 c) i$ H# g& {
/ ^' Y/ t: ], l% o, F; R3 o! {
: B$ F, y: B) h# y
借助于工作寄存器R0或R1间接寻址时,可寻256字节
- i5 J5 [3 `( F1 O" ~
8 ?. ^! g, y% {* h, M! I
8 k" m' U" n7 o8 M
从片外RAM区取数据: MOVX A,@Ri i=0-1
d# A2 v$ n- Q( G4 e
; z, S& D: K4 u0 d7 b
* |" c& [1 y1 @. h1 j8 b* r
向片外RAM区存数据: MOVX @Ri,A
0 z% X: ~; ?4 f, A$ R
T/ H( P0 x* ]
/ U* |4 }$ v! J* L4 T
借助16位的数据指针DPTR间接寻址,可寻64K字节:
' r* n% o/ \2 t
2 I4 d8 g, q: N1 m4 ^0 R
. m6 O$ t, |6 ~4 c) x8 k) J3 u: B
从片外RAM区取数据: MOVX A,@DPTR
) H6 U3 ]( Q' m0 z
. s( ^ s! D; |6 a$ R' | B! B+ G3 }# o
k8 X& p# m2 h) v
向片外RAM区存数据: MOVX @DPTR,A
$ U4 e. d8 H4 K9 ?$ `
4 o: O1 b' T" n' W# D
# b' A1 o1 `) z9 t% v
区分是访问内部存储器还是外部存储器地址靠指令来区分。
欢迎光临 EDA365电子工程师网 (http://bbs.elecnest.cn/)
Powered by Discuz! X3.2