《MCS-51单片机汇编语言程序设计举例.ppt》由会员分享,可在线阅读,更多相关《MCS-51单片机汇编语言程序设计举例.ppt(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、MCS-51单片机汇编语言程序设计举例1 查表程序设计查表程序设计 查表程序是一种常用程序,它广泛使用于 LED显示控制、打印机打印控制、数据补偿、数值计算、转换等功能程序中,这类程序具有简单、执行速度快等特点。所谓查表法,就是预先将满足一定精度要求的表示变量与函数值之间关系的一张表求出,然后把这张表存于单片机的程序存储器中,这时自变量值为单元地址,相应的函数值为该地址单元中的内容。查表,就是根据变量 X在表格中查找对应的函数值 Y,使 Y=f(X)。MCS-51指令系统中,有两条查表指令:MOVC A,A+PC MOVC A,A+DPTR 例例 1 一个十六进制数存放在内部 RAM 的 HE
2、X单元的低 4 位中,将其转换成ASCII码并送回 HEX单元。十六进制 09的ASCII码为 30H39H,AF的ASCII码为41H46H,ASCII码表格的首地址为ASCTAB。编程如下:ORG 1000H HEXASC:MOV A,HEX ANL A,0FH ADD A,03H;修改指针 MOVC A,A+PC MOV HEX,A RET ASCTAB:DB 30H,31H,32H,33H,34H DB 35H,36H,37H,38H,39H DB 41H,42H,43H,44H,45H DB 46H 在这个程序中,查表指令MOVC A,A+PC到表格首地址有两条指令,占用 3 个字节
3、地址空间,故修改指针应加 3。例例 2 设有一个巡回检测报警装置,需对 96 路输入进行控制,每路有一个额定的最大值,是双字节数。当检测量大于该路对应的最大值时,就越限报警。假设R2 为保存检测路数的寄存器,其对应的最大额定值存放于 31H和 32H单元中。查找最大额定值的程序如下:FMAX:MOV A,R2 ADD A,R2 ;表中一个额定值为2个字节 MOV 31H,A MOV DPTR,TAB;表首址 MOVC A,A+DPTR;查表读取第一个字节 XCH A,31H ;第一个字节内容存入31H INC DPTR MOVC A,A+DPTR;查表读取第二个字节 MOV 32H,A;第二字
4、节的内容存入32H TAB:DW 1230H,1450H,.DW 2230H,2440H,.DW 3120H,3300H,.2 数制转换数制转换 例例 4 将一个字节二进制数转换成 3 位非压缩型BCD码。设一个字节二进制数在内部RAM 40H单元,转换结果放入内部 RAM 50H#,51H,52H单元中(高位在前),程序如下:HEXBCD:MOV A,40H MOV B,100 DIV AB MOV 50H,A MOV A,10 XCH A,B DIV AB MOV 51H,A MOV 52H,B RET 例5 BCD码转换为二进制代码(方法:先将高半字节 1010,再加低半字节)。设待转换
5、的BCD 码存放在R2中DTOB MOV A,R2;ANL A,#0F0H;屏蔽低四位 SWAP A MOV B,#0AH MUL AB MOV R3,A MOV A,R2 ANL A,#0FH 屏蔽高四位 ADD A,R3 得转换结果 RET例6 双字节BCD码转换为二进制码设BCD码表示的4位十进制数分别存放在R1和R2中,其中R2存放千、百位,R1存放十、个位。转换后的结果低字节存放在20H单元,高字节存放在21H单元。转换时,可由高位到低位逐位检查BCD码的数值,然后累加各十进制对应的二进制数。其中,千位 1000=03E8H 百位 100=0064H十位 10=000AH 各位 BC
6、D码=二进制码例 BCD码3245=0011 0010 0100 0101则千位累加了3次03E8H,百位累加了2次0064H,十位累加了4次000AH,再加上个位。BBCD11:MOV 20H,#00H;MOV 21H,#00H;MOV R3,#0E8H;MOV R4#00H;一千位二进制数送R3,R4 MOV A,R2 ANL A,#0F0H;屏蔽百位 SWAP A;千位换到低四位 JZ BRAN1;LOOP1:DEC A ;千位减1 ACALL ADDT ;调用累加子程序 JNZ LOOP1 ;千位为0否?BRAN1:MOV R3,#64H;MOV R4,#00H;一百位二进制数送R3,
7、R4 MOV A,R2 ;ANL A,#0FH ;屏蔽千位 JZ BRAN2;百位为十转到个位处执行LOOP2 DEC A ;百位减1 ACALL ADDT;调用累加子程序 JNZ LOOP2;百位为0否BRAB2 MOV R3,#0AH ;十的二进制数送R3 MOV A,R1 ;ANL#F0H ;屏蔽个位 SWAP A ;十位换到低四位 JZ BRAN3 ;十位为0转到个位处执行LOOP3:DEC A ;十位减1 ACALL ADDT;调用累加子程序 JNZ LOOP3 ;十位为0否?BRAN3:MOV A,R1 ;ANL A,#0FH;屏蔽十位 MOV R3,A;ACALL ADDT;RE
8、T ADDT:PUSH PSW PUSH ACC CLR C MOV A,20H ADD A,R3 低位字节相加MOV 20H,A 结果送20H单元MOV A,21HADDC A,R4 高位字节相加MOV 21H,APOP ACCPOP PSWRET3 运算程序运算程序 一、一、加、加、减法程序减法程序 例例 7 将40H开始存放的 10 个字节的数与 50H开始存放的10 个字节的数相减(假设被减数大于减数)。设被减数指针为 R0,减数指针为 R1,差数放回被减数单元,R5 存放字节个数,则程序如下:SUB:MOV R0,40HMOV R1,50HMOV R5,10CLR CSUB1:MOV
9、 A,R0SUBB A,R1MOV R0,AINC R0INC R1DJNZ R5,SUB1RET 二、二、乘法运算程序乘法运算程序 在计算机中,常将乘法采用移位和加法来实现。例例8 将(R2R3)和(R6R7)中双字节无符号数相乘,结果存入 R4R5R6R7。此乘法可以采用部分积右移的方法来实现,其程序框图如图 4.6 所示,程序如下:NMUL:MOV R4,0 ;初始化 MOV R5,0 CLR C MOV R0,16NMUL1:MOV A,R4 ;CyR4R5R6R7右移一位 RRC A MOV R4,A MOV A,R5 RRC A MOV R5,A MOV A,R6 RRC A MO
10、V R6,A MOV A,R7 RRC MOV R7,A JNC NMUL2;C为移出乘数的最低位 MOV A,R5;(R4R5)+(R6F7)(R4R5)ADD A,R3 MOV R5,A MOV A,R4 ADDC A,R2 MOV R4,A NMUL2:DJNZR0,NMUL1;循环16位 MOV A,R4;最后结果再移一位 RRC A MOV R4,A MOV A,R5 RRC A MOV R5,A MOV A,R6 RRC A MOV R6,A MOV A,R7 RRC A MOV R7,A RET 图4.6 NMUL程序框图 例例 9 假定被乘数在(R4R3)中,乘数放在R2中,乘
11、积放在R7R6和R5中。MCS-51 中有 8 位数的乘法指令MUL,用它来实现多字节乘法时,可表示为 (R4R3)(R2)=(R4)28+(R3)(R2)=(R4)(R2)28+(R3)(R2)其中(R4)(R2)和(R3)(R2)都是可直接用MUL指令来实现,而乘以28意味着左移 8 位。由此可编写如下程序:NMUL1:MOV A,R2 MOV B,R3 MUL AB;(R3)(R2)MOV R5,A ;积的低位送R5 MOV R6,B ;积的高位送R6 MOV A,R2 MOV B,R4 MUL AB ;(R4)(R2)ADD A,R6;(R3)(R2)的高位加(R4)(R2)的低位MO
12、V A,B ADDC A,00H ;(R4)(R2)的高位加Cy MOV R7,A ;结果送R7 RET 三、三、除法运算程序除法运算程序 除法是乘法的逆运算,用移位、相减的方法来完成。首先比较被除数的高位字与除数,如被除数高位大于除数,则商为1,并从被除数中减去除数,形成一个部分余数;否则商位为 0,不执行减法。然后把新的部分余数左移一位,并与除数再次进行比较。循环此步骤,直到被除数的所有位都处理完为止,一般商的字长为 n,则需循环n次。一般计算机中,被除数均为双倍位,即如果除数和商为双字节,则被除数为四字节。如果在除法中发生商大于规定字节,称为溢出。在进行除法前,应该检查是否会产生溢出。一
13、般可在进行除法前,先比较被除数的高位与除数,如被除数高位大于除数,则溢出,置溢出标志,不执行除法。图 4.7 除法程序的流程 例例 10 将(R4R5R6R7)除 以(R2R3),商 放 在(R6R7)中,余数放在(R4R5)中。NDIV:MOV A,R5 ;判商是否产生溢出 CLR C SUBB A,R3 MOV A,R4 SUBB A,R2 JNC NDIV1 ;溢出,转溢出处理 MOV B,16;无溢出,执行除法 NDIV2:CLR C;被除数左移一位,低位送 0 MOV A,R7 RLC A MOV R7,A MOV A,R6 RLC A MOV R6,A MOV A,R5 RLC A MOV R5,A XCH A,R4 RLC A XCH A,R4 MOV F0,C;保护移出的最高位 CLR C SUBB A,R3;部分余数与除数比较 MOV R1,A MOV A,R4 SUBB A,R2 JB F0,NDIV3;移出的高位为 1,肯定够减 JC NDIV4;否则,(Cy)=0才够减 NDIV3:MOV R4,A;回送减法结果 MOV A,R1 MOV R5,A INC R7;商上1 NDIV4:DJNZ B,NDIV2;循环次数减 1,若不为零则循环 CLR F0 ;正常执行无溢出 F0=0 RET NDIV1:SETB F0 ;溢出F0=1 RET