《【大学课件】MCS51单片机指令系统与汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《【大学课件】MCS51单片机指令系统与汇编语言程序设计.ppt(79页珍藏版)》请在三一办公上搜索。
1、,2.3.5 位操作指令,位操作(布尔变量操作):操作数不是字节,而是字节中的某个位。每位的取值只能取0或1。指令的寻址范围:片内RAM位寻址区20H2FH,SFR中的11个可位寻址特殊寄存器中的83个可寻址位。特点:以进位标志Cy作为位累加器,可以实现布尔变量的传送、运算和控制转移等功能。指令中的位地址的表达方式:直接地址方式(如0AFH)、特殊功能寄存器名.位序号(如PSW.3)、字节地址.位序号(如0D0H.0)、位名称方式(如F0)和用户定义名称等几种方式。,http:/,1.位数据传送指令(2条)特点:在可寻址位与位累加器Cy之间进行的。不能在两个可寻址位间直接进行传送。指令格式:M
2、OV C,bit;(Cy)(bit)MOV bit,C;(bit)(Cy)例:比较 MOV A,20H;片内RAM 20H单元内容送A,传送8位二进制数 MOV C,20H;位地址为20H的位送C,传送1位二进制数P71 例2.55,http:/,2.位逻辑操作指令(6条),指令格式:操作码 C,其中:操作码包括ANL、ORL;包括bit、bit。CPL;dest 包括Cy、bit。功能:位逻辑操作指令用于位逻辑操作,还可用于对组合逻辑电路的模拟。采用位操作指令进行组合逻辑电路的设计比采用字节型逻辑指令节约存储空间,运算操作十分方便。P71 例2.56,http:/,3.位状态(置位、清0)控
3、制指令(4条)指令格式:CLR;0 SETB;1 其中:包括Cy、bit。4.位条件(控制)转移指令(5条)特点:以位的状态作为实现程序转移的判断条件。指令格式:(1)以进位标志位Cy内容为条件的转移指令 JC rel;若(Cy)=1,则转移(PC)(PC)+2+rel,否则顺序执行 JNC rel;若(Cy)=0,则转移(PC)(PC)+2+rel,否则顺序执行,http:/,(2)以位地址bit内容为条件的转移指令指令格式:JB bit,rel;若(bit)=1,则转移(PC)(PC)+3+rel,否则顺序执行 JNB bit,rel;若(bit)=0,则转移(PC)(PC)+3+rel,
4、否则顺序执行 JBC bit,rel;若(bit)=1,则转移(PC)(PC)+3+rel,且(bit)0,否则顺序执行,http:/,P73 例2.58,ORG 0100H MOV DPTR,#DATA MOV R0,#30H MOV R1,#40HLOOP:MOVX A,DPTR CJNE A,#0DH,LOOP1 SJMP$LOOP1:JB ACC.7,LOOP2 MOV R0,A INC R0 INC DPTR AJMP LOOP,LOOP2:MOV R1,A INC R1 INC DPTR AJMP LOOP END,http:/,2.4 汇编语言及程序设计,程序设计:就是编制计算机
5、的程序,即应用计算机所能识别的、接受的语言把要解决的问题的步骤有序地描述出来。程序设计语言的种类:(1)机器语言:机器语言是用二进制代码表示的计算机惟一能识别和执行的最原始的程序设计语言。(2)汇编语言:利用指令助记符来描述的程序设计语言。(3)高级语言:高级语言接近于人的自然语言,是面向过程而独立于机器的通用语言。汇编语言的指令类型:MCS-51单片机汇编语言,包含两类不同性质的指令。(1)指令:即指令系统中的指令。它们都是机器能够执行的指令,每一条指令都有对应的机器码。(2)伪指令:汇编时用于控制汇编的指令。它们都是机器不执行的指令,无机器码。,http:/,汇编语言的语句格式:汇编语言源
6、程序是由汇编语句(即指令)组成的。典型的汇编语句格式如下:标号:操作码 操作数,操作数;注释数据的表示方法:(1)二进制数:由0、1组成,“逢2进1”的数制。如:01011110B(01 后缀:B/b)(2)十六进制数:便于读写记忆的二进制数的简写形式。(09,AF 后缀:H/h)(3)十进制数:可用二进制数表示(也称为BCD码,09表示为:00001001B),也可用十进制数表示(后缀:D/d或无后缀)。,http:/,2.4.1 汇编语言程序设计的步骤,汇编语言程序设计:根据任务要求,采用汇编语言编制程序的过程称为汇编语言程序设计。汇编语言程序设计的步骤:(1)拟订设计任务书(2)建立数学
7、模型(3)确定算法(4)分配内存单元,编制程序流程图(5)编制源程序 进一步合理分配存储器单元和了解I/O接口地址;按功能设计程序,明确各程序之间的相互关系;用注释行说明程序,便于阅读和修改调试和修改。(6)上机调试(7)程序优化,http:/,编制程序流程图:是指用各种图形、符号、指向线等来说明程序设计的过程。国际通用的图形和符号说明如下:椭圆框:开始和结束框,在程序的开始和结束时使用。矩形框:处理框,表示要进行的各种操作。菱形框:判断框,表示条件判断,以决定程序的流向。流向线:流程线,表示程序执行的流向。圆 圈:连接符,表示不同页之间的流程连接。各种几何图形符号如下图所示。,http:/,
8、2.4.2 顺序程序设计,特点:顺序结构程序是最简单、最基本的程序。程序按编写的顺序依次往下执行每一条指令,直到最后一条。它能够解决某些实际问题,或成为复杂程序的子程序。例题2 将片内RAM 30H单元中的两位压缩BCD码转换成二进制数送到片内RAM 40H单元中。,解:两位压缩BCD码转换成二进制数的算法为:(a1a 0)BCD=10a1a0 程序流程图如右图所示。如:25=210+5用BCD码:(00100101)BCD=00101010+0101=11001,http:/,程序如下:ORG 1000HSTART:MOV A,30H;取两位BCD压缩码a1a0送A ANL A,#0F0H;
9、取高4位BCD码a1 SWAP A;高4位与低4位换位 MOV B,#0AH;将二进制数10送入B MUL AB;将10a1送入A中 MOV R0,A;结果送入R0中保存 MOV A,30H;再取两位BCD压缩码a1a0送A ANL A,#0FH;取低4位BCD码a0 ADD A,R0;求和10a1+a0 MOV 40H,A;结果送入40H保存 SJMP$;程序执行完,“原地踏步”END,http:/,例题3利用查表指令将内部RAM中20H单元的压缩BCD码拆开,转换成相应的ASCII码,存入21H、22H中,高位存在22H。解:BCD码的09对应的ASCII码为30H39H,将30H39H按
10、大小顺序排列放入表TABLE中,先将BCD码拆分,将拆分后的BCD码送入A,表首址送入DPTR,然后领用查表指令MOVC A,A+DPTR,查表即得结果,然后存入21H、22H中。程序如下:ORG 1000H START:MOV DPTR,#TABLEMOVA,20HANLA,#0FHMOVCA,A+DPTRMOV21H,A,http:/,MOVA,20HANLA,#0F0HSWAPAMOVCA,A+DPTRMOV22H,ASJMP TABLE:DB 30H,31H,32H,33H,34H DB 35H,36H,37H,38H,39H END,http:/,2.4.3 分支程序设计,特点:根据
11、不同的条件,确定程序的走向。它主要靠条件转移指令、比较转移指令和位转移指令来实现。分支程序的结构如右图所示。,分支程序的设计要点如下:(1)先建立可供条件转移指令测试的条件。(2)选用合适的条件转移指令。(3)在转移的目的地址处设定标号。,http:/,解:此题有三个条件,所以有三个分支程序。这是一个三分支归一的条件转移问题。X是有符号数,判断符号位是0还是1可利用JB或JNB指令。判断X是否等于0则直接可以使用累加器A的判0指令。程序流程图如右图所示。,例题4 求符号函数的值。已知片内RAM的 40H单元内有一自变量X,编制程序按如下条件求函数Y的值,并将其存入片内RAM 的41H单元中。1
12、 X0Y=0 X=0-1X0,http:/,ORG 1000HSTART:MOV A,40H;将X送入A中 JZ COMP;若A为0,转至COMP处 JNB ACC.7,POST;若A第7位不为1(X为正数),则程序转到 POST处,否则(X为负数)程序往下执行 MOV A,#0FFH;将1(补码)送入A中 SJMP COMP;程序转到COMP处POST:MOV A,#01H;将+1送入A中COMP:MOV 41H,A;结果存入Y SJMP$;程序执行完,“原地踏步”END,http:/,P76 例2.61,已知片内RAM的30H单元中存的有符号二进制数,求其补码,将补码存回30H单元。ORG
13、 0000H LJMP CMPT ORG 0030HCMPT:MOV A,30H JNB ACC.7,NCH;若A中为正数,不求补 CPL A;若A中为负数,求补码 ADD A,#01;A中数求反加1 ORL A,#80H;在符号位拼1 MOV 30H,ANCH:SJMP$END,http:/,2.4.4 循环程序设计,特点:程序中含有可以重复执行的程序段(循环体),采用循环程序可以有效地缩短程序,减少程序占用的内存空间,使程序的结构紧凑、可读性好。组成:循环程序一般由下面四部分组成。(1)循环初始化。位于循环程序开头,用于完成循环前的准备工作,如设置各工作单元的初始值以及循环次数。(2)循环
14、体。循环程序的主体,位于循环体内,是循环程序的工作程序,在执行中会被多次重复使用。要求编写得尽可能简练,以提高程序的执行速度。(3)循环控制。位于循环体内,一般由循环次数修改、循环修改和条件语句等组成,用于控制循环次数和修改每次循环时的参数。(4)循环结束。用于存放执行循环程序所得的结果,以及恢复各工作单元的初值。,http:/,循环程序的结构:(1)先循环处理,后循环控制(即先处理后控制)。如左下图所示。(2)先循环控制,后循环处理(即先控制后处理)。如右下图所示。,http:/,循环程序按结构形式,有单重循环与多重循环。1单重循环程序定义:循环体内部不包括其他循环的程序称为单重循环程序。,
15、例题5 已知片内RAM 30H3FH单元中存放了16个二进制无符号数,编制程序求它们的累加和,并将其和数存放在R4,R5中。解:每次求和的过程相同,可以用循环程序实现。16个二进制无符号数求和,循环程序的循环次数应为16次(存放在R2中),它们的和放在R4,R5中(R4存高8位,R5存低8位)。程序流程图如右图所示。,http:/,程序如下:ORG 1000HSTART:MOV R0,#30H MOV R2,#10H;设置循环次数(16)MOV R4,#00H;和高位单元R4清0 MOV R5,#00H;和低位单元R5清0LOOP:MOV A,R5;和低8位的内容送A ADD A,R0;将R0
16、与R5的内容相加并产生进位Cy MOV R5,A;低8位的结果送R5 CLR A;A清0 ADDC A,R4;将R4的内容和Cy相加 MOV R4,A;高8位的结果送R4 INC R0;地址递增(加1)DJNZ R2,LOOP;若循环次数减1不为0,则转到LOOP处循环;否则,循环结束 SJMP$END,http:/,例题6 编制程序将片内RAM的30H4FH单元中的内容传送至片外RAM的2000H开始的单元中。,解:每次传送数据的的过程相同,可以用循环程序实现。30H4FH共32个单元,循环次数应为32次(保存在R2中),为了方便每次传送数据时地址的修改,送片内RAM数据区首地址送R0,片外
17、RAM数据区首地址送DPTR。程序流程图如右图所示。,http:/,程序如下:ORG 1000H START:MOV R0,#30H MOV DPTR,#2000H MOV R2,#20H;设置循环次数 LOOP:MOV A,R0;将片内RAM数据区内容送A MOVX DPTR,A;将A的内容送片外RAM数据区 INC R0;源地址递增 INC DPTR;目的地址递增 DJNZ R2,LOOP;若R2的不为0,则转到LOOP处继续循 环;否则循环结束 SJMP$END,http:/,2多重循环程序,定义:若循环中还包括有循环,称为多重循环(或循环嵌套)。例题7 编制程序设计50ms延时程序。解
18、:延时程序与MCS-51指令执行时间(机器周期数)和晶振频率fOSC有直接的关系。当fOSC=12MHz时,机器周期为1s,执行一条DJNZ指令需要2个机器周期,时间为2s。50ms 2s255,因此单重循环程序无法实现,可采用双重循环的方法编写50ms延时程序。,http:/,程序如下:ORG 1000H DELAY:MOV R7,#200;设置外循环次数(此条指令需要1个机器周期)DLY1:MOV R6,#123;设置内循环次数 DLY2:DJNZ R6,DLY2;(R6)1=0,则顺序执行,否则转回 DLY2继续循环,延时时间为2s123=246s NOP;延时时间为1s DJNZ R7
19、,DLY1;(R7)1=0,则顺序执行,否则转回DLY1继续循环,延时时间为(246211)20021=50.003ms RET;子程序结束 END,http:/,3设计循环程序时应注意的问题(1)循环程序是一个有始有终的整体,它的执行是有条件的,所以要避免从循环体外直接转到循环体内部。(2)多重循环程序是从外层向内层一层一层进入,循环结束时是由内层到外层一层一层退出的。在多重循环中,只允许外重循环嵌套内重循环。不允许循环相互交叉,也不允许从循环程序的外部跳入循环程序的内部。(3)编写循环程序时,首先要确定程序结构,处理好逻辑关系。一般情况下,一个循环体的设计可以从第一次执行情况入手,先画出重
20、复执行的程序框图,然后再加上循环控制和置循环初值部分,使其成为一个完整的循环程序。(4)循环体是循环程序中重复执行的部分,应仔细推敲,合理安排,应从改进算法、选择合适的指令入手对其进行优化,以达到缩短程序执行时间的目的。,http:/,4排序程序设计(冒泡法),例题7 设MCS-51单片机内部RAM起始地址为30H的数据块中共存有64个无符号数,编制程序使它们按从小到大的顺序排列。解:设64个无符号数在数据块中的顺序为:e64,e63,e2,e1,使他们从小到大顺序排列的方法很多,现以冒泡法为例进行介绍。冒泡法又称两两比较法。它先使e64和e63比较,若e64e63,则两个存储单元中的内容交换
21、,否则就不交换。然后使e63和e62比较,按同样的原则决定是否交换。一直比较下去,最后完成e2和e1的比较及交换,经过N1=63次比较(常用内循环63次来实现)后,e1的位置上必然得到数组中的最大值,犹如一个气泡从水低冒出来一样,如下页图所示(图中只画出了6个数的比较过程)。,http:/,http:/,第二次冒泡过程和第一次完全相同,比较次数也可以是63次(其实只需要62次,因为e1的位置上是数据块中的最大数,不需要再比较),冒泡后在e2的位置上得到数组中的次大数,如上页图所示。如此冒泡(即大循环)共63次(内循环6363次)便可完成64个数的排序。实际编程时,可通过设置“交换标志”用来控制
22、是否再需要冒泡,若刚刚进行完的冒泡中发生过数据交换(即排序尚未完成),应继续进行冒泡;若进行完的冒泡中未发生过数据交换(即排序已经完成),冒泡应该停止。例如:对于一个已经排好序的数组:1,2,3,63,64,排序程序只要进行一次循环便可根据“交换标志”的状态而结束排序程序的再执行,这自然可以减少631=62次的冒泡时间。冒泡法程序流程图如下页图所示。,http:/,http:/,程序如下:ORG 1000HMOV R0,#30H;数据区首地址送R0MOV R3,#63H;设置外循环次数在R3中LP0:CLR 7FH;交换标志位2FH.7清0MOV A,R3;取外循环次数MOV R2,A;设置内
23、循环次数LP1:MOV 20H,R0;数据区数据送20H单元中MOV A,R0;20H内容送AINC R0;修改地址指针(R0+1)MOV 21H,R0;下一个地址的内容送21HCLR C;Cy清0 SUBB A,21H;前一个单元的内容与下一个单元的内容比较JC LP2;若有借位(Cy=1),前者小,程序转移到LP2处执行,若无借位(Cy=0),前者大,不转移,程序往下执行,http:/,MOV R0,20H;前、后内容交换DEC R0MOV R0,21H INC R0;修改地址指针(R0+1)SETB 7FH;置位交换标志位2FH.7为1LP2:DJNZ R2,LP1;修改内循环次数R2(
24、减少),若R20,则程序转到LP1 处仍执行循环,若R2=0,程序结束循环,程序往下执行JNB 7FH,LP3;交换标志位2FH.7若为0,则程序转到LP3处结束循环DJNZ R3,LP0;修改外循环次数R3(减少),若R30,程序转到LP0处,执行仍循环,若R3=0,程序结束循环,往下执行LP3:SJMP$;程序执行完,“原地踏步”END,http:/,2.4.5 查表程序设计,查表:根据存放在ROM中数据表格的项数来查找与它对应的表中值。适用场合:主要应用于数码显示、打印字符的转换、数据转换等场合。1.采用MOVC A,A+DPTR指令查表程序的设计方法(1)在程序存储器中建立相应的函数表
25、(设自变量为X)。(2)计算出这个表中所有的函数值Y。将这群函数值按顺序存放在起始(基)地址为TABLE的程序存储器中。(3)将表格首地址TABLE送入DPTR,X送入A,采用查表指令MOVC A,A+DPTR完成查表,就可以得到与X相对应的Y值于累加器A中。,http:/,2.采用MOVC A,A+PC指令查表程序的设计方法 当使用PC作为基址寄存器时,由于PC本身是一个程序计数器,与指令的存放地址有关,查表时其操作有所不同。(1)在程序存储器中建立相应的函数表(设自变量为X)。(2)计算出这个表中所有的函数值Y。将这群函数值按顺序存放在起始(基)地址为TABLE的程序存储器中。(3)X送入
26、A,使用ADD A,#data指令对累加器A的内容进行修正,偏移量data由公式data=函数数据表首地址PC1确定,即data值等于查表指令和函数表之间的字节数。(4)采用查表指令MOVC A,A+PC完成查表,就可以得到与X相对应的Y值于累加器A中。,http:/,例题8利用查表的方法编写Y=X2(X=0,1,2,9)的程序。解:设变量X的值存放在内存30H单元中,求得的Y的值存放在内存31H单元中。平方表存放在首地址为TABLE的程序存储器中。方法一:采用MOVC A,A+DPTR指令实现,查表过程如下图2.所示。,http:/,程序如下:ORG 1000H START:MOV A,30
27、H;将查表的变量X送入A MOV DPTR,#TABLE;将查表的16位基地址TABLE送DPTR MOVC A,A+DPTR;将查表结果Y送A MOV 31H,A;Y值最后放入31H中 SJMP$TABLE:DB 0,1,4,9,16 DB 25,36,49,64,81 END方法二:采用MOVC A,A+PC指令实现,查表过程如下页图所示。程序如下:,http:/,ORG 1000H START:MOV A,30H;将查表的变量X送入A ADD A,#04H;定位修正 MOVC A,A+PC;将查表结果Y送A MOV 31H,A;Y值最后放入31H中 SJMP$TABLE:DB 0,1,4
28、,9,16 DB 25,36,49,64,81 END,http:/,P84 例2.67,将存放在片内RAM 40H单元的1位16进制数转换为ASCII码,分别用查表和计算法完成。方法1:用查表求解。(略)方法2:计算求解:ORG 0000H LP1:ADD A,#0AH LJMP START ADD A,30H ORG 0030H LP2:MOV 40H,ASTART:MOV A,40H SJMP$ANL A,#0FH END CLR C SUBB A,#0AH JC LP1 ADD A,#0AH ADD A,37H SJMP LP2,http:/,2.4.6 子程序设计,子程序:能够完成确
29、定任务,并能为其他程序反复调用的程序段称为子程序。特点:子程序可以多次重复使用,避免重复性工作,缩短整个程序,节省程序存储空间,有效地简化程序的逻辑结构,便于程序调试。主程序:调用子程序的程序叫做主程序或称调用程序。主程序 子程序.AD1:PUSH PSW MOV A,20H PUSH 06H LCALL AD1 RL AMOV 30H,A RL A.POP 06H POP PSW RET,http:/,1子程序的调用与返回,主程序调用子程序的过程:在主程序中需要执行这种操作的地方执行一条调用指令(LCALL或ACALL),转到子程序,而完成规定的操作后,再在子程序最后应用RET返回指令返回到
30、主程序断点处,继续执行下去。,http:/,(1)子程序的调用子程序的入口地址:子程序的第一条指令地址称为子程序的入口地址,常用标号表示。子程序的调用过程:单片机执行ACALL或LCALL指令时,首先将当前的PC值(调用指令的下一条指令的首地址)压入堆栈保存(低8位先进栈,高8位后进栈),然后将子程序的入口地址送入PC,转去执行子程序。(2)子程序的返回主程序的断点地址:子程序执行完毕后,返回主程序的地址称为主程序的断点地址,它在堆栈中保存。子程序的返回过程:子程序执行RET指令时,将栈顶的内容(返回地址)弹回给PC(先弹回PC的高8位,后弹回PC的低8位),使程序回到原先被中断的主程序地址(
31、断点地址)去继续执行。,http:/,注意:中断服务程序是一种特殊的子程序,它是在计算机响应中断时,由硬件完成调用而进入相应的中断服务程序。RETI指令与RET指令相似,区别在于RET是从子程序返回,RETI是从中断服务程序返回。2保存与恢复寄存器内容(1)保护现场 主程序转入子程序后,保护主程序的信息不会在运行子程序时丢失的过程称为保护现场。保护现场通常在进入子程序的开始时,由堆栈完成。如:PUSH PSW PUSH ACC,http:/,(2)恢复现场 从子程序返回时,将保存在堆栈中的主程序的信息还原的过程称为恢复现场。恢复现场通常在从子程序返回之前将堆栈中保存的内容弹回各自的寄存器。如:
32、POP ACC POP PSW 3子程序的参数传递 主程序在调用子程序时传送给子程序的参数和子程序结束后送回主程序的参数统称为参数传递。入口参数:子程序需要的原始参数。主程序在调用子程序前将入口参数送到约定的存储器单元(或寄存器)中,然后子程序从约定的存储器单元(或寄存器)中获得这些入口参数。出口参数:子程序根据入口参数执行程序后获得的结果参数。子程序在结束前将出口参数送到约定的存储器单元(或寄存器)中,然后主程序从约定的存储器单元(或寄存器)中获得这些出口参数。,http:/,(3)传送子程序参数的方法 应用工作寄存器或累加器传递参数。优点是程序简单、运算速度较快,缺点是工作寄存器有限。应用
33、指针寄存器传递参数。优点是能有效节省传递数据的工作量,并可实现可变长度运算。应用堆栈传递参数。优点是简单,能传递的数据量较大,不必为特定的参数分配存储单元。利用位地址传送子程序参数。4子程序的嵌套 在子程序中若再调用子程序,称为子程序的嵌套。MCS-51单片机允许多重嵌套。如下页图所示。,http:/,5编写子程序时应注意的问题 子程序的入口地址一般用标号表示,标号习惯上以子程序的任务命名。例如,延时子程序常以DELAY作为标号。主程序通过调用指令调用子程序,子程序返回主程序之前,必须执行子程序末尾的一条返回指令RET。,单片机能自动保护和恢复主程序的断点地址。但对于各工作寄存器、特殊功能寄存
34、器和内存单元的内容,则必须通过保护现场和恢复现场实现保护。子程序内部必须使用相对转移指令,以便子程序可以放在程序存储器64KB存储空间的任何子域并能为主程序调用,汇编时生成浮动代码。子程序的参数传递方法同样适用于中断服务程序。,http:/,例题9 编制程序实现c=a2+b2,(a,b均为1位十进制数)。,解:计算某数的平方可采用查表的方法实现,并编写成子程序。只要两次调用子程序,并求和就可得运算结果。设a,b分别存放于片内RAM的30H,31H两个单元中,结果c存放于片内RAM的40H单元。程序流程图如右图所示。,http:/,主程序如下:ORG 1000H SR:MOV A,30H;将30
35、H中的内容a送入A ACALL SQR;转求平方子程序SQR处执行 MOV R1,A;将a2结果送R1 MOV A,31H;将31H中的内容b送入A ACALL SQR;转求平方子程序SQR处执行 ADD A,R1;a2+b2结果送A MOV 40H,A;结果送40H单元中 SJMP$;程序执行完,“原地踏步”求平方子程序如下(采用查平方表的方法):SQR:INC A MOVC A,A+PC RET TABLE:DB 0,1,4,9,16 DB 25,36,49,64,81 END,http:/,P88 例2.69,编写子程序,将由R0和R1所指的片内RAM中的两个3字节无符号数相加,结果送到
36、R0所指的片内RAM中。入口参数:R0,R1分别指向两个加数的低字节。出口参数:R0指向结果的高位字节子程序功能:将由R0和R1所指的片内RAM中的两个3字节无符号数相加,结果送到R0所指的片内RAM中。,http:/,程序:,ORG 0100HNADD:MOV R7,#03 CLR CNADD1:MOV A,R0 ADDC A,R1 MOV R0,A INC R0 INC R1 DJNZ R7,NADD1 DEC R0 RET END,http:/,P102 作业题20,ORG 0100HMOV R0,#30HMOV R7,#08HMOV A,#00HL1:ADD A,R0 INC R0 D
37、JNZ R7,L1 MOV B,#08H DIV AB MOV 3AH,A MOV 3BH,B SJMP$END,编程计算片内RAM30H37H这8个单元中的数的算术平均值,结果存放在3AH单元中。,http:/,2.5 程序设计举例,2.5.1 多字节算术运算程序例 2.70 已知片内RAM以BLOCK1和BLOCK2为起始的单元中,分别存有5字节无符号被减数和减数(低位在前,高位在后)。编程序求差值,并把结果存入以BLOCK1为起始地址的片内RAM中。解:两个5字节的数做减法,需要用循环结构设计程序。,http:/,程序,ORG 0100HSYSUB:MOV R0,#BLOCK1 MOV
38、R1,#BLOCK2 MOV R2,#05H CLR CLOOP:MOV A,R0 SUBB A,R1 MOV R0,A INC R0 INC R1 DJNZ R2,LOOP RET END,http:/,例2.71 编制程序实现两个16位二进制数乘法运算:,(R7R6)16(R5R4)16(R3R2R1R0)16 R7 R6 R5 R4 R4R6 R1R0 R4R7 R2R1 R5R6 R2R1 R5R7 R3R2,http:/,P89 程序,解:MCS-51乘法指令只能完成两个8位无符号数相乘,因此16位无符号数求积必须将它们分解成8位数相乘来实现。其方法有先乘后加和边乘边加两种。现以边乘
39、边加为例设计。程序如下 ORG 1000H DMUL:MOV A,R6;第一个因数的低位送A MOV B,R4;第二个因数的低位送B MUL AB;第一个因数的低位乘以第二个因数的低位 R4R6,http:/,MOV R0,A;积的低位送R0 MOV R1,B;积的高位送R1 MOV A,R7;第一个因数的高位送A MOV B,R4;第二个因数的低位送B MUL AB;R4R7 ADD A,R1;部分积相加,形成进位Cy MOV R1,A;部分积相加送R1 MOV A,B;部分积的进位Cy加到高位 ADDC A,#00H MOV R2,A MOV A,R6;第一个因数的低位送A MOV B,R
40、5;第二个因数的高位送B MUL AB;R5R6 ADD A,R1;部分积相加,形成进位Cy MOV R1,A;回送部分积 MOV A,R2,http:/,ADDC A,B;部分积相加 MOV R2,A;回送部分积 MOV A,#00H;部分积的进位Cy加到高位 ADDC A,#00H MOV R3,A;回送部分积 MOV A,R7;第一个因数的高位送A MOV B,R5;第二个因数的高位送B MUL AB;R5R7 ADD A,R2;部分积相加,形成进位Cy MOV R2,A;回送部分积 MOV A,R3 ADDC A,B;部分积相加 MOV R3,A;回送部分积 RET END,http:
41、/,2.5.2 数制转换程序,例 2.72 将4位压缩BCD码(十进制数)转换为二进制数。a3a2a1a0=a31000+a2100+a110+a0=(a310+a2)100+(a110+a0)公因式(ai10+aj),可用双重嵌套子程序的方法将公因式用内层子程序编写。(ai为高4位,aj为低4位)外层子程序入口参数:4位压缩BCD码存R6R5。外层子程序出口参数:转换后的二进制数存R6R5。内层子程序入口参数:待转换的BCD存R2。内层子程序出口参数:转换后的二进制数存R2。,http:/,程序(a310+a2)100+(a110+a0),ORG 0100HBCDBIN2:MOV A,R6
42、MOV R2,A ACALL BCDBIN1 MOV A,R2 MOV B,#100 MUL AB MOV R6,B MOV R4,A MOV A,R5 MOV R2,A ACALL BCDBIN1 MOV A,R2 ADD A,R4 MOV R5,A,MOV A,R6 ADDC A,#00 MOV R6,A RETBCDBIN1:MOV A,R2 ANL A,#0F0H MOV B,#10 SWAP A MUL AB MOV R3,A MOV A,R2 ANL A,#0FH ADD A,R3 MOV R2,A RET END,http:/,例2.73 将双字节二进制数转换成BCD码(十进制数
43、)。,解:将二进制数转换成BCD码的数学模型为:(a15a14a1a0)2=(a15215+a14214+a121+a020)10上式右侧即为欲求的BCD码。它可作如下变换(a15214+a14213+a1)2+a0括号里的内容可变为:(a15213+a14212+a13211+a2)2+a1括号里的内容可变为:(a15212+a14211+a13210+a3)2+a2 经过16次的变换后,括号里的内容可变为:(02+a15)2+a14 所以括号里的内容的通式为ai+12+ai,即为二进制数转换成BCD码的公因式。,http:/,在程序设计中,可利用左移指令(乘以2)实现ai+12,采用循环计
44、算16次公因式的方法来完成二进制数转换成BCD码。入口参数:16位无符号数送R3,R2。出口参数:共有5位BCD数,万位R6;千、百位R5;十、个位R4位。程序流程图如右图所示。,http:/,程序如下:ORG 1000H BINBCD1:CLR A;A 清0 MOV R4,A;清0出口参数寄存器 MOV R5,A MOV R6,A MOV R7,#10H;设置循环次数16 LOOP:CLR C;标志位Cy清0,为二进制数2作准备 MOV A,R2;ai+12 RLC A MOV R2,A MOV A,R3 RLC A MOV R3,A MOV A,R4,http:/,ADDC A,R4;带进
45、位自身相加,相当于乘2 DA A MOV R4,A MOV A,R5 ADDC A,R5 DA A MOV R5,A MOV A,R6 ADDC A,R6 MOV R6,A;双字节十六进制数的万位数不超过6,不用调整 DJNZ R7,LOOP;若16位未循环完,转向LOOP继续循环,否则继续执行 RET END,http:/,2.5.3 散转程序,散转程序:是一种并行分支程序(多分支程序),它是根据某种输入或运算结果,分别转向各个处理程序。在MCS-51中用JMP A+DPTR指令来实现程序的散转。转移的地址最多为256个。其结构如图下所示。,http:/,散转程序的设计方法:(1)应用转移指
46、令表实现的散转程序 直接利用转移指令(AJMP或LJMP)将欲散转的程序组形成一个转移表,然后将标志单元内容读入累加器A,转移表首址送入DPTR中,再利用散转指令JMP A+DPTR实现散转。(2)应用地址偏移量表实现的散转程序 直接利用地址偏移量形成转移表,特点是程序简单、转移表短,转移表和处理程序可位于程序存储器的任何地方。(3)应用转向地址表的散转程序 直接使用转向地址表。其表中各项即为各转向程序的入口。散转时,使用查表指令,按某单元的内容查找到对应的转向地址,将它装入DPTR,然后清累加器A,再用JMP A+DPTR指令直接转向各个分支程序。,http:/,(4)应用RET指令实现散转
47、程序 用子程序返回指令RET实现散转。其方法是:在查找到转移地址后,不是将其装入DPTR中,而是将它压入堆栈中(先低位字节,后高位字节,即模仿调用指令)。然后通过执行RET指令,将堆栈中的地址弹回到PC中实现程序的转移。例题12 编制程序用单片机实现四则运算。解:在单片机的键盘上设置“、”四个运算按键。其键值存放在寄存器R2中,当(R2)00H时做加法运算,当(R2)01H时做减法运算,当(R2)02H时做乘法运算,当(R2)03H时做除法运算。P1口输入被加数、被减数、被乘数、被除数,输出商或运算结果的低8位;P3口输入加数、减数、乘数、除数,输出余数或运算结果的高8位。,http:/,程序
48、简化流程图如下图所示。,程序如下:ORG 1000H START:MOV P1,#DATA1H;给 P1口、P3口送入数据DATA1,DATA2,用于计算 MOV P3,#DATA2H,http:/,MOV DPTR,#TABLE;将基址TABLE送DPTR CLR C;Cy清0 MOV A,R2;将运算键键值送A SUBB A,#04H;将键值和04H相减,用于产生Cy标志 JNC ERROR;若输入按键不合理,程序转ERROR处;否则,按键合理,程序继续执行 ADD A,#04H;还原键值 CLR C;Cy清0 RL A;将A左移,即键值2,形成正确的散转偏移量 JMP A+DPTR;程序
49、跳到(A)+(DPTR)形成的新地址TABLE:AJMP PRG0;程序跳到PRG0处,将要做加法运算 AJMP PRG1;程序跳到PRG1处,将要做减法运算 AJMP PRG2;程序跳到PRG2处,将要做乘法运算 AJMP PRG3;程序跳到PRG3处,将要做除法运算ERROR:(按键错误的处理程序)(略),http:/,PRG0:MOV A,P1;被加数送A ADD A,P3;做加法运算,结果送入A,并影响进位Cy MOV P1,A;和的低8位结果送P1 CLR A;A清0 ADDC A,#00H;将进位Cy送入A,作为和的高8位 MOV P3,A;和的高8位结果送P3 RET;返回开始程
50、序 PRG1:MOV A,P1;被减数送A CLR C;Cy清0 SUBB A,P3;做减法运算,结果送入A,并影响借位Cy MOV P1,A;差的低8位结果送P1 CLR A;A清0 RLC A;将借位Cy左移进A,作为差的高8位(负号)MOV P3,A;差的高8位(负号)结果送P3 RET;返回开始程序,http:/,PRG2:MOV A,P1;第一个因数送A MOV B,P3;第二个因数送B MUL AB;做乘法运算,积的低8位送入A,高8位送入B,影响Cy,OV标志位 MOV P1,A;积的低8位结果送P1 MOV P3,B;积的低8位结果送P3 RET;返回开始程序 PRG3:MOV