单片机指令系统、汇编程序设计、C51程序设计_第1页
单片机指令系统、汇编程序设计、C51程序设计_第2页
单片机指令系统、汇编程序设计、C51程序设计_第3页
单片机指令系统、汇编程序设计、C51程序设计_第4页
单片机指令系统、汇编程序设计、C51程序设计_第5页
已阅读5页,还剩183页未读 继续免费阅读

下载本文档

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

文档简介

项目二指令系统

学习目标

知识目标:掌握汇编语言的寻址方式、基本指令格式、熟悉常用指令功能;程序流程图的绘制方法;常用程序的编写方法和技巧。掌握C语言的编写方法和技巧。

技能目标:能根据要求编写常用程序。2.1概述一、指令指令是指挥计算机工作的命令,一种计算机所能执行的指令集合称之为计算机指令系统。

MCS-51单片机主要有两种指令形式:机器语言指令汇编语言指令。

1.机器指令用二进制代码表示的指令称为机器语言指令,也称机器码。例如:“累加器A加1”指令用二进制数表示时,是“00000100”,在程序存储器中占用一个字节单元。

2.汇编语言指令

用容易记忆的缩写符号表示机器语言指令就是汇编语言指令。例如,“A加B”用英语写出来是“AddBtoA”,缩写成“ADDA,B”。这个“ADDA,B”就是汇编语言指令。MCS-51单片机的开发商约定:“ADDA,B”与25F0H对应。我们将“ADD”缩写符号称为“助记符”。编写机器语言程序实质上就是用汇编语言编写程序。两种语言指令对照:汇编语言指令机器语言指令MOVA,#0AH74H0AHADDA,#14H24H14H2.28051汇编语言指令指令组成:操作码助记符操作数括号内的部分是可选项。每个字段之间要用分隔符分隔,可以用作分隔符的符号有空格、冒号、逗号、分号等。

指令格式:[标号:]操作码[目的操作数][,源操作数];[注释]LOOP:MOVA,3AH;(A)←(3AH)1.标号标号是语句地址的标志符号,代表该语句指令代码第一个字节的地址。

(1)标号由1~8个ASCII字符组成,且第一个字符必须是字母,其余字符可以是字母、数字或其他特定字符。

(2)不能使用该汇编语言已经定义了的符号作为标号。如指令助记符、寄存器符号名称等。

(3)标号后必须跟冒号。

2.操作码

操作码用于规定语句执行的操作。它是汇编语句中唯一不能空缺的部分,也是语句的核心,它用指令助记符表示。3.操作数

操作数用于给指令的操作提供数据或地址。在一条汇编语句中操作数可能是空缺的,也可能包括一项,还可能包括两项或三项。当有多个操作数时,各操作数间以逗号分隔。

(1)工作寄存器名。

(2)特殊功能寄存器名。

(3)标号名。

(4)常数。

(5)符号“$”,表示程序计数器PC的当前值。

(6)表达式。4.注释注释不属于汇编语句的功能部分,它只是对语句的说明。注释字段可以增加程序的可读性,有助于编程人员的阅读和维护。注释字段必须以分号“;”开头,长度不限可以换行接着书写,但换行时应注意在开头使用分号“;”。

指令的描述中经常用到一些特殊符号

Rn工作寄存器R0~R7,即n=0~7。Ri寄存器R0、R1,即i=0、1。direct8位内部RAM单元的地址#data:指令中的8位常数。#data16指令中的16位常数。addr16:16位的目的地址addr1111位的目的地址rel8位带符号的偏移量字节bit:内部数据RAM或SFR的可直接寻址位。/位操作数的前缀,表示对该位取反。(X)X中的内容。((X))由X寻址的单元中的内容。←表示数据的传送方向。<=>表示数据交换。MCS-51单片机指令系统的分类

按指令所占存储器字节数分(1)

单字节指令(49条)(2)

双字节指令(46条)(3)

三字节指令(16条)

按指令功能分:

(1)

数据传送指令(29条)(2)

算术运算指令(24条)(3)

逻辑运算指令(24条)(4)

控制转移类指令(17条)(5)

位操作指令(17条)按指令执行周期数分:(1)

单周期指令(64条)(2)

双周期指令(45条)(3)

四周期指令(2条)一、寻址方式我的信在她那!找信去!②①注:找信是寻找信的“地址”!寻址方式,就是指如何找到存放被操作数据的位置(地址)的方法。1.寄存器寻址寄存器寻址是指令中指定寄存器的内容作为操作数的寻址方式。寄存器目的地R0~R7ABDPTRMOVA,R12.直接寻址直接寻址是指令直接给出操作数所在单元的地址的寻址方式。指令中操作数部分给出直接地址,用direct表示。

XXH目的地内部RAMSFRXXHMOVA,3AH例:MOVA,3AH操作码直接地址10011111APC程序存储器…1110010100111010PC+1内部RAM…3AH39H10011111…XXH目的地R0、R1DPTRMOVA,@R13.寄存器间接寻址指令操作数的地址事先存放在某个寄存器中,由该寄存器的内容指定操作数地址的寻址方式,称为寄存器间接寻址,@为间接寻址指示符。信在XXH中寄存器可寻址内部RAM128B、外部RAM寻址DPTRMOVA,@R0PC操作码程序存储器11100110….….….~内部RAM47H65H65HR0….~~~47HA4.立即数寻址立即数寻址是由指令直接给出操作数的寻址方式。#为立即数的标识符。目的地MOVA,#30H速递快信30HA这类指令大都是双字节指令,仅有指令:MOVDPTR,#DATA16是三字节指令,它提供两字节立即数,如:MOVDRTR,#1600H,它的机器指令格式下所示:100100000001011000000000使用专用的汇编语言编译程序把编写的汇编语言源程序编译成机器语言程序,对立即数的书写一般有要求:对于单字节立即数,若数值大于等于A0H,则要在其前面加一个0,如指令“MOV

A,#0A0H”,该指令含义是把立即数A0H送累计器;对于双字节立即数,若数值大于等于A000H,则要在其前面加一个0。对于直接地址和偏移量也按相同方法书写。第一位数字是A~F时请在其前加05.变址寻址(基址寄存器+变址寄存器间接寻址)

变址间接寻址是将指令中基地址(基址寄存器)和偏移量地址(变址寄存器)的内容相加形成真正的操作数地址。基址寄存器1000H变址寄存器PCDPTRA程序存储器65H….….1000H+30H1030H30H65H6.相对寻址以当前的PC值加上指令中给出的相对偏移量rel而形成转移目的地址的寻址方式。2000H+2H+28H······SJMP28H202AH程序存储器2000H2002H源地址目的地址rel转移指令本身字节数rel是有符号的8位二进制数,用补码表示。相对偏移在+127~-128字节单元之间。7.位寻址位寻址适用于可以进行单独位操作的指令,指令中直接给出位地址寻找位操作数。参与操作的数据是1bit而不是1B。位地址用bit表示,以区别字节地址direct。

PCPC+11010001000110111程序存储器操作码0CyACFORSIRS0OVPPSW内部RAM位地址空间26H3736353433323130MOVC,37H0寻址空间及举例

寻址方式存储器空间寄存器寻址R0~R7、A、B、Cy(位)、DPTR直接寻址内部数据存储器00H~7FH字节单元特殊功能寄存器寄存器间接寻址内部数据存储器(@R1、@R0)

外部数据存储器(@R1、@R0、@DPTR)立即数寻址程序存储器(操作常数)变址间接寻址程序存储器(@A+DPTR、@A+PC)相对寻址程序存储器(修改了PC值)位寻址内部数据存储器及特殊功能寄存器中某些单元位

表3-1每一种寻址方式可涉及的存储器空间例1将D5H位的内容送入Cy,可用几种方式表达?

(1)

MOVC,0D5H(2)

MOVC,0D0H.5(3)

MOVC,F0(4)

MOVC,PSW.5例2判断下列指令各操作数的寻址方式(1)MOVA,#65H(2)MOV@R1,65H(3)MOV30H,R2(4)MOVC,20H(5)DJNZR2,LOOP(6)MOV60H,@R1(7)MOVCA,@A+PC

寄存器寻址变址寻址直接寻址寄存器间接寻址寄存器寻址相对寻址位寻址位寻址直接寻址寄存器寻址寄存器间接寻址直接寻址寄存器寻址立即数寻址二、数据传送类指令MCS-51单片指令系统中,数据传送指令共29条,分为内部数据传送指令、外部数据传送指令、堆栈指令和数据交换指令。数据传送指令是MCS-51单片机指令系统中数目最多、使用最频繁的指令。除了用POP或MOV操作向PSW传送数据的指令外,其他传送指令均不影响标志位。“传送”操作的功能是将源地址单元的内容传送到目的地址单元中去,而源地址单元的内容不变。累加器A直接地址direct立即数#data寄存器R0~R7寄存器间接@R0、@R1数据指针DPTR16位入、出栈@SP入出位累加器C11数据传送类指令示意图1.内部数据传送指令

是指数据在内部RAM单元之间传送。内部数据传送指令的助记符为MOV,其汇编语言指令格式为:

MOV[目的地址],[源地址](1)以累加器A为目的的传送指令

功能

执行时间

(A)←(Rn)1Tcy(A)←(direct)1Tcy(A)←((Ri))1Tcy(A)←#data1Tcy11101rrr汇编语言指令MOVA,RnMOVA,directMOVA,@RiMOVA,#data机器语言指令11100101direct1110011i01110100data

指令中Rn表示工作寄存器R0~R7,用机器码指令中的低3位指代工作寄存器的地址,其中:rrr=000~111,对应的工作寄存器R0~R7。而MOVA,30H的机器吗是1110010100110000,即E530H,它是双字节指令。

(2)以直接地址为目的的传送指令MOVdirect,A;(direct)←(A)MOVdirect,Rn;(direct)←(Rn)MOVdirect1,direct2;(direct1)←(direct2)MOVdirect,@Ri;(direct1)←((Ri))MOVdirect,#data;(direct1)←data

这组指令的目的操作数都是直接寻址单位,源地址操作数采用寄存器寻址、直接寻址、寄存器间接寻址和立即数寻址。

(3)以通用寄存器Rn为目的的传送指令MOVRn,A;(Rn)←(A)MOVRn,direct;(Rn)←(direct)MOVRn,#data;(Rn)←data

这三条指令都是以工作寄存器为目的操作数,源操作数的寻址方式有寄存器寻址、直接寻址和立即数寻址。

(4)以寄存器间接地址为目的的传送指令MOV@Ri,A;((Ri))←(A)MOV@Ri,direct;((Ri))←(direct)MOV@Ri,#data;((Ri))←data

这组指令的目的操作数都是间接寻址单元,源地址单元可采用寄存器寻址、直接寻址和立即数寻址方式。例3设内部RAM中的30H单元的内容为50H,试分析执行下面程序后各有关单元的内容。

MOV60H,#30HMOVR0,#60HMOVA,@R0MOVR1,AMOV40H,@R1MOV60H,30H2.16位数据传送指令MOVDPTR,#data16;(DPTR)←data16

MSC-51单片机指令系统中仅此一条传送16位数据的指令,功能是将16位数据送入寄存器DPTR中,其中数据的高8位送入DPH中,低8位送入DPL中。

3.数据交换指令

数据交换指令是在内部RAM的某一个单元和累加器A之间进行的,并且累加器A总是作为目标操作数。数据交换指令分为两种;整字节交换和半字节交换。

XCHA,源操作数

XCHA,Rn;(A)<=>(Rn)XCHA,direct;(A)<=>(direct)XCHA,@Ri;(A)<=>((Ri))

这组指令的功能是将累加器A的内容与源操作数(Rn、direct或@Ri)所指定单元相互交换内容

MOVA,30HXCHA,40HMOV30H,A88HA结果为(30H)=11H,(40H)=88H,而功能是将30H和40H单元内容互换。

88H30H40H11H…88H11H11H例3-4已知(30H)=88H,(40H)=11H,指出下列程序段执行的结果和功能。(1)半字节交换指令XCHDA,@Ri;(A)3~0

<=>((Ri))3~0SWAPA;(A)3~0<=>(A)7~4

第一条指令将Ri间接寻址的单元内容的低4位与累加器A内容的低4位互换,高四位内容不变,不影响标志位。例如,设(A)=0ABH,(R0)=30H,(30H)=12H,执行指令XCHDA,@R0后,(A)=A2H,(30H)=1BH。第二条指令将累加器A的高4位与低4位内容互换,不影响标志位。例5设内部数据存储器的60H、61H单元中连续存放着4位BCD码,试编写一段程序将这4位BCD码倒序排列。MOVR0,#60H;(R0)=60HMOVR1,#61H;(R1)=61HMOVA,@R0;(A)=((R0))=(60H)=a3a2SWAPA;A中的内容、低4位互换(A)=a2a3XCHA,@R1;(A)<=>((R1))SWAPA;(A)=a0a1MOV@R0,A;((R0))=(A),(60H)=a0a160H61H60H61Ha3a2a0a1a1a0A2a34.片外数据存储器传送指令

当把一个数据送到单片机外部扩展RAM的某个单元或外部扩展I/O口某个端口,或者从该单元、端口将数据取回到单片机内部的时候,就要用到这种指令。MOVXA,@Ri;(A)←((Ri))片外MOVXA,@DPTR;(A)←((DPTR))片外MOVX@Ri,A;((Ri))片外←(A)MOVX@DPTR,A;((DPTR))片外←(A)片外RAM读指令片外RAM写指令。例6将累加器A中的内容送入外部数据存储器的0060H单元。MOVR0,#60H;地址送间址寄存器MOVX@R0,A;A中内容送外部数据存储器的0060H单元MOVP2,#00;输出地址高8位输出00H例7将外部存储器的2000H单元的内容送入2100H单元。MOVDPTR,#2000H;(DPTR)=2000HMOVXA,@DPTR;(A)=((DPTR))MOVDPTR,#2100H;(DPTR)=2100HMOVX@DPTR,A;((DPTR))=(A)5.ROM数据访问指令MOVCA,@A+DPTR;

(A)←((A)+(DPTR))ROMMOVCA,@A+PC;(PC)←(PC)+1,(A)←((A)+(PC))ROM1065ALU1060H+05H=1065H程序存储器PCMOVCA,@A+DPTR34H…………05HDPLDPHA10H60H…指令执行后,A中的内容则为34H,而不再是5H34H两个指令的比较MOVCA,@A+DPTR:这条指令的执行结果只与指针DPTR及累加器A的内容有关,与该指令存放的地址无关,因此,表格的大小和位置可以在64KB程序存储器中任意安排,并且一个表格可以为各个程序块所共用。MOVCA,@A+PC:这条指令的优点是不改变特殊功能寄存器和PC的状态,只要根据A的内容就可以取出表格中的常数。缺点是表格只能放在该条查表指令后面的256个单元之内,表格的大小受到限制,而且表格只能被一段程序所利用。例8:设A的内容为BCD码(高4位为全0),试用查表法来求得相应的ASCII码。方法(一):BCD_ASC:MOVDPTR,#TABMOVCA,@A+DPTRRETTAB:DB30H,31H,32H,33H,34HDB35H,36H,37H,38H,39H6.栈操作指令片内RAM中有一个先进后出的堆栈操作缓冲区域,主要用于保护和恢复CPU的工作现场,也可实现内部RAM单元之间的数据传送。(1)入栈指令:PUSHdirect;(SP)←(SP)+1,((SP))←(direct)先将堆栈指针寄存器的内容加1,指向堆栈顶的一个单元中,然后将指令指定的直接寻址单元内容传送到这个单元中。(2)出栈指令:POPdirect;(direct)←((SP)),(SP)←(SP)-1出栈指令是将当前堆栈指针寄存器SP所指示单元内容传送到该指令指定的直接寻址单元中去,然后SP内容减1指向新栈顶。指令的操作数是direct直接地址,不能是间接地址、通用寄存器或其他。

例9已知(SP)=30H,(40H)=88H,(50H)=11H,指出下列程序段的执行结果和功能。PUSH40H;(SP)←(SP)+1=31H,((SP))←(40H),(31H)=88HPUSH50H;(SP)←(SP)+1=32H,((SP))←(50H),(32H)=11HPOP40H;(40H)←((SP)),(SP)←(SP)-1=31H,(40H)=11HPOP50H;(50H)←((SP)),(SP)←(SP)-1=30H,(50H)=88H三、算术运算类指令

1.加法指令加法指令包括带进位与不带进位加法指令、加1指令和十进制调整指令。(1)不带进位加法指令

ADDA,Rn;(A)←(A)+(Rn)

ADDA,direct;(A)←(A)+(direct)

ADDA,@Ri;(A)←(A)+(Ri)

ADDA,#data;(A)←(A)+data ADDCA,Rn

;(A)←(Cy)+(A)+(Rn)ADDCA,direct;

(A)←(Cy)+(A)+(direct)ADDCA,@Ri;(A)←(Cy)+(A)+((Ri))

ADDCA,#data;(A)←(Cy)+(A)+data

这些指令是将源字节单元的内容与累加器A的内容相加,并加上进位位Cy的内容,结果放入累加器A中。指令执行将影响标志AC、OV、Cy、P。其余功能和上面的ADD指令相同。带进位加法指令主要用于多字节加法的多字节求和,以考虑低字节求和向高字节的进位。(2)带进位加法指令例11计算6655H+11FFH的程序,结果放入50H、51H中。MOVA,#55HADDA,#0FFHMOV50H,AMOVA,#66HADDCA,#11HMOV51H,A

DAA;若[(A)3~0>9]或[(AC)=1],则(A)3~0←(A)3~0+06H;若[(A)7~4>9]或[(Cy)=1],则[(A)7~4←[(A)7~4+60H

(3).十进制调整指令

在指令系统中,没有专门的十进制(BCD码)的加法运算指令,只能使用ADD、ADDC命令,但有时会产生错误,该指令就是用于对A中BCD码加法运算结果进行调整。即两个压缩型BCD码(两个BCD码存放在一个字节存储单元)按照二进制数相加之后,必须经本指令调整,才能得到压缩型BCD码和数。

执行该指令时,判断A中的低4位是否大于9和辅助进位标志AC是否为“1”,若两者有一个条件满足,则低4位加6操作;同样,A中的高4位大于9或进位标志Cy为“1”两者有一个条件满足时,高4位加6操作。MOVA,#56HADDA,#67HDAA

这段程序中,第一条指令将立即数送入累加器A;第二条指令进行如下加法:0101011056011001116710111101BD0110011066++100100011123得结果BDH;第三条指令对累加器A进行十进制调整,高4、低4位均大于9,因此要加66H,得调整的BCD码123。例13设有4个压缩BCD码,分别放在内部数据存储器50H~51H单元和60H~61H单元中,试编写求出两个数的和的程序,结果存放到40H~41H单元中。

MOVA,50H;(A)←(50H)

ADDA,60H;(A)←(A)+(60H)

DAA,;BCD码调整

MOV40H,AMOVA,51HADDCA,61HDAAMOV41H,A(4)

加1指令INCA;(A)←(A)+1INCRn;(Rn)←(Rn)+1INCdirect;(direct)←(direct)+1INC@Ri;((Ri))←((Ri))+1INCDPTR;(DPTR)←(DPTR)+1

将指令中所指出操作数的内容加1,结果仍存放于原单元中去。若原来的内容为0FFH,则加1后将产生溢出,使操作数的内容变成00H,除“INCA”影响P外,不影响任何标志。

2.减法指令

(1)带借位减法指令SUBBA,Rn;(A)←(A)-(Cy)-(Rn)SUBBA,direct;(A)←(A)-(Cy)-(direct)SUBBA,@Ri;(A)←(A)-(Cy)-((Ri))SUBBA,#data;

(A)←(A)-(Cy)-data带借位减法指令的功能是将累加器A内容减去源地址单元内容,并减去进位位Cy的内容,结果放入累加器A中。两个数相减时,若D7位有借位,则置Cy为1,否则Cy清0;若D3位有借位,则辅助进位AC=1,否则清AC。若D6、D7位不同时借位,则置OV=1,否则清OV。若A的结果有奇数个1,则置奇偶校验位P为1,否则清0。

例15计算0EE33H-A0E0H的程序

CLRC;(Cy)←0MOVA,#33H;(A)←33HSUBBA,#0E0H;(A)←(A)-E0HMOV50H,A;(50H)←(A)

MOVA,#0EEHSUBBA,#0A0HMOV51H,A(2)减1指令DECA;(A)←(A)-1DECRn;(Rn)←(Rn)-1DECdirect;(direct)←(direct)-1DEC@Ri;((Ri))←((Ri))-1这组指令的功能是将操作数所指的单元内容减1,其操作不影响标志位Cy。若单元原始值为00H,则经过减1操作后变为0FFH,除“DECA”影响P外,不会影响任何标志位。3.乘、除法指令MCS-51单片机指令系统中有乘法、除法指令各一条,它们是两条执行时间最长的指令,执行时间为4个机器周期。(1)乘法指令

MULAB;(B)(A)←(A)×(B)

乘法指令的功能是将累加器A和寄存器B的8位无符号整数相乘,16位积的低8位存于A中,高8位存于B中。如果积大于255(FFH),则溢出标志OV置1,否则清0。进位标志位Cy总是为0。(2)除法指令DIVAB;(A)←(A)/(B)商

;(B)←(A)/(B)

余数该指令的功能是将A中无符号整数除以B中无符号整数,所得到商整数部分存于A中,余数部分存于B中。标志位Cy和OV清0(当除数为0时OV置1)。

四.逻辑运算类指令1.A操作指令(1)累加器A的“清零”与“取反”指令

CLR

A;(A)←#00HCPLA;(A)←/(A)CPLA指令对累加器的内容逐位取反,不影响标志位。

2)累加器A的内容带进位标志位循环左移指令:RLCA

3)累加器A循环右移指令:RRACyD7D04)累加器A的内容带进位标志位循环右移指令RRCA1)累加器A循环左移指令

RL

A(1)移位指令D7D0D7D0CyD7D01)移位操作都是对累加器A进行操作。2)移位指令常用做乘2或除2运算。例3-17若(A)=10111101B=0BDH,Cy=0,分析执行RLCA后,(A)和Cy的结果。解:执行RLCA后,(A)=01111010B=7AH,Cy=1。

ANLA,RnANLA,directANLA,@RiANLA,#dataANLdirect,AANLdirect,#data

这组指令的功能是:将两个操作数的内容按位进行逻辑与操作,并将结果送回目的操作数的单元中。与0相与,使被修改数相应位清零,与1相与,使被修改数相应位保持原值不变2.逻辑与指令例3-18将累加器A中压缩BCD码分为两个字节,形成非压缩BCD码,放入30H和31H单元中。

MOV40H,A;保存A中的内容

ANLA,#00001111B;清高4位,保留低4位

MOV30H,AMOVA,40H;取原数据

ANLA,#11110000B;保留高4位,清低4位

SWAPAMOV31H,AORLA,RnORLA,directORLA,@RiORLA,#dataORLdirect,AORLdirect,#data

这组指令的功能是:将两个操作数的内容按位进行逻辑或操作,并将结果送回目的操作数的单元中。与1相或,使被修改数相应位置1,与0相或,使被修改数相应位保持原值不变3.逻辑或指令例3-19将累加器A中的低4位由P1口的低4位输出,P1口的高4位不变。解:ANLA,#00001111BMOV30H,A;保留A中的低4位

MOVA,P1ANLA,#11110000B;P1的高4位不变

ORLA,30HMOVP1,A4.逻辑异或运算指令XPLA,Rn;(A)←(A)⊕(Rn)XRLA,direct;(A)←(A)⊕(direct)XRLA,@Ri;(A)←(A)⊕((Ri))XRLA,#data;(A)←(A)⊕dataXRLdirect,A;(direct)←(A)⊕(direct)XRLdirect,#data;(direct)←(direct)⊕data

与1相异或,使被修改数相应位取反,与0相异或,使被修改数相应位保持原值不变;本指令可判断两个数是否相等,若相等,则异或结果为全“0”;否则不相等。

练习:P88,17题五、控制转移类指令

1.无条件转移指令是指当程序执行到该指令时,无条件转移到指令所提供地址处执行。无条件转移指令共有4条,包括长转移指令、短转移指令、绝对转移指令和散转指令。(1)长转移指令

LJMPaddr16;(PC)←addr16该指令执行后将16位地址(addr16)传送给PC,从而实现程序转移到新的地址开始运行,该指令可实现64KB的范围内任意转移。该指令不影响标志位。

(2)绝对转移指令AJMPaddr11;(PC)←(PC)+2,(PC10~0)←addr11

由PC15~11信息和指令提供低11位地址组成16位转移目标地址,使程序无条件转向同一2KB存储空间目的地址执行。本指令不影响标志位。

(3)相对转移指令

SJMPrel;(PC)←(PC)+2,(PC)←(PC)+rel

指令中rel是一个有符号数偏移量,其范围为-128~+127,以补码形式给出。若rel是正数,则向前转移;若rel是负数,则向后转移。

1)一条带有FEH偏移量的SJMP指令,将实现无限循环。这是因为FEH是-2的补码,目的地址=PC+2-2=PC,结果转向自己,无限循环,一般在程序用SJMP$来表示SJMP0FEH。2)该指令中寻址方式称相对寻址方式。存储器80H–128rel+127PCPC+1PC+2……(4)散转指令JMP@A+DPTR;(PC)←(A)+(DPTR)PCDPTR(A)+(DPTR)→PC256BJMP@A+DPTR………

该指令执行时,把累加器A中的8位无符号数与DPTR中16位数相加,其中装入程序计数器PC,控制程序转到目的地址执行程序。整个指令的执行过程中,不改变累加器A和DPTR的内容。例3-20

某单片机应用系统有16个键,对应的键码值(00H~0FH)存放在R7中,16个键处理程序的入口地址分别为KEY0,KEY1,……

,KEY15。要求按下某键,程序即转移到该键的相应处理程序执行。解:预先在ROM中建立一张起始地址为KEYG的转移表:AJMPKEY0,……,AJMPKEY15,利用散转指令即可实现多路分支转移处理。

MOVA,R7RLA;由于AJMP指令为双字节指令,键值乘2倍

MOVDPTR,#KEYG;转移入口基地址送DPTRJMP@A+DPTR

……

KEYG:AJMPKEY0AJMPKEY1

……AJMPKEY152.条件转移指令条件转移指令是当满足给定的条件时,程序转移到目的地址去执行;条件不满足则顺序执行下一条指令。条件转移指令分为累加器A判零转移指令、比较转移指令和循环指令。(1)累加器A判零转移指令

JZrel;(PC)←(PC)+2

当(A)=0,(PC)=(PC)+rel,即转移当(A)≠0,则程序顺序执行

JNZrel;(PC)←(PC)+2

当(A)≠0,(PC)=(PC)+rel,即转移当(A)=0,则程序顺序执行P102程序阅读

在MCS-51中没有专门的比较指令,但提供了下面4条比较不相等转移指令:CJNEA,direct,relCJNEA,#data,relCJNERn,#data,relCJNE@Ri,#data,rel

这组指令的功能是:比较前面两个操作数的大小,如果它们的值不相等则转移。转移地址的计算方法与上述两条指令相同。如果第一个操作数(无符号整数)小于第二个操作数,则进位标志Cy置“1”,否则清“0”,但不影响任何操作数的内容。(2)比较转移指令P104程序阅读(3)循环控制转移指令DJNZRn,rel;(PC)←(PC)+2,(Rn)←(Rn)-1

当(Rn)≠0时,(PC)←(PC)+rel;当(Rn)=0时,程序顺序执行。DJNZdirect,rel;(PC)←(PC)+3,(direct)←(direct)-1

当(direct)≠0时,(PC)←(PC)+rel;当(direct)=0时,程序顺序执行。执行本指令时,将第一个操作数减1后判断结果是否为0,若为0,则终止循环程序段的执行,程序往下顺序执行;若不为0,则转移到目的地址继续执行循环程序段。用两条指令可以构成循环程序,循环次数就是第一个操作数的值。rel为相对偏移量。

P95程序阅读3.子程序调用

为简化程序设计,经常把功能完全相同或反复使用的程序段单独编写成子程序,供主程序调用。主程序需要时通过调用指令,无条件转移到子程序处执行,子程序结束时执行返回指令,再返回到主程序继续执行。(1)长调用指令LCALLaddr16

;(PC)←(PC)+3,

(SP)←(SP)+1,((SP))←(PC7~0);

(SP)←(SP)+1,((SP))←(PC15~8);

(PC)←addr16(2)短调用指令ACALLaddr11;(PC)←(PC)+2(SP)←(SP)+1,((SP))←(PC7~0);

(SP)←(SP)+1,((SP))←(PC15~8);

(PC15~0)←addr16

该指令的目的地址形成与11位的无条件转移指令类似,只是增加了断点压栈过程。指令的执行不影响标志位。

4.返回指令

返回指令应能自动恢复断点,将原压入栈的PC值弹回到PC中,保证回到断点处继续执行主程序。返回指令必须用在子程序或中断服务程序的末尾。(1)子程序返回指令RET;(PC15~8)←((SP)),(SP)←(SP)-1;

(PC7~0)←((SP)),(SP)←(SP)-1;这条指令将堆栈顶的2字节单元内容送到PC中,使程序返回到调用处。

(2)中断返回指令RETI;(PC15~8)←((SP)),(SP)←(SP)-1;

(PC7~0)←((SP)),(SP)←(SP)-1;该指令用于中断服务于程序的末尾,将堆栈顶的2字节的内容送到PC中,它与RET指令不同之处是它同释放中断逻辑,使同级中断可以被接受。

5.空操作指令NOP;(PC)←(PC)+1

该指令不作任何操作,仅仅将程序计数器PC加1,使程序继续向下执行。该指令为单周期指令,所以在时间上占用一个机器周期,常用于延时。P116程序阅读六、位操作类指令数据存储器:片内RAM20H~2FH单元共128位,位地址为00H~7FHA、B两个寄存器中的各8位,位地址为E0H~E7H、F0H~F7H位累加器:由C兼任I/O口:在SRF中共有44个布尔I/O口通用I/O口:共32个(P0.0~P0.7、P1.0~P1.7、P2.0~P2.7、P3.0~P3.7)用于定时器和串行口进行控制和测试的:16个(TCON0~TCON7、SCON0~SCON7)用于中断系统的:11个(IE1~IE4、IE7、IP0~IP4)用于PSW中的:7个(PSW.0、PSW.2~PSW.7)位操作指令:17条位地址的表示形式(1)直接(位)地址表示方式,如0D4H。(2)点表示方式,如PSW.4。(3)位名称表示方式,如RS1。(4)标号表示方式,如用伪指令BIT定义:

WBZD0BITEX0经定义后,允许指令中使用WBZD0代替EX0。

位数据传送指令

位数据传送指令的两个操作数,一个是指定的位单元,另一个必须是位累加器Cy(进位位标志Cy)。MOVC,bit;(Cy)←(bit)MOVbit,C;(bit)←(Cy)bit为内部RAM中的20H~2FH单元中128个可寻址位和特殊功能寄存器中的可位寻址位。此指令不影响其他寄存器或标志位。1.位逻辑运算指令(1)置“1”指令SETBC;(Cy)←1SETBbit;(bit)←1(2)位清“0”指令CLRC;(Cy)←0CLRbit;(bit)←0(3)位取反指令

CPLC;(Cy)←/(Cy)

CPLbit;(bit)←/(bit)(4)位逻辑“与”指令

ANLC,bit;(Cy)←(Cy)∧(bit)

ANLC,/bit;(Cy)←(Cy)∧/(bit)(5)位逻辑“或”指令

ORLC,bit;(Cy)←(Cy)∨(bit)

ORLC,/bit;(Cy)←(Cy)∨/(bit)

2.位控制转移指令位控制转移指令按照不同的条件分为以Cy内容为条件的转移指令和以位地址bit内容为条件的转移指令两类。(1)判布尔累加器Cy的转移指令JCrel;若(Cy)=1,则(PC)←(PC)+2+rel,即转移若(Cy)=0,则(PC)←(PC)+2,即顺序执行JNCrel;若(Cy)=0,则(PC)←(PC)+2+rel,即转移若(Cy)=1,则(PC)←(PC)+2,即顺序执行注:执行该指令时,不改变进位位Cy的值。(2)判位变量转移指令JBbit,rel

;若(bit)=1,则(PC)←(PC)+3+rel,即转移若(bit)=0,则(PC)←(PC)+3,即顺序执行JNBbit,rel

;若(bit)=0,则(PC)←(PC)+3+rel,即转移若(bit)=1,则(PC)←(PC)+3,即顺序执行两条指令不改变bit值,不影响标志位。

(3)判位变量为1转移并清零指令JBCbit,rel;若(bit)=0,则(PC)←(PC)+3;若(bit)=1,则(PC)←(PC)+3+rel,且(bit)←0

注意:不管bit位为何值,执行该指令后,bit位值为0。例22编写一程序完成下图的逻辑电路运算处理。

Z&&1&≥1ABCD

图中A、B、C、D为逻辑输入,而Z是运算结果输出量。为了使逻辑问题用单片机来处理,先选择一些端口位作为逻辑入变量和逻辑输出变量。定义:P1.0=A,P1.1=B,P1.2=C,P1.3=D,P1.4=ZP1.4=P1.0∧P1.1∨((P1.2∧P1.3)∧P1.3)MOVC,P1.0;输入变量AANLC,P1.1CPLCMOV30H,C;保存中间运算结果

MOVC,P1.2ANLC,P1.3ANLC,/P1.3ORLC,30HCPLCMOVP1.4,C;输出运算结果P1.4=P1.0∧P1.1∨((P1.2∧P1.3)∧P1.3)七、源程序的编辑和汇编1、源程序的编辑源程序的编写要依据80C51汇编语言的基本规则,特别要用好常用的汇编命令(即伪指令),例如下面的程序段:

ORG0040HMOVA,#7FHMOVR1,#44HEND

这里的ORG和END是两条伪指令,其作用是告诉汇编程序此汇编源程序的起止位置。编辑好的源程序应以“.ASM”扩展名存盘,以备汇编程序调用。

2、源程序的汇编

将汇编语言源程序转换为单片机能执行的机器码形式的目标程序的过程叫汇编。常用的方法有两种:手工汇编时,把程序用助记符指令写出后,通过手工方式查指令编码表,逐个把助记符指令翻译成机器码,然后把得到的机器码程序(以十六进制形式)键入到单片机开发机中,并进行调试。机器汇编是在常用的个人计算机PC上,使用交叉汇编程序将汇编语言源程序转换为机器码形式的目标程序。生成的目标程序由PC机传送到开发机上,经调试无误后,再固化到单片机的程序存储器ROM中。

源程序经过机器汇编后,形成的若干文件中含有两个主要文件,一是列表文件,另一个是目标码文件。因汇编软件的不同,文件的格式及信息会有一些不同。但主要信息如下:列表文件:地址目标码汇编程序

ORG0040H0040H747FMOVA,#7FH0042H7944MOVR1,#44HEND目标码文件:首地址末地址目标码0040H0044H747F7944

伪指令是汇编程序能够识别并对汇编过程进行某种控制的汇编命令。它不是单片机执行的指令,所以没有对应的可执行目标码,汇编后产生的目标程序中不会再出现伪指令。八、伪指令1、起始地址设定伪指令ORG格式为:

ORG表达式该指令的功能是向汇编程序说明下面紧接的程序段或数据段存放的起始地址。表达式通常为16进制地址,也可以是已定义的标号地址。

ORG8000HSTART:MOVA,#30H……

此时规定该段程序的机器码从地址8000H单元开始存放。

在每一个汇编语言源程序的开始,都要设置一条ORG伪指令来指定该程序在存储器中存放的起始位置。若省略ORG伪指令,则该程序段从0000H单元开始存放。在一个源程序中,可以多次使用ORG伪指令规定不同程序段或数据段存放的起始地址,但要求地址值由小到大依序排列,不允许空间重叠。2、汇编结束伪指令END格式为:

END

该指令的功能是结束汇编。汇编程序遇到END伪指令后即结束汇编。处于END之后的程序,汇编程序将不处理。3、字节数据定义伪指令DB

变量DB字节数据表

功能是从标号指定的地址开始,在ROM中定义字节数据。该伪指令将字节数据表中的数据根据从左到右的顺序依次存放在指定的存储单元中。一个数据占一个存储单元。例如: DB“howareyou?” 把字符串中的字符以ASCII码的形式存放在连续的ROM单元中。又如:

DB-2,-4,-6,8,10,18

把6个数转换为十六进制表示(FEH,FCH,FAH,08H,0AH,12H),并连续地存放在6个ROM单元。

该伪指令常用于存放数据表格。如要存放显示用的十六进制的字形码,可以用多条DB指令完成:

DB0C0H,0F9H,0A4H,0B0HDB99H,92H,82H,0F8HDB80H,90H,88H,83HDBC6H,A1H,86H,84H4、字数据定义伪指令DW变量DW字数据表功能是从标号指定的地址单元开始,在程序存储器中定义字数据。该伪指令将字或字表中的数据根据从左到右的顺序依次存放在指定的存储单元中。应特别注意:16位的二进制数,高8位存放在低地址单元,低8位存放在高地址单元。例如:ORG1400HDATA:DW324AH,3CH……

汇编后,(1400H)=32H,(1401H)=4AH,(1402H)=00H,(1403H)=3CH。5、空间定义伪指令DS[标号:]DS表达式功能是从标号指定的地址单元开始,在程序存储器中保留由表达式所指定的个数的存储单元作为备用的空间,并都填以零值。例如:ORG3000HBUF:DS50……

汇编后,从地址3000H开始保留50个存储单元作为备用单元。

6、赋值伪指令EQU

符号名EQU表达式功能是将表达式的值或特定的某个汇编符号定义为一个指定的符号名。例如:

ORG1000H LEN EQU10 SUM EQU21H BLOCK EQU22H CLRA MOVR7,#LEN MOVR0,#BLOCK LOOP: ADDA,@R0 INCR0 DJNZR7,LOOP MOVSUM,A END

该程序的功能是,把BLOCK单元开始存放的10个无符号数进行求和(≤255),并将结果存入SUM单元中。7、位地址符号定义伪指令BIT格式为:符号名BIT位地址表达式功能是将位地址赋给指定的符号名。其中,位地址表达式可以是绝对地址,也可以是符号地址。例如:

STBITP1.0

将P1.0的位地址赋给符号名ST,在其后的编程中就可以用ST来代替P1.0。4.3.1顺序程序(无分支、无循环)程序举例【例4-1】片内RAM的21H单元存放一个十进制数据十位的ASCII码,22H单元存放该数据个位的ASCII码。编写程序将该数据转换成压缩BCD码存放在20H单元。ORG0040HSTART:MOVA,21H;取十位ASCII码

ANLA,#0FH;保留低半字节

SWAPA;移至高半字节

MOV20H,A;存于20H单元

MOVA,22H;取个位ASCII码

ANLA,#0FH;保留低半字节

ORL20H,A;合并到结果单元

SJMP$END4.3.2分支程序【例4-2】设变量x以补码的形式存放在片内RAM的30H单元,变量y与x的关系是:当x大于0时,y=x;当x=0时,y=20H;当x小于0时,y=x+5。编制程序,根据x的大小求y并送回原单元。

ORG0040HSTART:MOVA,30H;取x至累加器

JZNEXT;x=0,转NEXTANLA,#80H;否,保留符号位

JZDONE;x>0,转结束

MOVA,#05H;x<0处理

ADDA,30HMOV30H,A;X+05H送YSJMPDONENEXT:MOV30H,#20H;x=0,20H送YDONE:SJMPDONEEND2023/3/1110【例4-3】根据R7的内容x(转移序号)转向相应的处理程序。设R7内容为0~4,对应的处理程序入口地址分别为PP0~PP4。

2023/3/1111START: MOVR7,#3;以转移序号3为例

ACALLJPNUM AJMPSTARTJPNUM: MOVDPTR,#TAB;置分支入口地址表首址

MOVA,R7 ADDA,R7;乘2,调整偏移量

MOVR3,AMOVCA,@A+DPTR;取地址高字节,暂存于R3XCHA,R3INCAMOVCA,@A+DPTR;取地址低字节

MOVDPL,A;处理程序入口地址低8位送DPLMOVDPH,R3;处理程序入口地址高8位送DPHCLRA

JMP@A+DPTR

2023/3/1112TAB: DWPP0 DWPP1 DWPP2

DWPP3 DWPP4PP0: MOV30H,#0;转移序号为0时,置功能号“0”于30H单元

RETPP1: MOV30H,#1;转移序号为1时,置功能号“1”于30H单元

RETPP2: MOV30H,#2;转移序号为2时,置功能号“2”于30H单元

RET

PP3: MOV30H,#3;转移序号为3时,置功能号“3”于30H单元

RETPP4: MOV30H,#4;转移序号为4时,置功能号“4”于30H单元

RET 4.3.3循环程序【例4-4】将内部RAM的30H至3FH单元初始化为00H。ORG0040HMAIN:MOVR0,#30H;置初值

MOVA,#00H;MOVR7,#16;LOOP:MOV@R0,A;循环处理

INCR0;DJNZR7,LOOP;循环修改,判结束

SJMP$;结束处理END2023/3/11144.4子程序及其调用完成通用功能、反复使用的程序设计成子程序。使应用程序结构清晰紧凑,便于阅读和调试执行要由其它程序来调用,执行完后要返回到调用程序结构上仍然采用一般程序的3种结构调用时注意:一是现场的保护和恢复;二是主程序与子程序间的参数传递。4.4子程序及其调用现场保护与恢复在主程序中实现(结构灵活)在子程序中实现(程序规范、清晰)参数传递利用累加器或寄存器(简单、快速,但参数个数不多)利用存储器(个数多,用R0或R1及DPTR为参数表指针)利用堆栈

4.4.3常用子程序示例(略)查表程序p112延时程序p116练习:编写程序,控制p1.0连接的发光二极管实现0.5s的闪亮,系统晶振为6MHz。要求,至少两个函数的设计主函数延时子函数练习:编写程序,控制p2连接的数码管,实现0.5s的切换数值从0-9循环显示,系统晶振为6MHz。要求,至少三个函数的设计主函数延时子函数查表子函数(获取数值x的段码)汇编语言编程总结特点:操作对象(变量)——全局变量功能有限优势:代码高效冗余少,运行速度快,实时性高,适合短小高速的程序。劣势:编程难度大,不便于阅读、修改、移植概述C51开发流程C51的优点1、编译器能自动完成变量的存储单元的分配。2、能对算法和应用程序进行移植。3、能对关键代码进行优化。第二部分80C51单片机的C语言程序设计一、C51数据类型C51具有标准C语言的所有标准数据类型,针对51单片机内部结构增加了以下特殊数据类型:(1)bit位变量。(2)sbit可独立寻址的位变量。(3)sfr8位特殊功能寄存器。(4)sfr1616位特殊功能寄存器。1.bit位变量

bit位变量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1。2.sbit可寻址位 sbit同样是单片机C语言中的一种扩充数据类型,利用它能访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。

C51数据类型3.sfr特殊功能寄存器

sfr也是一种扩充数据类型,占用一个内存单元,值域为0~255。利用它能访问51单片机内部的所有特殊功能寄存器。4.sfr1616位特殊功能寄存器 sfr16占用两个内存单元,值域为0~65535。sfr16和sfr一样用于操作特殊功能寄存器,不同的是它用于操作占两个字节的寄存器,如定时器T2。C51数据类型表1

温馨提示

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

评论

0/150

提交评论