单片机原理与应用第2章-第二版_第1页
单片机原理与应用第2章-第二版_第2页
单片机原理与应用第2章-第二版_第3页
单片机原理与应用第2章-第二版_第4页
单片机原理与应用第2章-第二版_第5页
已阅读5页,还剩245页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第2章MCS-51系列单片机指令系统 内容提要 1、本章讲解51系列单片机指令系统基础,汇编语言格式、常用符号,汇编语言对寄存器和标志位的影响,寻址方式等。 2、为了读者以后能熟练掌握和使用指令编程,本章把MCS-51系列单片机的111条指令按功能分为五大类:数据传送、算术运算、逻辑运算、控制转移和布尔指令。对这些指令逐条分类讲解,并举例说明各条指令的使用方法。 3、一台单片机,如果只有硬件,没有任何软件是不能工作的。配上了各种软件,单片机才能发挥其运算和控制功能。单片机通过运行程序才能完成相应的任务,程序中最基础的部分是单片机的指令。在本章练习中给出了简单的程序,望大家能学会用程序来指挥存储

2、器、寄存器、安排I/O口,完成单片机的控制任务。2.1 单片机指令系统基础 2.1.1指令的概念 1、机器码指令与汇编语言指令 指令是指挥计算机工作的命令。指令是计算机软件的基本单元。指令有两种表达形式。 机器码指令:用二进制代码(或十六进制数)表示的指令称为机器码指令或目标代码指令。实际上是送给CPU执行的程序编码。 汇编语言指令:为了方便记忆,便于程序的编写和阅读,用英文助记符来表示每一条指令的功能。用助记符表示的指令不能被计算机硬件直接识别和执行,必须通过汇编把它变成机器码指令才能被机器执行。 例如,计算机执行操作:把数3AH(H表示十六进制标识符,标明3A是十六进制数)传送到累加器A中

3、,实现这种操作的汇编语言指令形式为: MOV A,#3AH ;A#3AH,把数3AH送A中,3AH的二进制码为0011 1010B,B为二进制标识符,其中“#”是数字3AH的标识符。这条指令的机器码为“743A”。 2、汇编语言指令格式 指令格式是指令的书面表达形式,汇编语言指令格式为: 每一部分构成汇编指令的一个字段,各字段之间用空格或规定的标点符号隔开,方括号内的字段有时可以省略。标号:操作码助记符目的操作数,源操作数;注释 例如: LOOP:MOV A,#3AH ;A#3AH 各字段的意义如下: 标号:指令的符号地址。它通常代表一条指令的机器代码存储单元的地址,(如上例中的LOOP)。一

4、条语句之前是否要冠以标号,要根据程序的需要而定。当某条指令可能被调用或作为转移的目的地址时,通常要给该指令赋予标号。一旦给某条指令赋予了标号,该标号可作为其它指令的操作数使用。 操作码: 表示指令进行何种操作,用助记符形式给出。助记符一般为英语单词的缩写(上例中的MOV 意为传送)。 操作数: 指令操作的对象。操作数分为目的操作数(上例累加器A)和源操作数(上例中的3AH)。目的操作数和源操作数的书写顺序不能颠倒。所有指令按英文习惯表达时先写目的操作数,即操作的结果在第一个操作数中,操作数可以是数字(地址、数据都用十六进制数表示),也可以是标号或寄存器的名称等,也有些指令不需要指明操作数。 注

5、释:对指令功能的说明,便于程序的阅读和维护。它不参与计算机的操作(如上例中的;A#3AH)。也可用中文注释。符号“;”后面的内容为注释,它也可单独占据一行。 汇编指令各字段之间的标点符号应严格按照规定格式书写。 机器码指令的格式分为两部分:操作码和操作数,都用十六进制数表示。 机器码指令按其指令的字节长度划分为三种: (1)单字节指令。只有一个字节的操作码,实际上操作数隐含在其中。如机器码04H的指令是“INC A”。其功能为A的内容加一,A为操作数。 (2)双字节指令。由一个字节的操作码和一个字节的操作数组成,如指令“ADD A,#22H”,其操作码为24H,操作数为22H,目的操作数隐含在

6、操作码中。这条指令的机器码为2422H在程序存储器中占用两个字节。 (3)三个字节指令。由一个字节操作码和两个字节操作数组成。如指令“MOV 3AH,4BH”,该指令执行时把4BH地址单元的内容送到3AH地址单元中去。其机器码为853A4BH在程序存储器中占用三个字节。 以后在实验中和指令表中我们要经常用这些,读者可先看看书后面的指令表中有关字节的内容。 3、指令系统 单片机的所有指令的集合称为指令系统。指令系统与计算机硬件逻辑电路有着密切关系。它是表征计算机性能的一个重要指标,不同微机的指令系统是不同的。同一系列不同型号的微处理器的指令系统基本相同。 MCS-51系列单片机使用44种助记符,

7、有51种基本操作。通过助记符及指令的源操作数和目的操作数的不同组合构成了MCS-51的共111条指令。 MCS-51的指令系统按字节数分为:单字节指令49条;双字节指令46条;三字节指令16条。按指令执行的周期划分:一周期指令有57条;二周期指令52条;四周期指令2条(乘法和除法)。当主频为12MH时,完成一条单周期指令的执行时间为1us. MCS-51指令系统中有一个处理位变量的指令子集。这些指令在处理位变量时非常灵活、方便,使MCS-51更适合于工业控制。 2.1.2 51单片机指令系统说明 1、常用符号 在MCS-51汇编 语言指令系统中,规定了一些对指令格式描述的常用符号。现将这些符号

8、的标记和含义说明如下: Rn-选定当前工作寄存器区的寄存器,为R0R7其中之一。 Ri通过寄存器R0和R1间接寻址的RAM单元。为间接寻址前缀符号,i=0或1。 direct-直接地址,一个内部RAM单元地址(8位二进制数)或一个特殊功能寄存器。 #data-8位或16位常数,亦称立即数。#为立即数前缀标志符号。 Addr16-16位目的地址,供LCALL和LJMP指令使用。标示目标程序所在地址。 Addr11-11位目的地址,供ACALL和AJMP指令使用。 rel-8位带符号偏移量(以二进制补码表示),常用于相对转移指令。 bit-位地址。一位二进制数所在地址(8位二进制数)。 /位操作前

9、缀,表示该位内容求反。 (x)表示以x为地址单元中的内容。 (x)-表示以x地址单元中的内容为地址的单元中的内容。 当前指令的地址。 -是数据传输方向。指向目的操作数2、指令对标志位的影响 MCS-51指令系统中有些指令的执行结果要影响PSW中的标志位,现将影响标志位的指令列表如下: 表2.1 影响标志位的的指令示例指令 标志 指令 标志助记符 C OV AC 助记符 C OV ACADD CLR 0ADDC CPL SUBB ANL C, bit MUL 0 ANL C,/bit DIV 0 ORL C, bit DA ORL C,/bit RRV MOV C, bit RLC CJNE S

10、ETB C 12.1.3 51单片机寻址方式 指令的一个重要组成部分是操作数,由它指定参与运算的数据、数据所在的存储器单元地址、寄存器、I/O接口的地址。指令中所规定的寻找操作数的方式就是寻址方式。每一种计算机都具有多种寻址方式,寻址方式越多,计算机的功能就越强大,灵活性也越大。寻址方式的多少及寻址功能是反映指令系统优劣的主要因素之一。要掌握指令系统也可从寻址方式入手。 MCS-51指令系统的寻址方式有7种:立即寻址(#data)、寄存器寻址(Rn)、寄存器间接寻址(Ri、DPTR)、直接寻址(direct)、变址寻址(A+PC)、相对寻址(rel)和特定寄存器寻址(A)。有些书中把A当寄存器

11、寻址,把位寻址单独作为一种寻址方式,不管怎么分类其目的也是为了便于学习、记忆、掌握这111条指令。 1.立即寻址(#data) 操作数包含在指令字节中,操作数直接出现在指令中,并存放在程序存储器中,这种寻址方式称为立即寻址。 立即寻址指令的操作数是一个8位或16位的二进制常数,它前面以“#”号标识,例如:ADD A,#56H,这条指令完成把数56H与累加器A的内容(设为31H)相加,且结果(87H)存于累加器A中。这条指令的机器码为2456H。 2.寄存器寻址(Rn) 由指令指出某一个寄存器中的内容作为操作数,这种寻址方式称为寄存器寻址。在这种寻址方式中,指令的操作码中包含了参加操作的工作寄存

12、器R0R7的代码(指令操作码字节的低3位指明所寻址的工作寄存器)。例如:ADD A,Rn指令中的Rn,指令完成把A的内容加Rn的内容,结果放在A中。当n为0、1、2时,操作码分别为28、29、2A。 3.间接寻址(Ri/DPTR) 由指令指出某一个寄存器的内容作为操作数的地址。该地址中的内容参入操作。这种寻址方式称为寄存器间接寻址。访问外部RAM时,只可使用R0,R1或DPTR作为地址指针,寄存器间接寻址用符号“”表示。 例如:MOV A,RO(机器码是E6)是指:若RO内容为66H(内部RAM地址单元66H),而66H单元中内容是27H,则指令的功能是将27H这个数送到累加器A中。 4.直接

13、寻址(direct) 在指令中直接给出操作数所在存储单元的地址(一个8位二进制数,书写成二位十六进制数,如36H),称为直接寻址。在指令表中直接地址用direct表示,直接寻址方式中操作数所在存储器的空间有三种: ()内部数据存储器的128个字节单元(内部数据存储器地址00H7FH) 例如MOV A, 36H指令是将直接地址36H单元的内容送寄存器A中 ()位地址空间(有些书把这种寻址方式单独作为一种寻址方式) 例如MOV C, 57H指令是将位地址57H的内容送位累加器C中 ()特殊功能寄存器, 特殊功能寄存器只能用直接寻址方式进行访问。 例如MOV P1, 69H(或MOV 90H, 69

14、H)指令是将直接地址69H的内容送P1口锁存器(机器码都为859069),其中P1为特殊功能寄存器,在机器码中以直接地址90H出现。 5.基址加变址寻址(A+PC/A+DPTR) 以16位寄存器(DPTR或PC)作为基址寄存器,加上地址偏移量(累加器A中的8位无符号数)形成操作数的地址。该地址的内容参入操作。 基址加变址寻址方式有两类: (1)以程序计数器的值为基址,例如指令: MOVC A,A+PC;(A)(A)+(PC) 指令的功能是先使PC指向本指令下一条指令地址(本指令已完成操作),然后PC内容与累加器的内容相加,形成变址寻址的单元地址,该地址的内容(内容为单字节)送A。如本指令下一条

15、指令地址为2100H,A的内容为35H,程序地址2135H单元的内容为68H,则执行指令后A的内容为68H。注意地址为16位,数据为8位。 (2)以数据指针DPTR为基址,以数据指针内容和累加器的内容相加形成地址,例如: MOV DPTR #4200H ;给DPTR赋值 MOV A,#10H ;给A赋值 MOVC A ,A+DPTR ;变址寻址方式(A)(A)+(DPTR) 这三条指令的执行结果是将程序存储器 4210H地址单元的内容送A中。 6.相对寻址(rel) 以程序计数器PC的当前值为基址,加上相对寻址指令的字节长度,再加上指令中给定的偏移量rel的值(rel是一个8位带符号数,用二进

16、制补码表示),形成相对寻址的地址。 例如指令: JNZ rel (如果rel = 23H,则该指令的机器码为7023) 当A0时,程序跳到这条指令后面,相距23个字节的程序地址运行下一条指令。 7.特定寄存器寻址 累加器A和数据指针DPTR这两个使用最频繁的寄存器又称为特定寄存器。对特定寄存器的操作指令,指令不再需要指出其地址字节,指令码本身隐含了操作对象A或DPTR。 例如: INC A (指令码04) ;累加器加1,其中A的机器码被隐含 MOV A,#12H (指令码7412) ;数12送累加器 INC DPTR (指令码A3) ;数据指针 DPTR的内容加1 综上所述,寻址方式与存储器结

17、构有着密切关系。一种寻址方式只适合于对一部分存储器进行操作,在使用时要加以注意。 2.2.数据传送类指令 MCS-51单片机的指令系统按功能可分为五大类;数据传送类指令、算术运算类指令、逻辑运算类指令、控制转移类指令和布尔操作类指令。 数据传送指令又分片内、片外数据传送,数据交换,堆栈操作四个部分,本节学习的目的是要求我们尽快记忆,掌握它们,并开始学习应用指令编程。因此下面详细介绍这些指令。 2.2.1 片内数据传送指令 1、内部RAM数据传送 表2.2给出了在内部RAM中进行数据传送的基本操作及其在不同方式下的指令格式。 下面按指令的功能,对指令的基本操作分别叙述。 (1)一般数据传送指令

18、指令: MOVdest,src ;dest表示目的操作数字节,src为源操作数。 功能:字节变量传送。 说明:将第二操作数(源操作数)指定的字节变量传送到由第一操作数(目的操作数)(以后的指令多按英文的习惯把运行的结果存放在第一个操作数中,并把第一个操作数叫目的操作数)所指定的地址单元中。不改变源字节的内容,不影响PSW中的标志位。 此类指令参入的源和目的操作数有#data/A/Rn/Ri/direct五个,其不同组合,共有16条指令,详见表2.2。一般数据传送指令按操作数的这种组合形式分类。其主要目的是便于记忆,仅供读者学习时参考,读者也可使用其它方法进行分类。 以累加器A为目的操作数,有4

19、种寻址方式的组合(源操作数是Ri/Rn/direct/#data)结果8位数送入A中。符号“;”后面是对指令的说明。 MOV A,#4DH ;立即寻址,将数4DH传入A中 MOV A,3FH ;直接寻址,3F单元的内容传入A中,(A)(3FH) MOV A,RO ;间接寻址,R0的内容作地址单元的内容传入A中 MOV A,R7 ;寄存器寻址,R7的内容传入A中 以Ri或Rn为目的操作数,各有三种寻址方式的组合。源操作数是 (A/#data/direct),注:两个R寄存器之间没有数据传送指令。 MOV Rn,A ;累加器,A的内容送寄存器Rn中 MOV Rn,#data ;立即寻址,把数据da

20、ta送寄存器Rn中 MOV Rn ,direct ;直接寻址,地址direct的内容送寄存器Rn中 MOV Ri,A ; A的内容送到寄存器Ri的内容为地址的单元中 MOV Ri,#data ;数据data送到寄存器Ri的内容为地址的单元中 MOV Ri ,direct ;地址direct的内容送到寄存器Ri的内容为地址的单元中 如指令MOV R0 ,36H ;当R0的内容为47H,地址36H的内容为58H,则该指令把数58H送到地址47H单元中去。当指令是MOV R0 ,36H,则指令把数58H送R0中。 在两个片内RAM单元或专用寄存器SFR之间传送数据。此类指令的目的操作数是直接地址(d

21、irect)、源操作数有A/#data/Rn/Ri/direct,结果8位数送入地址direct中。 MOV direct,#4DH ;立即寻址,数4DH送到地址direct中 MOV direct,A ;特殊寄存器寻址,A的内容送地址direct中 MOV direct,RO ;间接寻址,R0间址的内容送地址direct中 MOV direct,R7 ;寄存器寻址,R7的内容送地址direct中 MOV direct, direct ;直接寻址,一地址单元内容送另一地址单元中 【例2.1 】 内部数据传送指令练习 MOV 3EH,#3FH ;数3FH传送入3EH地址单元中 MOV 3DH,A

22、 ;A的内容传送入3DH单元中 MOV 3BH,R1 ;R1的内容作地址单元的内容送3BH单元中 MOV 3CH,R4 ;寄存器R4的内容传送入3CH单元中 MOV 39H, 3AH ;3AH单元内容送39H单元 MOV A,3FH ;3FH单元的内容送A寄存器中 MOV PSW, #08H ;定义工作寄存器区1,RS0=1、RS1=0,PSW为直接地址 MOV 30H,#32H ;立即数32H送30H存储器地址单元中 MOV R7, 3FH ;3FH单元的内容送指定的R7寄存器中 MOV RO,#30H ;立即数30H送指定的R0寄存器中,下面R0的内容为30H MOV 40H,RO ;RO

23、间址的30H单元的内容送直接地址40H单元中 MOV RO,#20H ;立即数20H送30H单元,因R0的内容为30H MOV R0,20H ;20H单元内容送地址30H单元中,R0的内容为30H 显然MCS-51的数据传送类指令比较丰富,但寻址方式只有七种,内部数据传送指令只用其中的五种寻址方式。助记符也不多,大家可经比较而掌握这些指令,下面给出一个图2.1,以方便大家学习和记忆这些指令。16个箭头表示用MOV写出的片内数据传送有16条指令,方块内是寻址方式。图2.1片内数据存储器传送指令记忆图 【例2.2】 设内部RAM30H单元内容为40H,40H单元的值为10H,P1口作为输入口,其输

24、入的数据为0CAH,试判断下列程序连续执行的结果。 机器码 指 令 注 释 7830H MOV RO,#30H ;数据30H送R0中 E6H MOV A,RO ;地址单元30H中的内容40H送A中 F9H MOV R1,A ;A的内容40H送寄存器R1中 87F0H MOV B R1 ;地址40H的内容10H送B寄存器中 A790H MOV R1,P1 ;P1口的内容0CAH送地址40H中 85A090H MOV P2,P1 ;P1口锁存器内容0CAH送P2中 执行结果:(RO)=30H,(A)=(R1)=40H,(B)=10H,(40H)=0CAH,(P2)=0CAH 指令:MOV DPTR

25、,#data16 功能:把16位常数装入数据指针,执行操作(DPTR)data16 说明:注意这条三字节指令的编码形式。第一字节为操作码(90H),第二字节为数据高8位将存放入DPH,第三字节为数据低8位存放入DPL。以后这个16位数将作为数据地址使用。 2.栈操作指令 指令 PUSH direct 功能:把程序的中间数据送入堆栈,称为进栈。为直接寻址 说明:首先栈指针自动加1,执行(SP)(SP)+1,将栈指针移向堆栈中无数据的地址单元,然后将直接地址(direct)单元的内容送入SP所指定的堆栈单元中,执行(SP)(direct),不影响标志位。【例2.3】设堆栈指针SP的内容为09H,数

26、据指针DPTR的内容为0123H,试分析下列指令的执行结果。 PUSH DPL PUSH DPH 执行第一条指令:(SP)+1=0AH(SP);(DPL)=23H(0AH)把23H压入堆栈0AH中 执行第二条指令:(SP)+1=0BH(SP);(DPH)=01H(0BH)把01H压入堆栈0BH中 执行结果为:(0AH)=23H,(0BH)=01H,(SP)=0BH堆栈指针SP的内容为0BH 指令: POP direct 功能:把堆栈SP中的中间数据送入目的字节,称为出栈。和PUSH对应,出栈指令为: POP direct。 说明:读出由栈指针SP寻址的内部RAM单元内容。送到指定的直接寻址的字

27、节单元,然后栈指针自动减1,即执行操作: (direct)(SP),(SP) (SP)-1;指令执行不影响标志位。 【例2.4】设(SP)=32H,单片机内部RAM的31H,32H单元中的内容分别为23H,01H,试分析下列指令的执行结果。 POP DPH ;(SP)=(32H)=01H(DPH)/(SP)-1=31H(SP) POP DPL ;(SP) =(31H)=23H(DPL)/(SP)-1=30H(SP) 执行结果为(DPTR)=0123H。(SP)=30H。 在执行栈操作时,应注意它们的操作对象。PUSH和POP指令的执行过程中实际隐含着一个数据堆栈。PUSH指令把堆栈作为目的地址

28、,而POP指令则把堆栈作为源地址。进栈和出栈都是对堆栈而言。SP的内容是堆栈的地址。 3.数据交换指令 指令: XCH A,byte ;byte表示一个操作数字节 功能:交换累加器与字节变量中的数据。源操作数有Rn/direct/Ri 说明:XCH指令把指定字节的内容装入累加器A中,同时把累加器中原来的内容写入指定的字节中。源操作数有Rn/direct/Ri,目的操作数是A,共有三条指令。 XCH A,Rn ; XCH A,R6 ,A的内容和R6的内容交换 XCH A,Ri ; XCH A,R1 ,A的内容和R1的内容为地址单元的内容交换 XCH A,direct ; XCH A,37H ,A

29、的内容和37H单元的内容交换 【例2.5】 设RO寄存器内容为20H,累加器A的内容为3FH,内部RAM的20H单元内容为75H,若执行指令: XCH A,RO 则结果为:(20H)=3FH,(A)=75H 指令 XCHD A,Ri 功能:低半字节数据交换,执行操作(A3-0)(Ri)3-0) 说明:累加器A中的低4位与由寄存器Ri间接寻址的内部RAM单元的低4位数据进行交换。该指令不影响各寄存器的高4位,也不影响标志位。 【例2.6 】设RO内容为20H,累加器内容为36H,内部RAM的20H单元内容为75H,若执行指令。 XCHD A,RO 其结果为 (20H)=01110110B=76H

30、 (A) =00110101B=35H 指令: SWAP A 功能:累加器高4位内容与低4位内容交换。 说明:把累加器A的高半字节(D7-D4)和低半字节(D3-D0)内容互换,可看做连续4位循环移位指令,不影响标志位。 SWAP A指令主要用于有关BCD码数的转换操作中。A的高四位和其低四位交换。如:当A的内容为36H时,执行指令SWAP A后A的内容为63H。 2.2.2 片外数据传送指令 1.外部RAM数据传送 MCS-51单片机专用于访问外部数据存储器的指令只有4条,它们属于同一种基本操作,见表2.2。 MOVX A,Ri ;Ri内容为低8位地址的外部RAM单元把一个字节的数据传送A

31、MOVX Ri, A ;A的内容送Ri的内容为低8位地址的外部RAM单元中 MOVX A,DPTR ;DPTR的内容为16位地址的外部RAM单元把一个字节的数据传送A MOVX DPTR,A ;A的内容送DPTR的内容为16位地址的外部RAM单元中 单片机与外部数据存储器之间的数据传送采用两种寻址方式,这两种寻址形式都是间接寻址。一种是单字节寻址Ri,Ri的内容为数据的低8位地址,一种是双字节寻址DPTR,DPTR的内容为数据的16位地址,并且另一个操作数是A,共有4条指令。 选择单字节寻址,以当前寄存器区的RO或R1的内容作低8位地址,地址与数据分时从P0口输出,高8位地址由P2口默认给出,

32、这种地址形式最多可访问256个外部RAM存储器单元。实际上也是十六位地址在起作用。如果与存储器扩展电路相配合,用P2口输出高位地址。那么,使用单字节MOVX指令,也能在64KB地址范围内访问外部RAM。 【例2.7】 设工作寄存器RO的内容为21H,R1的内容为43H,(P2)=40H,外部RAM4043H单元内容为65H,执行下列指令: MOVX A,R1 ;数65H 送A中(以R1寄存器间址的4043H单元内容65H送A) MOVX RO ,A ;(21H)数65H,数65H送外部RAM的4021H单元 结果为把65H送入累加器A和外部RAM的4021H单元。 选择双字节地址。由数据指针产

33、生外部RAM的16位地址,如前所述,P2口输出高8位地址(DPH内容),PO口分时输出低8位地址(DPL内容)和8位数据。这种地址形式可以访问64KB外部RAM存储器空间。 这两种地址形式可以混合使用,即通过Ri地址形式选择一个小的RAM阵列(256字节)而通过DPTR地址选择较大的RAM空间,从而实现在外部RAM之间的数据传送。 【例2.8 】 某单片机系统配有2KB的外部RAM,试设计一程序把第250(0FAH)单元内容传送到04FFH单元。 MOV P2, #00H ;确定地址00FAH高8位 MOV RO,#0FAH ;置地址指针,当数据高位是字母时前面加0标识。 MOVX A,RO

34、;读片外数据存储器地址0FAH单元内容到A MOV DPTR,#04FFH ;置数据指针 MOVX DPTR,A ;将累计器中内容写入片外数据存储器04FFH地址单元中 在进行外部RAM的数据传送时,单片机将向外部发出读(RD)或写(WR)控制号。 2、查表指令 8051对程序存储器的访问,包括两类操作。一是从PC指向程序的某一地址处开始执行,转移指令及其他与PC有关的指令,专用于完成这一功能。二是读程序中的表格数据或常数,专用于这一操作的指令有两条,称为查表指令。 指令: MOVC A, A+PC MOVC A, A+DPTR 功能:采用变址寻址的字节代码传送,执行读程序存储器操作。 说明:

35、MOVC指令的功能是把程序存储器中的单字节代码或常数装入累加器。助记符MOVC的含义为从程序存储器取常数。其寄存器可以是数据指针或当前程序计数器。程序存储器一般用只读存储器ROM,所以这里只能读不能写。MOVC指令主要用于访问程序存储器中的表格数据或常数,采用DPTR数据指针作为基址寄存器,可以访问多至256项(0255)的表格,表格可以设置在64KB程序存储器的任何位置。在进行查表操作时,使DPTR指向表格的首址,表格的序号装入累加器,执行指令后就能把表格中的常数装入累加器A中。 以PC为基址寄存器的MOVC指令,其查表方法略为不同。表格位置设置有一定限制,只能设在查表指令操作码下的256个

36、字节范围之内。如A的内容为36H,DPTR的内容为3000H,程序存储器地址3036的内容为58H,执行MOVC A, A+DPTR后A的内容为58H。 单片机和外部数据存储器、程序存储器数据传送指令共有4+2条,指令中有一个操作数是A,分别用不同的助记符(MOVX/MOVC)。如图2.2所示。图2.2 片外数据存储器和程序存储器与片内数据传送第2章 MCS-51系列单片机指令系统 2.2.1 片内数据传送指令 1.内部RAM数据传送 2.堆栈操作指令 3.数据交换指令 2.2.2 片外数据传送指令 1.外部RAM数据传送 2.查表指令 2.2.数据传送类指令 目的要求:初步掌握单片机数据传送

37、类指令 使用方法,记忆分类方法。 教学重点:初步掌握29条数据传送指令。 记忆具体指令、理解其使用方法 复习内容: 指令的格式:标号:操作码助记符目的操作数,源操作数;注释 实际指令:LOOP:MOV A, #56H ;把数56H传送到累加器A中。 MOV R1, A ;把A的内容传送到R1中. 51单片机共七种寻址方式:立即寻址(#data)、寄存器寻址(Rn)、间接寻址(Ri/DPTR)、直接寻址(direct)、特定寄存器寻址(A)、基址加变址寻址(A+PC/A+DPTR)、相对寻址(rel)。也就是说在指令中出现的操作数只有这七种。51单片机的111条指令 通常把51单片机的111条指

38、令按功能分为五大类;数据传送类指令、算术运算类指令、逻辑运算类指令、控制转移类指令和布尔操作类指令。其中数据传送类指令又分为片内数据传送(MOV)、片外数据传送(MOVX、MOVC),数据交换(XCH),堆栈操作(PUSH、POP)等四个部分,共29条指令,下面详细介绍数据传送指令。1、内部RAM数据传送 指令格式:MOV ,说明:把第二操作数(源操作数)指定的字节变量传送到由第一操作数所指定的地址单元中(目的操作数),该操作不改变源字节的内容,不影响PSW中的标志位。以A为目的操作数时影响PSW中的P位。(51单片机的指令多按英文的习惯把运行的结果存放在第一个操作数中,并把第一个操作数叫目的

39、操作数)。此类指令参入的源操作数和目的操作数只有#data/A/Rn/Ri/direct五个,其不同组合,共有16条指令。以A为目的操作数的指令以累加器A为目的操作数有4条指令,(源操作数是Ri/Rn/direct/#data)执行结果(8位数)送入A中。助记符指令 具体指令 操作前内容 操作后内容 注 释 MOV A,#data MOVA,#36H (A)=17H (A)=36H 00HFFH MOV A,Rn MOV A,R2 (A)=17H,(R2)=38H (A)=38H,(R2)=38H n=0 7MOV A,Ri MOV A,R1 (A)=17H,(R1)=38H(38H)=59H

40、 (A)=59H,(R1)=38H(38H)=59H i=0 1 MOV A,direct MOV A,47H (A)=17H,(47)=35H (A)=35H,(47)=35H 00HFFH 以Ri或Rn为目的操作数注意两R之间没有数据传送指令。助记符指令 具体指令操作前内容操作后内容 MOV Rn,A MOV R0,A R0=12H,A/53HR0=53H,A/53HMOV Rn,#dataMOV R1,#35HR1=13H,R1=35H,MOV Rn ,direct MOV R2 ,45HR2/14H,45H/58HR2/58H,45H/58HMOV Ri,AMOV R0,AR0/30H

41、,A/75HR0/30H/75H,A/75HMOV Ri,#dataMOV R0,#36HR0/31H,R0/31H/36H,MOVRi ,directMOV R0 ,45HR0/32H,45H/78H32H/78H,45H/78H目的操作数是直接地址源操作数有A/#data/Rn/Ri/direct,结果8位数送入目的地址direct中。助记符指令具体指令操作前内容操作后内容MOV direct,#dataMOV 31H,#4DH 31H/15H,31H/4DHMOV direct,A MOV 32H,A 32H/16H,A/37H32H/37HMOV direct,RiMOV 33H,R0

42、33H/17H,R0/36H/57H33H/57HMOV direct,Rn MOV 34H,R7 34H/18H, R7 /37H34H/37HMOV direct, direct MOV 35H, 36H 35H/19H,36H59H35H/59H指令:MOV DPTR,#data16 功能:把16位常数装入数据指针中,执行操作(DPTR)data16说明:注意这条三字节指令的编码形式。第一字节为操作码(90H),第二字节为数据高8位将存放入DPH,第三字节为数据低8位存放入DPL。以后这个16位数将作为数据地址使用。用MOV写出的片内数据传送指令有16条指令 51单片机寻址方式有七种,内

43、部数据传送指令只用其中的五种寻址方式。助记符是MOV,下面给出一个速记图,以方便大家学习。2.堆栈操作指令 指令 PUSH direct 功能:把直接寻址中的数据送入堆栈,称为进栈。数据为程序 的中间结果说明:首先栈指针自动加1,执行(SP)(SP)+1,将栈指针移向堆栈中无数据的地址单元,然后将直接地址(direct)单元的内容送入SP所指定的堆栈单元中,执行(SP)(direct),该操作不影响标志位。【例2.3】堆栈操作设堆栈指针SP的内容为09H,数据指针DPTR的内容为0123H,试分析下列指令的执行结果。PUSH DPLPUSH DPH 执行第一条指令:(SP)+1=0AH(SP)

44、;(DPL)=23H(0AH)把23H压入堆栈0AH中 执行第二条指令:(SP)+1=0BH(SP);(DPH)=01H(0BH)把01H压入堆栈0BH中 执行结果为:(0AH)=23H,(0BH)=01H,(SP)=0BH堆栈指针SP的内容为0BH指令: POP direct 功能:把堆栈SP中的中间数据送入目的字节,称为出栈。和PUSH对应,出栈指令为: POP direct。 说明:读出由栈指针SP寻址的内部RAM单元内容。送到指定的直接寻址的字节单元,然后栈指针自动减1,即执行操作:(direct)(SP),(SP) (SP)-1;该指令执行不影响标志位。3.数据交换指令 指令: XC

45、H A,byte;byte表示一个操作数字节功能:交换累加器与字节变量中的数据。源操作数有Rn/direct/Ri说明:XCH指令把指定字节的内容装入累加器A中,同时把累加器中原来的内容写入指定的字节中。源操作数有:Rn/direct/Ri,目的操作数是A,共有三条指令。 字节交换指令字节交换指令有三条:助记符指令具体指令操作前内容操作后内容XCH A,RnXCH A,R6 A/78H,R6/56HA/56H,R6/78HXCH A,RiXCH A,R1 A/78H,R1/32H/39HA/39H,R1/32H/78HXCH A,directXCH A,37H A/78H.,37H/93HA/

46、93H, 37H/78H半字节交换指令指令 XCHD A,Ri功能:低半字节数据交换,执行操作(A3-0)(Ri)3-0) 指令: SWAP A 功能:累加器高4位内容与低4位内容交换例:XCHD A,RO;当(A)=34H,(20H)=75H 其结果为 (20H)=01110100B=74H (A) =00110101B=35H如果是执行 SWAP A ;则;(A)=43H2.2.2 片外数据传送指令 1.外部RAM数据传送 MCS-51单片机专用于访问外部数据存储器的指令只有4条 MOVX A,Ri ;把Ri内容为低8位地址的外部RAM单元中的数据传送AMOVX Ri, A ;把A的内容送

47、Ri的内容为低8位地址的外部RAM单元中MOVX A,DPTR ;把DPTR的内容为16位地址的外部RAM单元中的数据传送AMOVX DPTR,A ;把A的内容送DPTR的内容为16位地址的外部RAM单元中 2、查表指令 51单片机对程序存储器的访问指令有两条:指令: MOVC A,A+PC MOVC A, A+DPTR 说明:MOVC指令的功能是把程序存储器中的单字节代码或常数装入累加器。助记符MOVC的含义为从程序存储器中取常数。其寄存器可以是数据指针或当前程序计数器。程序存储器一般使用只读存储器ROM,所以这里只能读不能写。 片外数据传送举例操作前(A)=37H,(P2)=41H,(R0

48、)=01H,数据存储器(4101H)=35H, DPRT指向4101H,程序存储器地址PC=2000H,(2037H)=45H,(4138H)=57H,当不考虑上下指令的关系:MOVX A,R0 ;(A)=35H MOVX R0, A ;(4101H)=37H MOVX A,DPTR ;(A)=35H ;4101HMOVX DPTR,A ;(4101H)=37H MOVC A,A+PC ; (A)=45H ;37H+2000HMOVC A, A+DPTR ; (A)=57H ;37H+4101H片外数据存储器和程序存储器 片外数据存储器和程序存储器与片内数据存储器之间的传送数据共有6条指令 。

49、可用 下图加强记忆。 2.3 算术运算类指令 MCS-51单片机算术运算指令包括:加法指令(ADD)、带进位加法ADDC和带借位减法指令(SUBB)、加1指令(INC)、减1指令(DEC)、十进制调整指令(DA)、乘法(MUL)和除法(DIV)指令,共24条,加减法指令中有两个操作数时目的操作数是A,源操作数是Ri/Rn/direct/#data之一,其中DPTR有一条加一指令,参入乘法和除法的操作数只能是A和B,见表2.3。 类别 指令 机器码 字节数 执行周期 PSW位 功能注释加 ADD A,Rn 28-2F 1 12 CY OV AC (A)(A)+(Rn) 法 ADD A,Ri 26

50、/27 1 12 CY OV AC (A)(A)+(Ri) ADD A,direct 25 direct 2 12 CY OV AC (A)(A)+(direct) ADD A,#data 24 data 2 12 CY OV AC (A)(A)+ data带 ADDC A,Rn 38-3F 1 12 CY OV AC (A)(A)+(C)+(Rn)进 ADDC A,Ri 36/37 1 12 CY OV AC 带进位C加法位 ADDC A,direct 35 direct 2 12 CY OV AC 加 ADDC A,#data 34 data 2 12 CY OV AC带 SUBB A,R

51、n 98-9F 1 12 CY OV AC (A)(A)-(C)-(Rn)进 SUBB A,Ri 96/97 1 12 CY OV AC 带借位C减法位 SUBB A,direct 95 direct 2 12 CY OV AC 减 SUBB A,#data 94 data 2 12 CY OV AC表:2.3算术运算类指令加 INC A 04 1 12 (A)(A)+1 INC Rn 08-0F 1 12 操作数内容加1一 INC Ri 06/07 1 12 INC direct 05 direct 2 12 INC DPTR A3 1 24 减 DEC A 14 1 12 操作数内容减1

52、DEC Rn 18-1F 1 12一 DEC Ri 16/17 1 12 DEC direct 15 direct 2 12 MUL AB A4 1 48 OV (BA)(A)(B) DIV AB 84 1 48 OV (A)(A)/(B) DA A DA 1 12 余数送B2.3.1 加法指令 1.加法 ADD 说明:ADD指令把源字节变量与累加器A内容相加,结果存放在累加器A中,如果位7(最高位D7)或位3(第四位D3)向高位有进位,则分别将PSW的进位Cy和半进位AC标志位置1;否则清0。此外,ADD指令还将影响标志位OV和P。通常8位数据看成是用D7D6D5D4D3D2D1D0表示。A

53、DD指令有4种源操作数寻址方式:寄存器、直接、寄存器间址和立即数。当有两个操作数时有一个是A ,并且作为目的操作数,见表2.3。 无符号整数相加时,若C位为1,说明和数有溢出(大于255),在默认条件下,本单片机只能进行十六进制运算,但由于日常需要进行十进制或负数运算(以后叫带符号数),则可根据标志位的变化通过软件换算出结果,常把一个8位带符号数的最高位看成符号位,这样它只有七位有效数字,两个带符号数相加是否产生溢出,取决于和数位D6和位D7的进位情况。 【例2.9 】 设A的内容为十六进制数98H,R0的内容为十六进制数56H,地址单元56H的内容为十六进制数0B9H。不考虑上下指令的关系。

54、 ADD A,R0 ;98H+56H=0 EEH,结果A的内容为0EEH,进位Cy和AC都为0 ADD A,R0 ;98H+0B9H=1 51H,结果A的内容为51H,进位Cy和AC都为1 ADD A,56H ;98H+0B9H=1 51H,结果A的内容为51H,进位Cy和AC都为1 ADD A,#5CH ;98H+5CH=0 F4H,结果A的内容为0F4H,进位Cy为0,AC为1 2.带进位加法。ADDC 说明:ADDC把指令中的源字节变量、低位来的进位C与累加器内容相加,结果存于累加器中。该指令对标志位的影响,进位和溢出情况和ADD指令完全相同。 ADDC指令有4种操作数寻址方式,相应的4

55、条指令见表2.3。多字节数相加必须使用该指令,以保证低位字节的进位加到高位字节中。 【例2.10】设(A)=0C3H ,(RO)=0AAH,当(C)=1时,执行指令;ADDC A,RO (A) 11000011 ;看成有符号数为-3DH(100H- 0C3H),此为补码运算。 (RO)10101010 ;看成有符号数为-56H(100H- 0AAH) + (C) 1 ;低位送来的进位为1或C的内容 为1。 1 01101110 ;规定有符号数的最高位不是数 1,而是符号“负” 结果为:(C)=1,(OV)=1,(A)=6EH或看成符号数运算-3DH+(-56H)+1=-92H 本例操作结果的值

56、,以及本单片机的其它算术运算,本来都是十六进制无符号数运算。但可根据操作数是无符号数还是有符号数,运算时的进位和溢出等情况进行判别,从而通过软件来进行有符号数运算,这里若操作数为无符号数,则结果为366(十六进进制数为1 6EH),若是有符号数参入运算,因最高位为符号位,则结果为-146(-92H,补码是16EH)。因已超出了8位有符号数表示范围(-128127)。(10 0000 0000-0 1001 0010=1 0110 1110)或(2 00H-92H=1 6EH)结果是9位有符号数。注意:由负数的补码参入运算,结果也是补码,负数补码的最高位是1,可看成符号位。 3 加一指令 INC

57、 byte 说明:把指令中的字节变量加1,结果仍存放在原字节中。若原字节变量为0FFH,加1后将溢出为00H。该指令不影响任何标志。 INC 指令有4种寻址方式。A寻址、寄存器、直接和寄存器间址,共有4条指令。 INC A ;A的内容加一 INC R1 ;R1的内容加一 INC R1 ;R1的内容为地址单元的内容加一 INC 32H ;内部RAM32H地址单元的内容加一 【例2.11】 设(RO)=7EH,(7EH)=0FFH (7FH)=40H,执行下列指令: INC R0 ;0FFH+1=00H(7EH) INC RO ;7EH+1=7FH(RO) INC RO ;40H+1=41H(7F

58、H) 结果为:(RO)=7FH,(7EH)=00H,(7FH)=41H 另外,对于指令“INC direct”,当指令中的direct为端口地址P0P1时,其功能是修改端口的内容,其操作过程是先读入端口的内容,然后在CPU中加1,再输出到端口。注意:读入端口的值取自端口锁存器,而不是引脚。 4.指令 INC DPTR 功能:把16位数据指针内容加1。执行16位无符号数加法,即先对数据指针的低8位DPL内容加1,当有溢出时,再把DPH内容加1,不影响任何标志。这是唯一的16位寄存器加1指令。 2.3.2 十进制调整指令 功能:对累加器A中的BCD码加法运算后的结果进行二一十进行调整。 说明:单片

59、机运算指令是按十六进制加法设计,即8位二进制数运算之后,其结果(累加器A中的8位二进制数)可看成是二位十六进制数,而我们日常用的是十进制数,当我们把两个十进制数送单片机进行十六进制运算,该指令是把十六进制运算的结果化为十进制数,如运算06H+07H=0DH调整为十进制数为13。也就是说两个十进制数的和应在09之间时,单片机中结果确是在0-F之间,“DA A”指令正是在这一前提下出现的。 “DA A”指令能够根据加法运算后累加器中的值和PSW中的AC和C标志位的状态,自动选择一个修正值(00H,06H,60H,66H中的一个)和原运算结果相加,从而在任何情况下,都能获得正确的结果。这个过程称为二

60、一十进制调整。“DA A”指令在执行过程中自动选择修正值的规则是: 若(A30)9或(AC)=1,则执行(A30)+6(A30) 若(A74)9或(C)=1,则执行(A74)+6(A74)【例2.12】 设累加器A的内容为56H,它表示十进制数56的压缩的BCD码数,寄存器R3的内容为67H,表示十进制数67的压缩的BCD码数,进位标志为1,注:运算前参入运算的是十进制数56和67,采用十六进制运算。执行下列指令:ADDC A, R3 ;56H+67H=0BEHDA A ;0BEH+66H=1 24H,其中A的内容为24,进位为1 可以看出,执行ADDC指令后,累加器中的和数为BEH,它不是所

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论