单片机原理及应用学习笔记(二)

2019-04-15 19:01发布

接下来这部分主要是51系列单片机指令系统的具体介绍 (3.1)数据传送类指令(28条)
通用格式:MOV <目的操作数>,<源操作数> 属于“”复制“”性质,不影响标志位 第一类:以累加器为目的的操作数 MOV A,Rn......................MOV A,R6; (R6)->A寄存器寻址。。。。。。(n=0-7) MOV A,@Ri....................MOV A,70H; (70H)->A直接寻址 MOV A,direct..................MOV A,@R0;((R0))->A间接寻址 MOV A,#data..................MOV A,#78H;78H->A立即寻址 第二类:以Rn为目的的操作数指令 MOV Rn,A MOV Rn, direct MOV Rn, #data //功能:是把源操作数的内容送入当前一组工作寄存器区的R0-R7中的某一个寄存器 第三类:以直接地址direct为目的的操作数指令 MOV direct,A MOV direct,Rn MOV direct1,direct2 MOV direct,@Ri MOV direct,#data //功能:把源操作数送入直接地址指出的存储单元。direct是指内部RAM或者SFR的地址 第四类:以寄存器间接地址为目的的操作数指令 MOV @Ri,A MOV @Ri,direct MOV @Ri,#data 第五类:16位数传送指令 MOV DPTR,#data16 (#data16->DPTR) /唯一的16位数据传送指令,立即数的高8位送入DPH,立即数的低8位送入DPL/ 第六类:堆栈操作指令
/堆栈:MCS-51内部RAM可设定一个后进先出的区域/
(1)进栈指令: PUSH direct //现将栈指针SP加一,然后把direct中内容送入到栈指针 SP的内部RAM单元中
(2)出栈指令; POP direct //SP指示的栈顶(内部RAM单元)内容送入到direct字节单元中,栈指针SP减一 第七类:累加器A与外部数据存储器传送指令 MOV A,@DPTR; MOV A,@Ri; MOV @DPTR,A; MOV @Ri,A; //功能:读取外部RAM存储起或者I/O中的一个字节,或把A中的一个字节的数据写入到外部RAM存储器或者I/O口中。(注意:RD*或者WR*信号有效) 第八类:查表指令
/用于读取程序寄存器中的数据表格的指令,均采用基址寄存器加变址寄存器间接寻址方法/ 1)MOVC A ,@A+PC (2)MOVC A ,@A+DPTR 第九类:字节交换指令 XCH A,Rn XCH A,direct XCH A,@Ri 第十类:半字节交换指令 XCHD A,@Ri /……………………………………………………………………………………………………………………………………../ (3.2)算数操作类(24条)
//单字节的加减乘除指令,都是针对8位二进制无符号数。执行结果对CyAcOV三种标志位有影响。但是增一 减一不影响上述标志位。
第一类:加法指令 (一个加数总是来自累加器A,而另一个加数可由不同的寻址方式得到。结果总是放到A中) MOV A,Rn MOV A,direct MOV A,@Ri MOV A,#data //!!注意:使用加法指令的时候,要注意累加器A中的运算对各个标志位的影响:
第一:如果位七有进位,则置“1”进位标志Cy,否则则请“0”Cy;
第二:如果位三有进位,则置“1”辅助进位标志Ac,否则清“0”(Ac为PSW中的一位);
第三:如果为6有进位,位7没有进位;或者位7有进位,位6没有进位,则溢出标志位OV置“1”否则请“0”。 第二类:带进位的加法指令 (标志位Cy参与运算,因此是三个数相加) ADDC A,Rn;.....................(A)+(Rn)+C->A ADDC A,direct;.................(A)+(direct)+C->A ADDC A,@Ri;....................(A)+(Ri)+C->A ADDC A,#data;..................(A)+#data+C->A 第三类:增1指令: INC A INC Rn INC direct INC @Ri INC DPTR //不影响PSW中的任何标志位,若变量中的内容位FFH,程序执行后变量变为00H 第四类:十进制调整指令
格式: DA A //两个压缩BCD码的数按二进制相加后,必须经过本指令的调整才能得到正确的和数(仍为压缩BCD码表示)
应用背景:
(1)该指令执行前,一般有一条加法指令
(2)加法指令中的两个加数,应该用压缩BCD码表示的十进制数,和存放在A中
(3)执行完DA指令后,A中存放的数是两个加数的十进制和,也用压缩BCD码表示 第五类:带借位的减法指令 SUBB A,Rn SUBB A,direct SUBB A,@Ri SUBB A,#data /从累加器A中的内容减去指定的变量和进位标志Cy的值,结果存在累加器A中/
//!!!!注意:
第一:如果位7需要借位则置‘1’Cy,否则清‘0’
第二:如果位3需要借位则置‘1’Ac,否则清‘0’
第三:如果位6需要借位而位7不需要借位,或者位7需要借位而位6不需要借位,则置‘1’溢出标志位OV,否则清‘0’ 第六类:减1指令 DEC A DEC Rn DEC direct DEC @Ri //减1指令不影响标志位 第七类:乘法指令 MULL AB;...................AxB->BA //如果积大于255,则置‘1’溢出标志位OV 第八类:除法指令 DIV AB;......................A/B->A(商) 余数->B //如果B的内容位‘0’(即除数为0),则存放结果的A,B中的内容不定 /………………………………………………………………………………………………………………………………………/
(3.3)逻辑运算类指令(25条)
第一类:简单逻辑操作指令 1)CLR A //功能:累加器A清0.不影响Cy、Ac、等标志位 (2)CPL A //功能:将累加器A的内容按位逻辑取反,不影响标志位 第二类:左环移指令 RL A //功能:累加器A的8位向左循环移位,位7循环移入位0,不影响标志位 第三类:带进位左环移指令 RLC A //功能:将累加器A的内容和进位标志位Cy一起向左移一位,Acc.7移入进位位Cy,Cy移入Acc.0,不影响其他标志位 第四类:右环移指令 RR A //功能:累加器A的内容向右移一位,Acc.0移入Acc.7,不影响其他标志位 第五类:带进位右环移指令 RRC A //功能:累加器A的内容和进位标志位Cy一起向右环移一位,Acc.0进入Cy,Cy移入Acc.7 第六类:累加器半字节交换指令 SWAP A //功能:将累加器A的高半字节(Acc.7-Acc.4)和低半字节(Acc.3-Acc.0)互换 第七类:逻辑与指令 ANL A,Rn...................(A)^(Rn)->A ANL A,direct ANL A,#data ANL A,@Ri;(i=0/1) ANL direct,A ANL direct,#data //运算结果存入第一操作数中,按位进行与运算 第八类:逻辑或指令 ORL A,Rn...................(A)v(Rn)->A ORL A,direct ORL A,#data ORL A,@Ri;(i=0/1) ORL direct,A ORL direct,#data //运算结果存入第一操作数中,按位进行或运算 第九类:逻辑异或指令 XRL A,Rn; XRL A,direct; XRL A,#data; XRL A,@Ri;(i=0/1); XRL direct,A; XRL direct,#data; ‘’‘
//运算结果存入第一操作数中,按位进行异或运算 /………………………………………………………………………………………………………………………………………/ (3.4)控制转移类指令(17条)
第一类:无条件转移指令
(1)绝对跳转指令 AJMP addr11 //2K字节范围内的无条件转移指令,64k程序存储器空间分为32个区,每个区2k字节 ,
转移的目标地址必须与AJMP下一条指令的地址(pc)的高五位地址码A15-A11相同。 (2)长跳转指令 LJMP addr16 //指令执行时把指令的第二个和第三个字节分别装入pc的高位和低位字节中,
无条件的跳转向addr16指出的目标地址。目标地址可以在64k程序存储器地址空间的任何位置。 (3)相对转移指令 SJMP rel //在编写程序时,直接写上要转向的目标地址标号就可以,由汇编程序自动计算和填入偏移量
跳转目标地址处于当前pc值的-128字节~+127字节之间。 (4)间接跳转指令 JMP @A+DPTR //由A中8位无符号数与DPTR的16位数内容之和来确定。以DPTR内容作为基址,A的内容作为变址,给A赋不同的值,即可实现程序的多分支转移。 第二类:条件转移指令
(1)判0跳转指令 JZ rel;............如果累加器为0,则转移 JNZ rel;..........如果累加器非0,则转移 //规定的条件满足,则进行转移,跳转到相应的标号处,跳转目的地址的要求同SJMP。条件不满足则执行下一条指令 (2)比较不相等跳转指令 CJNE A,direct,rel CJNE A,#data,rel CJNE Rn,#data,rel CJNE Ri,#data,rel //比较前两个操作数的大小,如果他们不相等则转移,转换的目的地址要求同SJMP
//如果第一操作数(无符号位整数)小于第二操作数(无符号整数),则置进位标志位Cy,否则清0 (3)减一不为0跳转指令 DJNZ Rn,rel; (n=0~7) DJNZ direct,rel //将源操作数减一,结果回送到Rn寄存器或者direct中去,如果结果不为0则转移,转移的目的地址要求同SJMP
//允许程序员把寄存器Rn或者内部RAM的direct单元用作程序循环计数器。主要用于控制程序循环。
以减一后是否为0作为转移条件,即可实现按次数控制转移循环 第三类:调用和返回指令
(1)短调用指令 ACALL addr11 //与AJMP指令相似,是为了与MCS-48中的CALL指令兼容而设立的,不建议使用 (2)长调用指令 LCALL addr16 //该指令执行时,MCS51执行如下操作:(1)当前PCL,PCH进栈(2)addr16送入PC (3)从子程序返回指令 RET //执行该指令的时候:
(SP)->PCH,然后(SP)-1->SP
(SP)->PCL,然后(SP)-1->SP
//功能:从堆栈中退出PC的高8位和低8位字节,把栈指针减2,从PC值开始执行程序 (4)中断返回指令 RETI //功能与RET相似,不同之处是本指令清楚中断响应时,被置1的MCS51内部中断优先级寄存器的优先级状态 第四类:空操作指令 NOP /………………………………………………………………………………………………………………………………………/ (3.5)位操作指令(17条)
第一类:数据传送指令 MOV C,bit MOV bit,C 第二类:位变量修改指令 CLR C; 清0Cy位 CLR bit; 清0bit位 CLR C; Cy求反 CPL bit; bit位求反 SETB C; 置1Cy SETB bit; 置1bit 第三类:位变量逻辑与指令 ANL C,bit; bit^Cy->Cy ANL C,/bit; 第四类:位变量逻辑或指令 ORL C,bit; ORL C,/bit; 第五类:条件转移类指令 JC rel; 如果进位位Cy=1,则转移 JNC rel; 如果进位位Cy=0,则转移 JB bit,rel; 如果直接寻址位=1,则转移 JNB bit,rel;如果直接寻址位=0,则转移 JBC bit,rel;如果直接寻址位=1,则转移,并清0直接寻址位 (持续更新中!!!)