找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 6|回复: 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语言编程4 J2 I4 b' `, b
' a! g8 }& d  w( N3 N' w* h
3 l0 M4 W1 e7 j, ?, T% v8 S/ S
RAM是程序运行中存放随机变量的数据空间。在keil中编写程序,如果当前模式为small模式,如果总的变量大小未超过128B,则未初始化的变量的初值默认为0.如果所有的变量超过单片机small模式下的128B大小,则必须对变量进行初始化,否则超过RAM大小变量的值是不确定的,在small模式下超过128B大小的变量也必须在编译器中重新设定存储器的存储模式。
  p' D. e$ u/ @3 {1 G' u" N# h6 c! D9 w0 ]- p' Y4 C0 f& B+ B
0 _' z, c* F2 P4 Z
在keil中,可选择small,compact,large三种方式存储数据变量:6 O3 S' q6 `% j

7 H  e- B8 f1 w( |: j
8 I; h0 R2 i+ R; f) A# B2 @$ y
9 ^( M. I& A$ @' i( M4 j
. P' U: M0 p% ?) J6 d7 P8 f3 J0 R% {. [) w
' v, S3 g( s6 f$ O
在keil中可以用“TargetOptions”来配置这一项:* f) H) r) V$ C- b+ k- P; S
& P3 L1 S. A5 [
图1 选择数据存储模式, C# h" k5 K! A; v
6 y! ^& P/ ]1 B& m& z: b1 X
0 A6 l- C% R  N! e. h, k
2.片内数据存储区5 q% Z- `7 s9 D

: m2 Z; _6 ~  c& N) L, y
; b+ ^/ D6 [1 T0 O9 r% k$ d: S(1) 工作寄存器区
7 S" n, ]# M" D9 V2 I( x. ^1 C/ A3 ~; q+ Q1 g( j* E" I) k% E
7 a6 K3 L# S8 |4 n. x
工作寄存器区位于片内数据存储器中的00H~1FH单元,共32字节( 如此说来每个单元是一个字节了 ),分成四组。每组8个字节,分别记为R0~R7.
+ F) Q0 o# q3 b1 H& _' M  z
3 q; Q. d+ l! f  W" v4 Q程序默认在0区工作寄存器组存放中间运算数据。等待中断来时,中断数据工作寄存器组由0区切换到其它区域。
$ C  Q: I7 y$ z& J# L
$ w- D9 P  Z9 f6 v5 E! [; Q1 L4 c; Y, f/ y7 g
选择四组工作寄存器区的哪一组作为R0~R7由位于PSW寄存器的两位RS1,RS0来确定.
. a4 n& `0 R. E: q
" S6 Z, C" I4 z: A' C5 n8 S2 r' m$ D" r
RS1,RS0称为区开关或组开关,两位就可决定四种状态.( i& x+ B' S$ ]; ^- n) f+ ?
7 G" j+ K( `- {. _
(2)位寻址区
; \3 |6 x% U; i* P
) f5 T# [/ }# Q0 g# j' M9 r7 v! C3 n; E! p% ?7 r/ l" u+ }
用户存储区位于片内数据存储器中的020H~02FH单元,共16个字节,共128位,每个字节单元的位都有一个单独的地址,分别为00H-07H,如020H.1表示020H单元的bit[1]位。020H~02FH单元可作为位寻址区。这个范围内的存储单元最大的用处就是能进行位操作,在C语言中,只能用位操作运算符(&、|、^、~、<<、>>)来对字节数据进行位操作运算。如果用汇编指令就可以直接对此片存储单片进行位操作。
  L# \" @6 m( ?5 Y  Z7 O
8 d, y. o3 Q; Y  O- y+ U
, u" X, z3 P0 f+ {# V# a6 }. b如 SETB, 020H.1 就将020H的bit[1]置为了1.
! p, |* k3 Y6 s  Z5 w% v
' s+ s9 l: \1 D1 O4 K8 Y9 |! a7 D
除了RAM此片能进行位寻址的用户存储区以外,还有一些特殊的功能寄存器( SFR )也能进行位寻址。
+ P, x( e/ P3 b0 O7 |& `: i2 z  K  p' U# S# r0 G! z

( W/ Z; n' @; v# _- s6 G(3)数据缓冲区
2 T* i- t, u+ V+ m% B; y9 \( ~
) u+ D. ]5 {( @  {# g0 {4 R1 a5 }
& _5 Z) I% r' g4 q7 W: c51系列数据缓冲区地址为30H-7FH,共80字节。只能字节寻址,不能位寻址。由于工作寄存器和位寻址区,数据缓冲区是统一编址的,所以这三者都可以用作数据缓冲区。; ~- U, n0 g! h) g+ i( {

' S* _  g9 o+ f. ?. S/ O  F% s/ h7 g0 `# I1 l* l
(4)堆栈
+ R7 y: r! l, @  O' q# b8 v
1 t, D6 P/ j2 N
% S7 ?0 Q# V6 m1 |! S栈:由系统自动分配释放,存局部值。7 a& I' K4 j1 ?+ V" H1 ^2 g

4 V# E# Y, D+ N. r) S( d+ X  j: Y* ~7 d
堆:一般由程序员分配和释放。0 m, ^6 ?1 e3 h+ p  o7 ]) i3 }# d
' a  q7 O" l, }* D% L

) ~  u/ K9 `: Z  n7 r( U堆栈指针SP:8位寄存器,堆栈最大可达128单元,只可在片内RAM中进行堆栈操作。' C7 b- z: {: e$ }6 g  M- p+ Z
& R/ t% S$ t$ K+ k
. z7 E' G& T3 T! s% C# e% n
堆栈作用:用来保存地址、数据信息、具有先进后出特性,也是一种能存放二进制数据的空间。
  ]; j; r8 Y/ ^; Y1 p: Z. r7 e9 C6 i3 p5 A, t5 ?8 N' o

- f) Y! x& E: B' U/ CMC51堆栈采用满顶法向上生成的软件堆栈。
0 W- G" W5 }; y0 w. H$ |( p6 ^. U1 r. S2 b: H

6 ^8 u2 ]- h' O) }, r1 n软件堆栈:借助SP进行控制操作。3 a$ K; n2 G) ^! U  ?- x

/ M* l" @& M/ I
0 a) b/ i0 Y$ P  T0 v堆栈向上生长:新压栈的数据成为堆栈顶。
9 R/ @* a6 b5 O  g$ j6 h$ `; O8 A! z

- u; X7 C; \1 j; X! |堆栈向下生长:新压入的数据远离堆栈顶。
- X: t; F; e/ i2 |, r/ A2 r1 Z5 o" j
) \- S8 M. B! q+ d+ V/ y* g0 v$ ^5 E" j" e  b$ e! x+ b
地址大小还得看存储方式。! ]/ j+ g1 A5 g' P

9 K2 O) M- U& l# m  M2 V+ c
6 @6 S( V! S( x& j0 [7 a( L(5)专用寄存器区
% L  {& G7 o6 z
) b9 p3 P& I. e$ M) I: u, L1 n* ~2 B' H0 A( ^+ p) ~
专用寄存器区,也称特殊功能寄存器区 SFR8 O( P/ S4 a  C$ m" _0 K5 v, T

# C! O& W, g9 f$ U' D
' X% x! E! c' l2 N3 n% u/ F" H0 rSPECIAL FUNCTIONREGISTER) D) ~6 K) D1 X& f! `

* V1 {9 `( E/ L! [: J
( @. ?0 w9 K! A' K. B寻址地址离散地分布在80H~FFH,共128字节的空间.而实际有用的只有21个字节,即在这一空间里只有18个专用功能寄存器,其中有3个专用功能寄存器占用了两个字节.SFR主要用于片内硬件的管理,通常只能以字节为单位借助于MOV指令直接寻址,但也有一些专用功能寄存器可以位寻址。, B% {4 y6 m2 R0 D3 X

, ^' i& G8 P1 ~: @) i
" J  W( f, o) I# ^: Z7 Y# q* n& Y包含程序状态字PSW、数据指针寄存器DPTR、端口地址P0-P0、其它专用寄存器(累加器A、B)
" L; @/ R4 A  p" \" H6 Q$ M
7 l! U; k+ W& \- N# G
; ?  |) `" `+ k5 O' o3.片外数据存储区: i: s6 @. _. S! P1 q. c

1 [. \, w( n9 e. B* r# l- z& L9 {: r4 d6 H; Q& E
片外RAM区:可寻空间为共64K 0000H~FFFFH,
  [3 l+ q* J6 s* H. ]7 R2 d6 @& u7 |- u4 c8 [6 V
$ @/ V& A( R$ X+ z  n9 H
总是使用MOVX类指令寻址: S3 B, u9 \0 V/ R( k' p0 A

/ X  L7 r1 M. _% s& E2 M, m8 E! ~; @4 V8 p5 }
借助于工作寄存器R0或R1间接寻址时,可寻256字节. p9 A' a7 k: t# F# z  m# X8 L) ]

  A1 ~* l- J1 m# e  U" [1 I5 P- k! q# p9 G0 b
从片外RAM区取数据: MOVX A,@Ri i=0-18 j5 \3 g1 q# T3 {7 I
- f* n+ @. K/ D4 L" c

% B9 |0 X  V) P; V* n向片外RAM区存数据: MOVX @Ri,A  n0 |; {/ x7 z& H% W' V" t

4 a: |: j9 L* U/ y! d# E
! j8 w% Z8 r$ {0 k2 q借助16位的数据指针DPTR间接寻址,可寻64K字节:
6 D; u% X2 k$ x/ X- ]- a0 Z+ j% k# p; u6 I+ j' S# N9 V

8 \4 \  R% _7 ]' T/ [+ l: o从片外RAM区取数据: MOVX A,@DPTR
3 N& W$ P' D- w/ i& F
$ a5 |/ }8 W7 i4 F6 s% Z4 J' e, j8 ^; E7 T
向片外RAM区存数据: MOVX @DPTR,A" L, {" ~" n3 g+ o1 L

' y  H+ j$ I4 \0 |6 Q, g0 o: U2 l4 N
区分是访问内部存储器还是外部存储器地址靠指令来区分。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

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

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

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

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