单片机原理及接口技术:第3章 MCS51指令系统与程序设计_第1页
单片机原理及接口技术:第3章 MCS51指令系统与程序设计_第2页
单片机原理及接口技术:第3章 MCS51指令系统与程序设计_第3页
单片机原理及接口技术:第3章 MCS51指令系统与程序设计_第4页
单片机原理及接口技术:第3章 MCS51指令系统与程序设计_第5页
已阅读5页,还剩164页未读 继续免费阅读

下载本文档

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

文档简介

第3章

MCS51指令系统与程序设计学习目的及要求熟悉指令格式;掌握寻址方式;牢记指令。掌握汇编语言程序设计的语言结构;掌握常用的程序设计方法,如顺序结构、分支结构和循环结构,再加上使用广泛的子程序及中断服务子程序五种结构;重点掌握循环程序,子程序设计和查表程序设计。第3章MCS-51指令系统与程序设计3.1MCS-51指令系统概述3.2寻址方式3.3数据传送指令3.4算术/逻辑运算和移位指令3.5控制转移指令和位操作指令3.6汇编语言程序的设计3.7本章小结3.1

MCS-51指令系统概述指令:用于控制功能部件完成某一动作的指示或命令。指令系统:指令的集合,是CPU的重要指标和设计基础。指令的格式:

[标号]:操作码[目的操作数],[源操作数];注释

MAIN:MOVA,

#30H;74H

30H指令的字节数:单、双和三字节。3.1.1指令的分类单字节指令双字节指令三字节指令按指令的字节数单周期指令双周期指令四周期指令按指令的执行时间数据传送指令(28条)算术运算指令(24条)逻辑运算指令和移位指令(25条)控制转移指令(17条)位操作指令(28条)按指令的功能3.1.1指令的分类指令系统中所用符号的说明:①Rn:工作寄存器,n=0,1…7②#data:8位立即数③direct:8位直接地址,00H~7FH或SFR④@Ri:寄存器间接寻址,i=0或1⑤#data16:16位立即数⑥@DPTR:以DPTR为数据指针的间接寻址⑦bit:位地址,00H~7FH或20H.2或PSW.0⑧addr11:11位的目标地址⑨addr16:16位的目标地址⑩rel:8位带符号的地址偏移量

$:当前指令的地址3.2寻址方式计算机寻找操作数或下一条要执行的指令的地址的方式。1.立即寻址2.直接寻址3.寄存器寻址4.寄存器间接寻址5.变址寻址6.相对寻址7.位寻址“立即直接、寄存间接、相对变址”必须熟练掌握3.2.1立即寻址指令中直接给出操作数。例如:MOV A,#30H;74H

30HACC30H74H30H程序存储器ROM3.2.2直接寻址指令中直接给出操作数的直接地址。例如:MOV A,30H;E5H

30H75HACC30H31H5AH33H内部RAME0H5AH区别:MOV A,30H;E5H

30HMOV A,#30H;74H

30H可寻址空间:片内RAM的低128字节;特殊功能寄存器SFR。3.2.3寄存器寻址指令中给出存放操作数的寄存器名称。例如:MOV A,R1;E9H75HACCR0R15DH3AH内部RAME0H3AH常用寄存器:A、B、DPTR、R0~R7。3.2.4寄存器间接寻址以指令指定的寄存器内容为地址,该地址所指向的内部RAM单元的内容为操作数。例如:MOV R1,#30H;A9H

30HMOV A,@R1;E7H75HACCR0R15DH30H内部RAME0H30H33H33H区别:MOV A,@R1;E7HMOV A,R1;E9H可寻址空间:片内RAM(@R0、@R1);片外RAM(@R0、@R1、

@DPTR)。4种寻址方式的总结1.立即寻址MOV A,#data;A←data;74H

dataMOV Rn,#data;Rn←data;78~FH

dataMOV @Ri,#data;(Ri)←data;76~7H

dataMOV direct,#data;direct←data;75H

data2.直接寻址MOV A,direct;A←(direct);E5Hdirect

MOV direct,A;A→direct;F5H

directMOV Rn,direct;Rn←(direct);A8~FH

directMOV @Ri,direct;(Ri)←(direct);A6~7H

directMOV direct2,direct1;direct2←direct1

;85Hdirect2direct1一般RAM区位寻址区寄存器3区寄存器2区寄存器1区寄存器0区0007080F17101F187F2F3020R0~R7R0~R7R0~R7R0~R7内部数据存储器SFR区80FF4种寻址方式的总结3.寄存器寻址MOV A,Rn ;A←Rn;E8~EFHMOV Rn,A ;Rn←A;F8~FFHMOV direct,Rn;direct←Rn;88~8FH4.寄存器间接寻址MOV A,@Ri ;A←(Ri);E6~E7HMOV @Ri,A;(Ri)←A;F6~F7HMOV direct,@Ri;direct←(Ri);86~87H

direct一般RAM区位寻址区寄存器3区寄存器2区寄存器1区寄存器0区0007080F17101F187F2F3020R0~R7R0~R7R0~R7R0~R7内部数据存储器SFR区80FF3.2.5变址寻址以DPTR(PC)为基地址,加上地址偏移量(A中8位无符号数)形成操作数地址的方式。操作数存放在程序存储器中,操作数的地址=基址寄存器的内容+变址寄存器的内容该地址所指向的程序存储器单元的内容为操作数。例如:MOVCA,@A+DPTR;93HADPTR22100H2102H=+Acc042100H2101H2103H2102H00H01H04H09HROM可寻址空间:程序存储器3.2.6相对寻址

以指令中给出的操作数作为程序转移的偏移量,用于访问程序存储器,用相对转移指令来实现。MOVA,#30HCLRCSUBBA,R2JCNEXT ;40relSJMPOUT ;80relNEXT:NOP ;00OUT:·······目的地址=源地址+地址偏移量(rel)+转移指令字节数可寻址空间:程序存储器3.2.7位寻址对内部RAM中的位寻址区和可位寻址的特殊功能寄存器进行位操作。3.2.7位寻址1SETB20HCLR31H10SETBCCLRACC.001

交流与思考1.执行当前指令后,PC的内容为

。2.MOVXA,@DPTR源操作数寻址方式为

。3.JNCrel指令的寻址方式是

。4.MOVC,20H源操作数寻址方式为

。5.在访问特殊功能寄存器时,只能使用

寻址方式。6.在寄存器间接寻址方式中,指定寄存器中存放的是

。下一条将要读取指令码的首地址寄存器间接寻址相对寻址位寻址直接寻址操作数地址

交流与思考

交流与思考1.JZe的操作码地址为1000H,e=20H,它的转移目的地址为

。2.JBC02H,e操作码的地址为2000H,e=70H,它的转移目的地址为

。1022H2073H3.3数据传送指令最基本、最主要的操作3.3.1内部数据传送指令3.3.2外部数据传送指令3.3.3堆栈操作指令3.3.4数据交换指令必须熟练掌握3.3数据传送指令3.3数据传送指令3.3.1内部数据传送指令1.立即寻址MOV A,#data ;A←dataMOV Rn,#data ;Rn←dataMOV @Ri,#data ;(Ri)←dataMOV direct,#data ;direct←dataMoveimmediatedatatoAccumulatorMoveimmediatedatatoregisterMoveimmediatedatatodirectbyteMoveimmediatedatatoindirectRAM3.3.1内部数据传送指令【例3.2】

已知:R0=20H,MOVA,#18HMOVR7,#28HMOV@R0,#38HMOV21H,#48H执行指令后,A=________;R7=________;(20H)=______;(21H)=______。18H28H38H48H3.3.1内部数据传送指令2.直接寻址MOV A,direct ;A←(direct)MOV direct,A ;A→directMOV Rn,direct ;Rn←(direct)MOV @Ri,direct ;(Ri)←(direct)MOV direct2,direct1 ;direct2←direct1MovedirectbytetoAccumulatorMoveAccumulatortodirectbyteMovedirectbytetoregisterMovedirectbytetoindirectRAMMovedirectbytetodirect3.3.1内部数据传送指令【例3.3】

已知:R1=32H,(30H)=AAH,(31H)=BBH,(32H)=CCHMOVA,30HMOV50H,AMOVR6,31HMOV@R1,30HMOVP1,32H执行指令后,A=________;(50H)=________;R6=________;(32H)=________;P1=_________。AAHAAHBBHAAHAAH3.3.1内部数据传送指令3.寄存器寻址MOV A,Rn ;A←RnMOV Rn,A ;Rn←AMOV direct,Rn ;direct←Rn4.寄存器间接寻址MOV A,@Ri ;A←(Ri)MOV @Ri,A ;(Ri)←AMOV direct,@Ri ;direct←(Ri)3.3.1内部数据传送指令【例3.4】

已知:(40H)=11H,(41H)=22H,R0=40H,R1=41HMOV A,@R0MOV @R1,AMOV 42H,@R1执行指令后,A=________;(40H)=________;(41H)=______;(42H)=______。11H11H11H11H3.3.1内部数据传送指令5.内部数据传送指令的使用3.3.2外部数据传送指令1.16位数据传送指令MOV DPTR,#data16 ;DPTR←data162.ROM的字节传送指令MOVC A,@A+DPTR ;A←(A+DPTR)MOVC A,@A+PC ;PC←PC+1,A←(A+PC)3.3.2外部数据传送指令3.外部RAM的字节传送指令MOVX A,@Ri ;A←(Ri)MOVX @Ri,A ;(Ri)←AMOVX A,@DPTR ;A←(DPTR)MOVX @DPTR,A ;(DPTR)←A

3.3.3堆栈操作指令PUSH direct ;SP←SP+1,(SP)←(direct)POP direct ;direct←(SP),(SP)←SP-1【例3.8】

已知(30H)=X,(40H)=Y,请编程以堆栈操作方式交换两单元内容。MOV SP,#70H;令栈底地址为70HPUSH 30H;SP←SP+1,71H←XPUSH 40H;SP←SP+1,72H←YPOP 30H;30H←Y,(SP)←SP-1=71HPOP 40H;40H←X,(SP)←SP-1=70H3.3.4数据交换指令XCH A,RnXCH A,directXCH A,@RiXCHD A,@Ri【例3.9】

已知外部RAM20H=X,内部RAM20H=Y,请编程交换两单元内容。MOV R1,#20HMOVXA,@R1XCHA,@R1MOVX@R1,A3.4算术运算、逻辑运算和移位指令3.4.1算术运算指令3.4.2逻辑运算指令3.4.3移位指令必须熟练掌握3.4.1算术运算指令1.加法指令(1)不带进位加法指令ADD A,RnADD A,directADD A,@RiADD A,#data(2)带进位加法指令ADDC A,RnADDC A,directADDCA,@RiADDCA,#data3.4.1算术运算指令【例3.12】

设X=5AH,Y=6BH编程X+Y,并写出A和PSW值。MOVA,#5AHADDA,#6BHA=C5HPSW=44H3.4.1算术运算指令(3)加1指令INC AINCRnINCdirectINC@RiINC DPTR3.4.1算术运算指令【例3.14】

已知M1和M2单元存放两个16位无符号数X1和X2(低8位在前,高8位在后),写出X1+X2的程序并放在M1和M1+1中。MOVR0,#M1MOVR1,#M2MOVA,@R0ADDA,@R1MOV@R0,AINCR0INCR1MOVA,@R0ADDCA,@R1MOV@R0,ASJMP$3.4.1算术运算指令2.减法指令(1)带借位的减法指令SUBB A,RnSUBBA,directSUBBA,@RiSUBBA,#data (2)减1指令DEC ADECRnDECdirectDEC@Ri3.4.1算术运算指令3.十进制调整指令DAA(1)BCD码加法【例3.17】写出完成85+59的BCD加法程序(2)BCD码减法【例3.18】写出完成91-36的BCD减法程序3.4.1算术运算指令4.乘法和除法指令MUL ABDIV AB3.4.1算术运算指令【例3.19】

已知两个8位无符号乘数分别放在30H和31H中,试编程令它们相乘并把积的低8位放入32H,积的高8位放入33H中。MOVR0,#30HMOVA,@R0INCR0MOVB,@R0MULABINCR0MOV@R0,AINCR0MOV@R0,BSJMP$3.4.2逻辑运算指令1.逻辑与指令ANL A,RnANL A,directANL A,@RiANL A,#dataANL direct,AANL direct,#data3.4.2逻辑运算指令2.逻辑或指令ORL A,RnORL A,directORL A,@RiORL A,#dataORL direct,AORL direct,#data3.4.2逻辑运算指令【例3.22】

设A=AAH,P1=FFH,试通过编程将A中的低4位送入P1口低4位,P1口高4位不变。MOVR0,AANLA,#0FHANLP1,#0F0HORLP1,AMOVA,R0SJMP$3.4.2逻辑运算指令3.逻辑异或指令XRL A,RnXRL A,directXRL A,@RiXRL A,#dataXRL direct,AXRL direct,#data3.4.2逻辑运算指令【例3.23】

已知外部RAM30H=AAH,现欲使它高4位不变低4位取反,试编程。MOVR0,#30HMOVXA,@R0XRLA,#0FHMOVX@R0,ASJMP$3.4.2逻辑运算指令4.累加器的清零与取反指令CLR ACPL A3.4.2逻辑运算指令【例3.24】

已知30H单元有一个正数X,试编程求出-X的补码。MOVA,30HCPLAINCAMOV30H,ASJMP$3.4.3移位指令循环左/右移位指令RL ARR A带进位标志的循环左/右移位指令RLC ARRC A半字节交换指令SWAPA3.4.3移位指令例:在内部RAMM1和M1+1单元中有两个BCD数,请编程把它们紧缩成一个字节并放入M1单元.0000BCD10000BCD2M1M1+1BCD1BCD2M1例:一字节数据拆分成高4位和低4位一般RAM区位寻址区寄存器3区寄存器2区寄存器1区寄存器0区0007080F17101F187F2F3020R0~R7R0~R7R0~R7R0~R7内部数据存储器SFR区80FF3.5控制转移和位操作指令3.5.1控制转移指令3.5.2位操作指令3.5.1控制转移指令1.无条件转移指令长转移:LJMP addr16绝对转移:AJMP addr11短转移:SJMP rel散转指令:JMP @A+DPTR外部内部外部00000FFF1000FFFF程序存储器EA=1EA=03.5.1控制转移指令(1)长转移指令长转移指令的功能是把指令码中的16位地址addr16送入程序计数器PC,使程序无条件地转移到addr16处执行.LJMP addr16 ;指令助记符LJMP NEXT ;应用形式长转移指令的机器码为:转移范围64KB02Haddr15-8addr7-0指令码高8位地址低8位地址3.5.1控制转移指令(2)绝对转移指令AJMP addr11 ;指令助记符AJMPNEXT ;应用形式绝对转移指令的机器码为:a10a9a800001a7a6a5a4a3a2a1a0a10a9a8a7a6a5a4a3a2a1a0PC15-PC11目标地址:转移范围2KB3.5.1控制转移指令(3)短转移指令SJMP rel ;指令助记符SJMP NEXT ;应用形式目的地址=源地址+地址偏移量(rel)+转移指令字节数80Hrel操作码地址偏移量短转移指令的机器码为:3.5.1控制转移指令(4)变址寻址转移指令JMP@A+DPTR例3.30应用系统中有K0~K34个按键。如果其中某键按下,键检测程序将对应的键号(0~3)送入累加器A,请编写一段程序,根据A中的键号转去执行相应的键处理程序PM0~PM3。K0K1K2K3LJMPPM0LJMPPM1LJMPPM2LJMPPM3PMTBPMTB+3PMTB+6PMTB+9……转移指令表K0K3K2K1PM0PM1PM2PM33.5.1控制转移指令PMTB:LJMPPM0LJMPPM1LJMPPM2LJMPPM3……PM0: ……PM1: ……K0K1K2K33.5.1控制转移指令3.5.1控制转移指令2.条件转移指令(1)累加器A判零转移指令JZ relJNZ rel例3.31(P114)将外部RAM中以DATA1为起始地址的数据块以零为结束标志,编程将之传送到DATA2起始地址的内部RAM区。MCS-51RAM1DATA1DATA2RAM2DATA23.5.1控制转移指令【例3.31】

将外部RAM中以DATA1为起始地址的数据块以零为结束标志,编程将之传送到DATA2起始地址的内部RAM区。MOVR0,#DATA1MOVR1,#DATA2LOOP:MOVXA,@R0JZDONEMOV@R1,AINCR0INCR1SJMPLOOPDONE:SJMP$END3.5.1控制转移指令(2)比较条件转移指令CJNE A,#data,relCJNE A,direct,relCJNERn,#data,relCJNE @Ri,#data,rel3.5.1控制转移指令(3)减1条件转移指令DJNZ Rn,relDJNZ direct,rel3.5.1控制转移指令【例3.32】

试编写一程序将内RAM中以DAT为起始地址的数据块中的连续10个无符号数相加,将和送到SUM单元。设和不超过一个字节。0010010100011110DAT+1DAT……SUM一般RAM区位寻址区寄存器3区寄存器2区寄存器1区寄存器0区0007080F17101F187F2F3020R0~R7R0~R7R0~R7R0~R7内部数据存储器SFR区80FF3.5.1控制转移指令【例3.33

】试编一程序将片内RAM中以DAT为起始地址的数据块中的连续10个无符号数相加,并将结果送到SUM单元。设结果不超过8位二进制数所能表达的范围。ORG1000HMOVR2,#0AHMOVR0,#DATCLRALOOP:ADDA,@R0INCR0DJNZR2,LOOPMOVSUM,ADONE:SJMP$END3.5.1控制转移指令3.子程序调用和返回指令(1)调用指令①长调用指令LCALL addr16②绝对调用指令ACALL addr11(2)返回指令RETRETI3.5.1控制转移指令子程序设计例:0010010100011110DAT1+1DAT1……SUM10000110100011110DAT2+1DAT2……SUM2一般RAM区位寻址区寄存器3区寄存器2区寄存器1区寄存器0区0007080F17101F187F2F3020R0~R7R0~R7R0~R7R0~R7内部数据存储器SFR区80FF3.5.1控制转移指令ORG1000H MOV R2,#0AH;待求和数据个数 MOV R0,#DAT1;数据块的首地址 CLR ALOOP:ADDA,@R0 INC R0;循环程序求和 DJNZ R2,LOOP MOV SUM1,A;存放和 SJMP$ END3.5.1控制转移指令主程序MOV R2,#05HMOV R0,#DAT1MOV R1,#SUM1ACALL ADDNMOV R2,#08HMOV R0,#DAT2MOV R1,#SUM2ACALL ADDNSJMP $END改造的子程序ADDN:CLR ALOOP:ADD A,@R0 INC R0 DJNZR2,LOOP MOV@R1,A RET3.5.1控制转移指令4.空操作指令NOP3.5.1控制转移指令3.5.2位操作指令1.位传送指令MOV C,bitMOV bit,C2.位置位和清零指令CLR CCLR bitSETB CSETB bit3.5.2位操作指令3.位运算指令ANL C,bitANL C,/bitORL C,bitORL C,/bitCPL CCPL bitW=(M)∧(N)+(M)∧(N)MNW3.5.2位操作指令4.位控制转移指令(1)以Cy为条件的转移指令JC relJNC rel(2)以位的内容为条件的转移指令JB bit,relJNB bit,relJBC bit,rel3.5.2位操作指令

【例3.38】内部RAM的M1,M2单元中各有一个无符号8位二进制数,编程比较它们的大小,并把大数送入MAX单元.MOVA,M1 CJNEA,M2,NEXTNEXT:JNCNEXT1 MOVA,M2NEXT1:MOVMAX,A RET

交流与思考1.假定(A)=56,(R5)=67.执行指令ADDA,R5DA后,累加器A的内容为

,CY的内容为

。2.假定(A)=0C5H,执行指令:SWAPA后,累加器A的内容为

。0010001115CH

交流与思考3.已知片内RAM的20H中为01H,执行下列程序后(30H)=?MOVA,20HINCACPLAMOV30H,A0FDH

交流与思考4.判断以下指令的正误。1)MOV28H,@R42)MOVE0H,@R03)INCDPTR4)DECDPTR5)CLRR03.6汇编语言程序设计汇编语言程序设计既是软件问题,又与硬件密切相关,这是汇编语言的特点。3.6.1程序设计语言

1.机器语言:由二进制或十六进制组成,计算机能够直接识别和执行。难写、难懂、难查、难交流。2.汇编语言:由助记符、保留字、伪指令组成,通过“汇编程序”翻译成机器语言。可直接操作到计算机内部,益于写实时控制程序。3.高级语言:面向问题独立于机器,通用语言。通过解释程序和编译程序、连接程序,编译成目标代码。3.6.1汇编语言格式地址标号:操作码操作数;注释地址标号:任选项,字母开头,1-8个字符组成。操作码:指令保留字(MOV等)、伪指令(ORG等),指示计算机进行何种操作操作数:存放指令的操作数或操作数地址,由指令确定(解释见P128)注释字段:任选项,助于编写、阅读程序。3.6.1汇编语言构成汇编语言语句有三种基本类型:指令语句、伪指令语句和宏指令语句。1.指令性语句:用指令助记符构成的语句,指令系统,它要产生机器代码。2.指示性语句:伪指令,不产生机器码,只为汇编程序提供信息,是汇编程序识别执行的命令,用来对汇编过程进行某种控制。3.宏指令语句:用以代替汇编语言源程序中重复使用的程序段的一种语句,由汇编程序在汇编时产生相应的目标代码。3.6.1伪指令定义:仅向汇编程序发出的,并仅由汇编程序在汇编过程中识别和执行的一种汇编控制命令,它本身在目标程序中不产生机器码。汇编起始伪指令:ORG汇编结束伪指令:END定义字节伪指令:DB定义字伪指令:DW定义位伪指令:BIT赋值伪指令:EQUDATA3.6.1伪指令1.汇编起始伪指令格式:ORG<起始地址>(ORiGin)功能:指定汇编源程序编译成机器语言程序的起始地址。例如:ORG0000HLJMP0100HORG0100HStart:MOVA,#5AHSJMP$END程序中可以有多条ORG语句,但定义的起始地址既不要交叉,也不要重叠。必须从小地址向大地址分配程序所占空间。3.6.1伪指令2.汇编结束伪指令格式:END[ENDofassembly]功能:停止汇编示例:ORG0000HLJMP0100HORG0100HStart:MOVA,#5AhSJMP$END

3.6.1伪指令3.定义字节伪指令格式:<标号:>DB<项或项表>功能:把项或项表的数值存入从标号开始的连续单元,其中项或项表可以是一个字节、数或以引号括起来的字符串。

ORG1000HDat:DB11h,-1,’A’,’BCD’END

该指令只能为程序存储器赋初值,不能为其他存储器赋初值,尤其不能为内部数据存储器赋初值。注意:1000H11HFFH41H42H43H44H补码ASCII码程序存储器3.6.1伪指令4.定义字伪指令格式:<标号:>DW<项或项表>功能:把项或项表的数值存入从标号开始的连续单元,其中项或项表是一个字(两字节)。

ORG1000HDat:DW1122h,3344h,-1END1000H11H22H33H44H程序存储器只对程序存储器起作用FFHFFH3.6.1伪指令5.定义位伪指令格式:<符号>BIT<位地址>功能:定义位变量地址

UBIT20H.0VBIT20H.1WBIT20H.2XBITP1.0YBITP2.4ZBITP3.2QBITTCON.23.6.1伪指令6.赋值伪指令格式:<符号>EQU<变量值>功能:定义符号变量值

XEQU05HYEQU06HNEXTEQU2000H格式:<符号>DATA<变量值>功能:定义符号变量值(内部RAM)

ONEDATA30H(数据或地址)

TWODATAONE+13.6.1伪指令例.

伪指令应用

ORG8100H DW“AB” DW100H,1ACH说明

(1)(8100H)=41H(‘A’) (8101H)=42H(‘B’) (2)8102H单元起存放01H、00H、01H、ACH3.6.2汇编语言源程序的设计和汇编汇编原理和方法

1.拟制设计任务书

2.建立数学模型

3.确立算法

4.绘制流程图

5.编制源程序

6.上机调试3.6.2汇编语言源程序的设计和汇编把汇编语言源程序翻译成目标代码的过程

1.人工汇编

1)确定指令码和地址,对于一时无法确定的地址偏移量应照原样写上;2)地址符号的‘代真’过程。 2.机器汇编自动将汇编语言源程序翻译成目标代码,两次扫描,完成编译3.6.3汇编语言程序设计的结构便于总结方法编制高质优秀程序。顺序、分支和循环结构

1.简单程序设计顺序结构特点:不分长短、从头到尾、没有分支

语句1语句2语句n结束……入口出口简单程序设计

【例3.39】把压缩BCD码变成两个ASCII码,分别存放。

方法:先拆开,再加30H。ORG 0000H MOV A,20H ANL A,#0F0H SWAP A ORL A,#30H MOV 21H,A MOV 22H,20H ANL 22H,#0FH ORL 22H,#30H SJMP $ END简单程序设计【例3.40】一个16位二进制负数(补码),低8位在NUM单元,高8位在NUM+1单元,编写程序求该数的绝对值.MOV A,NUMCPL AADD A,#01HMOV NUM,AMOVA,NUM+1CPL AADDCA,#00HMOV NUM+1,A简单程序设计【例3.41】在20H中有一个8位无符号数,请编写程序把它转换成三位BCD数,把百位送入FIRST单元的低四位,十位和个位放在SECOND单元里.FIRST DATA30HSECONDDATA31HMOVA,20HMOVB,#64HDIVABMOVFIRST,AMOVA,BMOVB,#0AHDIV ABSWAPAORL A,BMOV SECOND,ASJMP$简单程序设计【例3-43】设被加数存放在内部RAM的30H(最高字节)、31H(次高字节)和32H(低位字节)单元中,加数的相应字节存放在内部RAM的33H、34H和35H单元中,试将两数相加,运算结果存放在30H、31H和32H中,进位位存放在位寻址区的00H位中。【例3-44】设在8031单片机的外部RAM的60H单元存有1字节代码,要求将其分解成两个4位字段,高4位存入原单元的低4位,其低4位存入61H单元的低4位且要求这两单元的高4位均为0,试编制相应的程序。分支程序设计【例3.42】变量X存放在VAR单元,按如下条件为函数值Y赋值,Y存放在FUNC单元.Y=1 X>00 X=0-1 X<0A←XA=0?A>0?A←0FFHA←1存结果NYNY分支程序设计VARDATA30HFUNCDATA31HMOVA,VARJZ DONEJBACC.7,NEG MOVFUNC,#01HSJMP$NEG:MOVFUNC,#0FFHSJMP$DONE:MOVFUNC,#00HSJMP$分支程序设计【例3.43】多分支程序.已知R3的值为00H~7FH中的一个,请编写出根据R3的值转移到相应的分支程序去的程序.分支较少时,可以使用比较条件转移指令,如R3的值为00~03H,可以按下面的方法设计程序:00010203K0K1K2K分支程序设计MOVA,R3CJNEA,#00H,NEXT1SJMPK0NEXT1:CJNEA,#01H,NEXT2SJMPK1NEXT2:CJNEA,#02H,NEXT3SJMPK2NEXT3:CJNEA,#03H,NEXT4SJMPK3NEXT4:RET K0: …K1: …K2: …K3: …分支程序设计MOVA,R3RLAMOVDPTR,#BRTABJMP@A+DPTRBRTAB:AJMPROUT00AJMPROUT01AJMPROUT02……AJMP ROUT127ROUT00: …ROUT01: … …ROUT127: … END分支程序设计【例3.44】两个有符号数分别存于ONE和TWO单元,编程比较它们的大小,并把大数存入MAX单元.分析:有符号数比较大小可以采用X-Y>0, OV=0 OV=1(负数-正数)X-Y<0, OV=0 OV=1(正数-负数)分支程序设计X-Y>0, OV=0 OV=1(负数-正数)X-Y<0, OV=0 OV=1(正数-负数)X 累加器A求X-Y的差差=0?MAX X差>0?OV=1?YNYNMAX YYOV=1?NNY分支程序设计ORG0400HONEDATA30HTWODATA31HMAXDATA32HMOVA,ONECLR CSUBBA,TWOJZXMAXJB ACC.7,NEGJB OV,YMAXSJMPXMAXNEG: JBOV,XMAXYMAX:MOVA,TWO SJMPDONEXMAX:MOVA,ONEDONE:MOVMAX,A SJMP$ END分支程序设计【例3-46】比较内部RAM的40H和50H单元中无符号数的大小,使得40H单元存放大数,50H单元存放小数。【例3-48】假定有3个分支程序段,各分支程序段的功能依次是从内部RAM取数、从外部RAM低256B范围取数和从外部RAM的64KB范围内取数。R0中存放内部RAM地址或外部RAM的低8位地址,R1中存放外部RAM的高8位,R3中存放分支序号值(0,1,2)。试编制程序段,根据R3的内容转入不同的处理功能。循环结构的程序设计循环程序的结构:循环初值设置循环体循环变量修改循环是否结束?YN退出循环循环初值设置循环体循环变量修改循环是否结束?YN退出循环循环程序设计【例3.45】内部RAM的BLOCK单元开始存放一个无符号的数据块,数据个数存放在LEN单元,编程求数据块各数的累加和,并存入SUM单元.R2=数据个数+1R1=块首地址累加器A清零循环结束?A=A+@R1R1=R1+1SUM=和等待NY循环程序设计ORG0200HLENDATA20HSUMDATA21HBLOCKDATA22HMOVR2,LENINCR2MOVR1,#BLOCKCLRALOOP:DJNZR2,NEXT SJMPSTORENEXT:ADDA,@R1 INCR1 SJMPLOOPSTORE:MOVSUM,A SJMP$循环程序设计【例3.46】已知内部RAMADDR为首地址的数据块内存放无符号数据,块长存放在LEN单元,请编程求出块中最大值并存入MAX单元.循环程序设计A清零数据块首地址 R0求A与块中数据的差A>块中数据A 块中数据修改数据地址指针循环是否结束?MAX A中最大值恢复A中数据YNYN循环程序设计LEN DATA20HMAX DATA21HORG 0300HCLR AMOV R0,#ADDRLOOP:

CLR CSUBBA,@R0JNC NEXTMOV A,@R0SJMPNEXT1NEXT:ADDA,@R0NEXT1:INCR0 DJNZLEN,LOOP MOVMAX,A SJMP$循环程序设计采用比较条件转移指令MOVMAX,#00HMOVR0,#ADDRLOOP:MOVA,@R0CJNEA,MAX,NEXT1NEXT1:JCNEXTMOVMAX,ANEXT:INCR0DJNZLEN,LOOPSJMP$循环程序设计【例3.47】多重循环程序设有10组三字节被加数和加数,分别存放在内部RAM中以BLOCK1和BLOCK2为首地址的两个数据块中.请编程求10组数的和(设和仍为三字节),把和送回以BLOCK1为首地址的数据块中。D7~D0D15~D8D23~D16D7~D0D15~D8D23~D16BLOCK1BLOCK2+D7~D0D15~D8D23~D16BLOCK1和R0 BLOCK1R1 BLOCK2R2 10R3 3CY 01个字节相加修改被加数地址指针修改加数地址指针字节数-1=0?数据个数-1=0?等待NNY循环程序设计ORG0050HBLOCK1DATA20HBLOCK2DATA40HMOVR0,#BLOCK1MOVR1,#BLOCK2MOVR2,#0AHLOOP:MOVR3,#03HCLRCLOOP1:MOVA,@R0ADDCA,@R循环程序设计MOV@R0,AINCR0INCR1DJNZR3,LOOP1DJNZ R2,LOOPSJMP$END循环结构的程序设计【例3-49】设长度不超过100字节的字符串放在8031单片机外部RAM以STA为首址的连续单元,该字符串用空格符SP('SP'=20H)作为结束标志。要求统计此字符串的长度并存入内部RAM的LONG单元中,试编写实现此要求的程序。【例3-50】某系有200名学生参加外语统考,若成绩已存放在MCS-51外部RAM起始地址为ENGLISH的连续存储单元,现要求统计90~100、80~89、70~79分之间的学生人数,并将统计结果存入内部RAM的GRADA、GRADB和GRADC单元。循环结构的程序设计【例3-51】设有32个无符号数存放在8031单片机内部以30H为起始地址的单元中,试编写一程序将它们按从大到小的顺序排列。【例3-52】设8031单片机使用12MHz晶振(机器周期T为1μs),试设计延时100ms的延时程序。查表程序设计查表指令:MOVC A,@A+DPTRMOVC A,@A+PC应用:y=f(x)或数据转换X有规律变化,表格的结构形式:例如:TAB: DB 30H DB 31H ……TAB1:DW 99H,99H DW 99H,98H DW 99H,94H DW 99H,86H ……查表程序设计

查表程序实现查表算法。该方法把事先计算或实验数据按一定顺序编成表格,存于程序存储器内,然后根据输入参数值,从表中取得结果。查表指令:MOVCA,@A+DPTR查表前数据表格表头地址存入DPTR,要查得的数在表中相对表头地址的偏移量送入累加器A,最后MOVCA,@A+DPTR完成查表,可在64KB内查表因为DPTR可以人为修改。MOVCA,@A+PC分为三步:1)用传送指令把所查数据的项数送入累加器A;2)使用ADDA,#data指令对累加器A进行修正,data值由下式确定:PC当前值+data=数据表头地址实际上data值等于查表指令和数据表格之间的字节数;3)用指令MOVCA,@A+PC完成查表由于PC指针只能在A中提供的偏移地址的范围内查表,故,查表范围进在一页内。7402240383F880FE30313233PCASCTAB+00123ASCTAB+2PC当前值3BPC当前值+3=PC当前值+3+2=表头(A)补偿值=表头地址-PC当前值表中偏移量

MOVA,#2ADDA,#03H;计算偏移量

MOVCA,@A+PC ;查表

MOVR0,A;存结果

SJMP$ASCTAB:DB ‘0’,‘1’,‘2’,‘3’

ORG0100HMOVA,R0;取转换值

ANLA,#0FH;屏蔽高四位

ADDA,#03H;计算偏移量

MOVCA,@A+PC ;查表

MOVR0,A;存结果

SJMP$ASCTAB:DB ‘0’,‘1’,‘2’,‘3’DB ‘4’,‘5’,‘6’,‘7’DB ‘8’,‘9’,‘A’,‘B’DB ‘C’,‘D’,‘E’,‘F’END303132333435363738394142ASCTAB1B2BPC当前值3B以PC为指针查表程序TB1:movA,R2addA,R2movR3,AincR3addA,#07HmovcA,@A+PCxchA,R3addA,#03HmovcA,@A+PCmovR4,Asjmp$TAB1:DW1520H,7586HDW2345H,1000HDW883H,9943HDW4051H,6785HDW4468H,5871HEND152075862345100008839943TAB11B2B1B1B2B以DPTR为指针查表程序LTB2:movDPTR,#TAB2movA,R3clrCrlcAmovR3,AxchA,R2rlcAxchR2,AaddA,DPLmovDPL,AmovA,DPHaddcA,R2movDPH,A

clrAmovcA,@A+DPTRmovR2,AclrAincDPTRmovcA,@A+DPTRmovR3,AretTAB2:DW......……END双字节R2R3查表双字节结果查表程序设计【例3.48】编程将十六进制数转换成为ASCII码.ORG0050HMOVA,R0MOVDPTR,#TABMOVCA,@A+DPTRMOVR0,ASJMP$TAB:DB30H,31H,……39H DB41H,……,46H查表程序设计【例3-53】在8031单片机内部RAM的LOC单元中存放一位非压缩BCD码,求其立方值并将它存放到内部RAM的RESULT和RESULT+1单元中,试编制相应程序。【例3-54】已知R0低4位有一个十六进制数(0~F中的一个),试编写能将它转换成相应ASCII码并存入R0的程序。【例3-55】已知一个以BLOCK1为起始地址的数据块(数据块长度在LEN单元),数据块中每个存储单元中的高、低4位分别为两个十六进制数,请通过编程将它们转换为相应的ASCII码,并存放在以BLOCK2为起始地址的连续存储单元中(低4位ASCII码在前,高4位ASCII码在后)。子程序和运算程序设计主程序……ACALLSUB(LCALLSUB)……SUB: ……;子程序RET子程序和运算程序设计子程序的参数传递共享1.利用寄存器或片内RAM存储器区2.利用寄存器传送子程序参数地址3.利用堆栈传送子程序参数4.利用位寻址区传送子程序参数格式:;子程序名;子程序功能:;入口参数:;出口参数:;占用资源:子程序名:通过寄存器传递方法简单、参数有限例:

ORG0000HMain:movsp,#5FHmovR0,#40HmovR7,#10HlcallZerosjmp$;子程序名:Zero;功能:对内部数据区清零;入口参数:R0内部数据区;R7内部数据区长度;出口参数:无;占用资源:A,R0,R7Zero:

clrALoop:

mov@R0,A

incR0

djnz,R7,Loop

ret

END

通过堆栈传递

ORG0000HMain:MOVSP,#5FHmov70H,#40hmov71H,#10Hpush70hpush71hlcallZerosjmp$;子程序名:Zero;功能:对内部数据区清零;入口参数:70内部数据区地址;71h内部数据区长度;出口参数:无;占用资源:,R0,R7,70h,71hZero:popDPHpopDPLpop07h;R7pop00h;R0clrALoop:mov@R0,AincR0djnz,R7,LooppushDPLpushDPHretEND

SP5FH61H40H10HPCLPCH63H通过数据指针(DPTR)传递将待传递参数紧跟在调用指令之后

ORG0000HMain:MOVSP,#6FHNOPACALLPRINTDB‘THISISAN’DB’EXAMPLE’DB0AH,0DH,00HNEXT:NOPSJMP$PRINT:POPDPHPOPDPLPPP1:MOVA,#00HMOVCA,@A+DPTR

INCDPTRJZPPPENDPPP2:MOVP1,ASJMPPPP1PPPEND:JMP@A+DPTREND子程序和运算程序设计【例3.49】设MDA和MDB中有两数a和b,请编写程序求c=a2+b2,并把c送入MDC.设a和b都是小于10的数.ORG 0000HMDA DATA20HMDB DATA21HMDC DATA22HMOVA,MDAACALLSQRMOVR1,AMOV A,MDBACALLSQRADDA,R1MOVMDC,ASJMP$SQR: ADDA,#01H MOVCA,@A+PC RETSTAB:DB0,1,4,9,… END子程序和运算程序设计【例3.50】在HEX单元有两个十六进制数,编程分别把它们转换成ASCII码,存入ASC和ASC+1单元.ORG0000HPUSHHEXACALLHASCPOPASCMOVA,HEXSWAP APUSH ACCACALLHASCPOPASC+1SJMP$子程序和运算程序设计PUSHACCINCSPINCSPRETASCTAB:DB30H,31H,… DB41H,42H,…HASC:DEC SP DEC SP POP ACC ANL A,#0FH ADD A,#07H MOVCA,@A+PC子程序和运算程序设计【例3.51】已知片内RAM中有一个五位BCD数(高位在前,低位在后)

温馨提示

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

评论

0/150

提交评论