3第三单元存储器与数据传送指令.docx
- 文档编号:8444687
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:25
- 大小:259.08KB
3第三单元存储器与数据传送指令.docx
《3第三单元存储器与数据传送指令.docx》由会员分享,可在线阅读,更多相关《3第三单元存储器与数据传送指令.docx(25页珍藏版)》请在冰豆网上搜索。
3第三单元存储器与数据传送指令
第三单元片内存储器与数据传送指令
本单元学习要点
1.89C52单片机中的存储器结构和种类?
主要作用?
2.数据传送中的来源与目的存储器,哪些是合法的数据传送指令?
3.位传送指令的特点。
4.数据传送指令的寻址方式。
3.1片内存储器组织结构
3.1.1存储器类型
在图1-2所示的89C52内部的基本结构中,有两块存储器:
RAM和快闪存储器(FLASH)。
RAM是Random-accessMemory的缩写,意为随机读写存储器,说白了,就是顺便什么时候都可以对其进行读或写操作,但RAM中的内容在掉电(关机)后就不复存在,也即开机后RAM中的内容是随机的,因而这一类存储器又被称为易失性存储器,这类存储器主要用于存储数据。
与此相对的是ROM(ReadOnlyMemory,只读存储器),这类存储器只能采用特殊的方法或特殊的工具才能把数据写进去,如采用烧录器等装置。
一般说来,单片机本身不能对片内的ROM进行写入。
又由于ROM是非易失性的存储器,即在关闭电源之后已写入的数据不会丢失,所以,在单片机中ROM经常作为程序存储器。
常见的ROM种类有4种:
PROM(ProgrammableRead-OnlyMemory可编程序的只读存储器):
这是一种最先出现的ROM,它只能写入一次,不允许修改或再次写入。
这一类ROM目前仍在应用,主要用于已成熟的较大批量生产的产品中的单片机。
EPROM(ErasableProgrammableReadOnlyMemory,可擦可编程只读存储器):
这是一种可以多次写入、用紫外线擦除的ROM,主要用于小批量生产的单片机应用系统或研发单片机应用产品时采用。
早年INTEL公司生产的87C51片内就是采用EPROM。
自从EEPROM(ElectricallyErasableProgrammableReadOnlyMemory,电可擦可编程只读存储器)和FLASHMEMORY(快速存储器或闪存)出现后,EPROM就渐渐消逝了。
EEPROM:
类似EPROM,但它不用紫外线擦除,而只要用电就可擦除。
但其写入和擦除的速度较慢。
目前仍然有应用。
FLASHMEMORY:
与EEPROM类似,但其读写的速度要快得多,密度(集成度)也要高,自从它出现后迅速取代EPROM和EEPROM在单片机中广泛应用。
AT89C52片内就是采用8KB(千字节)的FLASHMEMORY作为程序存储器。
3.1.2存储器组织
80C52的存储器组织有几个不同的存储空间,如图3-1所示。
每个存储空间都是具有连续的字节地址空间,其地址都是从0开始至最大存储范围的字节地址,即他们的地址是全部重叠的。
他们之间是利用指令的寻址方式不同而区别开来。
片内存储器
图3-180C52的存储器组织
右边的虚线框内89C52的程序存储器区,左边的虚线框内89C52的数据存储器区。
而点划线框内是89C52片内的存储器,点划线框外是片外的存储器。
1.程序存储器(CODE)区
89C52的程序存储器区又分为片内和片外两个区。
AT89C52的片内程序存储器区(ICODE)是快闪存储器,可以多次擦写,特别适合于开发程序量不大的新产品或学习用。
AT89C52的片内快闪存储器有8K字节。
AT89C52的片外程序存储器区(XCODE)有16位寻址空间(即16位地址线),可达64K。
代码段是只读的,当要对外接存储器件如EPROM进行寻址时,单片机会产生一个信号。
但这并不意味着片外程序存储器区一定要用一个EPROM。
目前一般使用EEPROM作为外接存储器,可以被外围器件或8051进行改写,这使系统更新更加容易,新的软件可以下载到EEPROM中,而不用拆下它,然后装入一个新的EEPROM。
另外,带电池的SRAMs也可用来代替EPROM,他可以像EEPROM一样进行程序的更新,并且没有像EEPROM那样读写次数的限制,但是当电源耗尽时,存储在SRAMs中的程序也随之丢失。
使用SRAMs来代替EPROM时允许快速下载新程序到目标系统中,这避免了编程/调试/擦写这样一个循环过程,不再需要使用昂贵的在线仿真器。
本书配套的实验板就是采用SRAMs作为系统的程序存储器,在调试完成后再把调试好的代码(程序)写入片内闪存中。
2.数据存储器(DATA)区
89C52的数据存储器(DATA)区包括片内前128字节的内部RAM和外部64K字节的RAM(XDATA)两部分。
片内前128字节主要是作为数据段称为DATA区,指令用一个或两个周期来访问数据段访问DATA区,比访问XDATA区要快,因为它采用直接寻址方式,而访问XDATA须采用间接寻址,必须先初始化DPTR。
通常我们把使用比较频繁的变量或局部变量存储在DATA段中,但是必须节省使用DATA段,因为它的空间毕竟有限。
在数据段中也可通过R0和R1采用间接寻址访问,R0和R1被作为数据区的指针,将要读或写的字节的地址放入R0或R1中,根据源操作数和目的操作数的不同执行指令需要一个或两个周期。
片内前128字节的DATA区又可以分为图3-2所示的几个区域。
其中:
工作寄存器组:
地址从00H~1FH,每8个单元为1组,共有4个组。
00H~07H为第零组(0组),08H~0FH为第一组(1组),……,18H~1FH为第三组(3组)。
单片机复位时默认第零组为当前工作寄存器组,即读、写R0时是从00H单元进行读、写操作,读、写R1时是从01H单元进行读、写操作,……,读、写R7时是从07H单元进行读、写操作。
通过PSW(程序状态寄存器)中的RS0、RS1位可以设置当前工作寄存器组。
表3-1给出了当前工作寄存器组与RS0、RS1的关系。
比如,执行了以下两条指令:
SETBRS0;置位RS0
SETBRS1;置位RS1
则把第三组设置为当前工作寄存器组,如果这时执行
MOVR7,#3AH;送立即数3AH到R7
则把立即数3AH写入到1FH单元中。
可位寻址区:
地址从20H~2FH共16个单元中的每一位都可以直接寻址,即可以对这些单元中的某一位进行读、写操作而不会影响该单元中的其他位,也可以把这些单元中的某一位作为标志,用指令对其进行判断。
这些位都有自己的位地址,如图3-3所示。
指令:
SETB00H;置位20H单元的第0位
是把位地址00H(字节地址20H单元的第0位)置为1。
而
CLR77H;清除2EH单元的第7位
则是把位地址77H(字节地址20H单元的第7位)清除为0。
图3-2片内数据存储器
表3-1当前工作寄存器组与RS1、RS0的关系
当前工作寄存器组
RS1
RS0
0组(00H~07H)
0
0
0组(08H~0FH)
0
1
0组(10H~17H)
1
0
0组(18H~1FH)
1
1
3.特殊功能寄存器
中断系统和外部功能控制寄存器位于从地址80H开始的内部RAM中。
这些寄存器被称做特殊功能寄存器(SpecialFunctionRegisters,简称SFR),其中很多寄存器都可位寻址(可通过名字进行引用)。
例如,要对中断使能寄存器中的EA位进行寻址,可使用EA、或IE.7、或0AFH来访问。
SFRs控制定时/计数器、串行口、中断源及中断优先级等,这些寄存器的寻址方式和DATA中的其它字节和位一样。
SFR的分布如图3-4所示。
图3-4SFR的分布
4.IDATA区
8052有附加的128字节的内部RAM,位于从80H开始的地址空间中,被称为IDATA。
因为IDATA区的地址和SFRs的地址是重叠的,通过区分所访问的存储区来解决地址重叠问题。
SFRs只能通过直接寻址来访问,而IDATA区只能通过间接寻址来访问。
例如:
MOV82H,#0FH;写入立即数#0FH到DPL
与
MOVDPL,#0FH;写入立即数#0FH到DPL
作用完全一样,都是写入立即数#0FH到DPL。
而
MOVR0,#82H;写入立即数#82H到R0
MOV@R0,#0FH;写入立即数#0FH到83H
是写入立即数#0FH到IDATA中的82H单元。
5.XDATA区
89C52的最后一个存储空间为64K,和片外CODE区一样采用16位地址寻址,称作外部数据区,简称XDATA区。
这个区通常包括一些RAM,如SRAM,或一些需要通过总线接口的外围器件。
对XDATA的读写操作需要至少两个指令周期,只能使用DPTR、R0或R1间接寻址。
如
MOVDPTR,#Addr;写入地址立即数#Addr到DPTR
MOVX@DPTR,A;把累加器A中的数据写入DPTR所指向的XDATA单元
或
MOVP2,#HIGH_Addr;写入地址高位立即数#Addr到P2
MOVR1,#LOW_Addr;写入地址低位立即数#Addr到R1
MOVX@R1,A;把A中的数据写入P2和R1所指向的XDATA单元
这两组指令都是完成把A中的数据写入XDATA单元。
而
MOVDPTR,#Addr;写入地址立即数#Addr到DPTR
MOVXA,@DPTR;把DPTR所指向的XDATA单元中的数据读到A
或
MOVP2,#HIGH_Addr;写入地址高位立即数#Addr到P2
MOVR1,#LOW_Addr;写入地址低位立即数#Addr到R1
MOVXA,@R1;把P2和R1所指向的XDATA单元中的数据读到A
则把XDATA单元中的数据读到A中。
3.2数据传送指令
数据传送指令是单片机编程中用的最多的指令。
前面介绍了89C52的存储器分布,自然地就应该有这些存储器(区)之间的数据传送指令,但是,由于89C52的存储器区之间地址有重叠,因而必须用不同的寻址方式和操作数来区别所传送数据的“来源”和“目的”。
这部分内容对初学者来说是最难记忆的。
为了方便读者快速、准确地掌握8051的数据传送指令,一方面给出表3-2和图3-5来说明传送指令与数据的“来源”和“目的”之间的关系,并在下面加以详细地说明,另一方面,在下一小节给出了数据传送的实验,务必请读者按照示例和本章的习题要求尽量多做实验。
表3-2传送指令及其与数据的“来源”和“目的”之间的关系
目的
源
立即地址
(SFR和低128字节RAM)
工作寄存器
(Rn)
累加器
片外数据存储器
(XDATA)
片内高128字节RAM
(IDATA)
立即数
(#data)
MOVdirect,#data
MOVDPTR,#datal6
MOVRn,#data
MOVA,#data
MOV@Ri,#data
程序存储器
(CODE)
MOVCA,@A+DPTR
MOVCA,@A+PC
立即地址
(SFR和低128字节RAM)
MOVdirect2,direct1
MOVRn,direct
MOVA,direct
MOV@Ri,direct
工作寄存器(Rn)
MOVdirect,Rn
MOVA,Rn
累加器
MOVdirect,A
MOVRn,A
MOVX@Ri,A
MOVX@DPTR,A
MOV@Ri,A
片外数据存储器
(XDATA)
MOVXA,@DPTR
MOVXA,@Ri
片内高128字节RAM
(IDATA)
MOVdirect,@Ri
MOVA,@Ri
图3-5传送指令与数据的“来源”和“目的”之间的关系
有关传送指令说明如下
1.位传送指令MOVC,bit和MOVbit,C没有在表中列出。
这两条指令是把一位数据在C(进位位、位于程序状态寄存器PSW的第7位,作为布尔操作的累加器)中与直接位地址(即所有位可寻址的存储器中的位)之间进行操作。
如
MOVC,00H;把00H(字节地址20H中的第0位)中的内容送C
MOVP3.2,C;把C中的内容送P3.2(P3口的第2位)
MOVTR0,C;把C中的内容送TR0(定时/计数器T0的启动位)
都是位传送指令。
位地址都可以看成直接地址,但它们之间不能直接传送数据,只能通过C来传送,如
MOVP3.2,00H
是非法的,要实现00H到P3.2的数据传送,只能
MOVC,00H;把00H(字节地址20H中的第0位)中的内容送C
MOVP3.2,C;把C中的内容送P3.2(P3口的第2位)
而
MOVP3.2,#01H
也是非法的,位数据传送指令中没有立即数作为源地址的指令,只能
SETBP3.2,;把P3.2(P3口的第2位)置位
CLRP3.2,;把P3.2(P3口的第2位)清零
位可寻址存储器中的位可用两种方式来寻址:
MOV22H.5,C;把C中的内容送字节地址22H中的第5位
MOV15H,C;把C中的内容送字节地址22H中的第5位
位可寻址SFR中的位既可用上述两种方式来寻址:
MOVP3.2,C;把C中的内容送P3.2(P3口的第2位)
MOV0B0H.2,C;把C中的内容送P3.2(P3口的第2位)
也可用该位所特有的名称来寻址:
MOVPSW.6,C;把C中的内容送PSW.6(通用标志F0)
MOV0D0H.6,C;把C中的内容送PSW.6(通用标志F0)
MOVF0,C;把C中的内容送PSW.6(通用标志F0)
都是把C中的数据送到PSW.6(通用标志F0)。
2.片内RAM高128字节是IDATA,地址从80H~FFH,与特殊寄存器(SFR)的地址完全重叠,对他们的访问完全由寻址方式来区别(在上一小节介绍IDATA已举例说明)。
IDATA采用Ri(i=0,1)来间址,而SFR既可用其名称来寻址,也可用其地址作为立即地址来寻址。
3.片内RAM低128字节(DATA)实际上也是IDATA,其地址从00H~7FH。
但这些存储器单元既可以立即地址寻址,也能用Ri间接寻址。
而处于该区域的工作寄存器还可作为寄存器寻址。
表中有唯一的一条16位数传送指令:
MOVDPTR,#datal6。
该指令用于对数据指针DPTR赋值。
4.立即数和XCODE只能作为源操作数(即数据源地址)。
5.XCODE只能作为源操作数向累加器A传送数据,有两条指令:
MOVCA,@A+DPTR;把A和DPTR的和所指向的XCODE单元中的数读到A
MOVCA,@A+PC;把A和PC(程序计数器)的和所指向的XCODE
;单元中的数读到A
注意指令中采用“MOVC”作为助记符,说明是从程序存储器(CODE)中读取数据。
而从XDATA中读取数据的指令为:
MOVXA,@DPTR;把DPTR所指向的XDATA单元中的数读到A
MOVXA,@Ri;把P2(高8位地址)和Ri(低8位地址)所指向的
;XDATA单元中的数读到A
指令中采用“MOVX”作为助记符,说明是从外部数据存储器(XDATA)中读取数据。
同样,写到XDATA的指令为
MOVX@DPTR,A;把A中的数写到DPTR所指向的XDATA单元
MOVX@Ri,A;把A中的数写到P2(高8位地址)和Ri(低8位地址)所指
;向的XDATA单元
只有XDATA只能与累加器互相传送数据。
6.立即数、立即地址和累加器(ACC)作为数据源地址,是“O型供血者”,他们有最多的接收数据的目的地。
而外部数据存储器(XDATA)最“内向”,它只与ACC互传数据。
7.ACC又是最大的数据接收者,这就意味着ACC处于单片机核心部位,编程是用得最多的地方。
8.除ACC外,工作寄存器是交换数据最为方便、最为频繁的存储器。
它们具有的寻址方式最多:
MOVR6,#0FH;写入立即数#0FH到R6(06H单元)
与
MOV06H,#0FH;写入立即数#0FH到R6(06H单元)
与
MOVR0,#06H;写入立即数#06H到R0
MOV@R0,#0FH;写入立即数#0FH到R0所指向的单元(06H)
都是把数据写到06H单元。
3.3数据传送指令说明
1.寄存器内容送累加器
格式:
MOVA,Rn
代码:
操作:
(A)←(Rn),n=0~7
说明:
Rn在内部数据存贮器中的地址由当前的工作寄存器区选择位RS1、RS0确定,可以是00H~07H、08H~0FH、10H~17H或18H~1FH。
以后指令中对Rn不再重复说明。
2.累加器内容送寄存器
格式:
MOVRn,A
代码:
操作:
(Rn)←(A),n=0~7
说明:
目的操作数采用寄存器寻址方式。
3.内部RAM内容送累加器
格式:
MOVA,@Ri
代码:
操作:
(A)←((Ri)),i=0,1
说明:
Ri在内部数据存贮器中的地址由当前工作寄存器区选择位RS1、RS0确定,分别为01H,02H,08H,09H,10H,11H和18H,19H。
以后的指令中对Ri不再重复解释。
该指令可以访问整个内部RAM空间(0~255单元)。
4.累加器内容送内部RAM
格式:
MOV@Ri,A
代码:
F6H~E7H
操作:
((Ri))←(A),i=0,1
5.立即数送累加器
格式:
MOVA,#data
代码:
74H
操作:
(A)←#data
说明:
代码的第二字节为立即数,它与指令的操作码一起放在程序存贮器中,执行该指令时,与操作码一起取到CPU中。
6.内部RAM或专用寄存器内容送累加器
格式:
MOVA,direct
代码:
E5H
操作:
(A)←(direct)
说明:
代码的第二字节为直接地址,可以指向专用寄存器及内部RAM(0~127单元)。
它与指令一起放在程序存贮器中,执行该指令时,与操作码一起取到CPU,经地址译码访问指定单元。
以后指令中对直接地址direct不再作解释。
7.累加器内容送内部RAM或专用寄存器
格式:
MOVdirect,A
代码:
F5H
操作:
(direct)←(A)
8.立即数送寄存器
格式:
MOVRn,#data
代码:
78H~7FH
操作:
(Rn)←#data,n=0~7
9.立即数送内部
格式:
MOV@Ri,#data
代码:
76H~77H
操作:
((Ri))←#data,i=0,1
10.立即数送内部RAM或专用寄存器
格式:
MOVdirect,#data
代码:
75H
操作:
(direct)←#data
说明:
这是一条3字节指令,代码的第二字节为直接地址,第3字节为立即数,在执行该指令时,它们与指令的操作码一起从程序存贮器取入CPU。
11.寄存器内容送内部RAM或专用寄存器
格式:
MOVdirect,Rn
代码:
88H~8FH
操作:
(direct)←(Rn),n=0~7
12.内部RAM或专用寄存器内容送寄存器
格式:
MOV:
Rn,direct
代码:
A8H~AFH
操作:
(Rn)←(direct),n=0~7
13.内部RAM内容送内部RAM或专用寄存器
格式:
MOVdirect,@Rn
代码:
86H~87H
操作:
(direct)←((Rn)),i=0,1
14.内部RAM或专用寄存器内容送内部RAM
格式:
MOV@Ri,direct
代码:
A6H~A7H
操作:
((Ri))←(direct),i=0,1
15.内部RAM和专用寄存器之间的直接传送
格式:
MOVdirect,direct
代码:
85H
操作:
(direct)←(direct),n=0~7
说明:
这是一条3字节指令,代码的第二、三字节分别为源操作数和目的绝对地址。
指令的功能很强,它能实现内部RAM之间、专用寄存器之间或专用寄存器与内部RAM之间的直接数据传送。
而执行时间为2个机器周期。
16.16位立即数送数据指针
格式:
MOVDPTR,#data16
代码:
90H
操作:
(DPH)←#data15~data8
(DPH)←#data7~data0
说明:
这是整个指令系统中唯一的一条16位数据的传送指令,用来设置地址指针。
17.外部数据存贮器内容送累加器
格式:
MOVXA,@Ri
代码:
E2H~E3H
操作:
(A)←((Ri)),i=0,1
说明:
指令执行时,在P3.7引脚上出现
有效信号,用作外部数据存贮器的读选通信号。
P0口上分时输出由Ri指定的8位地址信息及输入该单元的内容。
18.累加器内容送外部数据存贮器
格式:
MOVX@Ri,A
代码:
F2H~F3H
操作:
((Ri))←(A),i=0,1
说明:
指令执行时,在P3.6引脚上出现
有效信号,用作外部数据存贮器的写选通信号。
P0口上分时输出由Ri指定的8位地址信息及输出到该单元的数据。
以上两条与外部数据存贮器传送数据的指令可以访问256字节的存贮空间。
19.累加器内容送外部数据存贮器
格式:
MOVX@DPTR,A
代码:
F0H
操作:
((DPTR))←(A)
说明:
指令执行时,P3.6经脚上输出
有效信号,用作外部数据存贮器的写选通信号。
DPTR所包含的16位地址信息由P0(低8位)和P2(高8位)输出,累加器的内容由P0输出,P0口作分时复用的总线。
20.外部数据存贮器内容送累加器
格式:
MOVXA,@DPTR
代码:
E0H
说明:
指令执行时,P3.7引脚上输出
有效信号,有作外部数据存贮器的读选通信号。
DPTR所包含的16位地址信息由P0(低8位)和(高8位)输出,选中单元的数据由P0输入到累加器,P0口作分时复用的总线。
以上两条与外部数据存贮器间的数据传送指令可以访问64KB字节的存贮空间。
21.数据存贮器内容送累加器
格式:
MOVCA,@A+DPT
代码:
93H
说明:
指令首先执行16位无符号数的加法操作,获得基址与变址之和,低8位相加产生进位时,直接加到高位,并不影响标志。
22.程序存贮器内容送累加器
格式:
MOVCA,@A+PC
代码:
83H
说明:
指令首先将PC修正到下一条指令的地址上,然后执行16位无符号数的加法操作,获得基址与变址之和,低8位相加产生进位时,直接加到高位,并不影响标志。
以上两条MOVC是64KB存贮空间内的查表指令,实现程序存贮器到累加器的代码或常数传送,每次传送一个字节。
源操作数采用基址加变址寻址方法,基址寄存器分别为16位的DPTR或程序计数器PC,变址寄存器为累加器。
23.寄存器内容与累加器内容交换
格式:
XCHA,Rn
代码:
C8H~CFH
操作:
(A)(Rn),n=0~7
24.内部RAM
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 3第三单元 存储器与数据传送指令 第三 单元 存储器 数据 传送 指令