1、单片机技术及应用基于汇编及C51程序设计,第3章 51单片机指令系统及汇编程序设计,主 要 章 节,3.1 指令系统概述3.2 51单片机的寻址方式3.3 51单片机的指令系统3.4 51单片机汇编程序设计概述3.5 51单片机常用汇编程序设计,2018/7/6,2,1,3.1 指令系统概述,一、51单片机汇编指令格式标号: 操作码 操作数1,操作数2 ;注释(1)操作码指明指令的功能(2)操作数给指令操作提供数据、数据的地址或指令的地址(3)标号是指令的符号地址,后面需带冒号(4)注释是对指令的解释,前面需带分号,2018/7/6,3,1,3.1 指令系统概述,二、51单片机汇编指令常用符号
2、(1)Ri和Rn (2)#data(3)#data16(4)rel(5)addr16和addr11(6)direct(7)bit(8)(X)(9)/ 和符号,2018/7/6,4,1,3.2 51单片机的寻址方式,一、立即寻址操作数是常数,直接在指令中给出常数以“#”符号作前缀例如: MOV A,#30H,2018/7/6,5,1,3.2 51单片机的寻址方式,二、寄存器寻址操作数存放在寄存器中指令中直接给出寄存器名称寄存器:八个通用寄存器R0R7、累加器A、寄存器B和数据指针寄存器DPTR(DPH和DPL)例如: MOV A,R1,2018/7/6,6,1,3.2 51单片机的寻址方式,三、
3、直接寻址操作数存放在存储单元中指令中直接提供存储单元的地址访问对象:片内数据存储器和特殊功能寄存器。例如: MOV A,30H,2018/7/6,7,1,3.2 51单片机的寻址方式,四、寄存器间接寻址操作数存放在存储单元中,存储单元的地址又存放在寄存器中指令中通过相应的寄存器来提供的存储单元的地址间接寻址用到的寄存器:通用寄存器R0、R1和数据指针寄存器DPTR。访问的对象为:片内数据存储器和片外数据存储器片内数据存储器:用R0和R1作指针 (MOV)片内数据存储器:用R0和R1访问低端的256字节;(MOVX)用DPTR访问整个64K;,2018/7/6,8,1,3.2 51单片机的寻址方
4、式,访问形式:寄存器名例如:1)MOV R1,#30H MOV A,R12)MOV DPTR,#2000HMOV A,DPTR,2018/7/6,9,1,3.2 51单片机的寻址方式,五、变址寻址操作数存放在存储单元中操作数的地址由指令中提供的基址寄存器和变址寄存器中的内容相加得到基址寄存器是:数据指针寄存器DPTR和程序计数器PC;变址寄存器:累加器A访问的对象只能是程序存储器(MOVC)格式只有两种:MOVC A, A+DPTRMOVC A, A+PC,2018/7/6,10,1,3.2 51单片机的寻址方式,六、指令寻址操作对象是地址1. 绝对寻址直接提供目的位置的地址或地址的一部分2.
5、 相对寻址以当前程序计数器PC值加上指令中给出的偏移量rel得到目的位置的地址(1)当前PC值是指转移指令执行时的PC值,它等于转移指令的地址加上转移指令的字节数。(2)偏移量rel是8位有符号数,以补码表示,它的取值范围为-128+127。 相对寻址的目的地址为:目的地址=当前PC+rel=转移指令的地址+转移指令的字节数+rel,2018/7/6,11,1,3.2 51单片机的寻址方式,七、位寻址位处理操作位的寻址方式位地址的表示:(1)直接位地址(00H0FFH)。例如:20H。(2)字节地址带位号。例如:20H.2表示20H单元的2位。(3)特殊功能寄存器名带位号。例如:P0.1表示P
6、0口的1位。(4)位符号地址。例如:TR0是定时/计数器T0的启动位。,2018/7/6,12,1,3.3 51单片机的指令系统,3.3.1 数据传送类指令 三组:普通传送指令、数据交换指令、堆栈操作指令。用到的助记符有:MOV、MOVX、MOVC、XCH、XCHD、PUSH、POP和SWAP。1. 普通数据传送指令 1)片内数据存储器传送指令MOV 指令格式:MOV 目的操作数,源操作数,2018/7/6,13,1,1. 普通数据传送指令,1)片内数据存储器传送指令MOV,2018/7/6,14,1,总共16条注意:,MOV A,A指令没有意义源操作数和目的操作数中的Rn和Ri不能相互配对,
7、1. 普通数据传送指令,2) 片外数据存储器传送指令MOVX 四条,格式:MOVX A,DPTR;A (DPTR)MOVX DPTR,A;(DPTR) AMOVX A,Ri;A (Ri)MOVX Ri,A;(Ri) A,2018/7/6,15,1,1. 普通数据传送指令,3) 程序存储器传送指令MOVC两条:一条是用DPTR基址变址寻址,一条是用PC基址变址寻址。格式如下:MOVC A, A+DPTR ;A (A+DPTR)MOVC A, A+PC ;A (A+PC),2018/7/6,16,1,2. 数据交换指令,有3个助记符XCH、XCHD和SWAP,5条指令,格式如下:XCH A,Rn
8、;A RnXCH A ,direct;A(direct)XCH A, Ri;A(Ri)XCHD A, Ri;A03(Ri)03SWAP A ;A03A47,2018/7/6,17,1,3. 堆栈操作指令,堆栈操作有两种: “入栈”,助记符PUSH; “出栈”, 助记符POP;格式如下: PUSH direct ;SPSP+1, (SP) (direct) POP direct ;(direct)(SP), SP SP-1,2018/7/6,18,1,3.3.2 算术运算类指令,1. 加法指令1)一般的加法指令ADD四条,格式如下:ADD A,Rn;A A + RnADD A,direct;A
9、A +(direct)ADD A,Ri;A A +(Ri)ADD A,#data;A A + #data,2018/7/6,19,1,1. 加法指令,2) 带进位加法指令ADDC四条,格式如下:ADDC A,Rn;A A + Rn + CADDC A,direct;A A +(direct)+ CADDC A,Ri;A A +(Ri)+ CADDC A,#data;A A + #data + C,2018/7/6,20,1,1. 加法指令,3) 加1指令INC5条,格式如下:INC A;A A + 1INC Rn;Rn Rn + 1INC direct;(direct) (direct)+ 1
10、INC Ri;(Ri)(Ri)+ 1INC DPTR;DPTR DPTR + 1,2018/7/6,21,1,2. 减法指令,1) 带借位减法指令SUBB四条,格式如下:SUBB A,Rn;A A - Rn - CSUBB A,direct;A A -(direct)- CSUBB A,Ri;A A -(Ri)- CSUBB A,#data;A A - #data - C,2018/7/6,22,1,2. 减法指令,2) 减1指令DEC四条,格式如下:DEC A;A A - 1DEC Rn;Rn Rn - 1DEC direct;direct (direct)- 1DEC Ri;(Ri)(Ri
11、)- 1,2018/7/6,23,1,3.3.2 算术运算类指令,乘法指令MUL:(无符号数) MUL AB ;AB B A CY复位。对于OV:当积大于255时,OV为1;否则,OV为0 除法指令DIV :(无符号数) DIV AB ;AB 商放A,余数放B 一般情况下CY和OV都清0,只有当B寄存器中的除数为0时,CY和OV才被置1,2018/7/6,24,1,3.3.2 算术运算类指令,5) 十进制调整指令 十进制调整指令只有一条: DA A 调整过程为:(1)若累加器A的低四位为十六进制的AF或辅助进位标志AC为1,则累加器A中的内容做加06H调整。(2)若累加器A的高四位为十六进制的
12、AF或进位标志CY为1,则累加器A中的内容做加60H调整。,2018/7/6,25,1,3.3.3 逻辑操作指令,1. 逻辑与指令ANLANL A,Rn ;A A RnANL A,direct ; A A (direct)ANL A,Ri ; A A (Ri)ANL A,#data ;A A dataANL direct,A ;(direct) (direct) AANL direct,#data ;(direct) (direct) data,2018/7/6,26,1,3.3.3 逻辑操作指令,2. 逻辑或指令ORLORL A,Rn ;A A RnORL A,direct ;A A (di
13、rect)ORL A,Ri ;A A (Ri)ORL A,#data ;A A dataORL direct,A ;(direct) (direct) AORL direct,#data ;(direct) (direct) data,2018/7/6,27,1,3.3.3 逻辑操作指令,3. 逻辑异或指令XRLXRL A,Rn ;A A RnXRL A,direct ;A A (direct)XRL A,Ri ;A A (Ri)XRL A,#data ;A A dataXRL direct,A ;(direct) (direct) AXRL direct,#data ;(direct) (d
14、irect) data,2018/7/6,28,1,4. 清零和求反指令(1)清零指令:CLR A ;A 0(2)求反指令:CPL A ;A,2018/7/6,29,1,5. 循环移位指令,(1)累加器A循环左移RL: RL A(2)累加器A循环右移RR: RR A(3)带进位的循环左移RLC: RLC A(4)带进位的循环右移RRC: RRC A,2018/7/6,30,1,3.3.4 控制转移指令,1. 无条件转移指令1)无条件长转移指令LJMP指令格式: LJMP addr16;PC PC + 2;PC addr16可以转移到程序存储器64KB空间的任意位置缺点是:执行时间长,字节数多。
15、2)无条件绝对转移指令AJMP指令格式: AJMP addr11;PC100 addr11 当前位置2KB范围以内转移,2018/7/6,31,1,1. 无条件转移指令,3) 无条件相对转移指令SJMP指令格式: SJMP rel;PC PC + 2;PC PC + rel转移范围为-128+127HERE:SJMP HERE 或SJMP $4)无条件散转指令JMP指令格式: JMP A+DPTR;PC A + DPTR,2018/7/6,32,1,2. 条件转移指令,1)累加器A判零条件转移指令判0指令JZ:JZ rel ; PC PC + 2; 若 A = 0,则PC PC + rel;否
16、则,顺次执行下一条指令判非0指令JNZ:JNZ rel ; PC PC + 2;若 A 0,则PC PC + rel;否则,顺次执行下一条指令,2018/7/6,33,1,2)比较转移指令CJNE,有四条,格式如下:CJNE A,#data,rel ; PC PC + 3; 若 A data,则C=0,PC PC + rel,转移; 若 A data,则C=0,PC PC + rel,转移; 若 Rn data,则C=0,PC PC + rel,转移; 若 (Ri) (direct),则C=0,PC PC + rel,转移; 若 A (direct),则C=1,PC PC + rel,转移;
17、若 A = (direct),不转移, 顺次执行下一条指令,2018/7/6,35,1,3)减1不为零转移指令DJNZ两条,格式如下:DJNZ Rn,rel ; PC PC + 2, Rn Rn - 1; 若 Rn 0 , PC PC + rel,转移;否则,顺次执行下一条指令DJNZ direct,rel; PC PC + 2,(direct)(direct)- 1; 若(direct)0,PC PC + rel,转移;否则,顺次执行下一条指令,2018/7/6,36,1,3. 子程序调用及返回指令1) 长调用指令指令格式:LCALL addr16; PC PC + 3; SP SP + 1
18、;(SP) PC70; SP SP + 1;(SP) PC158; PC addr16,转移到子程序去执行,2018/7/6,37,1,2)绝对调用指令指令格式:ACALL addr11; PC PC + 2; SP SP + 1;(SP) PC70; SP SP + 1;(SP) PC158; PC100 addr11,转移到子程序去执行,2018/7/6,38,1,3)子程序返回指令指令格式: RET ; PC PC + 1; PC158(SP); SP SP - 1; PC70 (SP); SP SP 1; 返回执行调用指令的下一条指令,2018/7/6,39,1,3)中断返回指令指令格
19、式:RETI; PC PC + 1; PC158(SP); SP SP - 1; PC70 (SP); SP SP 1; 返回执行中断断点位置的下一条指令 返回前先清除中断的优先级触发器,2018/7/6,40,1,3.3.5 位操作类指令,1. 位传送指令MOVMOV C,bit;C(bit)MOV bit,C;(bit)C2. 位逻辑操作指令1)位清0 CLR C; C 0CLR bit;(bit) 02)位置1SETB C; C 1SETB bit(bit) 1,2018/7/6,41,1,2. 位逻辑操作指令,3)位取反CPL C; C /CCPL bit;(bit) (bit)4)位
20、与ANL C,bit; C C (bit)ANL C,/bit; C C (/bit)5)位或ORL C,bit; C C (bit)ORL C,/bit; C C (/bit),2018/7/6,42,1,3. 位转移指令1)以C为条件的位转移指令JC rel; PC PC + 2; 若C=1 , PC PC + rel,转移;否则,顺次执行下一条指令JNC rel; PC PC + 2; 若C=0 , PC PC + rel,转移;否则,顺次执行下一条指令,2018/7/6,43,1,2)以bit为条件的位转移指令 JB bit,rel; PC PC + 3; 若(bit)=1 , PC
21、PC + rel,转移;否则,顺次执行下一条指令 JNB bit,rel; PC PC + 3; 若(bit)=0 , PC PC + rel,转移;否则,顺次执行下一条指令 JBC bit,rel; PC PC + 3; 若(bit)=1 , PC PC + rel, 且(bit)0,转移; 否则,顺次执行下一条指令4. 空操作指令NOP NOP ;PC PC+1,2018/7/6,44,1,3.4 51单片机汇编程序设计概述,3.4.1 51单片机汇编程序设计过程(1)明确课题的具体内容,对程序功能、运算精度、执行速度等方面的要求及硬件条件。(2)把复杂问题分解为若干个模块,确定各模块的处
22、理方法,画出程序流程图(简单问题可以不画)。对复杂问题可分别画出分模块流程图和总的流程图。(3)存储器资源分配,如各程序段的存放地址、数据区地址、工作单元分配等。(4)编制程序,根据程序流程图精心选择合适的指令和寻址方式来编制源程序。(5)对程序进行汇编、调试和修改。将编制好的源程序进行汇编,检查修改程序中的错误,执行目标程序,对程序运行结果进行分析,直至正确为止。,2018/7/6,45,1,3.4.2 51单片机汇编程序常用伪指令,1. ORG伪指令格式: ORG addr ;通常用十六进制数表示地址2. DB伪指令格式:标号: DB 项或项表3. DW伪指令格式:标号: DW 项或项表,
23、2018/7/6,46,1,4. DS伪指令格式:标号: DS 数值表达式5. EQU伪指令格式:符号 EQU 项6. DATA伪指令格式:符号 DATA 直接字节地址,2018/7/6,47,1,7. XDATA伪指令格式:符号 XDATA 直接字节地址8. BIT伪指令格式:符号 BIT 位地址9. END伪指令格式:END,2018/7/6,48,1,3.5 51单片机常用汇编程序设计,3.5.1 数据传送程序【例3-18】把片内RAM的30H3FH的16个字节的内容传送到片外RAM的1000H单元位置处。,2018/7/6,49,1,程序如下:ORG 0000HLJMP MAINORG
24、 1000HMAIN: MOV R2,#16MOV R0,#40HMOV DPTR,#2000HLOOP: MOV A,R0;R0 DPTRMOVX DPTR,AINC R0INC DPTRDJNZ R2,LOOPSJMP $END,2018/7/6,50,1,3.5.2 运算程序,【例3-20】两个两字节无符号数相乘,其中:被乘数的高字节放在R7中,低字节放在R6中;乘数的高字节放在R5中,低字节放在R4中。乘得的积有4个字节,按由低字节到高字节的次序存于片内RAM中以ADDR为首地址的区域中。,2018/7/6,51,1,R3,R2,R1,R0,2018/7/6,52,1,程序如下:ORG
25、 0000HLJMP MAINORG 0100HMAIN:MOV R0,#ADDRMUL1:MOV A,R6MOV B,R4MUL AB ;R6R4,结果的低字节直接存入积的第一字节单元MOV R0,A ;结果的高字节存入R3中暂存起来MOV R3,BMUL2:MOV A,R7MOV B,R4MUL AB ;R7R4,结果的低字节与R3相加后,再存入R3中ADD A,R3MOV R3,AMOV A,B ;结果的高字节加上进位位后存入R2中暂存起来ADDC A,#00MOV R2,A,2018/7/6,53,1,MUL3:MOV A,R6MOV B,R5MUL AB ;R6R5,结果的低字节与R
26、3相加存入积的第二字节单元ADD A,R3INC R0MOV R0,AMOV A,R2ADDC A,B ;结果的高字节加R2再加进位位后,再存入R2中MOV R2,AMOV A,#00ADDC A,#00 ;相加的进位位存入R1中MOV R1,AMUL4:MOV A,R7MOV B,R5MUL AB ;R7R5,结果的低字节与R2相加存入积的第三字节单元ADD A,R2INC R0MOV R0,AMOV A,BADDC A,R1 ;结果的高字节加R1再加进位位后存入积的第四字节单元INC R0MOV R0,ASJMP $END,3.5.3 代码转换程序,【例3-22】一位十六进制数转换成8段式
27、数码管共阴极显示码。设数放在R2中,查得的显示码也放于R2中。,2018/7/6,54,1,1)用MOVC A,A+DPTR构造的查表程序段:ORG 0200HCONVERT:MOV DPTR,#TAB ;DPTR指向表首地址MOV A,R2 ;转换的数放于MOVC A, A+DPTR ;查表指令转换MOV R2,ARETTAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,67H,77H,7CH,39H,5EH,79H,71H ;显示码表,2018/7/6,55,1,2)用“MOVC A,A+PC”构造的查表程序段:ORG 0200HCONVERT:MOV
28、 A,R2 ;转换的数放于ADD A,#03H;加查表指令相对于表首的位移量MOVC A, A+PC ;查表指令转换MOV R2,ARETTAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,67H,77H,7CH,39H,5EH,79H,71H ;显示码表,3.5.4 分支程序,1. 一般分支程序【例3-23】从片外RAM的1000H单元开始放了200个英文符号,要求统计它们当中字符“A”的个数,放于R7中。,2018/7/6,56,1,程序段如下:ORG 0000HLJMP MAINORG 0100HMAIN: MOV R2,#200MOV DPTR,#
29、1000HMOV R7,#0LOOP:MOVX A,DPTRCJNE A,#41H,NEXTINC R7NEXT:INC DPTRDJNZ R2,LOOPSJMP $END,2. 多分支程序,JMP A+DPTR实现多分支程序过程如下:先用无条件转移指令(“AJMP”或“LJMP”)按顺序构造一个转移指令表,通过转移指令表中的指令可转移到各个分支。将转移指令表的首地址装入DPTR中,用分支信息形成变址装入累加器A。执行多分支转移指令JMP A+DPTR实现转移。,2018/7/6,57,1,【例3-24】现有10路分支,分支号分别为09,要求根据R2中的分支号转向各个分支的程序。,2018/7
30、/6,58,1,程序段如下:ORG 1000HMOV A,R2RL A;分支信息乘2形成变址值放入累加器AMOV DPTR,#TAB ;DPTR指向转移指令表的首地址JMP A+DPTR;转向形成的散转地址RETTAB:AJMP OPR0 ;转移指令表AJMP OPR1AJMP OPR9OPR0:OPR1:OPR9:,3.5.5 延时程序,【例3-25】下面是延时500us的程序,设系统时钟频率12MHZ。DEL500us:MOV R7,#124;1个机器周期NOP;1个机器周期LOOP: NOP;1个机器周期NOP;1个机器周期DJNZ R7,LOOP;2个机器周期RET;2个机器周期系统时钟频率12MHZ,机器周期1us。延时时间计算如下: 延时时间=1+1+124 ( 1+1+2) + 2 1us=500us,2018/7/6,59,1,习 题2、3、5、6、7、9、10、12,2018/7/6,60,1,