大学单片机原理及应用(C语言版)-周国运-课件PPT
收藏
资源目录
压缩包内文档预览:(预览前20页/共24页)
编号:21836325
类型:共享资源
大小:16.05MB
格式:ZIP
上传时间:2019-09-06
上传人:QQ24****1780
认证信息
个人认证
王**(实名认证)
浙江
IP属地:浙江
25
积分
- 关 键 词:
-
大学
单片机
原理
应用
利用
运用
语言版
国运
课件
ppt
- 资源描述:
-
大学单片机原理及应用(C语言版)-周国运-课件PPT,大学,单片机,原理,应用,利用,运用,语言版,国运,课件,ppt
- 内容简介:
-
单片机原理及应用 (C语言版)第3章 MCS-51指令系统及汇编程序设计主 编:周国运本章制作:周国运中国水利水电出版社第3章 MCS-51指令系统及汇编程序设计目 录3.1 汇编语言概述 3.2 MCS-51单片机寻址方式3.3 MCS-51单片机指令系统3.4 MCS-51单片机伪指令3.5 汇编语言程序设计举例 本章讨论MCS-51单片机的指令系统及汇编语言程序设计。内容主要包括:汇编语言基本概念、寻址方式、指令系统、伪指令、汇编语言程序举例。本章是单片机程序设计的基础,即便是主要用C语言做设计程序,但对某些要求较高的部分,还是需要用汇编语言来写程序。 3.1 汇编语言概述 主要内容3.1.1 指令和机器语言3.1.2 汇编语言3.1.3 汇编语言指令格式3.1.1 指令和机器语言一、指令和指令系统指令:是计算机中CPU根据人的意图来执行某种操作的命令。指令系统:是一台计算机(CPU)所能执行的全部指令的集合。指令系统的强弱,决定了计算机智能的高低。3.1.1 指令和机器语言二、程序和程序设计语言程序:人们编写的、使计算机完成某项工作的指令序列,称为程序。程序设计:编写程序的过程叫程序设计程序设计语言:编写程序的一整套规则、方法。程序设计语言分类:分为机器语言、汇编语言和高级语言等。3.1.1 指令和机器语言三、机器语言机器语言:用二进制编码表示每条指令,是计算机能够直接识别和执行的语言。目标程序:用机器语言编写的程序。例如“13+25” ,在MCS-51中的机器码为0 1 1 1 0 1 0 0 0 0 0 0 1 1 0 10 0 1 0 0 1 0 0 0 0 0 1 1 0 0 1用十六进制表示指令码为:74H 0DH把13放到累加器A中24H 19H A加25,结果仍放回A中3.1.2 汇编语言汇编语言:用助记符、符号、数字等表示指令的程序语言。例如,上面的“13+25”的例子可写成:汇编语言程序机器语言代码MOV A,#0DH74H 0DHADD A,#19H24H 19H相对于机器语言来说,汇编语言容易理解和记忆。 汇编语言和机器语言都属于低级语言。 3.1.3 汇编语言指令格式一、MCS-51汇编语言指令格式由四部分组成,其一般格式如下:标号: 操作码 操作数 ;注释方括号中的内容可以没有,即可以没有标号、操作数和注释,至少要有操作码。其操作数部分最多可以是三项:第1操作数 , 第2操作数 , 第3操作数对MOV指令,有两项,第1操作数常称为目的操作数,第2操作数称为源操作数。3.1.3 汇编语言指令格式例如:START:MOVA,#23H;23H A“START”为标号“MOV”为操作码“ A,#23H”为操作数“23H A”为注释 3.1.3 汇编语言指令格式二、MCS-51汇编指令构成1、单字节指令指令中既包含有操作码,也包含有操作数,有两种情况。1)指令码中隐含着对某个寄存器的操作如:“INC A”、“MUL AB”、“RL A”、“CLR C”、“INC DPTR”等指令。2)由指令码中的r r r或i指定操作数 3.1.3 汇编语言指令格式这种情况是指令中使用了Rn或Ri如“MOVRn,A”编码格式为:1 1 1 1 1 r r rrrr的取值为:07,表示R0R7又如“MOV A,Ri”编码格式为:1 1 1 0 0 1 1 ii取值为:0、1,表示R0、R13.1.3 汇编语言指令格式2、双字节指令一个字节表示操作码,另一个字节表示操作数或操作数的地址。3、三字节指令一个字节表示操作码,另两个字节表示操作数或操作数的地址。3.2 MCS-51单片机寻址方式 主要内容3.2.1 立即数寻址3.2.2 寄存器寻址3.2.3 直接寻址3.2.4 寄存器间接寻址3.2.5 变址寻址3.2.6 位寻址3.2.7 指令寻址3.2.8 寻址空间及指令中的符号 寻址方式:就是指CPU寻找参与运算的操作数的方式,或者寻找数据保存位置的方式。7种寻址方式:立即数寻址、寄存器寻址、直接寻址、寄存器间接寻址、变址寻址、位寻址和指令寻址。寻址方式分两类:操作数寻址和指令寻址,在7种寻址方式中,除了指令寻址之外,其余6种都属于操作数寻址。 寻址方式是汇编语言程序设计中最基本的内容之一,必须要十分熟悉。3.2 MCS-51单片机寻址方式 3.2.1 立即数寻址立即数寻址也叫立即寻址、常数寻址。其操作数就在指令中,是指令的一部分,紧跟在操作码后面,用“#”符号作前缀,以区别地址。例如:MOV A,#2CH;2CH A MOV A,2CH;(2CH) A前者表示把2CH这个数送给累加器A,后者表示把片内RAM中地址为2CH单元的内容送给累加器A。 3.2.1 立即数寻址立即数也可以是16位的,如:MOVDPTR,#1234HMOVTL2,#2345HMOVRCAP2L,#3456H对于第2条指令,立即数的低8位送给了TL2,高8位送给了TH2;对于第3条指令,立即数的低8位送给了RCAP2L,高8位送给了RCAP2H。 3.2.2 寄存器寻址寄存器寻址:就是由指令指出寄存器组R0R7中某一个或寄存器A、B、DPTR和C(位处理器的累加器)的内容作为操作数。例如:MOVA,R7;(R7) AMOV36H,A;(A) 36HADDA,R0;(A)+(R0) A对于工作寄存器组的操作,必须要考虑PSW中RS1、RS0的值,确定当前使用的是哪一组寄存器以及它们的实际地址。 3.2.2 寄存器寻址图3-1 寄存器寻址方式(INC R3)3.2.3 直接寻址直接寻址:是指操作存放在片内RAM中,指令中给出操作数的地址。例如:MOVA,38H;(38H) A说明: (1)直接寻址方式可以访问片内RAM的低128字节和所有的特殊功能寄存器。(2)直接寻址不能够访问片内RAM的高128字节,高128字节只能够间接访问。对于特殊功能寄存器,既可以使用地址,也可以使用SFR名。例如:MOVA,P1 或 MOVA,90H 3.2.4 寄存器间接寻址寄存器间接寻址:是指操作数存放在RAM中,指令中给出存放操作数地址的寄存器,指令执行时,通过寄存器内的地址,间接地访问操作数。存放地址的寄存器称为间址寄存器,在指令中,在寄存器前面加前缀“”表示。MCS-51单片机规定,使用Ri(i=0、1,即指R0、R1)、SP和DPTR作间址寄存器。寄存器间接寻址有以下几种情况。 3.2.4 寄存器间接寻址一、使用Ri间接访问片内RAM间接访问的范围:256字节(包括低128字节和高128字节),但不包括特殊功能寄存器。例如:MOVA,Ri;(Ri) AMOVRi,A;(A)(Ri)(Ri):表示Ri指向的单元,即单元的地址((Ri)):表示Ri指向单元中的数据。操作过程如图3-3所示。3.2.4 寄存器间接寻址对使用SP间接访问片内RAM (在C语言中也可以访问片外RAM) ,仅用在堆栈操作中,见后面指令系统。 3.2.4 寄存器间接寻址二、使用Ri间接访问片外RAM间接访问的范围:片外RAM的64KB全空间。其指令只有两条:MOVXA,Ri ;(P2) (Ri) AMOVXRi,A ;(A)(P2 Ri)注意: (1)P2中的值作为高8位地址,Ri中的值作为低8位地址; (2)如果P2不改变,则范围为256B;(3)这两条指令均为总线操作,相应总线信号有效(高低8位地址、ALE、RD或WR)。3.2.4 寄存器间接寻址三、使用DPTR间接访问片外RAM间接访问的范围:片外RAM的64KB全空间。其指令也是只有两条:MOVXA,DPTR;(DPTR) AMOVXDPTR,A;(A)(DPTR)DPTR为16位地址。 3.2.5 变址寻址变址寻址:实为基址加变址的间接寻址。指令中给出存放基址和变址的寄存器。基地址寄存器:DPTR或PC;变址寄存器:累加器A。也在地址寄存器前面加上前缀“”。例如:MOVCA,A+DPTR;(A)+(DPTR) A该指令的操作过程如图3-4所示。 3.2.5 变址寻址3.2.5 变址寻址变址寻址的空间为程序存储器寻址范围:若使用DPTR为基地址寄存器,寻址范围为64KB;若使用PC为基地址寄存器,寻址空间在PC之后256字节范围内。变址寻址主要用于查表操作 3.2.6 位寻址位寻址:是指操作数是二进制位、位地址位操作数地址范围:片内RAM中20H2FH,SFR中可以按位寻址的位。位地址在指令中用bit表示。例如:SETBbitMOVC,bit 3.2.6 位寻址位地址的4种表示方式:1)直接位地址(00HFFH)。如32H2)字节地址带位号。如20H.1,表示20H单元的第1位。3)特殊功能寄存器名带位号。如P1.7,表示P1口的第7位。4)位符号地址。具体的:SFR位名;用 “BIT”定义的位符号(如“flag BIT 01H”)。如TR0、flag,TR0表示定时器/计数器0的运行控制位,flag表示01H位。 3.2.7 指令寻址指令寻址:指令中的操作数给出转移的目标地址或目标地址的一部分。指令寻址分为绝对寻址和相对寻址两种方式。指令寻址用于控制转移指令中。3.2.7 指令寻址一、绝对寻址绝对寻址:指令中的操作数给出转移的16位目标地址。寻址范围:64KB全空间。绝对寻址用在长转移和长调用指令中,例如:LJMPSER_INT_T1;无条件转移到T1中断服务程序LCALLSUB_SORT; SUB_SORT调用排序子程序SUB_SORT为16位目标地址标号SER_INT_T1为16位目标地址标号3.2.7 指令寻址二、相对寻址相对寻址:是以当前程序计数器PC值为基地址,加上指令中给出的偏移量rel,得到目标位置的地址。即:目标地址PCrelrel目标地址PC偏移量rel为8位补码,其值为-128+127。rel0表明目标地址小、源地址大,程序向回跳转;rel0,程序向前跳转。3.2.7 指令寻址例如:JZFIRST;(A)0,跳转到FIRSTDJNZR7,LOOP;(R7)-10,跳转到LOOP说明:(1)在实际编程中,不需要计算rel,rel由编译器自动计算;(2)当跳转范围超出了rel范围,编译器会提示,对程序做适当调整即可。 3.2.8 寻址空间及指令中的符号注释3.2.8 寻址空间及指令中的符号注释二、指令中常用符号Rn:n=07。当前选中的工作寄存器R0R7。Ri:i=0、1。当前选中的工作寄存器组中可作为地址指针的R0和R1。#data:8位立即数。#data16:16位立即数。direct:8位片内RAM单元地址,包括低128B和SFR,但不包括高128B。addr16:程序存储空间的16位地址 3.2.8 寻址空间及指令中的符号注释rel:补码形式的8位地址偏移量。以下面指令的第一个字节为基地址,地址偏移量在-128+127。bit:片内RAM或SFR中的直接寻址位地址:间址寄存器的前缀符号,表示间接寻址。3.2.8 寻址空间及指令中的符号注释():表示中的内容 ():表示由中指向的地址单元中的内容:逻辑与:逻辑或:逻辑异或、:指令操作流程,将内容送到箭头指向的地方 3.3 MCS-51单片机指令系统 主要内容3.3.1 数据传送指令3.3.2 算术运算指令3.3.3 逻辑运算指令3.3.4 控制程序转移指令3.3.5 位操作指令3.3 MCS-51单片机指令系统 指令概述MCS-51单片机指令系统有111条指令,分类如下。1、按字节分类单字节指令:49条;双字节指令:45条三字节指令:17条2、按执行时间分类单周期指令:64条;双周期指令:45条四周期指令:2条(乘、除指令)3.3 MCS-51单片机指令系统 3、按功能分类(分为5大类)数据传送指令:29条算术运算指令:24条逻辑运算指令:24条控制程序转移指令:17条位操作指令:17条MCS-51指令没有复杂的寻址方式,并且助记符只有42种,所以单片机指令容易理解、容易记忆、容易掌握。 3.3.1 数据传送指令数据传送是使用最频繁的一类指令。所谓传送,就是把源地址单元的内容传送到目的地址单元中去,而源地址单元中的内容不变。数据传送指令可以分为三组:普通传送指令、数据交换指令、堆栈操作指令。这类指令一般不影响程序状态字,只有目的操作数是累加器A时,影响标志位P。3.3.1 数据传送指令一、普通传送指令普通传送指令以助记符MOV为基础,分为:片内数据存储器传送指令,用MOV片外数据传送指令,用MOVX程序存储器传送指令,用MOVC3.3.1 数据传送指令1、片内数据存储器传送指令MOV 格式: MOV 目的操作数,源操作数源操作数:可以是A、Rn、Ri、 direct、#data目的操作数:可以是A、Rn、Ri、direct、DPTR以目的操作数的不同可以分为五个小组,共16条指令。 3.3.1 数据传送指令(1)以A为目的操作数MOVA,Rn ;(Rn)A E8EFMOVA,direct ;(direct)A E5 directMOVA,Ri ;(Ri)A E6 E7 MOVA,#data ;data A 74 data工作寄存器Rn:R0R7Ri间接寻址寄存器:R0或R1本组4条指令都影响PSW中的P标志位指令字节数:1、2、1、2 3.3.1 数据传送指令(2)以Rn为目的操作数MOVRn,A;(A) Rn MOVRn,direct;(direct) RnMOVRn,#data;data Rn本组指令都不影响PSW中的标志位。指令字节数:1、2、2 3.3.1 数据传送指令(3)以直接地址direct为目的操作数MOVdirect,A;(A) directMOVdirect,Rn;(Rn) directMOVdirect2,direct1 ;(direct1)direct2MOVdirect,Ri;(Ri) directMOVdirect,#data;data direct本组指令都不影响PSW中的标志位指令字节数:2、2、3、2、3 3.3.1 数据传送指令(4)以间接地址Ri为目的操作数MOVRi,A;(A) Rn MOVRi,direct;(direct) RnMOVRi,#data;data Rn本组指令都不影响PSW中的标志位。 3.3.1 数据传送指令(5)以DPTR为目的操作数MOVDPTR,#data16;dataHDPH,dataLDPL该指令不影响PSW中的标志位。例3-1 设片内RAM中(30H)=40H,(40H)=10H,分析以下程序执行后各单元及寄存器中的内容。 3.3.1 数据传送指令MOVR0,#30H;30H R0MOVA,R0;(R0) AMOVR1,A;(A) R1MOVB,R1;(R1) BMOV10H,#20H;20H 10H执行上述指令后的结果为:(R0)=30H,(R1)=(A)=40H,(B)=10H,(10H)=20H3.3.1 数据传送指令2、片外数据存储器传送指令MOVXMOVXA,Ri;(P2),(Ri) AMOVXRi,A;A (P2, Ri)MOVXA,DPTR;(DPTR) AMOVXDPTR,A;A (DPTR)第1和第3条指令是执行总线读操作,读控制信号RD有效;第2和第4条指令是执行总线写操作,写控制信号WR有效。这组指令中第1、3两条指令影响P标志位,其它2条指令不影响任何标志位。 3.3.1 数据传送指令例3-2 设片外RAM空间(0203H)=6FH,分析执行下面指令后的结果。MOVDPTR,#0203H;0203H DPTRMOVXA,DPTR;(DPTR) AMOV30H,A;(A) 30HMOVA,#0FH;0FH AMOVXDPTR,A;(A) (DPTR)执行结果为:(DPTR)=0203H,(30H)=6FH,(0203H)=(A)=0FH3.3.1 数据传送指令3、程序存储器传送指令MOVC该类指令又称为查表指令,经常用于查表。这类指令只有以下2条单字节指令。MOVCA,A+DPTR ;(A)+(DPTR) AMOVCA,A+PC ;(A)+(PC) A前者叫远程查表指令(64KB全空间),后者叫近程查表指令(PC处256B)。这两条指令都影响P标志位。3.3.1 数据传送指令地址偏移量的计算方法使用第2条指令的关键,是准确计算从本指令到数据所在处的地址偏移量。将分为两段:表首偏移和表内偏移地址偏移量表首偏移量表内偏移量表首偏移量为:表首偏移量表首地址PC3.3.1 数据传送指令例3-3 从程序存储器2000H单元开始存放09的平方值,以PC作为基址寄存器,执行查表指令得到6的平方值,并且送到片内RAM中的30H单元。设MOVC指令所在的地址为1FA0H,则表首偏移量2000H(1FA0H1)5FH,表内偏移量为6。相应的程序为:MOVA,#5FH;表首偏移送AADDA,#06H;计算总偏移MOVCA,A+PC;读表中数据MOV30H,A3.3.1 数据传送指令用以DPTR为基址寄存器的查表指令,其程序如下:MOVDPTR,#2000HMOVA,#6MOVCA,A+DPTR MOV30H,A通过本例对两条查表指令比较可以看出,以DPTR为基址寄存器的查表指令使用简单、方便。 3.3.1 数据传送指令二、数据交换指令数据交换指令则数据作双向传送,传送后,前一个操作数传送到了后一个操作数所保存的地方,后一个操作数传送到了前一个操作数所保存的地方。数据交换指令要求第一个操作数必须为累加器A。共5条指令,分为字节交换和半字节交换两个类型。 3.3.1 数据传送指令1、字节交换指令XCHA,Rn;(A)(Rn)XCHA,direct;(A)(direct)XCHA,Ri;(A)(Ri)这3条指令都影响P标志位2、低半字节交换指令XCHDA,Ri ;(A03)(Ri)03)这条指令影响P标志位3、A自身半字节交换指令SWAPA;(A 03)(A47)这条指令不影响任何标志位3.3.1 数据传送指令例3-4 设(R0)=30H,(30H)=4AH,(A)=28H,则分别执行“XCH A,R0”、 “XCH A,R0” “XCHD A,R0”、“SWAP A”后各单元的内容。执行:XCH A,R0 ;后(A)=30H,(R0)=28H执行:XCH A,R0 ;后(A)=4AH,(30H)=28H执行:XCHD A,R0 ;后(A)=2AH,(30H)=48H执行:SWAP A;后(A)=82H,(30H)=4AH3.3.1 数据传送指令三、堆栈操作指令堆栈操作有进栈和出栈两条指令,常用于保存和恢复现场。PUSHdirect;先(SP) +1 SP, ;后(direct)(SP)POPdirect;先(SP) direct, ;后(SP) -1 SPPUSH为进栈操作, POP为出栈操作。当操作数是累加器A时,影响P标志位。 3.3.1 数据传送指令例3-5 若在程序存储器中2000H单元开始的区域依次存放着09的平方值,用查表指令读取3的平方值并存于片内RAM中30H单元,要求操作后保持DPTR中原来的内容不变。为了使用DPTR,并且保持原来的内容不变,应该在使用DPTR前使其进栈,使用后再出栈恢复其原来内容。程序如下: 3.3.1 数据传送指令注意:(1)进栈与出栈必须成对使用;(2)先进栈的必须后出栈,后进栈的必须先出栈,否则会出现DPL与DPH内容互换。 PUSHDPHPUSHDPLMOVDPTR,#2000HMOVA,#3MOVCA,A+DPTRMOV30H,APOPDPLPOPDPH3.3.2 算术运算指令指令内容:包括加、减、乘、除、BCD码调整等指令,共有24条。CPU的运算能力:只能执行无符号二进制整数运算,可以借助于溢出标志位,实现有符号数的补码运算;借助于进位标志,可以实现多精度加、减运算。对标志位的影响:结果会影响进位标志CY、半进位标志AC、溢出标志OV、奇偶标志位P,但加1和减1指令不影响这些标志位。3.3.2 算术运算指令指令中的操作数:多数以累加器A作为第一操作数,第二操作数可以是工作寄存器Rn、直接地址数据、间接地址数据和立即数。即第一操作数:多为A第二操作数:Rn、direct、Ri、#data为了便于讨论,将其分为5个类型。 3.3.2 算术运算指令一、加法指令分为不带进位加法、带进位加法和加1指令1、不带进位加法指令ADDADD A,Rn;(A)+(Rn)AADD A,direct;(A)+(direct)AADD A,Ri;(A)+(Ri)AADD A,#data;(A)+ dataA 这组指令影响标志位CY、AC、OV和P,溢出标志OV只对有符号运算有意义。 3.3.2 算术运算指令2、带进位加法指令ADDCADDCA,Rn;(A)+(Rn)+ CYAADDCA,direct ;(A)+(direct)+CYAADDCA,Ri;(A)+(Ri)+CYAADDCA,#data;(A)+data+CYA 这组指令影响标志位CY、AC、OV和P,溢出标志OV只对有符号运算有意义。 3.3.2 算术运算指令例3-7 试编写程序,把R1R2和R3R4中的两个16位数相加,结果存放在R5R6中。思路:先对两个低字节相加,再对两个高字节相加。 (1)低字节R2和R4相加:使用ADD,其和存放于R6中; (2)高字节R1和R3相加:使用ADDC,其和存放于R5中。程序段如下页。 3.3.2 算术运算指令程序段如下:MOVA,R2;(R2) AADDA,R4;(A)+(R4) AMOVR6,A;(A) R6MOVA,R1;(R1) AADDCA,R3;(A)+(R3)+CYAMOVR5,A;(A) R5 3.3.2 算术运算指令3、加1指令INCINCA;(A)+ 1 AINCRn;(Rn)+ 1 RnINCdirect;(direct)+ 1 directINCRi;(Ri)+ 1 (Ri)INCDPTR;(DPTR)+ 1 DPTR这组指令除了第一条影响标志位P之外,其它指令不影响标志位。 3.3.2 算术运算指令二、减法指令减法指令分为带借位减法指令和减1指令。1、带借位减法指令SUBBSUBBA,Rn;(A)-(Rn)-CYASUBBA,direct;(A)-(direct)- CYASUBBA,Ri;(A)-(Ri)-CYASUBBA,#data;(A)-data-CYA这组指令影响标志位CY、AC、OV和P,溢出标志OV只对有符号数运算有意义。 3.3.2 算术运算指令由于MCS-51单片机没有不带借位的减法指令,对于不带借位的减法运算,可以先对CY清0,然后再用SUBB命令操作。例3-8 试编写实现“R2R1 R3”功能的程序。程序段如下:MOVA,R2CLRC;对CY清0SUBBA,R1MOVR3,A 3.3.2 算术运算指令1、减1指令DECDECA;(A) - 1 ADECRn;(Rn) - 1 RnDECdirect;(direct) - 1 directDECRi;(Ri) - 1 (Ri)这组指令除了第一条影响标志位P之外,其它指令不影响标志位。 3.3.2 算术运算指令三、乘法指令MUL在MCS-51单片机中,乘法指令只有一条。MUL AB;(A)(B) B(高字节)、A(低字节)操作:把累加器A和寄存器B中两个8位无符号数相乘,所得的16位积的高字节存放在B中,低字节存放在A中。对标志位的影响:若乘积大于0FFH,OV置1,说明高字节B中不为0,否则OV清0;影响P标志位;对CY总是清0。 3.3.2 算术运算指令例 设(A)50H,(B)0A0H,分析执行指令“MULAB”后的结果。 指令执行后的结果为:(B)32H,(A)00H即乘积为3200H, Cy0,OV1。3.3.2 算术运算指令四、除法指令DIV在MCS-51单片机中,除法指令只有一条。DIV AB;(A)/(B),商A、余B操作:A的内容除以B的内容(均为无符号整数),所得结果的整数商存放在A中,余数存放在B中。对标志位的影响:如果除数(B)=0,则标志位OV置1,否则清0;影响P标志位;CY总是被清0。 3.3.2 算术运算指令五、十进制调整指令DA十进制调整指令只有一条。DAA;调整A内容为BCD码调整方法:若A的低(高)4位为十六进制的AF,或者标志位AC(CY)为1,则A的内容加06H(60H)调整。 适用场合:用于ADD或ADDC指令后,且只能用于压缩的BCD码相加结果的调整。对标志位的影响:影响CY、AC和P,但不影响OV。3.3.2 算术运算指令例3-9 试编写程序,对两个十进制数76、58相加,并且保持其结果为十进制数,把结果存于R3中。程序段如下:MOVA,#76HADDA,#58HDAAMOVR3,A程序执行后,R3中的内容为34H,进位标志CY为1,则最后结果为134。编程时,注意对BCD码的写法:要按十进制数格式写,然后在其后面加上H。 3.3.3 逻辑操作指令逻辑操作指令包括与、或、异或、清0、求反、移位等操作指令,共有24条。指令中的操作数:A、Rn、direct、Ri、#data对标志位的影响:一般不影响标志位。如果累加器A为目的操作数,会影响奇偶标志P;如果带进位位作移位操作,会影响进位标志CY。为了便于讨论,将其分为5组进行讨论。 3.3.3 逻辑操作指令一、逻辑与指令ANLANLA,Rn ;(A)(Rn) AANLA,direct ;(A)(direct) AANLA,Ri ;(A)(Ri) AANLA,#data ;(A) data AANLdirect,A ;(direct)(A) directANLdirect,#data ;(direct)datadirect逻辑与操作往往用于使某些位清0。这组指令的仅前4条只影响奇偶标志位P。 3.3.3 逻辑操作指令二、逻辑或指令ORLORLA,Rn ;(A)(Rn) AORLA,direct ;(A)(direct) AORLA,Ri ;(A)(Ri) AORLA,#data ;(A)data AORLdirect,A ;(direct)(A) directORLdirect,#data ;(direct)datadirect逻辑或操作往往用于使某些位置1。这组指令的仅前4条只影响奇偶标志位P。 3.3.3 逻辑操作指令三、逻辑异或指令ORLXRLA,Rn ;(A) (Rn) AXRLA,direct ;(A) (direct) AXRLA,Ri ;(A) (Ri) AXRLA,#data ;(A) data AXRLdirect,A ;(direct) (A) directXRLdirect,#data ;(direct) datadirect逻辑异或操作往往用于使某些位取反。用1异或使对应位取反这组指令的仅前4条只影响奇偶标志位P。 3.3.3 逻辑操作指令例3-10 写出完成以下各功能的指令:1)只对累加器A中的1、3、5位清0;2)只对A中的2、4、6位置1;3)只对A中的0、1、6、7位取反。对应指令如下:ANLA,#11010101BORLA,#01010100B XRLA,#11000011B 3.3.3 逻辑操作指令四、累加器A清0和求反指令CLRA;0 ACPLA;(A) A前一条指令是对A清0,该指令影响奇偶标志位P。后一条指令是对A求反,不影响任何标志位。 3.3.3 逻辑操作指令四、循环移位指令A循环左移: RL A ;A循环右移: RR A ;A带进位循环左移 :RLC A ;A带进位循环右移 :RRC A ;说明:(1)这4条指令,每执行一次只 移动1位;(2)左移一次相当于乘以2,右移一次相当于除以2。对标志位影响:仅后两条指令影响CY和P3.3.4 控制程序转移指令计算机功能的强弱,主要取决于转移类指令的多少与功能,特别是条件转移指令。MCS-51单片机有17条转移类指令,包括无条件转移指令、条件转移指令、子程序调用及返回指令等。对标志位影响:只有比较转移指令影响进位标志CY,其它指令不影响标志位。为了便于讨论,将其分为4组进行讨论。 3.3.4 控制程序转移指令一、无条件转移指令无条件转移指令:当程序执行该指令后,程序无条件地转移到指定的地址去执行。包括短转移、长转移和间接转移3条指令1、短转移指令SJMP(相对转移指令)SJMPrel;(PC)+ relPCrel:相对转移偏移量,有符号数,128127,负数表示向回跳转,正数表示向前跳转。指令实际写为:“SJMP 目标地址标号”3.3.4 控制程序转移指令2、长转移指令LJMPLJMPaddr16 ;addr16 PC由于程序的目标地址是16位,因此程序可以跳转到64KB程序存储器空间的任何地方。指令的实际编写形式为:“LJMP 目标地址标号”。 3.3.4 控制程序转移指令3、间接转移指令JMP也叫散转指令、多分支转移指令。JMP A+DPTR ;(A)+(DPTR)PCDPTR为基址,A为相对偏移,在64KB范围内无条件转移。说明:(1)DPTR一般为确定的值,累加器A为变值,根据A的值转移到不同的地方,因此该指令也叫散转指令。(2)在使用中,往往与一个转移指令表一起实现多分支转移。 3.3.4 控制程序转移指令例3-13 分析下面多分支转移程序段。MOVB,#3MULAB;开始时(A)=0、1、2MOVDPTR,#TABLE;表首地址送DPTRJMPA+DPTR;根据A值转移TABLE:LJMPTAB0;(A)=0时转到TAB0执行LJMPTAB1;(A)=3时转到TAB1执行LJMPTAB2;(A)=6时转到TAB2执行.程序中,根据累加器A的开始值(0、1、2)转移到相应的TAB0TAB2分支去执行。3.3.4 控制程序转移指令一、条件转移指令当指令中条件满足时,程序转到指定位置执行,条件不满足时,程序顺序执行。条件转移指令有三种:判断累加器A转移指令、比较转移指令、循环转移指令,共8条。这类指令都属于相对转移,转移范围均为128127。需要注意的是:注释中的PC值,均为下一条指令的地址值。 3.3.4 控制程序转移指令1、判断转移指令判断A为0转移:JZ rel;(A)0, (PC)+ relPC;(A)0, 顺序执行判断A非0转移:JNZ rel;(A)0, (PC)+ relPC;(A)0, 顺序执行指令的实际编写形式分别为:“JZ 目标地址标号”和“JNZ 目标地址标号”。 3.3.4 控制程序转移指令例3-14 试编写程序,把片外RAM地址从2000H开始的数据,传送到片内RAM地址从30H开始的单元,直到出现0为止。程序段如下:MOVDPTR,#2000HMOVR0,#30HLOOP:MOVXA,DPTR3.3.4 控制程序转移指令LOOP:MOVXA,DPTRMOVR0,AINCR0INCDPTRJNZLOOP;(A)0跳转SJMP$;程序停留到此 3.3.4 控制程序转移指令2、比较转移指令CJNE比较转移指令功能较强,共有4条指令 ,一般格式为:CJNE操作数1,操作数2,rel (目标标号)指令功能:两个操作数做比较,若不等则转移,否则顺序执行。具体形式如下,第一条:CJNEA,direct,rel;若(A)(direct),则(PC) +relPC, 即转移;否则顺序执行且(A)(direct),0CY;(A)(direct),1CY3.3.4 控制程序转移指令第二条:CJNEA,#data,rel ;若(A) data,则(PC) +relPC, 即转移;否则顺序执行且(A)data, 0CY;(A) data, 1CY第三条:CJNERn,#data,rel ;若(Rn) data,则(PC) +relPC, 即转移;否则顺序执行且(Rn)data, 0CY;(Rn)data, 1CY3.3.4 控制程序转移指令第四条:CJNERi,#data,rel ;若(Ri) data则(PC) +relPC, 即转移;否则顺序执行且(Ri)data,0CY;(Ri)data, 1CY可见这4条指令会影响进位标志CY。3.3.4 控制程序转移指令3、循环转移指令DJNZ循环转移指令共有两条指:DJNZRn,rel ;(Rn) -1Rn;若(Rn)0,则(PC)+ relPC ,否则顺序执行DJNZdirect,rel;(Rn) -1direct;若(direct)0,则(PC)+relPC ,否则顺序执行指令的实际编写形式为:DJNZRn,标地址标号DJNZdirect,目标地址标号3.3.4 控制程序转移指令例3-15 试编写程序,统计片内RAM中从40H单元开始的20个单元中0的个数,结果存于R2中。用R0作间址寄存器读取数据,用JNZ或CJNE判断数据是否为0,用R2记录0的个数,用DJNZ指令、R7控制循环。程序段一(用JNZ判断数据是否为0):MOVR0,#40H;R0指向40H单元MOVR7,#20;R7控制循环MOVR2,#0;R2存放结果3.3.4 控制程序转移指令MOVR0,#40H;R0指向40HMOVR7,#20;R7控制循环MOVR2,#0;R2存放结果LOOP:MOVA,R0JNZNEXT;(A)0转INCR2NEXT:INCR0DJNZR7,LOOP3.3.4 控制程序转移指令程序段二 (用CJNE判断数据是否为0):MOVR0,#40H;R0指向40HMOVR7,#20;R7控制循环MOVR2,#0;R2存放结果LOOP:CJNER0,#0,NEXTINCR2NEXT:INCR0DJNZR7,LOOP3.3.4 控制程序转移指令三、子程序调用和返回指令这类指令有3条,一条调用,两条返回。1、子程序调用指令(也叫长调用指令)LCALLaddr16;(SP)+1SP、(PC70)(SP),(SP)+1SP、(PC158)(SP),addr16PC2、子程序返回指令RET;(SP)PC158 、(SP)-1SP, (SP)PC70、(SP)-1SP 3.3.4 控制程序转移指令3、中断服务程序返回指令RETI;(SP)PC158 、(SP)-1SP, (SP)PC70、(SP)-1SP “RETI”除了具有“RET”的功能外,还将开放中断逻辑。四、空操作指令NOP;延时一个机器周期常用于延时3.3.4 控制程序转移指令还有两条指令:以上只有15条指令,这两条指令是“AJMP”和“ACALL”,称为绝对转移(短转移)指令和绝对子程序调用(短调用)指令。初识这两条指令:这两条指令的转移范围是绝对划定的2KB,用不好会出现错误,并且其编码也不好理解(见附录B),唯一的优点只是比“LJMP”和“LCALL” 少一个字节,在存储器容量大、价格低的今天,其唯一的优点也没有意义,所以没有必要使用这两条指令。 3.3.5 位操作指令在进行位操作时,位累加器C即为进位标志CY。位地址区域:1)片内RAM字节地址20H2FH单元中连续的128个位(位地址为00H7FH);2)部分SFR中的位,特别是累加器A和寄存器B中的位,与00H7FH位一样,都可以作软件标志或位变量。3.3.5 位操作指令位地址的4种表示方式:1)直接位地址(00HFFH),如18H。2)字节地址带位号,如20H.0,表示20H单元的第0位。3)特殊功能寄存器名带位号,如P2.3,表示P2口的第3位。4)位符号地址,可以是特殊功能寄存器位名,也可以是用位地址符号命令“BIT”定义的位符号,如flag(flag应在这之前定义过,如“flag BIT 05H”)。3.3.5 位操作指令例如,用上述4种方式都可以表示PSW(D0H)中的第2位,分别为:D2H、D0H.2、PSW.2、OV。 位操作指令共有17条,可以将其分成:位数据传送指令、位逻辑操作指令、位控制转移指令三组进行讨论。 3.3.5 位操作指令一、位传送指令MOVC,bit;(bit) CMOVbit,C;(C) bit例3-16 编写程序,把片内RAM中07H位的数值,传送到ACC.0位。程序段如下:MOVC,07HMOVACC.0,C注意:位之间不能够直接传送,必须借助于C。 3.3.5 位操作指令二、位逻辑操作指令位逻辑操作指令包括位清0、位置1、位取反、位与、位或,共10条指令。1、位清0指令CLRC;0 CCLRbit;0 bit2、位置1指令SETBC;1 CSETBbit;1 bit 3.3.5 位操作指令3、位取反指令CPLC;(C) CCPLbit;(bit) bit4、位与指令ANLC,bit; (C) (bit) CANLC,bit ; (C)(bit) C5、位或指令ORLC,bit; (C)(bit) CORLC,bit ; (C)(bit) C3.3.5 位操作指令三、位转移指令位转移指令是判断C或bit为条件的转移指令,共5条指令。1、以C为条件的转移指令JC rel;若(C)=1, 则(PC)+relPC;否则顺序向下执行JNC rel;若(C)=0, 则(PC)+relPC;否则顺序向下执行 3.3.5 位操作指令2、以bit为条件的转移指令JBbit,rel;若(bit)=1,则(PC)+rel PC;否则顺序向下执行JNBbit,rel;若(bit)=0,则(PC)+rel PC;否则顺序向下执行JBCbit,rel;若(bit)=1,则(PC)+rel PC,且0 bit;否则顺序向下执行 3.3.5 位操作指令例3-17 编写程序,利用位操作指令,实现下图所示的硬件逻辑电路功能。程序段如下:MOVC,P1.1ORLC,P1.2 CPLCANLC,P1.0CPLCMOV0F0H,C3.3.5 位操作指令MOV0F0H,C ;(C) 0F0H位MOVC,P1.3 ;(P1.3) CANLC,P1.4;(C) P1.4 CCPLC;ORLC,0F0H ;(C)(0F0H) CMOVP1.5,C ;(C) P1.5 3.4 MCS-51单片机伪指令伪指令的功能:在汇编程序中,用于指示汇编程序如何对源程序进行汇编。对伪指令的处理:不同于指令,在汇编时并不翻译成机器代码,只是在汇编过程进行相应的控制和说明。伪指令的具体作用:通常在汇编程序中用于定义数据、分配存储空间、控制程序的输入/输出等。在MCS-51系统中,常用的伪指令有以下7条。 3.4 MCS-51单片机伪指令一、ORG伪指令ORG伪指令称为起始汇编伪指令,常用于汇编语言某程序段的开始或某个数据块的开始。一般格式为:标号:ORG16位地址其标号为可选项。例如:ORG0040H MAIN:MOVSP,#0DFHMOV30H,#00H 3.4 MCS-51单片机伪指令二、END伪指令END伪指令称为结束汇编伪指令。一般格式为:END 三、EQU伪指令EQU伪指令称为赋值伪指令。一般格式为符号名EQU项(常数、常数表达式、字符串或地址标号)EQU的功能是将右边的项赋值给左边。3.4 MCS-51单片机伪指令四、DATA伪指令DATA伪指令称为数据地址赋值伪指令。其一般格式为:符号名DATA常数或常数表达式DATA的功能也是将右边的项赋值给左边。该伪指令是用于定义片内数据区变量。与DATA类似的还有一条伪指令XDATA,用于定义片外数据区变量。 3.4 MCS-51单片机伪指令五、BIT伪指令BIT伪指令称为位地址符号伪指令。其格式为:符号名BIT位地址BIT伪指令的功能是把右边的地址赋给左边的符号名。位地址可以是前面所述的4种形式中的任一种。例如:FLAGRUNBIT00HFLAGMUSBIT01HFLAGALARBITP1.7 3.4 MCS-51单片机伪指令六、DB伪指令BD伪指令称为定义字节伪指令。其格式为:标号:DB项(字节数据、字节数表或字符、字符串)它的功能是从指定单元开始定义(存储)若干个字节的数据或字符、字符串,字符或字符串需要用引号(单引号或双引号均可)括起来,即用ASCII码表示。例如:TABLE:DB32,24H,“B”,abcd3.4 MCS-51单片机伪指令七、DW伪指令BW伪指令称为定义字伪指令。其格式为:标号:DW字数据或字数据表BW伪指令的功能是从指定单元开始定义(存储)若干个字数据,每一个数据都占2个字节,而用DB伪指令定义的数据只占一个字节。其中标号是可选的。例如:ORG1000HTABLE2:DW32,24H,1234H注意:高字节存放在前,低字节存放在后3.5 汇编语言程序设计举例主要内容3.5.1 简单程序设计3.5.2 分支程序设计3.5.3 循环程序设计3.5.4 子程序设计3.5.1 简单程序设计简单程序:程序的简单和复杂是相对而言的,这里所说的简单程序,是指顺序执行的程序。简单程序的执行情况:简单程序从第一条指令开始,依次执行每一条指令,直到程序执行完毕,之间没有任何转移和子程序调用指令,整个程序只有一个入口和一个出口。简单程序是复杂程序的基础。 3.5.1 简单程序设计一、数据拆分例3-19 片内RAM的30H单元内存放着一压缩的BCD码,编写程序,将其拆开并转换成两个ASCII码,分别存入31H和32H单元中,高位在31H中。根据数字09的ASCII码为30H39H,因此,将30H中的两个BCD码拆开后,分别加上30H即可。相应程序段如下: 3.5.1 简单程序设计MOVR0,#30H;R0指向30H单元MOVA,R0;取原BCD码数据PUSHACC;进栈暂存SWAPA;高低4位数交换ANLA,#0FH;截取高位数ORLA,#30H;高位转换成ASCIIINCR0;R0指向31H单元 MOVR0,A;保存高位ASCII3.5.1 简单程序设计POPACC ;原BCD码出栈ANLA,#0FH ORLA,#30H;低位转换成ASCIIINCR0;R0指向32H单元MOVR0,A;保存低位ASCII码SJMP$;CPU停留于此处 3.5.1 简单程序设计二、数制转换例3-20 片内RAM的30H单元内存放着一8位二进制数,编写程序,将其转换成压缩的BCD码,分别存入30H和31H单元中,高位在30H中。其方法是用除法实现。原数除以10,其余数为个位数,其余数再除以10,其商为百位数,余为十位数。对应程序段如下: 3.5.1 简单程序设计MOVA,30H;取数据MOVB,#10DIVAB;除后个位在B,百十位在AMOV31H,B ;个位存31H低4位MOVB,#10DIVAB;除后十位在B,百位在AMOV30H,A ;保存百位MOVA,B;十位数送ASWAPA;十位数被交换到高4位ORL31H,A ;十位数存于31H高4位SJMP$ 3.5.2 分支程序设计分支程序:程序根据不同的条件,转向不同的处理程序,这种结构的程序称为分支程序。实现分支程序的方法:借助于条件转移指令、比较转移指令和位转移指令,可以实现程序的分支处理。在汇编语言程序中,分支结构是比较麻烦的,初学时应特别小心。 3.5.2 分支程序设计一、一般分支程序例3-21 片内RAM的30H、31H单元存放着两个无符号数,编写程序比较其大小,将其较大者存于30H中,较小者存于31H单元中。用减法判断,两个数相减后,通过借位标志位CY来判断。程序段如下: 3.5.2 分支程序设计MOVA,30HCLRCSUBBA,31HJNCL1;(30H)(31H)转MOVA,30H;(30H)小两数交换XCHA,31HMOV30H,AL1:SJMP$ 3.5.2 分支程序设计例3-22 片内RAM的30H单元内存放着一有符号二进制数变量X,其函数Y与变量X的关系为:X+5X20 Y=020X10-5X10编写程序,根据变量值,将其对应的函数值送入31H中。这是一个三分支的条件转移程序,可以使用CJNE、JC、JNC等指令进行判断。程序流程图如图3-6所示,程序段如下: 3.5.2 分支程序设计3.5.2 分支程序设计MOVA,30HCJNEA,#10,L1L1:JNCL2;X10转L2MOV31H,#0FBH;X10, Y=-5SJMPL4L2:;X10ADDA,#5;先按X20, Y=X+5MOV31H,ACJNEA,#26,L3 L3:JNCL4;X20,转MOV31H,#0 ;20X10, Y=0L4:SJMP$ 3.5.3 循环程序设计循环程序一般由以下几个部分组成:1)循环初始化部分:用于对循环变量、其它变量和常量赋初值,做好循环前的准备工作。2)循环体部分:这一部分由重复执行部分和循环控制部分组成。3)循环结束部分:这一部分用于存放循环结果、恢复所占用寄存器或内存的数据等。循环程序的关键是对循环变量的修改和控制,特别是循环次数的控制。3.5.3 循环程序设计一、单层循环程序例3-23 在片内RAM的30H3FH单元,存放着16个无符号字节数据,编写程序,计算这16个数的和。16个字节数的和不会超过两个字节,将和存于40H、41H中,高
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。