1、单片机程序程序存储空间(ROM )和数据存储空间(RAM)详解问题:STC89C52RC 单片机:8K 字节程序存储空间,512 字节数据存储空间,内带 2K 字节EEPROM 存储空间; 它们分别存的是什么?8K 的程序存储空间是存储代码,也就是你写的程序生成的 HEX 文件的,相当于电脑系统的 C 盘。512字节相当于内存,存储空间存储变量,像 u8 x,y,z,u32 a 之类的临时变量掉电后数据丢失。2K eeprom 相当于电脑系统的硬盘,数据写入后掉电不丢失。主要是单片机在运行的过程中写入数据或者读取数据。像设置的闹铃值,设置好了就不用每次都去设置了,保存在单片机里面,即使掉电了,
2、设置的数据也不会丢失,只需单片机上电再读取就好了。单片机原理及系统结构在此先详细分析 51 单片的存储器结构和寻址方法,再分析片外存储器的扩展,最后给出设计原理并分析系统结构。图一:存储空间分布51 单片机存储器结构分析 8051 单片机的存储器在物理结构上分为程序存储器空间和数据存储器空间,共有 4 个存储空间: 片内程序存储器、片外程序存储器以及片内数据存储器、片外数据存储器空间。这种程序存储和数据存储分开的结构形式被称为哈佛结构。MCS-51 使用哈弗结构,它的程序空间和数据空间是分开编址的,即各自有各自的地址空间,互不重叠。所以即使地址一样,但因为分开编址,所以依然要说哪一个空间内的某
3、地址。而 ARM(甚至是 x86)这种冯诺依曼结构的 MCU/CPU,它的地址空间是统一并且连续的,代码存储器/RAM/CPU寄存器,甚至 PC 机的显存,都是统一编址的,只是不同功能的存储器占据不同的地址块,各自为政。MCS-51单片机存储器的配置特点 内部集成了4K 的程序存储器 ROM; 内部具有256B 的数据存储器 RAM(用户空间+SFR 空间) ; 可以外接64K 的程序存储器 ROM 和 数据存储器 RAM。从物理结构的角度讲,51单片机的存储系统可以分为四个存储空间:既片内 ROM,RAM 和片外ROM、RAM。从逻辑结构上看(既编程的角度) ,可以分为三个不同的空间:(1)
4、 片内、片外统一编址的64KB 的程序存储器地址空间:0000HFFFFH( 用16位地址);,其中0000H0FFFH 为片内4KB 的 ROM 地址空间, 1000HFFFFH 为外部ROM 地址空间;(2) 256B 的内部数据存储器地址空间(用8位地址) ,00HFFH ,分为两大部分,其中00H7FH (共128B 单元)为内部静态 RAM 的地址空间, 80HFFH 为特殊功能寄存器的地址空间,21个特殊功能寄存器离散地分布在这个区域; (3) 64KB 的外部数据存储器地址空间( 用16 位地址):0000HFFFFH,包括扩展I/O 地址空间。上述 4 个存储空间地址是重叠的,
5、如图 1 所示。8051 的指令系统设计了不同的数据传送指令以区别这 4 个不同的逻辑空间:CPU 访问片内、片外 ROM 指令用 MOVC,访问片外 RAM 指令用 MOVX,访问片内 RAM 指令用 MOV。程序存储器用于存放编好的程序和表格常数。程序通过 16 位程序计数器寻址,寻址能力为 64KB。这使得指令能在 64KB 的地址空间内任意跳转,但不能使程序从程序存储器空间转移到数据存储器空间。程序存储器 ROM 的片内和片外寻址1.程序存储器 ROM 用于存放程序、常数或表格。2.在51单片机中,由引脚 /EA 上的电平选择内、外 ROM: EA=1时,CPU 执行片内的4KROM
6、中的程序; EA=0时,CPU 选择片外 ROM 中的程序。3.无论是使用片内还是使用片外 ROM,程序的起始地址都是从 ROM 的0000H 单元开始。4.尽管系统可以同时具备片内 ROM 和外部 ROM,但是在一般正常使用情况下,通过/EA 的设定来选择其一(或者使用内部 ROM,或者使用外部 ROM) 。5.如果 EA=1(执行片内程序存储器中程序时):如果程序计数器的指针 PC 值超过0FFFH (4K)时,单片机就要自动的转向片外的 ROM 存储器且从1000H 单元开始执行程序(无法使用片外 ROM 的低4K 空间) 。6.当程序超过4K 时,有两种使用程序存储器 ROM 的方法:
7、设置 EA=0,使用外部 ROM。从地址=0000H 开始;设置 EA=1,使用内部的4KROM 和外部 ROM(地址从1000H 开始的单元) 。8051 从片内程序存储器和片外程序存储器取指时的执行速度相同。程序存储器六个特殊的单元:在 ROM 中有六个单元具有特定功能。0000H 单元:复位时程序计数器 PC 所指向的单元,因此用来 存放程序中的第一条指令;0003H 单元:外部中断/INT0 的矢量入口地址;000BH 单元:定时器 T0溢出中断的矢量入口地址;0013H 单元:外部中断/INT1 的矢量入口地址;001BH 单元:定时器 T1的溢出中断矢量入口地址;0023H 单元:
8、串行口接收、传送的中断矢量入口地址。矢量入口单元:在编写中断程序时,写入对应的“跳板指令”单片机第一条指令的两个特征:存放在 ROM 的0000H 单元;必须是“跳转指令”以跳过下面的5个中断矢量,转到后面的真正的主程序入口0100H 单元。ORG 0000H LJMP 0100HORG 0100HSTART: MOV A,#00H END外部程序存储器:当单片机使用外 ROM 存储器时(扩展系统) ,必须设定/EA=0,此时单片机的端口功能就要发生相应的改变: P0、P2作为外部 ROM 的地址和数据总线; 使用引脚/psen 信号来选通外部 ROM 的数据三态输出。程序存储器 RAM 的片
9、内和片外寻址无论在物理上还是逻辑上,系统中 RAM 都可分为两个独立空间:内部和外部 RAM。由不同的指令来访问。1.访问内部数据存储单元时,使用 MOV 指令;2.访问外部数据存储器时,使用 MOVX 指令。内部 RAM 从功能上将256B 空间分为二个不同的块:1.低128B 的 RAM 块;2.高128B 的 SFR(Special Function Register )块。在低128B 的 RAM 存储单元中又可划分为:1.工作寄存器区;2.位寻址区;3.通用存储数据的“便签区” 。高128B 的专用寄存器区 SFR 中仅仅使用了21寄存器(51 系列) ,其它107 个单元不能使用。
10、注意:一般的教科书里 RAM 大小是指默认用户 RAM,但是很少有特别说明的C51:片内用户 RAM 有 128字节(位于片内所有 RAM 的低 128B,高 128B 是 SFR)访问 RAM 可以使用直接或者间接寻址方式,地址为 00H-7FH,在 80H-FFH 的空间分配给了 SFR,只能使用直接寻址方式。C52:片内用户 RAM 为 256字节(位于片内所有 RAM 的低 128B,高 128B 是 SFR 和用户RAM)低 128字节( 00H-7FH)的访问方式为直接和间接寻址方式;高 128字节(地址 80H-FFH)只能使用间接寻址方式。SFR 的地址也为 80H-FFH,但
11、只能使用直接寻址方式。也就是说, C52的高 128B 是用户 RAM 和 SFR 统一编制,共享地址,通过指令的寻址方式不同来进行区分。对于数据存储器,分为内部数据存储器(IDATA/RAM)和外部数据存储器(XDATA)两个部分,但这两个存储器就不像 code 存储器那样共享地址空间的了。一般的 8051 芯片,内部 RAM 只有 128B,从 0x00-0x7F,而从 0x80-0xFF 则是 SFR(CPU工作寄存器和各种外设寄存器都在此)的区域。对于 8052 来说,内部 RAM 有 256B,所以 0x80-0xFF 是高 128B 的 RAM 在使用。可这部分不是 SFR 专用的
12、吗?是 SFR 专用,但注意,SFR 的访问只能使用“直接寻址方式” (使用特定的汇编指令来实现) ,区别就在这里。只有通过直接寻址访问的地址才是 SFR,否则就是普通的 RAM。至于外扩的 RAM(XDATA) ,地址也是从 0x0000-0xFFFF 的,而且这里的 0x0000和内部 RAM 的 0x00 是不同的,是完全独立的两个空间。他们的访问方法也是不同的。MCS-51 使用 MOVX 指令,来读写 XDATA 区。而且,访问 XDATA 区,是需要 DPTR 寄存器来辅助的。因为只有 DPTR 才能装得下十六位的 XDATA 地址。所以说,MCS-51 读写 IDATA 区的速度
13、是最快的,而且访问方法也是最多的。访问XDATA 区的速度相对就要慢很多。用 P0 口作地址/数据复用总线,用 P2 口的口线作高位地址线,最多可以扩展开关电源模块 64KB 的存储器。控制信号线包括:使用 ALE 作为地址锁存的选通信号,以实现低8 位地址的锁存 ;以 PSEN 信号作为扩展程序存储器的读选通信号;以 EA 信号作为内、外程序存储器的选择信号;以 EA 和作为扩展数据存储器和 I/O 端口的读、写选通信号。执行MOVX 指令时, RD 和 WR 信号分别自动有效。片外数据存储器 RAM 的读和写由 8051的 RD(P3.7)和 WR(P3.6)信号控制,而片外程序存储器的输
14、出允许(OE)由读选通 PSEN 信号控制。尽管片外数据存储器和片外程序存储器共处同一地址空间,但由于控制信号及使用的数据传送指令不同,故不会发生总线冲突。图 2 数据扩展图由于现在以 8051 为内核的单片机几乎都带有内部的 FLASH 程序存储器。如本设计中要用到的开关电源模块 AT89C51 或 AT89S51 均自带 4KB 的 FLASH 程序存储器,有的单片机带有 20KB 甚至更大容量的程序存储器。因此在单片机开发中,很少用专门的程序存储器芯片来扩展外部程序存储器,通常也没有必要。寻址空间为什么会最大 64KB 程序存储?单片机的 P0.0 做为低位地址线,P2.0作为高位地址线的时候,就总共有 16 根地址线,也就是可以寻址 2的16次方地址,也就是 65536 (64K)地址。8位的单片机指的是数据总线的宽度,也就是说传输的数据最高是8位宽度,和地址总线没关系的。8051的单片机 P0 口作为地址和数据总线 复用,P2 口只能作为地址扩展接口使用。别把这地址宽度和数据宽度这两个概念搞混了。