您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 机械/模具设计 > #MCS-51单片机指令系统及编程举例
微机原理及应用•对于任何一台计算机,必须有软件(程序)的支持,才能工作。但是市场上所售的单片机是裸机,在使用之前要现对它编程,将程序固化在芯片内,才能使用。•指令系统是一种CPU所能直接执行的所有命令的集合,CPU的主要功能是由它的指令系统来体现的。任何计算机语言编写的任何程序,都必须转换为指令系统中相应指令代码的有序集合,CPU才能执行。•单片机的指令系统是单片机能够识别并执行的所有指令的集合。•3.1指令系统简介•每一种CPU都有其独立的指令系统。•MCS-51系列单片机指令系统共有111条指令,其中有49条单字节指令,45条双字节指令和17条三字节指令。•MCS-51指令系统的功能十分强大,它把体现单片机的各种功能的寄存器组织在统一的地址空间中,MCS-51指令系统在其存储空间、时间的利用率及工作效率方面都是较高的。•1.指令格式•MCS-51指令系统中的每一条指令都有两级指令格式:CPU可直接识别并执行的机器语言指令(机器语言)。汇编语言指令(简称汇编指令)。•符号说明:见书上.P.34•MCS-51汇编语言指令格式,由以下几个部分组成:[标号:]操作码[目的操作数][,源操作数][;注释]•例:LOOP:MOVA,R1;AR1MOVA,R1INCANOP•3.2寻址方式•所谓寻址方式就是寻找或获得操作数的方式。•指令的一个重要组成部分是操作数。由寻址方式指定参与运算的操作数或操作数所在单元的地址。•MCS-51指令系统的寻址方式有以下7种:•1.立即寻址•2.直接寻址•3.寄存器寻址•4.寄存器间接寻址•5.变址寻址•6.相对寻址•7.位寻址•立即寻址:操作数直接出现在指令中,可以是8位,也可是16位。该方式寻址中的操作数称为立即数,用“#”表示。•例:MOVA,#30H;A30H执行结果:A=30H•例:MOVDPTR,#1000H;DPTR1000H执行结果:DPTR=1000H,注意:只有MOVDPTR,#date16指令的立即数为16位,DPTR分为DPH和DPL,在上述例子中,DPH=10H,DPL=00H•直接寻址:操作数的地址直接出现在指令中。这类寻址方式的操作数只能是存放在内部RAM和SFR中。(1)SFR例:MOVA,P1执行结果:将P1口的内容送到A中。若P1的内容为78H,执行该指令后,A=78H见.P.23•(2)内部RAM的低128字节•例:MOVA,76H•执行结果:将76H单元的内容送到A中。•若(76H)=3FH,执行该指令后,A=3FH注意:若要表示某个单元的内容,将该单元用括号扩起来,如(43H)、(76H)、(R0)等。•寄存器寻址:操作数为寄存器的内容。此处的寄存器指的是工作寄存器R0~R7、累加器A、通用寄存器B、数据指针寄存器DPTR和位累加器C(即进位位C)。例:MOVA,R0执行结果:将R0的内容送入A中。若R0的内容(R0)=5AH,则A=5AH•寄存器间接寻址:将指定寄存器中的内容作为地址,该地址对应的内容才是操作数,用@表示。•例:MOVA,@R0执行结果:将R0的内容作为地址,再将该地址对应的内容送入A中。若(R0)=46H,(46H)=2FH,则:A=((R0))=(46H)=2FH•例:MOV@R1,76H执行结果:((R1))(76H)。若(76H)=0FH,(R1)=23H,则:(23H)=0FH•变址寻址:以程序指针PC或数据指针DPTR为基址,以累加器A作为变址,两者内容相加(即基址+偏移量)形成16位地址。例:•地址目标代码汇编指令21007406MOVA,#06H210283MOVCA,@A+PC210300NOP210400NOP………210932DB32H执行结果分析:当执行到MOVCA,@A+PC时,PC=2103H(基址),A=06H(偏移量),因此@A+PC所示的地址=2103H+06H=2109H,(2109H)=32H,所以A=32H例:•MOVA,#01HMOVDPTR,#TABLEMOVCA,@A+DPTRTABLE:DB41HDB42H……执行结果分析:基址的首地址=TABLE偏移量=01H,程序执行到MOVCA,@A+DPTR时,@A+DPTR所指的地址=TABLE+01H,因此,该指令执行后A=42H•相对寻址:以PC的当前值为基址,与指令中的第二字节给出的偏移量rel(8位有符号数)相加,所得之和为程序的转移地址。转移范围为+127~-128字节之间。•例:SJMP08H;双字节指令分析:若PC=2000H为该条指令的地址,则转移目标地址=2000H+02H+08H=200AH•位寻址:对片内RAM的20H~2FH字节地址中的所有位和部分SFR的位进行寻址。•区分指令中是位地址还是存储器单元地址不太容易,主要是由另一个操作数来区分。•例:SETBEX0;EX01,位寻址•MOVC,07H;C(07H),位寻址•MOVA,20H;A(20H),直接寻址•MOVC,20H;C(20H),位寻址•3.3指令系统•指令分类:MCS-51指令系统共有111条指令,分成5大类:(1)数据传送类(2)算术运算类(3)逻辑运算类(4)控制程序转移类(5)布尔变量操作(位操作类)3.4汇编语言程序设计基础用汇编语言编写的源程序汇编程序目标程序•汇编语言是一种采用助记符表示的机器语言,即用助记符号来代表指令的操作码和操作数,用标号或符号代表地址、常数或变量。而助记符一般都是英文单词的缩写,因此使用方便。这种用助记符编写的程序称为源程序。•汇编语言源程序必须翻译成机器语言的目标代码,亦称目标程序,计算机才能执行。其翻译工作可由汇编程序自动完成,汇编程序的功能就是将用助记符号编写的源程序翻译成用机器语言表示的目标程序。汇编语言程序的组成:•汇编语言源程序是由汇编语句组成的,一般情况下,汇编语言语句可分为:指令性语句(即汇编指令)和指示性语句(即伪指令)。•指令性语句(可简称指令)是进行汇编语言程序设计的可执行语句,每条指令都产生相应的机器语言的目标代码。源程序的主要功能是由指令性语句去完成的。•指示性语句(伪指令)又称汇编控制指令。它是控制汇编(翻译)过程的一些命令,程序员通过伪指令通知汇编程序在进行汇编时的一些指示。因此,伪指令不产生机器语言的目标代码,是进行汇编语言程序设计的不可执行语句。伪指令:1、ORG(汇编起始地址)例:ORG3000HSTART:MOVA,R1……2、END(结束汇编)3、EQU(等值或赋值)格式:标识符EQU数或汇编符号功能:把数或汇编符号赋给标识符,且只能赋值1次。例:INT-1EQU001BHORGINT-1AJMPLP1注意:EQU与前面的标号之间不要使用冒号,只用一个空格进行分隔。4、DB(定义字节)格式:[标号:]DBX1,X2,X3,…Xn功能:将项或项表中的8位字节数据依次存入标号所示的存储单元中例:DELAY:DB50H;将50H存入存储单;元DELAY中。例:ORG2000HTAB:DB12H,0AFH,00111001B,”9”结果:(2000H)=12H,(2001H)=0AFH,(2002H)=00111001B,(2003H)=9(字符)。(自学5,6,7)5、DW(定义字)格式:[标号:]DWX1,X2,X3,…Xn功能:将项或项表中的16位字数据依次存入标号所示的存储单元中。6、DS(定义存储单元)格式:标号:DS数字功能:从标号所指示的单元开始,根据数字的值保留一定数量的字节存储单元,留给以后存储数据用。例:SPACE:DS10表示从SPACE开始保留10个存储单元,下条指令将从SPACE+10处开始汇编。7、BIT(地址符号命令)格式:标识符BIT位地址功能:将位地址赋予标识符。例:A1BITP1.0MOVC,A1汇编语言程序设计实例•1、简单程序(顺序程序)例:将片内RAM的30H和31H的内容相加,结果存入32H。ORG2000HMOVA,30H;A←(30H)ADDA,31H;A←A+(31H)MOV32H,A;结果存入32HEND例:拼字:将外部数据存储器3000H和3001H的低4位取出拼成一个字,送到3002H中。ORG2000HMOVDPTR,#3000H;DPTR外部存储器地址3000HMOVXA,@DPTR;A(3000H)ANLA,#0FH;屏蔽高4位(即取低4位)SWAPA;交换高低4位MOVR1,A;暂存于R1中INCDPTR;指向下一单元3001HMOVXA,@DPTR;A(3000H)ANLA,#0FH;屏蔽高4位(即取低4位)ORLA,R1;拼成一个字INCDPTR;指向下一单元3002HMOVX@DPTR,A;送结果到3002H单元SJMP$END2、分支程序•在解决实际问题时,常常需要根据不同的条件去执行不同的处理结果,这样,程序就产生了分支,这种结构的程序,称为分支程序。条件成立NY分支程序常用的指令指令功能JZrelJNZrelJCrelJNCrelJBbit,relJNBbit,relJBCbit,relCJNEA,direct,relCJNEA,#data,relCJNERn,#data,relCJNE@Rn,#data,relA的内容为零转移此位为1转移,并将此位清零A的内容非零转移CY=1转移CY=0转移此位为1转移此位非1转移两数不相等转移两数不相等转移两数不相等转移两数不相等转移例:把片外RAM的首地址为10H开始存放的数据块,传送给片内RAM首地址为20H开始的数据块中去,如果数据为“0”,就停止传送。ORG2000HMOVR0,#10HMOVR1,#20HLOOP:MOVXA,@R0HERE:JZHEREMOV@R1,AINCR0INCR1SJMPLOOPEND例:求符号函数,设X、Y分别为30H、31H。1X0Y=0X=0-1X0MOVA,30HJZLP0JBACC.7,LP1MOVA,#01HSJMPLP0LP1:MOVA,#0FFHLP0:MOV31H,ASJMP$ENDY开始X=0Y=0X0结束Y=1Y=-1YNNLP0:LP1:分析:X是有符号数,判断符号位是0还是1可利用JB或JNB指令。判断X是否等于0则直接可以使用累加器A的判0指令。例3-24:内部RAM30H开头的20个连续单元中,存放有20个数,统计等于8的单元个数,结果放在R2中。分析:取一个数与8比较,相等R2加1,不相等跳过。并作20次重复即可。流程如右图,程序如下:ORG1000HSTART:MOVR0,#30HMOVR7,#20MOVR2,#0LOOP:CJNE@R0,#08H,NEXTINCR2NEXT:INCR0DJNZR7,LOOPSJMP$3、循环程序在程序执行过程中,当需要多次反复执行某段程序时,可采用循环结构。循环开始循环结束循环控制设置循环初值循环体循环修改完成未完完成循环开始循环结束循环控制设置循环初值循环体循环修改未完循环程序的结构循环程序包括以下四个部分:置循环初值循环体循环控制变量修改循环终止控制常用于循环控制的指令有:DJNZ、CJNE、JC、JNC等控制类指令。例:有20个数存放于内部RAM从41H开始的连续单元中,试求其和,并将结果存放于40H单元(和数是一个8位二进制数,不考虑进位问题)ORG2000HMOVA,#00H;累加器清0MOVR7,#14H;R7为循环计数器,R7=20MOVR0,#41H;建立内存数据指针,首地址为41HLOOP:ADDA,@R0;累加INCR0;指向下一数据单元DJNZR7,LOOP;R7-1≠0,表示累加未结束,继续累加;;否则,往下执行。MOV40H,A;结果存放于40H单元END例:在内部RAM的42H开始的连续单元中存放一组8位无符号数,该数组长度为n(n≤3DH)存放于41H中,找出该组数中最大的数,并将其存入内部RAM的40H单元。ORG2000HMOVR0,#42H;第1个数送40H单元MOV40H,@R0DEC41H;设置计数
本文标题:#MCS-51单片机指令系统及编程举例
链接地址:https://www.777doc.com/doc-4432137 .html