单片机学习第三章_第1页
单片机学习第三章_第2页
单片机学习第三章_第3页
单片机学习第三章_第4页
单片机学习第三章_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

1,第三章:指令系统,本讲重点:寻址方式;MCS-51指令集;,2,3.1指令系统概述,51系列单片机指令集含有111条指令,每条指令在执行时要花去一定的时间,以机器周期为单位。按指令执行时间分类:单周期(64条);双周期(45条);4周期(2条),按指令的功能分类,可分为5大类:数据传送类(29条);算术运算类(24条)逻辑运算及移位类(24);控制转移类(17条)位操作类(17条),每条指令在程序存储器ROM中占据一定的空间,以字节为单位。按指令所占字节数分类:单字节(49条);双字节(46条);3字节(16条),3,3.2ASM-51指令的格式,方括符表示可选项标号代表指令所在地址,1-8个字母/数字,“:”结尾操作码就是指令功能助记符,指令实体目的操作数源操作数注释,以“;”开头,标号:操作码目的操作数,源操作数;注释,4,3.351单片机指令的寻址方式,寄存器寻址立即寻址寄存器间接寻址直接寻址变址寻址(基址寄存器+变址寄存器间接寻址)相对寻址位寻址,寻址方式:指令按地址获得操作数的方式七种寻址方式,一条指令可能含多种寻址方式,5,寄存器寻址从寄存器中读取操作数或存放操作数进寄存器例:MOVA,B;(A)(B)MOV30H,R0;(30H)(R0)MOVA,R1;(A)(R1),寻址范围:(1)4组通用工作寄存器区共32个工作寄存器;R0-R7(2)部分特殊功能寄存器,6,立即寻址操作数直接就出现在指令中例:MOVA,#64H;(A)立即数64HADDA,#05H;(A)(A)+立即数05H注意:符号“#”表明其后跟的是立即数,立即数就是数字量本身。,7,寄存器间接寻址寄存器中的内容是一个地址,由该地址单元寻址到所需的操作数,注意:1)“间接”表示某寄存器中的“内容”只是一个“单元地址”,这个地址单元中存放的数据才是要找的“操作数”。2)符号“”表示“在”,其含义与读音皆同“at”。,例:MOVR1,#30H;(R1)立即数30H,MOVR1,#30H;(R1)立即数30HMOVR1,#0FH;(30H)立即数0FHMOVA,R1;(A)(30H)=#0FH,8,直接寻址指令中直接给出了操作数所在单元的地址或名称例:MOVR1,1FH;(R1)(1FH)MOV30H,4AH;(30H)(4AH),在本单片机中规定:访问特殊功能寄存器SFR只能采用直接寻址方式。例如:MOVA,SP;(A)(SP)MOVA,81H;(A)(SP)MOVP1,#5AH;(P1)(#5AH)MOV90H,#5AH;(P1)(#5AH)MOVB,30H;(B)(30H),相同,相同,9,在本单片机中访问特殊功能寄存器SFR只能采用直接寻址方式的原因:SFR分布在80H0FFH范围内,而52系列单片机有256字节的片内RAM,其中的80H0FFH的RAM与SFR所占地址重叠。,MOVA,90H等效于MOVA,P1属直接寻址MOVA,R0;事先已知(R0)=#90H执行的操作:A(90H)属寄存器间接寻址,随意写的指令如:MOVA,85H则是非法的!,于是规定:80H0FFH范围内的RAM只能用寄存器间接寻址方式,而SFR只能用直接寻址方式。从而解决了地址冲突的问题。例如:,10,存储器配置(片内RAM),89C51片内RAM128字节(00H7FH)89C52片内RAM256字节(00H0FFH),00H,20H,2FH,7FH,1FH,30H,80H,FFH,52子系列才有的RAM区,普通RAM区,位寻址区,工作寄存器区,SFR分布在80H-FFH其中92个位可位寻址,80H,FFH,89C51128字节,89C52256字节,只能直接寻址,只能寄存器间接寻址,11,变址寻址也称为:基址寄存器+变址寄存器间接寻址,以16位的地址指针寄存器DPTR或16位的PC寄存器为基址寄存器,以累加器A为变址寄存器,两者中的“内容”形成一个16位的“地址”,该“地址”所指的存储单元中的内容才是操作数。,例:设:A中已存有#A4H,DPTR中已存有#1234HMOVCA,A+DPTR;(A)(A)+(DPTR)操作:将A4H+1234H=12D8H单元中的数放进累加器A,12,相对寻址当前PC值加上指令中规定的偏移量rel,构成实际的操作数地址例:SJMPrel操作:跳转到的目的地址=当前16位PC值+rel,注意:1)“当前PC值”指程序中下一条指令所在的首地址,是一个16位数;2)符号“rel”表示“偏移量”,是一个带符号的单字节数,范围是:-128+127(80H7FH),在实际编程中,“rel”通常用标号代替,13,位寻址指令中直接给出了操作数所在的位地址。例:CLRP1.0;(P1.0)0SETBACC.7;(ACC.7)1CPLC;(C)NOT(C),注意:1)位地址里的数据只可能是一个0或12)有的位地址十分明确,如P1.0,ACC.7等,有的位地址则“不太明确”,如:MOVA,17H;(A)(17H),17H是字节地址MOVACC.0,17H;(ACC.0)(17H),这里ACC.0是位地址所以该指令中的17H是22H单元的第7位,14,片内RAM中有128个位可按位寻址的位,位地址:00H7FH分布在:20H2FH单元;另外,在SFR中还有92个位可按位寻址,00H,20H,2FH,7FH,1FH,30H,80H,FFH,52子系列才有的RAM区,普通RAM区,位寻址区,工作寄存器区,27H,22H,21H,20H,26H,24H,25H,23H,28H,0706050403020100,0F0E0D0C0B0A0908,1716151413121110,1F1E1D1C1B1A1918,2726252423222120,2F2E2D2C2B2A2928,3736353433323130,3F3E3D3C3B3A3938,4746454443424140,2FH,7F7E7D7C7B7A7978,位地址,总共128个可按位寻址的位,单元地址,D7D6D5D4D3D2D1D0,15,3.4MCS-51指令集,功能分五类,共111条指令,16,MCS-51指令集(五大类功能),数据传送类指令:(29条)算术运算类指令:(24条)逻辑运算及移位类指令:(24条)控制转移类指令:(17条)位操作(布尔操作)类指令:(17条),17,内部存储器间传送:(MOV16条)外部数据存储器与累加器间传送:(MOVX4条)程序存储器向累加器传送:(MOVC2条)数据交换:(XCH,XCHD,SWAP5条)堆栈操作:(PUSH,POP2条),(一)数据传送类指令(5种/29条),18,Acc累加器,Direct直接寻址,Ri间接寻址,Rn寄存器,#data立即数,Rn:R0R7Ri:R0,R1#data:8位立即数#data16:16位立即数direct:直接地址rel:8位带符号偏移量,(一)数据传送类指令(5种/29条),内部存储器间传送指令(16条):MOV类指令的操作方向总是后面的操作数指向前面的操作数!例:MOVA,30H(A)(30H),19,数据传送类指令(续),外部数据存储器与累加器间传送(4条):MOVX类指令可在累加器与以DPTR或Ri所代表的外部RAM之间进行数据传送。,例如:MOVXA,DPTR(A)(DPTR)MOVXA,Ri(A)(Ri)MOVXDPTR,A(DPTR)(A)MOVXRi,A(Ri)(A),20,程序存储器向累加器传送指令(2条):MOVCA,A+DPTRMOVCA,A+PC通常称为查表指令,寻址方式属:“基址寄存器+变址寄存器间接寻址”,数据传送类指令(续),A+DPTR或A+PC指向程序存储器中的某单元。拟传送给累加器ACC的数据就是程序中事先写进去的表格数据。这些表格数据往往用伪指令DB,DW等定义在程序中。,21,数据传送类指令(续),数据交换指令(5条):XCHA,direct(字节互换)XCHA,Ri(字节互换)XCHA,Rn(字节互换)(A)(direct)或(Ri),或(Rn),XCHDA,Ri累加器Acc的低4位与(Ri)的低4位互换,各自的高4位不变,SWAPA累加器Acc的低4位与自身的高4位互换,22,堆栈操作指令(2条):,PUSH入栈指令,POP出栈指令,堆栈区由特殊功能寄存器堆栈指针SP管理堆栈区可以安排在RAM区任意位置,一般不安排在工作寄存器区和可按位寻址的RAM区,而是放在RAM区的靠后的位置堆栈总是指向栈顶通常PUSH与POP两条指令成对使用,数据传送类指令(续),23,例如:设(A)=7BH;(35H)=11H并且知道(SP)60HPUSHACC;(61H)#7BHPUSH35H;(62H)(35H)即:(62H)#11H,POPACC;(A)(62H)即:(A)#11HPOP5AH;(5AH)(61H)即:(5AH)#7BH,24,(二)算术运算类指令(6种/24条),加法运算:(ADD4条)带进位加法运算:(ADDC4条)带借位减法运算:(SUBB4条)加1/减1操作:(INC,DEC9条)单字节乘/除法运算:(MUL,DIV2条)十进制调整:(DAA1条),25,(二)算术运算类指令(续),加法运算:(ADD4条)带进位加法运算:(ADDC4条)带借位减法运算:(SUBB4条),所有的加法(ADD)、带进位加法(ADDC)、带借位减法(SUBB)运算都是以A为一个加数或被减数,最终结果也存进A。,加法(ADD)、带进位加法(ADDC)以及带借位减法(SUBB)运算中,如果产生了进位或借位,将自动对PSW中的Cy标志位置“1”。,带进位加法(ADDC):(A)(A)+(Cy)+(第二操作数)带借位减法(SUBB):(A)(A)-(Cy)-(第二操作数),26,(二)算术运算类指令(续),加法运算:(ADD4条)ADDA,Rn;(A)+(Rn)A,n=0-7ADDA,direct;(A)+(direct)AADDA,Ri;(A)+(Ri)A,i=0,1ADDA,#data;(A)+#dataA带进位加法运算:(ADDC4条)带借位减法运算:(SUBB4条),27,(二)算术运算类指令(续),加1/减1操作:(INC,DEC9条)INC,DEC与用加/减法指令做加1/减1操作不同之处在于INC、DEC不影响标志位.,INCA;A(A)+1INCRn;Rn(A)+1INCdirect;direct(direct)+1INCRi;(Ri)(Ri)+1INCDPTR;DPTR(DPTR)+1,对标志位不产生影响若:(A)0FFH,(Cy)=0执行:INCA结果:(A)00H,(Cy)=0,28,减1类指令共4条,其功能是将操作数指定单元内容减1。DECA;A-1A,A中内容减1DECRn;Rn-1Rn,Rn中内容减1DECdirect;(direct)-1(direct),直接地址中内容减1DECRi;(Ri)-1(Ri),Ri间址中的内容减1,29,(二)算术运算类指令(续),单字节乘/除运算:(MUL,DIV2条)两个单字节数的乘/除法运算只在A与B之间进行。MULAB:(A)与(B)相乘,积为16位数,(A)积的高8位;(B)积的低8位DIVAB:(A)除以(B),结果用2字节表示,(A)商的整数部分;(B)余数,30,(二)算术运算类指令(续),BCD码是指“用二进制表达的十进制数”。如:十进制数20可以用二进制数00010100B表示;也可以用十六进制数14H表示;还可以用BCD码00100000B或20H表示。,4个二进制位就可以表示一位BCD码:00001001可表示十进制数(BCD数)09;8个二进制位就可以表示两位压缩的BCD码:0000000010011001表示0099。,十进制调整:(DAA1条)用于两个BCD码之间的相加,这条指令只能跟在ADD或ADDC之后,31,若(A)309或(AC)=1则(A)30(A)306;若(A)749或(CY)=1则(A)74(A)746;,例:两个十进制数“65”与“58”相加,根据常识,显然其和应当为“123”。,MOVA,#65HADDA,#58HDAA结果:(A)=23H(CY)=1,指令“DAA”完成的操作:,65011001015801011000,+,1,3,18,19,2,6601100110,32,若(A)309或(AC)=1则(A)30(A)306;若(A)749或(CY)=1则(A)74(A)746;,又如:两个十进制数“39”与“58”相加,根据常识,显然其和应当为“97”。,MOVA,#39HADDA,#58HDAA结果:(A)=97H(CY)=0,39001110015801011000,+,0,7,23,9,60110,指令“DAA”完成的操作:,33,(三)逻辑运算及移位类指令(5种/24条),逻辑与运算:(ANL6条)逻辑或运算:(ORL6条)逻辑异或运算:(XRL6条)累加器清零/取反:(CLR,CPL2条)累加器移位操作:(RL,RLC,RR,RRC4条),34,逻辑运算及移位类指令(续),逻辑与(ANL),逻辑或(ORL),逻辑异或(XRL):,累加器清零/取反操作(CLR,CPL2条),CLRA对累加器清零1Byte1个TmCPLA对累加器按位取非1Byte1个Tm,35,逻辑运算指令的常见用法,逻辑与ANL用于清0或者保留某些位:例:ANLA,#0FH;则(A)=0AH,(已知累加器A中已存有数:9AH),逻辑或ORL用于置1或者保留某些位:例:ORLA,#0FH;则(A)=9FH,逻辑异或XRL用于取反或者保留某些位:例:XRLA,#0FH;则(A)=95H(A)10011010#0FH0000111195H10010101,36,逻辑运算及移位类指令(续),累加器移位操作:(RL,RLC,RR,RRC4条),RLA左环移,累加器A,累加器A,Cy,累加器A,Cy,累加器A,RRCA带进位位右环移,RRA右环移,RLCA带进位位左环移,37,(四)控制转移类指令(4种/17条),此类指令改变程序的执行顺序改变当前PC值,无条件转移:(LJMP,AJMP,SJMP,JMP4条),条件转移(判断跳转):(JZ,JNZ,CJNE,DJNZ8条),子程序调用及返回:(LCALL,ACALL,RET,RETI4条),空操作:(NOP1条)“耗时”一个机器周期。,38,控制转移类指令(续),无条件转移:LJMP,AJMP,SJMP,JMP4条,LJMPaddr16长跳转指令可在64K范围内跳转,AJMPaddr11绝对跳转指令可在指令所在的2K范围内跳转,SJMPrel相对跳转指令可在当前PC-128与+127范围内跳转,JMPA+DPTR间接长跳转指令可在以DPTR为基址+A为偏移量之和所指向的64K程序范围内跳转,39,条件转移:JZ,JNZ,CJNE,DJNZ8条,JZrelJNZrel根据Acc的内容是否为0决定是否跳转,DJNZdirect,relDJNZRn,rel将direct(或Rn)里的内容减1,结果不等于0就跳转;等于0则不跳转继续往下走。,40,条件转移(续),CJNEA,#data,relCJNEA,direct,relCJNERi,#data,relCJNERn,#data,rel将A(或Ri,或Rn)与#data(或direct)相比较,其值不相等就跳转;相等则不跳转,继续往下走。,41,控制转移类指令(续),LCALLaddr16子程序长调用指令可在64K范围内调用子程序,子程序调用及返回:(LCALL,ACALL,RET,RETI4条),ACALLaddr11子程序绝对调用指令可在指令所在的2K范围内调用子程序,RET子程序返回指令子程序结束并返回调用的下一条指令,RETI中断服务子程序返回指令中断结束/返回被打断处的下一条指令,42,(五)位操作类指令(17条),位操作类指令以位为单位进行逻辑运算及操作,可分为4种:,位传送:(MOV2条),位清零/置位:(CLR,SETB4条),位逻辑与/或/非运算:(ANL,ORL,CPL6条),位条件转移:(JC,JNC,JB,JNB,JBC5条),43,位传送指令(2条):MOVC,bit(C)(bit)MOVbit,C(bit)(C)注:bit表示位地址,位清零/置位指令(4条):CLRbit(或C)(bit或C)“0”SETBbit(或C)(bit或C)“1”,位逻辑与/或/非指令(6条):ANLC,bit(或/bit)ORLC,bit(或/bit)CPLbit(或C)注:“/bit”表示对bit位先取反然后再参加运算,44,判位条件转移指令(5条):,JCrel(Cy)=“1”就跳转;否则不跳转,JNCrel(Cy)“1”就跳转;否则不跳转,JBbit,rel(bit)=“1”就跳转;否则不跳转,JNBbit,rel(bit)“1”就跳转;否则不跳转,JBCbit,rel(bit)=“1”就先将其清零再跳转;否则,不动此位也不跳转。,45,任务一:控制一盏灯点亮,任务二:红灯周期性地亮/灭,JOB3:CLRP1.1;P1.1清“0”,亮绿灯REDO:SETBP1.3;将P1.3置“1”CHECK:JNBP1.3,CHECK;检测传感器是否被阻断LOOP:;有入侵者,报警!AJMPREDO;再跳回去检测,JOB1:CLRP1.0;P1.0清“0”,亮红灯HERE:AJMPHERE;原地等待,不做别的事,JOB2:CPLP1.0;对P1.0取反:红灯亮/灭ACALLDELAY;延时1秒AJMPJOB2;重复,任务三:红外防盗报警,前面的简单测控实例中的程序:,位操作指令,46,任务一:控制一盏灯点亮,任务二:红灯周期性地亮/灭,JOB3:CLRP1.1;P1.1清“0”,亮绿灯REDO:SETBP1.3;将P1.3置“1”CHECK:JNBP1.3,CHECK;检测传感器是否被阻断LOOP:;有入侵者,报警!AJMPREDO

温馨提示

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

评论

0/150

提交评论