|
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, ~区分是访问内部存储器还是外部存储器地址靠指令来区分。 |
|