第3章80C51单片机的存储器结构3.1存储器的分类存储器的的作用是用来存放程序和数据,存储器可分为磁存储和半导体存储器,半导体存储器按功能又可分为只读存储器ROM和随机存储器RAM,如图3-1所示。单片机存储器结构中都采用半导体存储器。1.只读存储器ROM只读存储器在正常工作状态下只能从中读出数据,用户不能快速地随时修改或者重新写入数据,数据可长时间的保存。(1)可编程ROM,可通过专用设备(编程器)将数据写入ROM。PROM:用户可一次编程;EPROM:紫外线擦除,电改写(多次);EEPROM:电擦除,电改写(多次);FLASHROM:闪存(多次)。(2)掩膜ROM用户不能将数据写入,由厂家写入数据。由于上述特点,所以在单片机中一般做为程序存储器。2.随机存取存储器RAM在加电期间,可以随时向存储器里写入数据或从中读出数据,但掉电后,数据丢失。SRAM:静态存储器,加电期间数据可以长久保存,掉电信息丢失。DRAM:动态存储器,即使在加电期间数据也会丢失(数据要刷新)。由于上述特点,所以在单片机中一般作为数据储存器。3.2计算机中储存器的两种结构在计算机中存储器的用途是存放程序和数据,它有两种结构:冯•诺伊曼结构和哈佛结构。冯•诺伊曼结构:程序和数据共用一个存储器逻辑空间,统一编址。哈佛结构:程序与数据分为两个独立存储器逻辑空间,分开编址。注:★个人电脑(PC机)采用的是冯•诺伊曼结构;★单片机一般采用哈佛结构(8051);★8051(80C51)单片机,数据存储器用的是SRAM程序存储器用的是ROM。3.380C51单片机的储存器3.3.18051(80C51)系列存储器结构1.物理空间有四个部分(1)内部数据存储器(128BSRAM)。(2)外部扩展数据存储器(最大64KRAM)。(3)内部程序存储器(4KFlashROMAT89S51)。(4)外部扩展程序存储器(最大64KRAM)。2.逻辑空间有三个部分(1)程序存储器ROM:包括内部和外部,共用一个64K的寻址空间。(2)内部数据存储器RAM(128B),独立的一个128B的寻址空间。(3)外部数据存储器RAM(64K),独立的一个64K的寻址空间。如图3-2所示。★内部数据存储器和外部数据存储器相互之间独立编址,★内部程序存储器和外部程序存储器统一编址,共用一个64K的寻址空间。外部数据储存器64K(SRAM)内部数据储存器128B(SRAM)SFR00H7FHFFH0000HFFFFH0000HFFFFH0FFFH80H1000H内部程序储存器4K(ROM)外部程序储存器64K(ROM)3.3.2数据储存器数据存储器是采用了静态随机存储器(SRAM)的结构,掉电信息丢失,故用于暂存数据及运算的中间结果。1.内部数据存储器的结构内部数据储存器它由工作寄存器区、位寻址区、用户区三个部分组成,地址范围00H~7FH,共128个单元。用户对这些单元的访问,可以用“直接寻址”的方法,即在指令中用“direct”表示,指的就是00H~7FH这128个地址单元,指令中直接给出操作数所在单元地址的这种寻址方式称之为“直接寻址”。何为寻址方式,即寻找操作数的方法。图3-3内部数据存储器结构工作寄存器区00H7FH位寻址区用户区1FH20H2FH30H(1)工作寄存器区(00H~1FH)共32个单元,又分为4组,每组8个单元,都用R0~R7表示,如图3-4所示,R0R1R2R3R4R5R6R700H01H02H03H04H05H06H07H1组2组3组08H0FH1FH18H17H10HR0R0R0R7R7R70组个寄存器对应的地址见表3-1所示在内部工作寄存器中的地址是唯一,但寄存器名重名,一个寄存器名对应有4个单元,为了解决重名问题,单片机用特殊功能寄存器PSW中的RS1、RS0来选择,也就是说,单片机在工作时不会同时使用这4组寄存器,在某一时刻,只能选择其中的一组。工作寄存器组地址寄存器名RS1RS00组00H~07HR0~R7001组08H~0FHR0~R7012组10H~17HR0~R7103组18H~1FHR0~R711在指令系统中对于这些空间的访问有以下方法:●直接使用地址,在指令系统中用“direct”表示,这种方式称之为直接寻址。如:指令MOVA,direct;指令中的“direct”就是指内部数据存储器中的地址(00H~7FH)该指令就是把direct这个单元中的操作数传送到A中。操作数是指指令中参与操作的数据。指令系统中出现的“direct”,在实际编程的过程中不能出现,必须写对应的实际地址“00H~7FH”,这一点非常重要。如:MOVA,30H;就是将30H中的数送给A。●直接使用寄存器名R0~R7,指令系统中用“Rn”表示这8个寄存器,这种方式的寻址称之为“寄存器寻址”,就是操作数放在寄存器中。如:指令MOVA,Rn;指令中的“Rn”就是指工作寄存器R0~R7。该指令就是把Rn中的操作数传送到A中。指令系统中出现的“Rn”,在实际编程的过程中不能出现,必须写对应的寄存器“R0~R7”。如:MOVA,R3;就是将工作寄存器R3中的数传送到A中。●R0和R1这两个寄存器还有一种用法,称之为“寄存器间接寻址”,用“@Ri”表示,i=0、1。R0和R1存放的是操作数所在单元的地址。如:MOVA,@Ri;指令中的“@Ri”就是指工作寄存器R0和R1。该指令就是把Ri中的数取出作为所取数据的单元地址。指令系统中出现“@Ri”,在实际编程的过程中不能出现,必须写“@R0或@R1”。如:MOVA,@R0;就是将R0中的数取出,作为所取数据的地址,将该地址单元的数取出送到A中。如图3-5所示,@R0所指的操作数就是10101010B(AAH)。3-5所示,指令MOVA,@R0操作示意。可以用((R0))=(40H)=AAH表示。00H1FH20H2FH30H1010101001000000R040H注:★在寄存器寻址中(Rn),这4组寄存器,由用户使用中通过PSW中的RS1和RS0的设定,来确定用户使用的组。★这32个单元可以使用“直接寻址”方式,也可使用“寄存器寻址”方式来进行访问。★4组中的R0和R1除了“直接寻址”和“寄存器寻址”外,还可采用“寄存器间接寻址”方式来访问。(2)位寻址区(20H~2FH)这16个RAM单元具有双重功能。它们既可以像普通RAM单元一样按字节存取,即“直接寻址(direct)”也可以对每个RAM单元中的任何一个二进制位单独存取,这就是位寻址(bit),80C51单片机为这些区域专门设置了位处理器(一个1位的CPU),用于这些空间的访问,如图3-6所示。图3-6,位地址表。07H17H0FH06H16H0EH05H15H0DH04H14H0CH03H13H0BH02H12H0AH01H11H09H00H10H08H1FH2FH27H1EH2EH26H1DH2DH25H1CH2CH24H1BH2BH23H1AH2AH22H19H29H21H18H28H20H37H3FH36H3EH35H3DH34H3CH33H3BH32H3AH31H39H30H38H47H46H45H44H43H42H41H40H4FH57H4EH56H4DH55H4CH54H4BH53H4AH52H49H51H48H50H5FH5EH5DH5CH5BH5AH59H58H67H6FH66H6EH65H6DH64H6CH63H6BH62H6AH61H69H60H68H77H7FH76H7EH75H7DH74H7CH73H7BH72H7AH71H79H70H78H20H23H2FH28H2CH2EH2BH2AH27H29H26H2DH25H24H22H21H在指令系统中对于这些空间的访问有以下方法:●可以采用“直接寻址”的方式去访问这16个单元;如:MOVA,20H(MOVA,direct)●也可以采用“位寻址(bit)”的方式去访问这128个二进制位。如:MOVC,00H(MOVC,bit)该指令就是把00H中的一个二进制数送到C中。指令中“bit”,指的就是位地址“00H~7FH”。注:★字节地址:20H~2FH,位地址:00H~7FH。★为了区分位地址“00H~7FH”和内部数据存储器的地址“00H~7FH”,提到位寻址区中的位地址时,必须注明位地址。单元地址,称之为字节地址,也可简称地址。(3)数据缓冲区(用户区)(30H~7FH)数据缓冲区共有80个RAM单元,用于存放用户数据或作堆栈区使用,也称用户RAM区。80C51对用户RAM区中每个RAM单元只能按字节存取的(不可位寻址)。在指令系统中对于这些空间的访问只有一种方法,即直接寻址(direct)。如:MOVA,40H(MOVA,direct)内部数据存储器小结:★内部数据存储器中所有的单元(128B)都可以用直接寻址的方法来进行访问(direct)。★工作寄存器区也可以用寄存器寻址(Rn)的方法来访问,指令系统中一般都用寄存器寻址(Rn)的方法来访问该空间。除了寄存器寻址的方式,R0和R1也可采用寄存器间接寻址@Ri的方式,在使用中R0和R1必须先满足间接寻址方式,有多余的可用于寄存器寻址方式。★位寻址区,对这16个单元可以使用直接寻址方式,这16个单元中的128个位(都有位地址),还可以用位寻址的方式来访问。★用户区只能用直接寻址的方式来访问。★指令系统中所有的数据处理、运算都是在内部数据存储器中完成,所以指令系统也是非常丰富的(大部分指令都是针对该空间)。2.外部数据存储器当内部数据存储器不够用时,在单片机的外总线上可以最大扩展64K的RAM,可独立寻址,有专用指令系统(MOVX传送指令),不能用于数据的运算及处理,所以仅有4条指令,两条读,两条写,用于一般数据的存放,地址为0000H-FFFFH。寻址方式采用寄存器间接寻址的方式,如MOVXA,@DPTR.,指令中DPTR,开辟在特殊功能寄存器(SFR)中,是一个16位的数据存储器(数据指针),用于访问外部数据存储器和程序存储器,一般用于存放的是外部数据存储器和程序存储器的地址(外部数据存储器的地址也是16位)。存储器结构见图3-7所示。图3-7外部数据存储器结构外部数据储存器64K(SRAM)FFFFH0000H3.3.3特殊功能寄存器(SFR)80C51系列单片机内的锁存器、定时器、串行口、数据缓冲器及各种控制寄存器、状态寄存器都以特殊功能寄存器(SFR)的形式出现,它们离散地分布在高128位片内RAM80H~FFH中。51子系列共有18个特殊功能寄存器,占用21个单元,其余107个单元用户不好使用(AT89C51)。表3-2SFR地址映像表TC/TC/这18个特殊功能寄存器,其中有15个特殊功能寄存器占用1个单元,另外3个特殊功能寄存器占用2个单元,这就是为什么18个特殊功能寄存器占用21个单元的原因。这18个特功能寄存器我们先学5个,其余的放在以后学习。1.累加器ACC(E0H)累加器ACC是80C51型单片机中最常用的寄存器。许多指令的操作数取自ACC,许多运算的结果存放在ACC中。乘除法指令必须通过ACC进行。累加器ACC的指令助记符为A。简单的讲就是一个8位的存储器,使用非常频繁,很多指令中必须用到ACC。D7D6D5D4D3D2D1D0ACCE0HACC.7ACC.6ACC.5ACC.4ACC.3ACC.2ACC.1ACC.0E7HE6HE5HE4HE3HE2HE1HE0H在指令系统中,可直接使用寄存器名ACC(A)和字节地址E0H对这八个二进制位进行操作,前者称之为寄存器寻址,后者称之为直接寻址(direct),用户一般使用寄存器寻址,即寄存器寻址,在特殊条件下才会使用直接寻址。累加器ACC也是一个可以对8个二进制位进行位寻址的寄存器,8个二进制位都有唯一的位地址,指令中只能使用位地址(bit),也称之为位寻址,若使用位编号,编译软件会将位编号转换成位地址,再进行编译,最后形成目标文件。2.寄存器B(F0H)80C51单片机