版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第三单元 片内存储器与数据传送指令本单元学习要点1. 89C52单片机中的存储器结构和种类?主要作用?2. 数据传送中的来源与目的存储器,哪些是合法的数据传送指令?3. 位传送指令的特点。4. 数据传送指令的寻址方式。3.1 片内存储器组织结构3.1.1 存储器类型在图1-2所示的89C52内部的基本结构中,有两块存储器:RAM和快闪存储器(FLASH)。RAM是Random-access Memory的缩写,意为随机读写存储器,说白了,就是顺便什么时候都可以对其进行读或写操作,但RAM中的内容在掉电(关机)后就不复存在,也即开机后RAM中的内容是随机的,因而这一类存储器又被称为易失性存储器,
2、这类存储器主要用于存储数据。与此相对的是ROM(Read Only Memory,只读存储器),这类存储器只能采用特殊的方法或特殊的工具才能把数据写进去,如采用烧录器等装置。一般说来,单片机本身不能对片内的ROM进行写入。又由于ROM是非易失性的存储器,即在关闭电源之后已写入的数据不会丢失,所以,在单片机中ROM经常作为程序存储器。常见的ROM种类有4种:PROM(Programmable Read-Only Memory 可编程序的只读存储器):这是一种最先出现的ROM,它只能写入一次,不允许修改或再次写入。这一类ROM目前仍在应用,主要用于已成熟的较大批量生产的产品中的单片机。EPROM(
3、Erasable Programmable Read Only Memory,可擦可编程只读存储器):这是一种可以多次写入、用紫外线擦除的ROM,主要用于小批量生产的单片机应用系统或研发单片机应用产品时采用。早年INTEL公司生产的87C51片内就是采用EPROM。自从EEPROM(Electrically Erasable Programmable Read Only Memory,电可擦可编程只读存储器)和FLASH MEMORY(快速存储器或闪存)出现后,EPROM就渐渐消逝了。EEPROM:类似EPROM,但它不用紫外线擦除,而只要用电就可擦除。但其写入和擦除的速度较慢。目前仍然有应用
4、。FLASH MEMORY:与EEPROM类似,但其读写的速度要快得多,密度(集成度)也要高,自从它出现后迅速取代EPROM和EEPROM在单片机中广泛应用。AT89C52片内就是采用8 KB(千字节)的FLASH MEMORY作为程序存储器。3.1.2 存储器组织80C52的存储器组织有几个不同的存储空间,如图3-1所示。每个存储空间都是具有连续的字节地址空间,其地址都是从0开始至最大存储范围的字节地址,即他们的地址是全部重叠的。他们之间是利用指令的寻址方式不同而区别开来。FFFFH0000H(XCODE)外部程序存储器FFFFH0000H(XDATA)外部数据存储器FFH特殊寄存器7FH(
5、SFR)7FH片内RAM00HFFH片内RAM7FH(IDATA)1FFFH片内ROM0000H(ICODE)片内存储器图3-1 80C52的存储器组织右边的虚线框内89C52的程序存储器区,左边的虚线框内89C52的数据存储器区。而点划线框内是89C52片内的存储器,点划线框外是片外的存储器。1程序存储器(CODE)区89C52的程序存储器区又分为片内和片外两个区。AT89C52的片内程序存储器区(ICODE)是快闪存储器,可以多次擦写,特别适合于开发程序量不大的新产品或学习用。AT89C52的片内快闪存储器有8K字节。AT89C52的片外程序存储器区(XCODE)有16位寻址空间(即16位
6、地址线),可达64K。代码段是只读的,当要对外接存储器件如EPROM进行寻址时,单片机会产生一个信号。但这并不意味着片外程序存储器区一定要用一个EPROM。目前一般使用EEPROM作为外接存储器,可以被外围器件或8051进行改写,这使系统更新更加容易,新的软件可以下载到EEPROM中,而不用拆下它,然后装入一个新的EEPROM。另外,带电池的SRAMs也可用来代替EPROM,他可以像EEPROM一样进行程序的更新,并且没有像EEPROM那样读写次数的限制,但是当电源耗尽时,存储在SRAMs中的程序也随之丢失。使用SRAMs来代替EPROM时允许快速下载新程序到目标系统中,这避免了编程/调试/擦
7、写这样一个循环过程,不再需要使用昂贵的在线仿真器。本书配套的实验板就是采用SRAMs作为系统的程序存储器,在调试完成后再把调试好的代码(程序)写入片内闪存中。2数据存储器(DATA)区89C52的数据存储器(DATA)区包括片内前128字节的内部RAM和外部64K字节的RAM(XDATA)两部分。片内前128字节主要是作为数据段称为DATA区,指令用一个或两个周期来访问数据段访问DATA区,比访问XDATA区要快,因为它采用直接寻址方式,而访问XDATA须采用间接寻址,必须先初始化DPTR。通常我们把使用比较频繁的变量或局部变量存储在DATA段中,但是必须节省使用DATA段,因为它的空间毕竟有
8、限。在数据段中也可通过R0和R1采用间接寻址访问,R0和R1被作为数据区的指针,将要读或写的字节的地址放入R0或R1中,根据源操作数和目的操作数的不同执行指令需要一个或两个周期。7CH工作寄存器0组工作寄存器2组工作寄存器3组工作寄存器1组00H08H01H02H03H04H05H06H07H21H09H0BH0CH0DH0EH0FH10H0AH18H12H13H14H15H16H17H19H1BH1CH1DH1EH1FH20H1AH11H31H28H23H24H25H26H27H29H2BH2CH2DH2EH2FH30H2AH22H7DH7EH7FH(DATA)片内数据存储器R1R2R3R4
9、R5R6R7R0R1R2R3R4R5R6R7R0R1R2R3R4R5R6R7R0R1R2R3R4R5R6R7R0可位寻址区片内前128字节的DATA区又可以分为图3-2所示的几个区域。其中:工作寄存器组:地址从00H1FH,每8个单元为1组,共有4个组。00H07H为第零组(0组),08H0FH为第一组(1组),18H1FH为第三组(3组)。单片机复位时默认第零组为当前工作寄存器组,即读、写R0时是从00H单元进行读、写操作,读、写R1时是从01H单元进行读、写操作,读、写R7时是从07H单元进行读、写操作。通过PSW(程序状态寄存器)中的RS0、RS1位可以设置当前工作寄存器组。表3-1给出
10、了当前工作寄存器组与RS0、RS1的关系。比如,执行了以下两条指令:SETB RS0 ; 置位RS0SETB RS1 ; 置位RS1则把第三组设置为当前工作寄存器组,如果这时执行MOV R7, #3AH ; 送立即数3AH到R7则把立即数3AH写入到1FH单元中。可位寻址区:地址从20H2FH共16个单元中的每一位都可以直接寻址,即可以对这些单元中的某一位进行读、写操作而不会影响该单元中的其他位,也可以把这些单元中的某一位作为标志,用指令对其进行判断。这些位都有自己的位地址,如图3-3所示。指令:SETB 00H ; 置位20H单元的第0位是把位地址00H(字节地址20H单元的第0位)置为1。
11、而CLR 77H ; 清除2EH单元的第7位则是把位地址77H(字节地址20H单元的第7位)清除为0。0DH0CH0BH07H02H03H01H00H06H05H04H0AH09H08H0EH0FH17H1FH77H7FH71H7CH1EH13H21H20H23H2DH2EH2FH22H1DH1CH1BH12H11H10H16H15H14H1AH19H18H7DH7BH72H73H70H76H75H74H7AH79H78H7EH字节地址位地址图3-3 可位寻址区图3-2 片内数据存储器 表3-1 当前工作寄存器组与RS1、RS0的关系当前工作寄存器组RS1RS00组(00H07H)000组(0
12、8H0FH)010组(10H17H)100组(18H1FH)113特殊功能寄存器中断系统和外部功能控制寄存器位于从地址80H开始的内部RAM中。这些寄存器被称做特殊功能寄存器(Special Function Registers,简称SFR),其中很多寄存器都可位寻址(可通过名字进行引用)。例如,要对中断使能寄存器中的EA位进行寻址,可使用EA、或IE.7、或0AFH来访问。SFRs控制定时/计数器、串行口、中断源及中断优先级等,这些寄存器的寻址方式和DATA中的其它字节和位一样。SFR的分布如图3-4所示。字节地址字节地址SFR名称复位后的值(x表示不确定)灰色背景表示位可寻址图3-4 SF
13、R的分布4IDATA 区8052有附加的128字节的内部RAM,位于从80H开始的地址空间中,被称为IDATA。因为IDATA 区的地址和SFRs 的地址是重叠的,通过区分所访问的存储区来解决地址重叠问题。SFRs只能通过直接寻址来访问,而IDATA区只能通过间接寻址来访问。例如:MOV 82H, #0FH; 写入立即数#0FH到DPL与MOV DPL, #0FH; 写入立即数#0FH到DPL作用完全一样,都是写入立即数#0FH到DPL。而MOV R0, #82H; 写入立即数#82H到R0MOV R0, #0FH; 写入立即数#0FH到83H是写入立即数#0FH到IDATA中的82H单元。5
14、XDATA 区89C52的最后一个存储空间为64K,和片外CODE 区一样采用16位地址寻址,称作外部数据区,简称XDATA区。这个区通常包括一些RAM,如SRAM,或一些需要通过总线接口的外围器件。对XDATA的读写操作需要至少两个指令周期,只能使用DPTR、R0或R1间接寻址。如MOV DPTR, #Addr; 写入地址立即数#Addr到DPTRMOVX DPTR, A; 把累加器A中的数据写入DPTR所指向的XDATA单元或MOV P2, #HIGH_Addr; 写入地址高位立即数#Addr到P2MOV R1, #LOW_Addr; 写入地址低位立即数#Addr到R1MOVX R1, A
15、; 把A中的数据写入P2和R1所指向的XDATA单元 这两组指令都是完成把A中的数据写入XDATA单元。而MOV DPTR, #Addr; 写入地址立即数#Addr到DPTRMOVX A, DPTR; 把DPTR所指向的XDATA单元中的数据读到A或MOV P2, #HIGH_Addr; 写入地址高位立即数#Addr到P2MOV R1, #LOW_Addr; 写入地址低位立即数#Addr到R1MOVX A, R1; 把P2和R1所指向的XDATA单元中的数据读到A 则把XDATA单元中的数据读到A中。3.2 数据传送指令数据传送指令是单片机编程中用的最多的指令。前面介绍了89C52的存储器分布
16、,自然地就应该有这些存储器(区)之间的数据传送指令,但是,由于89C52的存储器区之间地址有重叠,因而必须用不同的寻址方式和操作数来区别所传送数据的“来源”和“目的”。这部分内容对初学者来说是最难记忆的。为了方便读者快速、准确地掌握8051的数据传送指令,一方面给出表3-2和图3-5来说明传送指令与数据的“来源”和“目的”之间的关系,并在下面加以详细地说明,另一方面,在下一小节给出了数据传送的实验,务必请读者按照示例和本章的习题要求尽量多做实验。表3-2 传送指令及其与数据的“来源”和“目的”之间的关系 目的源立即地址(SFR和低128字节RAM)工作寄存器(Rn)累加器片外数据存储器(XDA
17、TA)片内高128字节RAM(IDATA)立即数(#data)MOV direct,#dataMOV DPTR,#datal6MOV Rn,#dataMOV A,#dataMOV Ri,#data程序存储器(CODE)MOVC A,A+DPTRMOVC A,A+PC立即地址(SFR和低128字节RAM)MOV direct2,direct1MOV Rn,directMOV A,directMOV Ri,direct工作寄存器(Rn)MOV direct,RnMOV A, Rn累加器MOV direct,AMOV Rn,AMOVX Ri,AMOVX DPTR,AMOV Ri,A 片外数据存储器(
18、XDATA)MOVX A,DPTR MOVX A,Ri片内高128字节RAM(IDATA)MOV direct, RiMOV A,Ri 寄存器C1直接数据Data累加器A寄存器间接R1,R0寄存器DPTR立即数#Data寄存器间接SP寄存器R7R0直接数据Data116图3-5 传送指令与数据的“来源”和“目的”之间的关系有关传送指令说明如下1. 位传送指令MOV C,bit和MOV bit,C没有在表中列出。这两条指令是把一位数据在C(进位位、位于程序状态寄存器PSW的第7位,作为布尔操作的累加器)中与直接位地址(即所有位可寻址的存储器中的位)之间进行操作。如MOV C, 00H; 把00H
19、(字节地址20H中的第0位)中的内容送C MOV P3.2, C; 把C中的内容送P3.2(P3口的第2位)MOV TR0, C; 把C中的内容送TR0(定时/计数器T0的启动位)都是位传送指令。位地址都可以看成直接地址,但它们之间不能直接传送数据,只能通过C来传送,如MOV P3.2, 00H是非法的,要实现00H到P3.2的数据传送,只能MOV C, 00H; 把00H(字节地址20H中的第0位)中的内容送C MOV P3.2, C; 把C中的内容送P3.2(P3口的第2位)而MOV P3.2, #01H也是非法的,位数据传送指令中没有立即数作为源地址的指令,只能SETB P3.2, ;
20、把 P3.2(P3口的第2位)置位CLR P3.2, ; 把 P3.2(P3口的第2位)清零位可寻址存储器中的位可用两种方式来寻址:MOV 22H.5, C; 把C中的内容送字节地址22H中的第5位MOV 15H, C; 把C中的内容送字节地址22H中的第5位位可寻址SFR中的位既可用上述两种方式来寻址:MOV P3.2, C; 把C中的内容送P3.2(P3口的第2位)MOV 0B0H.2, C; 把C中的内容送P3.2(P3口的第2位)也可用该位所特有的名称来寻址:MOV PSW.6, C; 把C中的内容送PSW.6(通用标志F0)MOV 0D0H.6, C; 把C中的内容送PSW.6(通用
21、标志F0)MOV F0, C; 把C中的内容送PSW.6(通用标志F0)都是把C中的数据送到PSW.6(通用标志F0)。2. 片内RAM高128字节是IDATA,地址从80HFFH,与特殊寄存器(SFR)的地址完全重叠,对他们的访问完全由寻址方式来区别(在上一小节介绍IDATA已举例说明)。IDATA采用Ri(i0,1)来间址,而SFR既可用其名称来寻址,也可用其地址作为立即地址来寻址。3. 片内RAM低128字节(DATA)实际上也是IDATA,其地址从00H7FH。但这些存储器单元既可以立即地址寻址,也能用Ri间接寻址。而处于该区域的工作寄存器还可作为寄存器寻址。表中有唯一的一条16位数传
22、送指令:MOV DPTR,#datal6。该指令用于对数据指针DPTR赋值。4. 立即数和XCODE只能作为源操作数(即数据源地址)。5. XCODE只能作为源操作数向累加器A传送数据,有两条指令:MOVC A,A+DPTR; 把A和DPTR的和所指向的XCODE单元中的数读到AMOVC A,A+PC; 把A和PC(程序计数器)的和所指向的XCODE; 单元中的数读到A注意指令中采用“MOVC”作为助记符,说明是从程序存储器(CODE)中读取数据。而从XDATA中读取数据的指令为:MOVX A,DPTR ; 把DPTR所指向的XDATA单元中的数读到AMOVX A,Ri; 把P2(高8位地址)
23、和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处
24、于单片机核心部位,编程是用得最多的地方。8. 除ACC外,工作寄存器是交换数据最为方便、最为频繁的存储器。它们具有的寻址方式最多:MOV R6, #0FH; 写入立即数#0FH到R6(06H单元)与MOV 06H, #0FH; 写入立即数#0FH到R6(06H单元)与MOV R0, #06H; 写入立即数#06H到R0MOV R0, #0FH; 写入立即数#0FH到R0所指向的单元(06H)都是把数据写到06H单元。3.3 数据传送指令说明1. 寄存器内容送累加器格式:MOV A,Rn11101rrrE8HEFH代码:操作:(A)(Rn),n=07说明:Rn在内部数据存贮器中的地址由当前的工作
25、寄存器区选择位RS1、RS0确定,可以是00H07H、08H0FH、1017或18H1FH。以后指令中对Rn不再重复说明。2. 累加器内容送寄存器格式:MOV Rn,A11101rrrF8HFFH代码:操作:(Rn)(A), n=07说明:目的操作数采用寄存器寻址方式。3. 内部RAM内容送累加器格式:MOV A, Ri1110011rF6HE7H代码: 操作:(A)(Ri), i=0,1说明:Ri在内部数据存贮器中的地址由当前工作寄存器区选择位RS1、RS0确定,分别为01H,02H,08H,09H,10H,11H和18H,19H。以后的指令中对Ri不再重复解释。该指令可以访问整个内部RAM
26、空间(0255单元)。4. 累加器内容送内部RAM格式:MOV Ri ,A1111011i代码:F6HE7H 操作: (Ri)(A), i=0,15. 立即数送累加器01110100格式:MOV A,data代码:74H 立即数操作:(A)data说明:代码的第二字节为立即数,它与指令的操作码一起放在程序存贮器中,执行该指令时,与操作码一起取到CPU中。6. 内部RAM或专用寄存器内容送累加器11100101格式:MOV A,direct代码:E5H 直接地址操作:(A)(direct)说明:代码的第二字节为直接地址,可以指向专用寄存器及内部RAM(0127单元)。它与指令一起放在程序存贮器中
27、,执行该指令时,与操作码一起取到CPU,经地址译码访问指定单元。以后指令中对直接地址direct不再作解释。. 累加器内容送内部RAM或专用寄存器格式:MOV direct,A11110101代码:F5H 直接地址操作:(direct)(A)8. 立即数送寄存器格式:MOV Rn, #data01111rrr代码:78H7FH立即数操作:(Rn) # data,n=079. 立即数送内部格式:MOV Ri, # data1110011i代码: 76H77H立即数操作:(Ri) # data,i=0,110. 立即数送内部RAM或专用寄存器格式:MOV direct,#data11100101代
28、码: 75H直接地址立即数操作:(direct) # data说明:这是一条3字节指令,代码的第二字节为直接地址,第3字节为立即数,在执行该指令时,它们与指令的操作码一起从程序存贮器取入CPU。11. 寄存器内容送内部RAM或专用寄存器格式:MOV direct,Rn10001rrr代码: 88H8FH直接地址操作:(direct)(Rn),n=0712. 内部RAM或专用寄存器内容送寄存器10101rrr格式:MOV:Rn, direct代码: A8HAFH直接地址操作:(Rn)(direct),n=0713. 内部RAM内容送内部RAM或专用寄存器1000011i格式:MOV direct
29、, Rn代码: 86H87H 直接地址操作:(direct)(Rn),i=0,114. 内部RAM或专用寄存器内容送内部RAM格式:MOV Ri, direct直接地址1000011i代码: A6HA7H操作:(Ri)(direct),i=0,115. 内部RAM和专用寄存器之间的直接传送格式:MOV direct, direct直接地址(源)10000101代码: 85H直接地址(目的)操作:(direct)(direct),n=07说明:这是一条3字节指令,代码的第二、三字节分别为源操作数和目的绝对地址。指令的功能很强,它能实现内部RAM之间、专用寄存器之间或专用寄存器与内部RAM之间的直
30、接数据传送。而执行时间为2个机器周期。16. 16位立即数送数据指针格式:MOV DPTR, data16立即数高位10010000代码: 90H立即数低位操作:(DPH)data 15 data 8(DPH)data 7 data 0说明:这是整个指令系统中唯一的一条16位数据的传送指令,用来设置地址指针。17. 外部数据存贮器内容送累加器1110011i格式:MOVX A, Ri代码: E2HE3H操作:(A)(Ri),i=0,1说明:指令执行时,在P3.7引脚上出现有效信号,用作外部数据存贮器的读选通信号。P0口上分时输出由Ri指定的8位地址信息及输入该单元的内容。18. 累加器内容送外
31、部数据存贮器格式:MOVX Ri ,A1111001i代码: F2HF3H操作:(Ri)(A),i=0,1说明:指令执行时,在P3.6引脚上出现有效信号,用作外部数据存贮器的写选通信号。P0口上分时输出由Ri指定的8位地址信息及输出到该单元的数据。以上两条与外部数据存贮器传送数据的指令可以访问256字节的存贮空间。19. 累加器内容送外部数据存贮器格式:MOVX DPTR, A11110000代码: F0H操作:(DPTR)(A)说明:指令执行时,P3.6经脚上输出有效信号,用作外部数据存贮器的写选通信号。DPTR所包含的16位地址信息由P0(低8位)和P2(高8位)输出,累加器的内容由P0输
32、出,P0口作分时复用的总线。20. 外部数据存贮器内容送累加器格式:MOVX A , DPTR 11100000代码: E0H说明:指令执行时,P3.7引脚上输出有效信号,有作外部数据存贮器的读选通信号。DPTR所包含的16位地址信息由P0(低8位)和(高8位)输出,选中单元的数据由P0输入到累加器,P0口作分时复用的总线。以上两条与外部数据存贮器间的数据传送指令可以访问64KB字节的存贮空间。21. 数据存贮器内容送累加器10010011格式:MOVC A,ADPT代码: 93H 说明:指令首先执行16位无符号数的加法操作,获得基址与变址之和,低8位相加产生进位时,直接加到高位,并不影响标志
33、。22. 程序存贮器内容送累加器格式:MOVC A,APC10000011代码: 83H 说明:指令首先将PC修正到下一条指令的地址上,然后执行16位无符号数的加法操作,获得基址与变址之和,低8位相加产生进位时,直接加到高位,并不影响标志。以上两条MOVC是64KB存贮空间内的查表指令,实现程序存贮器到累加器的代码或常数传送,每次传送一个字节。源操作数采用基址加变址寻址方法,基址寄存器分别为16位的DPTR或程序计数器PC,变址寄存器为累加器。23. 寄存器内容与累加器内容交换11001rrr格式:XCH A,Rn代码: C8HCFH操作:(A) (Rn),n=0724. 内部RAM内容与累加
34、器内容交换1100011i格式:XCH A,Ri代码: C6HC7H操作:(A) (Ri), i=0,125. 内部RAM或专用寄存器内容与累加器内容交换11000101格式:XCH A,direct代码: C5H直接地址操作:(A) (direct) 26. 内部RAM低4位内容与累加器低4位内容交换格式:XCHD A,Ri1101011i代码: C6HD7H操作:(A30) (Ri30),i=0,1 27. 累加器低4位与高4位交换11000100格式:SWAP A代码: C4H操作:(A30) (A74) 28. 栈顶内容送内部RAM或专用寄存器格式:POP direct直接地址1101
35、0000代码: D0H 操作:(direct) (SP) (SP) (SP)1说明:POP为堆栈操作指令,由栈针SP所寻址的内部RAM单元的内容传送到指令中直接寻址的一个单元中去。然后,栈针减1。一般而言,执行此指令不影响标志,若目标操作数为PSW,则有可能使一些标志改变。这也是通过指令强行修改标志的一种方法。29. 内部RAM或专用寄存器内容送栈顶11000000格式:PUSH direct代码: C0H直接地址操作:(SP) (SP)1 (SP) direct说明:PUSH也是堆栈操作指令,它把指令中直接寻址的一个字节压入到当前栈针加1的单元中去。指令不影响标志。3.4 若干数据传送实验下
36、面通过几个数据传送实验来熟悉和掌握数据传送指令及其应用。实验3-1:外部数据块搬移(256字节)把处于程序存储器(XCODE)中从Data_TAB开始的256个字节数据传送到外部数据存储器从B000H开始的256个单元中去。ORG 8000H; 实验板开始执行的第一条指令所处的地址LJMP MAIN; 跳转到主程序ORG 8030H; 主程序开始的地址;避开中断入口地址MAIN:MOV DPTR, #Data_TAB; 使DPTR指向XCODE中的Data_TAB开始的256个字节数据MOV P2, #0B0H; 使P2口指向XDATA中的目的地址高8位MOV R0, #00H; 使R0口指向
37、XDATA中的目的地址低8位起始地址MOVEDATA:MOV A, #00H; 清除累加器,以便下一条指令能准确指向XCODE中的数据MOVC A, A+DPTR; 从XCODE中读取数据,请注意指令形式MOVX R0, A; 把数据写到XDATA中INC DPTR; 修改源数据指针INC R0; 修改目的数据指针CJNE R0, #00H, MOVEDATA; 没有送完256个数据,跳转到MOVEDATA继续送数HALT:LJMP HALT; 送完256个数据,在此死循环,实际程序中应为后续操作;+以下为XCODE中的数据表+; 用以分隔程序,使程序清晰易懂Data_TAB: ; 常数或数据
38、表格前用标号表示其起始地址DB 0, 1, 2, 3, 4, 5, 6, 7; 立即数可以用十进制数表示,也可以用十六进制数表示, 后者有后缀“H”DB 8, 9, 0AH, 0BH, 0CH, 0DH, 0EH, 0FH; 十六进制数中最高位数为AF时,前面要补数字“0”DB 10H, 11H, 12H, 13H, 14H, 15H, 16H, 17H; 十六进制数中最高位数为AF时,前面要补数字“0”DB 18H, 19H, 1AH, 1BH, 1CH, 1DH, 1EH, 1FH; 每行起始用伪指令“DB”定义数据,“DB”表示数据字节DB 0F8H, 0F9H, 0FAH, 0FBH,
39、 0FCH, 0FDH, 0FEH, 0FFH; 每个数据字节之间用英文逗号分隔;+ +表格结束+; 用以分隔程序,使程序清晰易懂END; 程序结束,编译程序不理会END以后的内容该实验的目的是重温开发环境的使用、汇编程序的格式和熟悉、掌握XCODE、XDATA和累加器之间转送数据指令。实验3-2:外部数据块搬移(65280>数据字节数>256)把处于外部数据存储器从Data_BLOCK开始的NUMB(65280>NUMB>256)个字节数据传送到串口数据缓冲器(SBUF)中去。ORG 8000H; 实验板开始执行的第一条指令所处的地址LJMP MAIN; 跳转到主程序
40、ORG 8030H; 主程序开始的地址;避开中断入口地址MAIN:MOV DPTR, #Data_BLOCK; 使DPTR指向XDATA中的Data_BLOCK开始数据块MOV R0, #NUMB_LOW; #NUMB_LOW为#NUMB的低位字节放到作为低位字节计数器的R0中MOV R1, #NUMB_HIGH+1; #NUMB_HIGH为#NUMB的高位字节加1放到作为高位字节计数器的R1中MOVEDATA:MOVX A, DPTR; 从XDATA中读取数据,请注意指令形式MOV SBUF, A; 把数据写到SBUF中INC DPTR; 修改源数据指针DJNZ R0, MOVEDATA;
41、没有送完NUMB个数据,跳转到MOVEDATA继续送数DJNZ R1, MOVEDATA; HALT:LJMP HALT; 送完NUMB个数据,在此死循环,实际程序中应为后续操作;=; 用以分隔程序,使程序清晰易懂END; 程序结束,编译程序不理会END以后的内容请自行给定地址(Data_BLOCK)和数据字节数(NUMB)并完成该实验。注意充分利用集成开发环境中的各项工具和窗口观察每条指令运行的结果。注意:实验板中Data_BLOCK地址应该在B000H以上,8000HAFFFH和FFF0HFFFFH的部分数据存储器被实验版的监控程序和用户程序占用。实验3-3:外部数据块搬移(65536&g
42、t;数据字节数>1)把处于外部数据存储器(XDATA)中从Data_TAB1开始的NUMB个字节数据传送到外部数据存储器从Data_TAB2开始的NUMB个单元中去。ORG 8000H; 实验板开始执行的第一条指令所处的地址LJMP MAIN; 跳转到主程序ORG 8030H; 主程序开始的地址;避开中断入口地址MAIN:MOV DPTR, # Data_TAB1; 使DPTR指向XDATA中的Data_TAB1开始的数据块MOV R0, # Data_TAB2_LOW; # Data_TAB2的低位字节放到R0中MOV P2, # Data_TAB2_HIGH; # Data_TAB2
43、的高位字节放到P2中MOV R2, #0; R2作为送数个数计数器的低位字节计数器MOV R3, #0; R3作为送数个数计数器的高位字节计数器MOVEDATA:MOVX A, DPTR; 从XDATA中的Data_TAB1开始的数据块读取数据MOVX R0, A; 把数据写到XDATA中的Data_TAB2开始的数据块中INC DPTR; 修改源地址指针INC R0; 修改目的地址指针低位字节CJNE R0, #0, MOVEDATA1; 目的地址指针低位字节是否有进位INC P2; 目的地址指针低位字节有进位,高位字节加1MOVEDATA1:INC R2; 修改已传送数据个数计数指针低位字
44、节CJNE R2, #0, MOVEDATA2; 已传送数据个数计数指针低位字节是否有进位INC P3; 已传送数据个数计数指针低位字节有进位,高位字节加1MOVEDATA2:CJNE R2, #NUMB_LOW, MOVEDATA; 比较已传送数据个数计数指针低位字节,不等则继续送数CJNE R3, #NUMB_HIGH, MOVEDATA; 低位字节相等,比较高位字节,不等则继续送数HALT:LJMP HALT; 送完数据块搬移,在此死循环,实际程序中应为后续操作;=; 用以分隔程序,使程序清晰易懂END; 程序结束,编译程序不理会END以后的内容注意:实验板中Data_TAB2地址应该在
45、B000H以上,8000HAFFFH和FFF0HFFFFH的部分数据存储器被实验版的监控程序和用户程序占用。实验3-4:清除外部数据存储器(0000H7FFFH)清除外部数据存储器(XDATA)中从9000H到FEFFH的所有单元。ORG 8000H; 实验板开始执行的第一条指令所处的地址LJMP MAIN; 跳转到主程序ORG 8030H; 主程序开始的地址;避开中断入口地址MAIN:MOV DPTR, #9000H; 使DPTR指向XDATA中的起始地址9000HMOV A, #0; 清除累加器CLR_RAM:MOVX DPTR, A; 清除DPTR所指向的XDATA单元(即写入数据00H
46、)INC DPTR; 修改地址指针MOV R0, DPH; 把地址指针的高位字节送到R0中进行判断CJNE R0, #0FFH, CLR_RAM; 完成清除XDATA?HALT:LJMP HALT; 完成清除XDATA,在此死循环,实际程序中应为后续操作;=; 用以分隔程序,使程序清晰易懂END; 程序结束,编译程序不理会END以后的内容实验3-5:清除片内数据存储器(DATA+IDATA)清除片内数据存储器(DATA+IDATA),即片内从00H至FFH所有单元。(由于实验板的监控程序暂用了IDATA中高十几个字节的地址,直接在实验板上调试该实验程序会导致死机,请采用软件调试方式做该实验。)ORG 8000H; 实验板开始执行的第一条指令所处的地址LJMP MAIN; 跳转到主程序ORG 8030H; 主程序开始的地址;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 个性化视频制作委托合同书(2024年版)版B版
- 2025年环保型打印纸张品研发与认证合同4篇
- 2025年度文化创意产业承包经营合同赔偿与创意成果转化3篇
- 二零二五版房产维修基金管理合同3篇
- 2025年绿色建筑彩板房采购协议3篇
- 2025年度商业地产项目租赁协议范本4篇
- 二零二五年度美容师客户满意度调查与反馈协议4篇
- 2024年销售合同风险评估3篇
- 2025版合伙企业个人退伙权益保障协议书3篇
- 2025年度数据中心基础设施建设承包协议8篇
- 2025年度公务车辆私人使用管理与责任协议书3篇
- 售后工程师述职报告
- 绿化养护难点要点分析及技术措施
- 2024年河北省高考历史试卷(含答案解析)
- 车位款抵扣工程款合同
- 小学六年级数学奥数题100题附答案(完整版)
- 高中综评项目活动设计范文
- 英汉互译单词练习打印纸
- 2023湖北武汉华中科技大学招聘实验技术人员24人笔试参考题库(共500题)答案详解版
- 一氯二氟甲烷安全技术说明书MSDS
- 物流签收回执单
评论
0/150
提交评论