1、MCS-51单片机汇编语言程序设计举例,1 查表程序设计,查表程序是一种常用程序, 它广泛使用于 LED显示控制、 打印机打印控制、数据补偿、数值计算、转换等功能程序中, 这类程序具有简单、执行速度快等特点。 所谓查表法, 就是预先将满足一定精度要求的表示变量与函数值之间关系的一张表求出, 然后把这张表存于单片机的程序存储器中, 这时自变量值为单元地址, 相应的函数值为该地址单元中的内容。查表, 就是根据变量 X在表格中查找对应的函数值 Y, 使 Y=f(X)。,MCS - 51指令系统中, 有两条查表指令: MOVC A, A+PCMOVC A, A+DPTR,例 1 一个十六进制数存放在内
2、部 RAM 的 HEX单元的低 4 位中, 将其转换成ASCII码并送回 HEX单元。 十六进制 09的ASCII码为 30H39H, AF的ASCII码为41H46H, ASCII码表格的首地址为ASCTAB。编程如下:,ORG 1000H HEXASC: MOV A, HEXANL A, 0FHADD A, 03H; 修改指针MOVC A, A+PCMOV HEX, ARET,ASCTAB: DB 30H, 31H, 32H, 33H, 34HDB 35H, 36H, 37H, 38H, 39HDB 41H, 42H, 43H, 44H, 45HDB 46H在这个程序中, 查表指令MOVC
3、 A, A+PC到表格首地址有两条指令, 占用 3 个字节地址空间, 故修改指针应加 3。,例 2 设有一个巡回检测报警装置, 需对 96 路输入进行控制, 每路有一个额定的最大值, 是双字节数。当检测量大于该路对应的最大值时, 就越限报警。假设R2 为保存检测路数的寄存器, 其对应的最大额定值存放于 31H和 32H单元中。 查找最大额定值的程序如下:,FMAX: MOV A, R2 ADD A, R2 ; 表中一个额定值为2个字节MOV 31H, AMOV DPTR, TAB ; 表首址,MOVC A, A+DPTR; 查表读取第一个字节XCH A, 31H ; 第一个字节内容存入31HI
4、NC DPTRMOVC A, A+DPTR; 查表读取第二个字节MOV 32H, A ; 第二字节的内容存入32HTAB: DW 1230H, 1450H, .DW 2230H, 2440H, .DW 3120H, 3300H, .,2 数制转换,例 4 将一个字节二进制数转换成 3 位非压缩型BCD码。 设一个字节二进制数在内部RAM 40H单元, 转换结果放入内部 RAM 50H#, 51H, 52H单元中(高位在前), 程序如下:,HEXBCD: MOV A, 40HMOV B, 100DIV ABMOV 50H, AMOV A, 10XCH A, BDIV ABMOV 51H, AMO
5、V 52H, BRET,例5 BCD码转换为二进制代码(方法:先将高半字节 1010,再加低半字节)。设待转换的BCD码存放在R2中 DTOB MOV A, R2;ANL A, #0F0H ; 屏蔽低四位SWAP AMOV B, #0AHMUL ABMOV R3,AMOV A, R2ANL A, #0FH 屏蔽高四位ADD A, R3 得转换结果RET,例6 双字节BCD码转换为二进制码 设BCD码表示的4位十进制数分别存放在R1和R2中,其中R2存放千、百位,R1存放十、个位。转换后的结果低字节存放在20H单元,高字节存放在21H单元。 转换时,可由高位到低位逐位检查BCD码的数值,然后累加
6、各十进制对应的二进制数。其中, 千位 1000 =03E8H 百位 100 = 0064H 十位 10 = 000AH 各位 BCD码=二进制码,例 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,R4MOV A, R2ANL A, #0F0H; 屏蔽百位SWAP A; 千位换到低四位JZ BRAN1; LOOP1: DEC A ; 千
7、位减1ACALL ADDT ; 调用累加子程序,JNZ LOOP1 ; 千位为0否? BRAN1: MOV R3, #64H ; MOV R4, #00H ; 一百位二进制数送R3,R4MOV A ,R2 ;ANL A, #0FH ; 屏蔽千位JZ BRAN2 ; 百位为十转到个位处执行 LOOP2 DEC A ; 百位减1ACALL ADDT ; 调用累加子程序JNZ LOOP2 ; 百位为0否 BRAB2 MOV R3, #0AH ; 十的二进制数送R3MOV A, R1 ;ANL #F0H ; 屏蔽个位SWAP A ; 十位换到低四位JZ BRAN3 ; 十位为0转到个位处执行,LOOP
8、3: DEC A ; 十位减1ACALL ADDT; 调用累加子程序JNZ LOOP3 ; 十位为0否? BRAN3: MOV A,R1 ; ANL A, #0FH ; 屏蔽十位MOV R3, A;ACALL ADDT;RET ADDT: PUSH PSWPUSH ACCCLR CMOV A, 20HADD A, R3 低位字节相加,MOV 20H, A 结果送20H单元 MOV A, 21H ADDC A,R4 高位字节相加 MOV 21H, A POP ACC POP PSW RET,3 运算程序,一、 加、 减法程序,例 7 将40H开始存放的 10 个字节的数与 50H开始存放的10
9、个字节的数相减(假设被减数大于减数)。 设被减数指针为 R0, 减数指针为 R1, 差数放回被减数单元, R5 存放字节个数, 则程序如下:,SUB: MOV R0, 40HMOV R1, 50HMOV R5, 10CLR C SUB1: MOV A, R0SUBB A, R1MOV R0, AINC R0INC R1DJNZ R5, SUB1RET,二、 乘法运算程序在计算机中, 常将乘法采用移位和加法来实现。 例8 将(R2R3)和(R6R7)中双字节无符号数相乘, 结果存入 R4R5R6R7。 此乘法可以采用部分积右移的方法来实现, 其程序框图如图 4.6 所示, 程序如下:,NMUL:
10、 MOV R4, 0 ; 初始化MOV R5, 0CLR CMOV R0, 16,NMUL1: MOV A, R4 ; CyR4R5R6R7右移一位RRC AMOV R4, AMOV A, R5RRC AMOV R5, AMOV A, R6RRC AMOV R6, AMOV A, R7RRCMOV R7, AJNC NMUL2; C为移出乘数的最低位MOV A, R5 ; (R4R5)+(R6F7)(R4R5),ADD A, R3MOV R5, AMOV A, R4ADDC A, R2MOV R4, ANMUL2: DJNZR0, NMUL1; 循环16位 MOV A, R4; 最后结果再移一
11、位RRC AMOV R4, AMOV A, R5RRC AMOV R5, AMOV A, R6,RRC AMOV R6, AMOV A, R7RRC AMOV R7, ARET,图4.6 NMUL程序框图,例 9 假定被乘数在(R4R3)中, 乘数放在R2中, 乘积放在R7R6和R5中。 MCS - 51 中有 8 位数的乘法指令MUL, 用它来实现多字节乘法时, 可表示为(R4R3)(R2) =(R4)28+(R3)(R2) =(R4)(R2)28+(R3)(R2) 其中(R4)(R2)和(R3)(R2)都是可直接用MUL指令来实现, 而乘以28意味着左移 8 位。由此可编写如下程序:,NM
12、UL1: MOV A, R2 MOV B, R3MUL AB ; (R3)(R2)MOV R5, A ; 积的低位送R5MOV R6, B ; 积的高位送R6MOV A, R2MOV B, R4MUL AB ; (R4)(R2)ADD A, R6 ; (R3)(R2)的高位加(R4)(R2)的低位 MOV A, BADDC A, 00H ; (R4)(R2)的高位加CyMOV R7, A ; 结果送R7RET,三、 除法运算程序除法是乘法的逆运算, 用移位、 相减的方法来完成。 首先比较被除数的高位字与除数, 如被除数高位大于除数, 则商为1, 并从被除数中减去除数, 形成一个部分余数; 否则
13、商位为 0, 不执行减法。 然后把新的部分余数左移一位, 并与除数再次进行比较。循环此步骤, 直到被除数的所有位都处理完为止,一般商的字长为 n, 则需循环n次。 一般计算机中, 被除数均为双倍位, 即如果除数和商为双字节, 则被除数为四字节。如果在除法中发生商大于规定字节, 称为溢出。 在进行除法前, 应该检查是否会产生溢出。一般可在进行除法前, 先比较被除数的高位与除数, 如被除数高位大于除数, 则溢出, 置溢出标志, 不执行除法。,图 4.7 除法程序的流程,例 10 将(R4R5R6R7)除以(R2R3), 商放在(R6R7)中, 余数放在(R4R5)中。,NDIV: MOV A, R
14、5 ; 判商是否产生溢出CLR CSUBB A, R3MOV A, R4SUBB A, R2JNC NDIV1 ; 溢出, 转溢出处理MOV B, 16; 无溢出, 执行除法,NDIV2: CLR C ; 被除数左移一位, 低位送 0MOV A, R7RLC AMOV R7, AMOV A, R6RLC AMOV R6, AMOV A, R5RLC AMOV R5, AXCH A, R4RLC AXCH A, R4,MOV F0, C ; 保护移出的最高位CLR CSUBB A, R3 ; 部分余数与除数比较MOV R1, AMOV A, R4SUBB A, R2JB F0, NDIV3; 移出的高位为 1, 肯定够减JC NDIV4 ; 否则, (Cy) = 0才够减NDIV3: MOV R4, A ; 回送减法结果MOV A, R1MOV R5, AINC R7 ; 商上1,NDIV4: DJNZ B, NDIV2; 循环次数减 1 ,若不为零则循环CLR F0 ; 正常执行无溢出 F0 = 0RETNDIV1: SETB F0 ; 溢出F0=1RET,