单片机实验报告——加减法

更新时间:2023-06-07 05:11:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

单片机实验一

一、实验目的

1. 学习多字节压缩BCD 码加减法运算的程序设计;

2. 学习单字节有符号数加减运算的程序设计。

二、实验设备

统一电子开发平台

三、实验要求

1.编写通用4 字节压缩BCD 码的加、减法运算程序;

2.编写通用单字节有符号二进制数加、减法运算程序;

四、实验原理

对于简单的8 位加减可以直接调用指令就可以了。例如加法可以使用指令ADD 以及带进位加ADDC,

但单字节加减法只能在256 之内进行运算;在实际应用中经常需要进行多字节运算,从而处理更大的数

据。该实验介绍单片机BCD 码多字节加、减运算通用程序的设计。

1.多字节无符号压缩BCD 码加法运算

假设多字节无符号被加数的最低字节的地址为R0,加数的最低字节地址为R1,字节数共为len;计

算结果的地址于被加数相同。

◆ 入口参数:

R0:被加数地址指针;

R1:加数地址指针;

len:字节数。

◆ 出口参数:

@R0:计算结果;

rLen:计算结果字节数。

◆ 使用资源:ACC,R0、R1,内部RAM 单元len、rlen 及存放被加数、加数、计算结果的内存单元。

示例程序如下:

;多字节无符号压缩BCD 码加法运算

rlen data 30h; 存放计算结果字节数

len data 31h; 存放相加字节数

; r0 定位40h,r1 定位50h

; 此处的程序的问题是前面字节的进位没有处理,

; 只是对最后字节相加处理了进位ORG 0000h;

ADDl: PUSH PSW ;保护标志寄存器内容

CLR C ;进位位清0

MOV rlen,#00H ;和的字节数先清0

ADD: MOV A,@R0 ;取被加数

ADD A,@R1 ;求和

DA A ;十进制调整

MOV @R0,A ;保存

INC R0 ;地址增1

INC R1

INC rlen ;字节数增1

DJNZ len,ADD ;所有字节未加完继续,否则向下执行

JNC ADD20 ;和的最高字节无进位转ADD20

MOV @R0,#01H ;和的最高字节地址内容为01H

INC rlen

ADD20: POP PSW

RET

END

多字节加法运算一般是按从低字节到高字节的顺序进行的,所以必须考虑低字节向高字节的进位情况,被加数和加数的压缩BCD 码,最大不超过99,而99+99+1(进位)=199,此时不需要使用ADDC 指令,但当两字节当最低两字节相加后,必须使用“DA A”进行十进制调整,调整后产生进位。而最高两字节相加后应考虑是否有进位。若有进位,应向和的最高位字节地址写入01H,这时和数将比加数或被加数多出一个字节。

2.单字节带符号数加法运算

编程范例:

两个8 位二进制带符号数加法,被加数和加数分别存于BLK 和BLK+1 单元,和超过8 位要占两个单元,设为SUM 和SUM+1 单元。解:两个带符号数的加法是作为补码加法处理的。由于和超过8 位,因此,和就是一个16 位带符号数,符号位在16 位数的最高位。为此,直接相加进位是不够的,还要做一些处理。例如-65 和-65 相加,若直接求和产生溢出,即使扩展到16 位,结果也不正确。如:-65 1 0 1 1 1 1 1 lB+) -65 1 0 1 1 1 1 1 1B

0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 OB现在这个16 位数的最高位为0,两个负数相加变为正数,显然是错误的。处理的方法是先将8 位带符号数扩展成16 位带符号数,然后再相加。若是8 位正数,则高8 位扩展为00H;若是8 位负数,则高8 位扩展为0FFH。这样处理后,再按双字节相加,就可以得到正确的结果。如上例,由于是负数,高8 位应是全1,然后再加:-65 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1B+) -65 1 1 1 1 1 1 1 1 1 0 1 l 1 1 1 1B

1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0B,最高位的进位丢失不计。换算成真值为—130,结果正确。在编程时,判别加数和被加数的符号位,再决定是否要将高8 位改为0FFH。程序如下: BLK DATA 30H

SUM DATA 40H

ORG 0000h

MAIN:

MOV R0,#BLK ;R0 指向被加数

MOV R1,#SUM ;R1 指向和

MOV R2,#0 ;高8 位先设为0

MOV R3,#0

MOV A,@R0 ;取出被加数

JNB ACC.7,N1 ;若是正数转移到N1

MOV R2,#0FFH ;若是负数高8 位为全1

N1:INC R0 ;修改即指针

MOV B,@R0 ;取加数到B

JNB B.7,N2 ;若是正数转移N2

MOV R3,#0FFH ;若是负数高8 位为全1

N2:ADD A,B ;低8 位相加 .

MOV @R1,A ;存低8 位和

INC R1 ;修改R1 指针

MOV A,R2 ;准备加高8 位

ADDC A,R3 ;高8 位相加

MOV @R1,A ;存高8 位和

SJMP $

END

3.多字节无符号压缩BCD 码减法运算

为了使用“DA A”指令对十进制减法进行调整,必须采用对减数求补相加的方法,以9AH 为模减去减数即得到减数的补数。设被减数低字节地址存在R1,减数低字节地址存在R0,字节数存在len;差的低字节地址存在R0,差的字节数存在rlen。

入口参数:

R0:减数地址指针;

R1:被减数地址指针;

len:字节数

出口参数:

R0:差的地址指针

R3:差的字节数

使用资源: A,R0,R1,内部RAM 单元

范例程序如下:

rlen data 30h; 存放计算结果字节数

len data 31h; 存放相加字节数

ORG 0000h;

SUBCD: MOV rlen,#00H ;差字节单元清0

CLR 07H ;符号位清0

CLR C ;借位位清0SUBBCD: MOV A,#9AH ;减数对模100 求补

SUBB A,@R0

ADD A,@R1 ;补码相加

DA A

MOV @R0,A ;存结果

INC R0

INC R1

1NC rlen

CPL C ;进位求反以形成正确借位

DJNZ len,SUBCDl ;未减完去SUBCDl,减完向下执行

JNC SUBCD2 ;无借位去别Ⅸm 返回主程序,否则继续

SETB 07H ;有借位,置“1”符号位

SUBCD2: RET

END

程序中对减数求补后与被减数相加,用“DA A”指令进行调整。若二者相加调整后结果无进

位(C=0),则表示二者相减有借位;若二者相加调整后有进位(C;1),则表示二者相减无借位。所以必须对进位标志位C 进行求反操作,才能得到正确结果。

五、实验步骤

1.按照实验要求编写程序。

2.在开发环境中运行程序,对通用寄存器进行赋值,看运算结果是否正确。

输入输出效果:

本文来源:https://www.bwwdw.com/article/00i1.html

Top