单片机3-2.ppt
MCS51系列单片机指令系统分类系列单片机指令系统分类 按寻址方式分为以下七种:按寻址方式分为以下七种:按功能分为以下五种:按功能分为以下五种:1 1、立即寻址、立即寻址 1 1、数据传送指令、数据传送指令2 2、直接寻址、直接寻址 2 2 2 2、算术运算指令、算术运算指令、算术运算指令、算术运算指令3 3、寄存器寻址、寄存器寻址 3 3、逻辑运算指令、逻辑运算指令4 4、寄存器间接寻址指令、寄存器间接寻址指令 4 4、控制转移类指令、控制转移类指令5 5、相对寻址、相对寻址 5 5、位操作指令、位操作指令6 6、变址寻址、变址寻址7 7、位寻址、位寻址1二、二、算术运算指令算术运算指令算术运算包括加、减、乘、除四则运算,共算术运算包括加、减、乘、除四则运算,共2424条,助记符条,助记符8 8种。种。23说明说明l多数算术运算指令多数算术运算指令会影响标志位会影响标志位lCPUCPU执行算术运算指令后,根据数据操执行算术运算指令后,根据数据操作情况作情况自动设置自动设置PSWPSW中的中的CyCy、ACAC、OVOV、P Pl进位进位(借位借位)标志标志CyCy为无符号整数的多字为无符号整数的多字节加法、减法、移位等操作提供了方便节加法、减法、移位等操作提供了方便l溢出标志溢出标志OVOV可方便的控制可方便的控制补码运算补码运算l辅助进位标志辅助进位标志ACAC则可用于则可用于BCDBCD码运算码运算4算术运算指令对标志位影响情况如下所示算术运算指令对标志位影响情况如下所示注:符号符号表示相应的指令影响该标志位,表示相应的指令影响该标志位,0 0表示相表示相应的指令对该标志位清应的指令对该标志位清0 0,x x表示相应的指令对该标志表示相应的指令对该标志位没有影响。位没有影响。5 加加1指令(指令(INC)和减)和减1指令(指令(DEC)中只有对累)中只有对累加器的操作(加器的操作(INC A和和DEC A)对)对奇偶位奇偶位P有影响,有影响,对其它标志没有影响,而其它的加对其它标志没有影响,而其它的加1指令和减指令和减1指令对指令对标志位也没有影响。标志位也没有影响。注意:注意:没有指令没有指令 DEC DPTR 可用指令可用指令 DEC DPL 代替代替6关于关于DA指令需要说明的是:指令需要说明的是:DA指令的功能是对累加器A中刚进行的两个BCD码加法的结果进行十进制调整(加6修正)。该指只能紧跟紧跟在加法指令在加法指令(ADD/ADDC)后进行并且两个加数必须已经是BCD码,而且也只能对累加器A中结果进行调整。当累加器A中的低4位数出现了非BCD码(10101111)或低4位产生进位(AC=1),则应在低4位加6调整,以产生低4位正确的BCD结果。当累加器A中的高4位数出现了非BCD码(10101111)或高4位产生进位(CY=1),则应在高4位加6调整,以产生高4位正确的BCD结果。注意,DA指令不能对减法进行十进制调整。7【例例】若(A)0101 0110B,表示的BCD码为(56)BCD(R2)0110 0111B,表示的BCD码为(67)BCD,(CY)0。执行以下指令:ADD A,R2 DA A 请分析指令执行后的结果。根据题意分析程序指令执行的过程如下图所示:由于:(A)0010 0011B,即(23)BCD,(CY)1,即(01)BCD 结果为BCD数123。84位二进制数来表示位二进制数来表示1位十进制数中的位十进制数中的09这这10个数码个数码例:例:例:例:若若若若A=(25)A=(25)A=(25)A=(25)BCDBCDBCDBCD 而而而而R0=(39)R0=(39)R0=(39)R0=(39)BCDBCDBCDBCD 则:则:则:则:ADD AADD AADD AADD A,R0 R0 R0 R0;A=5EH A=5EH A=5EH A=5EH DA A DA A DA A DA A;A=(64)A=(64)A=(64)A=(64)BCDBCDBCDBCD 执行的过程为执行的过程为执行的过程为执行的过程为:2 5:2 5:2 5:2 5 H H H H +3 9 H +3 9 H +3 9 H +3 9 H 5 E H 5 E H 5 E H 5 E H 加法运算的结果加法运算的结果加法运算的结果加法运算的结果 +0 6 +0 6 +0 6 +0 6 H H H H 调整调整调整调整 6 4 6 4 6 4 6 4 H H H H 调整后的结果调整后的结果调整后的结果调整后的结果 9【例例】编制2个十六进制数加法程序,假定和超过双字节 (21H 20H)+(31H 30H)(42H 41H 40H)分析:先低字节作不带进位求和,再作带进位高字节求和。程序如下:MOV A,20H ADD A,30H MOV 40H,A ;(20H)+(30H)40H MOV A,21H ADDC A,31H MOV 41H,A ;(21H)+(31H)+(C)41H MOV A,#00H ;准备处理最高位 ADDC A,#00H;记入最高位 MOV 42H,A10思考一下这段程思考一下这段程序中序中A的变化的变化(A)=#00H+#00H+(C)【例例】双字节无符号数相减(31H 30H)(41H 40H)(31H 30H).程序如下:程序如下:MAIN:CLR C ;CY清零清零 MOV R0,#30H ;设被减数地址 MOV R1,#40H ;减数地址 MOV A,R0 ;取被减数低字节 SUBB A,R1 ;被减数低字节减去减数低字节 MOV R0,A ;存低字节差 在在30HINC R0 ;指向被减数高字节31H 加一指令加一指令INC R1 ;指向被减数高字节41HMOV A,R0 ;取被减数高字节SUBB A,R1 ;被减数高字节减去减数高字节并减 ;去低字节相减时产生的借位MOV R0,A ;存高字节差 在在31HHERE:SJMP HERE11【例例】双字节乘法程序,要求:(R0R1)(R2)(R3R4R5)分析:设(R0)=J,(R1)=K,(R2)=L,则:程序如下:程序如下:MOV A,R1 MOV B,R2 MUL AB ;K*L MOV R5,A ;KL低R5 MOV R4,B ;KL高暂存R4 MOV A,R0 MOV B,R2MUL AB ;J*LADD A,R4 MOV R4,A ;KL高+JL低R4MOV A,BADDC A,#00H MOV R3,A ;JL高+(C)R312【例例】利用除法指令进行代码转换。设一个8位无符号二进制数存放在内部RAM的30H单元中,将其转化为10进制数据。百位,十位,个位分别存放在40H,41H,42H中。分析:(30H)/100商(百位)(40H)余数/10 商(十位)(41H)余数(个位)(42H)程序如下:MOV R0,#40H ;要存放的首地址MOV A,30HMOV B,#64H ;(除数为除数为100)DIV ABMOV R0,A ;除以100后的商MOV A,B ;余数送至AMOV B,#0AH;(除数为除数为10)DIV ABINC R0 ;指向41H MOV R0,AINC R0 ;指向42HMOV R0,B 13MCS51系列单片机指令系统分类系列单片机指令系统分类 按寻址方式分为以下七种:按寻址方式分为以下七种:按功能分为以下五种:按功能分为以下五种:1 1、立即寻址、立即寻址 1 1、数据传送指令、数据传送指令2 2、直接寻址、直接寻址 2 2、算术运算指令、算术运算指令3 3、寄存器寻址、寄存器寻址 3 3 3 3、逻辑运算指令、逻辑运算指令、逻辑运算指令、逻辑运算指令4 4、寄存器间接寻址指令、寄存器间接寻址指令 4 4、控制转移类指令、控制转移类指令5 5、相对寻址、相对寻址 5 5、位操作指令、位操作指令6 6、变址寻址、变址寻址7 7、位寻址、位寻址14三、逻辑操作类指令三、逻辑操作类指令逻辑运算类指令共有逻辑运算类指令共有2424条,包括与、或、条,包括与、或、异或、清零、求反及移位指令异或、清零、求反及移位指令当当目的操作数为累加器目的操作数为累加器A A时会影响奇偶标时会影响奇偶标志位志位P P,带进位的移位指令会影响带进位的移位指令会影响C C除此之外,逻辑运算类指令不影响程序除此之外,逻辑运算类指令不影响程序状态状态PSWPSW151617注:注:符号符号“”表示两个数按位进行逻辑与,符号表示两个数按位进行逻辑与,符号“”表示表示两个数按位进行逻辑或,符号两个数按位进行逻辑或,符号“”表示两个数按位进行表示两个数按位进行逻辑异或,逻辑异或,“”表示累加器表示累加器A A的内容按位取反。的内容按位取反。逻辑逻辑“与与”指令常常用于屏蔽字节中的某些位。指令常常用于屏蔽字节中的某些位。若清除某若清除某位,则用位,则用“0 0”与该位进行逻辑与该位进行逻辑“与与”,若保留某位,则用,若保留某位,则用“1 1”与该位进行逻辑与该位进行逻辑“与与”。例如例如:若(若(P1P1)=C5H=11000101B=C5H=11000101B,为屏蔽,为屏蔽P1P1口的高口的高4 4位,需执行指令位,需执行指令:ANL P1,#0FH ANL P1,#0FH 指令执行结果为:指令执行结果为:(P1)=05H=00000101B(P1)=05H=00000101B18注:注:逻辑逻辑“或或”指令常常用于使字节中的某些位置指令常常用于使字节中的某些位置“1 1”。若置若置“1 1”某位,某位,则用则用“1 1”与该位进行逻辑与该位进行逻辑“或或”,若保留某位,则用,若保留某位,则用“0 0”与该位进与该位进行逻辑行逻辑“或或”。例如例如:将将P1P1口的口的4 40 0位设置成累加器位设置成累加器A A的的4 40 0位,而位,而P1P1口高口高3 3位位保持不变,需执行下列程序指令保持不变,需执行下列程序指令:ANL A,#00011111B ANL A,#00011111B ANL P1,#11100000B ANL P1,#11100000B ORL P1,A ORL P1,A逻辑逻辑“异或异或”指令常用于使字节中的某些位取反。指令常用于使字节中的某些位取反。若用若用“1 1”与某位与某位进行逻辑进行逻辑“异或异或”则则该位取反该位取反,若,若保留某位保留某位,则用,则用“0 0”与该位进行与该位进行逻辑逻辑“异或异或”。可以利用异或指令对某个单元进行可以利用异或指令对某个单元进行自身异或,以实现清零自身异或,以实现清零操作。操作。例如例如:若若(A)=B5H=10110101B(A)=B5H=10110101B,执行下列程序指令,执行下列程序指令:XRL A,#0F0H XRL A,#0F0H ;A A的高的高4 4位取反,低位取反,低4 4位保持不变位保持不变(A)=45H(A)=45H MOV 30H,A MOV 30H,A ;(30H)=(A)=45H(30H)=(A)=45H XRL A,30H XRL A,30H ;A A清零清零 19注:注:“RL ARL A”使累加器使累加器A A的各位循环左移的各位循环左移1 1位相当于原内容位相当于原内容乘乘2 2为左移为左移“RR ARR A”使累加器使累加器A A的各位循环右移的各位循环右移1 1位相当于原内容位相当于原内容除除2 2为右移为右移预先清零预先清零CYCY,采用带进位位的左移和右移,能够,采用带进位位的左移和右移,能够保留乘除产生的进保留乘除产生的进位和余数位和余数。例例:设设(A)=00000111B=07H(A)=00000111B=07H,(,(CYCY)=0=0,则执行指令,则执行指令:RL A RL A ;(A A)=00001110B=0EH=00001110B=0EH,(,(CYCY)=0=0 RRC A RRC A ;(A A)=00000111B=07H=00000111B=07H,(,(CYCY)=0=0CLR C CLR C ;RRC A RRC A ;(A A)=00000011B=03H=00000011B=03H,(,(CYCY)=1=120例:例:设(设(C)=0CLR C;清零清零MOV A,#5CH;01011100BRL A;10111000BRLC A;01110000B(c)=?RR A;00111000BRRC A;10011100B(c)=?SWAP A;11001001B例:例:设设 A=11000101 A=11000101,Cy=0Cy=0,分别执行分别执行下列单条指令:下列单条指令:CPL ACPL A 求:求:A=A=,Cy=Cy=00111010 000111010 010001011 010001011 010001010 110001010 1RL A RL A A=,Cy=RLC A RLC A A=,Cy=21【例例3-14】设40H单元中存放的是一个16位二进制数的低8位,41H单元中存放的是这个16位二进制数的高8位(假设这个数小于128),请将这个16位二进制数进行左移1位。分析:实现所要求的功能应该按如下图所示的设计思路进行设计分析:实现所要求的功能应该按如下图所示的设计思路进行设计程序指令如下程序指令如下:CLR C ;CY清零清零MOV R1,#40H;设低字节地址设低字节地址MOV A,R1 ;取低取低8位位 为什么用为什么用A?RLC A ;低;低8位左移位左移MOV R1,A ;保存移位后的低保存移位后的低8位字节位字节INC R1 ;指向高指向高8位地址位地址MOV A,R1 ;取高取高8位位为什么用为什么用A?RLC A ;高;高8位左移,并带进低位左移,并带进低8位左移产生的进位位位左移产生的进位位MOV R1,A ;保存移位后的高保存移位后的高8位字节位字节 22注意:只能对累加器注意:只能对累加器A A进行移位进行移位MCS51系列单片机指令系统分类系列单片机指令系统分类 按寻址方式分为以下七种:按寻址方式分为以下七种:按功能分为以下五种:按功能分为以下五种:1 1、立即寻址、立即寻址 1 1、数据传送指令、数据传送指令2 2、直接寻址、直接寻址 2 2、算术运算指令、算术运算指令3 3、寄存器寻址、寄存器寻址 3 3、逻辑运算指令、逻辑运算指令4 4、寄存器间接寻址指令、寄存器间接寻址指令 4 4 4 4、控制转移类指令、控制转移类指令、控制转移类指令、控制转移类指令5 5、相对寻址、相对寻址 5 5、位操作指令、位操作指令6 6、变址寻址、变址寻址7 7、位寻址、位寻址23四、控制转移类指令四、控制转移类指令转移指令通过改写转移指令通过改写PCPC的当前值,从而改变的当前值,从而改变CPUCPU执执行程序的顺序,使程序发生跳转。行程序的顺序,使程序发生跳转。转移指令分类:转移指令分类:1)1)无条件转移无条件转移:执执行行无无条条件件转转移移指指令令,程程序序无无条条件件转转移移到到指指定处。定处。2)2)条件转移条件转移:指指令令中中给给出出转转移移条条件件,执执行行指指令令时时,先先测测试试条条件件,若若满满足足条条件件,则则程程序序发发生生转转移移,否否则则,仍顺序执行程序。仍顺序执行程序。243)3)子程序调用和返回指令子程序调用和返回指令:控制程序从主程序转移到子程序入口地址,子控制程序从主程序转移到子程序入口地址,子程序执行完后,返回主程序继续执行。程序执行完后,返回主程序继续执行。4)4)中断中断:中断是与接口硬件密切相关的技术,当中断发中断是与接口硬件密切相关的技术,当中断发生时,也会改变程序的执行顺序,使程序转到生时,也会改变程序的执行顺序,使程序转到中断服务子程序执行,执行完后返回主程序。中断服务子程序执行,执行完后返回主程序。这类指令共这类指令共1717条条,如下表所列:如下表所列:252627l长转长转LJMPLJMP:提供的是1616位地址位地址,因此程序可以转向64KB的程序存储器地址空间的任何单元。该指令不影响pswl短转短转AJMPAJMP:指令的转移范围为AJMP下面一条指令的存储地址相同的2KB2KB区间区间内,可以向前也可以向后。l相对转相对转SJMPSJMP:我们往往并不是直接把要转移(或调用)到的目标指令的地址给出,而是通过标号标号给出,该标号对应的地址由编译器自动计算出。SJMP rel28SJMP NEXTSJMP NEXT NEXT NEXT:lHERE:SJMP HERE,或:SJMP$,表示程序“原地踏步”,造成程序的无限循环,一般用于主程序结束的位置,等待中断信号的到来。有时候也用有NOP的无限循环实现这一功能,如:WAITINT:NOP NOP NOP SJMP WAITINT29l散转散转指令指令 JMP A+DPTRJMP A+DPTR的转移地址由数据指针DPTR的16位数和累加器A的8位数进行无符号数相加形成,并直接送入PC,指令执行过程对DPTR、A和标志位均无影响。该条指令具有散转功能其转移地址不是在汇编或编程时确定的,而是在程序运行过程中动态决定动态决定的。例:根据累加器A中键值的不同跳转到相应的程序。MOV DPTR,#TABLE RL A ;将A值乘2,因为AJMP 指令为双字节指令 JMP A+DPTR TABLE:AJMP TAB0 AJMP TAB1 30l比较不相等转移指令比较不相等转移指令(CJNE),不等则转移,不等则转移 CJNE A,#data,rel CJNE Rn,#data,rel CJNE Ri,#data,rel CJNE A,direct,rel例例:编写指令序列:当:编写指令序列:当P1P1口内容为口内容为8080H H时程序才向下执行,否时程序才向下执行,否则处于等待状态。程序如下:则处于等待状态。程序如下:MOV AMOV A,#80H#80H LOOPLOOP:CJNE ACJNE A,P1P1,LOOP LOOP;比较不相等;比较不相等 32例例:设:设P1P1口口P1.0P1.0P1.3P1.3为准备就绪信号输入端,为准备就绪信号输入端,当该当该4 4位输入全为位输入全为1 1时说明各项工作已准备好,单时说明各项工作已准备好,单片机可顺序执行程序,否则循环等待,程序如下:片机可顺序执行程序,否则循环等待,程序如下:LO:MOV LO:MOV A,P1A,P1 ANL ANL A,#0FHA,#0FH;取低四位取低四位 CJNE A,#0FH,LO CJNE A,#0FH,LO;比较不相等比较不相等MAIN:MAIN:33l减减1不为不为0条件转移指令条件转移指令(循环转移指令循环转移指令)DJNZ Rn,rel;PCPC+2,Rn(Rn)-1 若若R20,PCPC+rel 若若R2=0,PC不变不变 相当于不转移相当于不转移 DJNZ direct,rel;PCPC+3,direct(direct)-1,若若(direct)0,PCPC+rel 若若(direct)=0,PC不变不变用于控制循环操作用于控制循环操作35例:用于循环结构程序。设要求程序循环执行例:用于循环结构程序。设要求程序循环执行100100次次MOV R2MOV R2,#100#100;设循环计数器初值设循环计数器初值LOOPLOOP:;多次循环程序段多次循环程序段 DJNZ R2DJNZ R2,LOOPLOOP;循环控制循环控制 ;循环结束;循环结束思考:思考:当循环计数器初值为当循环计数器初值为0 0,循环次数有多少?,循环次数有多少?36例:在程序初始化时经常遇到这种情况,假定数例:在程序初始化时经常遇到这种情况,假定数据区地址为据区地址为3030H H,长度为长度为1010,要把它们全部清,要把它们全部清0 0ZZZ:ZZZ:MOVMOVR0,#30HR0,#30HMOVMOVR7,#0AHR7,#0AHMOVMOVA,#00HA,#00HLOOP:MOVLOOP:MOVR0,AR0,AINCINCR0R0DJNZDJNZ R7,LOOPR7,LOOP38【例例3-15】利用DJNZ指令设计循环延时程序,已知fosc=12MHz1)单循环延时)单循环延时 DELAY:MOV R7,#10 ;单周期指令 DJNZ R7,;双周期指令 延时长度:t=1s210+1s=21s2)双重循环延时双重循环延时 DELAY:MOV R7,#0AH ;单周期指令 DL:MOV R6,#64H ;单周期指令 DJNZ R6,;双周期指令 DJNZ R7,DL ;双周期指令延时长度:t=(1s2100+2s+1s)10+1s=2031s3)三重循环延时)三重循环延时 DELAY:MOV R7,#10 ;单周期指令 DL2:MOV R6,#200 ;单周期指令 DL1:MOV R5,#250 ;单周期指令 DJNZ R5,;双周期指令 DJNZ R6,DL1 ;双周期指令 DJNZ R7,DL2 ;双周期指令 延时长度:t=(1s2250+2s+1s)200)+2s+1s)10+1s=1006031s 1 秒39lNOPNOP这条指令不产生任何控制操作,只是将程序计数器PC的内容加1。该指令在执行时间上要消耗1个机器周期,在存储空间上占用一个字节。常用来实现较短时间的延时或用于在延时子程序中用来拼凑精确延时。【例例】已知fosc=12MHz,设计循环延时2ms的子程序程序 DELAY:MOV R7,#0AH ;单周期指令 0AH=10 DL:MOV R6,#62H ;单周期指令 62H=98 DJNZ R6,;双周期指令 NOP ;单周期指令 DJNZ R7,DL ;双周期指令 延时长度:t=(1s298+2s+1s+1s)10+1s =2001s40l子程序调用和返回指令子程序调用和返回指令程序转移与子程序调用指令的区别:程序转移与子程序调用指令的区别:转移指令不需考虑返回问题转移指令不需考虑返回问题,而调用指令不但要保证程序正确转到子程序入口地址,还要保证子程序执行完后能正确返回主程序调用处。这就需要在调用前正确地保护现场保护现场,调用完正确地恢复现场恢复现场。现场的保护和恢复是利用堆栈堆栈完成的,堆栈是内部RAM中一片存储区,采用先进后出的原则存取数据,调用前保护现场的工作由调用指令完成,调用后恢复现场的工作由返回指令完成。41子程序调用和返回指令也使程序发生转移。子程序调用和返回指令也使程序发生转移。子程序调用过程子程序调用过程为为避免重复避免重复,节省存储空间节省存储空间常把一些相同内容的处理程常把一些相同内容的处理程序段从主程序中独立出来,序段从主程序中独立出来,这独立的程序段这独立的程序段称为子程序称为子程序子程序的用法并不复杂,主子程序的用法并不复杂,主程序中采用调用指令,它是一条无条件转移指程序中采用调用指令,它是一条无条件转移指令,使程序转到子程序的入口地址处。但调用令,使程序转到子程序的入口地址处。但调用指令与转移指令不同:指令与转移指令不同:42l返回指令返回指令 RETRET 每个子程序每个子程序的最后一条指令最后一条指令,在执行返回指令时,将原先压栈的断点出栈,从而实现返回主程序,并从原断点处重新执行主程序。指令执行的操作为:PC158(SP)SPSP-1 PC70(SP)SPSP-1 指令机器码:指令机器码:2222H HRETRET指令从堆栈弹出保存的指令从堆栈弹出保存的PCPC地址,实现子程序地址,实现子程序返回。返回。4455H54H53HSP 03 20执行前执行前 执行后执行后例例(SP)=55H (54H)=03H (55H)=20H执行完执行完RET后:后:(SP)=53H(PC)=2003H子程序调用中应注意的问题子程序调用中应注意的问题允许允许子程序嵌套调用子程序嵌套调用 在子程序的调用中,又调用别的子程序称在子程序的调用中,又调用别的子程序称作子程序嵌套作子程序嵌套45例:子程序嵌套例:子程序嵌套MAINMAIN:MOV SPMOV SP,#30H#30H;设置栈底设置栈底 LCALL SUB1LCALL SUB1 ;调用子程序调用子程序 SUB1:SUB1:;子程序段子程序段1 1 LCALL SUB2 LCALL SUB2 ;调用子程序调用子程序 RETRET ;返回主程序返回主程序SUB2:SUB2:;子程序段子程序段2 2 RETRET ;返回返回子子程序程序1 146不要忘记给栈指针设初始值不要忘记给栈指针设初始值调用时有时用到压栈出栈指令,两者要配对使调用时有时用到压栈出栈指令,两者要配对使用用堆栈区设置要合理堆栈区设置要合理子程序起始指令要使用标号,用作子程序名。子程序起始指令要使用标号,用作子程序名。执行返回指令执行返回指令RET之前,保证栈顶内容为主程之前,保证栈顶内容为主程序返回地址,以便正确返回主程序。序返回地址,以便正确返回主程序。47(10)中断返回指令 RETIRETI;32H32HCPUCPUCPUCPU响应中断后执行的中断服务程序也存在返回主程响应中断后执行的中断服务程序也存在返回主程响应中断后执行的中断服务程序也存在返回主程响应中断后执行的中断服务程序也存在返回主程序的问题,在中断服务程序中用序的问题,在中断服务程序中用序的问题,在中断服务程序中用序的问题,在中断服务程序中用RETIRETIRETIRETI返回主程序。返回主程序。返回主程序。返回主程序。RETIRETIRETIRETI也具有恢复断点的功能,与也具有恢复断点的功能,与也具有恢复断点的功能,与也具有恢复断点的功能,与RETRETRETRET类似,除此之外,类似,除此之外,类似,除此之外,类似,除此之外,它还会清除它还会清除它还会清除它还会清除“优先级激活优先级激活优先级激活优先级激活”触发器,以重新开放同触发器,以重新开放同触发器,以重新开放同触发器,以重新开放同级或低级的中断申请。级或低级的中断申请。级或低级的中断申请。级或低级的中断申请。注意:注意:注意:注意:在调用子程序和执行中断服务程序时都需要在调用子程序和执行中断服务程序时都需要在调用子程序和执行中断服务程序时都需要在调用子程序和执行中断服务程序时都需要用到堆栈,单片机上电复位后,用到堆栈,单片机上电复位后,用到堆栈,单片机上电复位后,用到堆栈,单片机上电复位后,SP=07HSP=07HSP=07HSP=07H,堆栈区域堆栈区域堆栈区域堆栈区域与工作寄存器区重叠,应注意修改堆栈指针。与工作寄存器区重叠,应注意修改堆栈指针。与工作寄存器区重叠,应注意修改堆栈指针。与工作寄存器区重叠,应注意修改堆栈指针。48MCS51系列单片机指令系统分类系列单片机指令系统分类 按寻址方式分为以下七种:按寻址方式分为以下七种:按功能分为以下五种:按功能分为以下五种:1 1、立即寻址、立即寻址 1 1、数据传送指令、数据传送指令2 2、直接寻址、直接寻址 2 2、算术运算指令、算术运算指令3 3、寄存器寻址、寄存器寻址 3 3、逻辑运算指令、逻辑运算指令4 4、寄存器间接寻址指令、寄存器间接寻址指令 4 4、控制转移类指令、控制转移类指令5 5、相对寻址、相对寻址 5 5 5 5、位操作指令、位操作指令、位操作指令、位操作指令6 6、变址寻址、变址寻址7 7、位寻址、位寻址49六、布尔操作类指令(位操作)六、布尔操作类指令(位操作)n n5151单片机的硬件结构中有单片机的硬件结构中有1 1个位处理机个位处理机(又称(又称布尔处理机布尔处理机),并设有一个执行位),并设有一个执行位操作的指令集,包括操作的指令集,包括位传送、位逻辑运算、位传送、位逻辑运算、位转移位转移等几类指令,使单片机很适宜于位等几类指令,使单片机很适宜于位处理任务重、逻辑运算多的场合。处理任务重、逻辑运算多的场合。n n位操作指令位操作指令是以位地址与进位位是以位地址与进位位C C为操作为操作数。单片机中可进行寻址的有片内数。单片机中可进行寻址的有片内RAM20HRAM20H2FH2FH中连续的中连续的128128位及位及SFRSFR中的可寻址位。中的可寻址位。位操作指令共位操作指令共1717条,如下表所示:条,如下表所示:505152位操作指令中的位地址有位操作指令中的位地址有四四种种表示形式表示形式假设表示的都是假设表示的都是PSWPSW中的位中的位5 5,则这四种表示方,则这四种表示方式如下:式如下:直接地址方式(如,0D5H);点操作符方式(如,0D0H.5、PSW.5等);位名称方式(如,F0);伪指令定义方式(如,MYFLAG BIT F0)。53伪指令定义方式应用举例:伪指令定义方式应用举例:在交通灯控制程序中,我们把在交通灯控制程序中,我们把P1.0定义为定义为LEFT,把,把P1.1定义位定义位RIGHT,分别代表左转和右转信号灯,编程如,分别代表左转和右转信号灯,编程如下:下:LEFT BIT P1.0 RIGHT BIT P1.1 ORG 0100H SETB LEFT ;左转;左转 LCALL WAIT30S;等待;等待30秒秒 CLR LEFT SETB RIGHT ;右转;右转可见这种方法编写的程序可读性较强。可见这种方法编写的程序可读性较强。54【例例3-17】编程统计片内编程统计片内RAM 30H开始的开始的20个带符号数中负数个带符号数中负数的个数,结果存入的个数,结果存入50H单元。单元。程序如下:MOV R2,#20 ;置循环次数放R2 MOV R3,#0 ;计数初值 MOV R0,#30H;首单元地址放R0 LOOP:MOV A,R0 ;取数至A JNB ACC.7,L1 ;最高位为0表示是非负数则转L1,不统计 ;注意这里判别累加器A的最高位使用的是ACC.7 INC R3 ;否则,最高位为1表示是负数,则统计,R3R3+1 L1:INC R0 DJNZ R2,LOOP;R2R2-1 若R20继续循环 MOV 50H,R3 RET 55【例例3-183-18】利用位逻辑指令,模拟下图所示的逻辑电路功能。程序如下:程序如下:PR2:MOV C,P1.1 ;(CY)(P1.1)ORL C,P1.2 ;(CY)(P1.1)V(P1.2),得出A点逻辑状态 ANL C,P1.0 ;(CY)(P1.0)A点状态 CPL C ;取反,得出B点逻辑状态 MOV F0,C ;F0内暂存B点状态 MOV C,P1.3 ;(CY)(P1.3)ANL C,P1.4 ;(CY)(P1.3)(P1.4)CPL C ;取反,得出C点逻辑状态 ORL C,F0 ;B点状态与C点状态进行逻辑或 MOV P1.5,C ;运算结果送入P1.5 RET56补补 码码正数的补码正数的补码:与原码相同。例:+9的补码是00001001。(备注:这个+9的补码说的是用8位的2进制来表示补码的。)负数的补码:负数的补码:负数的补码等于其绝对值的原码各位取反,然后整个数加1的数值。例:-7的补码。因为给定数是负数,则符号位为“1”。后七位:-7的原码(10000111)按位取反(11111000)(负数符号位不变)加1(11111001)所以-7的补码是11111001。数数0 0的补码:的补码:表示是唯一的+0的补码=+0的反码=+0的原码=00000000-0的补码=11111111+1=0000000057补码补码已知一个数的补码,求原码的操作分两种情况已知一个数的补码,求原码的操作分两种情况:如果补码的符号位为符号位为“0 0”,表示是一个正数,其原码就是补码。如果补码的符号位为符号位为“1 1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。例:已知一个补码为11111001,则原码是10000111(-7)。因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”。其余七位1111001取反后为0000110;再加1,所以是10000111。58【例例3-193-19】设X存在30H单元中并以补码形式表示,根据下式 X+2,X0 Y=100,X=0 ;求出Y值,将Y值存入31H单元。X,X0 SGN(X)=0 当当 X=0 SGN(X)=-1 当当 X082b按分支号转移按分支号转移如:分支号如:分支号=0,程序转移到,程序转移到ADDR0处;当分支号处;当分支号=1,程序转移到,程序转移到ADDR1处;处;。(1)用地址表法。设分支号已存入用地址表法。设分支号已存入A。MTJS:MOV DPTR,#TAB ;取表首地址取表首地址 CLR C RLC A ;分支号分支号2 MOV R2,A MOVC A,A+DPTR;取分支地址低位取分支地址低位 PUSH ACC ;入栈保存入栈保存 MOV A,R2 INC A MOVC A,A+DPTR;取分支地址高位取分支地址高位 PUSH ACC ;入栈保存入栈保存 RET ;分支地址分支地址PC,转移转移TAB:DW ADDR0 ;分支地址表分支地址表DW ADDR1 ADDR0:;程序段程序段0 A=?0处理一处理二处理1n83、循环结构、循环结构 循环程序结构是汇编语言程序中常见的一种程序结构。所谓循环,就是让计算机反复执行某一段程序。使用循环程序可以省略很多类似的代码,提高程序的代码密度。循环程序主要包含以下三个方面:循环程序主要包含以下三个方面:(1 1)循环初始化。)循环初始化。设置循环的初始状态,如工作单元的清零,循环次数的设置等。在设置初始条件时要小心,否则很容易让程序多执行(或少执行)一次。()循环体,()循环体,即循环程序的主体,是要求计算机重复执行的部分。这部分程序应该特别注意精简,因为要重复多次,所以这部分的精简程度决定了整个循环程序的执行效率。()循环控制。()循环控制。包括对循环计数器的修改和循环结束条件的判断等内容。86 循环程序按结构形式,有单重循环单重循环与多重循环多重循环,所谓的多重循环是指循环体内又有循环多重循环是指循环体内又有循环。在多重循环中,只允许外重循环嵌套内重循环。不允许循环相互交叉,也不允许从循环程序的外部跳入循环程序的内部,如下图所示:87【例例】把内部RAM中从ST1地址开始存放的数据传送到以ST2开始的存储区中,数据块长度未知,但已知数据块的最后一个字节内容为00H,而其它字节均不为0。并设源地址与目的地址空间不重叠。分析:显然,我们可以利用判断每次传送的内容是否为 0 这一条件来控制循环。利用判A转移控制的循环流程图如下图所示。参考程序如下:参考程序如下:START:MOV R0,#ST1 MOV R1,#ST2 LOOP:MOV A,R0 JZ ENT MOV R1,A INC R0 INC R1 SJMP LOOP ENT:RET 884、子程序、子程序能完成某项特定功能的独立程序段,可被反复调用。能完成某项特定功能的独立程序段,可被反复调用。子程序设计子程序设计一子程序入口用标号作为子程序名。一子程序入口用标号作为子程序名。二调用子程序之前设置好堆栈。二调用子程序之前设置好堆栈。三三用用返返回回指指令令RETRET结结束束子子程程序序,并并保保 证堆栈栈顶为调用程序的返回地址。证堆栈栈顶为调用程序的返回地址。四四.子程序嵌套须考虑堆栈容量。子程序嵌套须考虑堆栈容量。五五.提供足够的调用信息提供足够的调用信息:如如:子子程程序序名名、子子程程序序功功能能、入入口口参参数数和和出出口口参参数数、子子程程序序占占用用的的硬硬件件资资源、子程序中调用的其他子程序名。源、子程序中调用的其他子程序名。89MCS-51汇编语言的程序综合性设计实例汇编语言的程序综合性设计实例【例例】利用MCS-51仿真实验板,外部扩展四个双色发光二极管HL1、HL2、HL3和HL4分别模拟北(HL1)、西(HL2)、东(HL3)、南(HL4)四个方向交通灯,连接电路如下图所示:90分析:分析:双色发光二极管有一个阴极,两个阳极G和R,当G极为高电平时,发光二极管呈现绿色,当R极为高电平时,发光二极管呈现红色,当G和R极都为高电