找回密码
 注册
关于网站域名变更的通知
查看: 152|回复: 2
打印 上一主题 下一主题

单片机教程11单片机算术运算指令

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-7-22 10:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
不带进位位的单片机加法指令
0 l& \1 p/ Y+ j+ S& Z6 u4 n! `ADD A,#DATA ;例:ADD A,#10H& g  a, m$ ?/ Z2 R3 J
ADD A,direct ;例:ADD A,10H
6 a8 ^1 w( s; ?& `( gADD A,Rn ;例:ADD A,R7
, x- [) ]' v+ m/ w! `; MADD A,@Ri ;例:ADD A,@R00 m4 ^, R' |# m7 O- H5 E
用途:将A中的值与其后面的值相加,最终结果否是回到A中。, n  Q0 N+ U+ N
例:MOV A,#30H: N2 \- g0 d- D& W
ADD A,#10H
# J& F, C5 W" Y则执行完本条指令后,A中的值为40H。
: K) E/ K5 ^/ O' Q# R0 j0 t下面的题目自行练习9 w. ]1 w0 ]; L+ s+ C4 V" A  c
MOV 34H,#10H2 ~! {1 G- Y0 x* `2 B! _
MOV R0,#13H1 B) x9 e7 ~( P3 O, S
MOV A,34H* I" H# ^. }. ~' a1 W5 Q
ADD A,R0! r: P: M! I' q4 \  g
MOV R1,#34H
+ N5 a5 e! y" E  \: o, SADD A,@R1; w0 H+ m9 k4 j0 m; @7 W- ~9 ~
带进位位的加法指令/ E0 S; G4 }; c5 d3 {$ O9 A% o
ADDC A,Rn' p, Q8 c: Y, g  G0 F3 ^6 Q
ADDC A,direct$ ?" e0 Z2 j. g
ADDC A,@Ri: ?( G/ k% R' @- ^
ADDC A,#data
# W- m0 \1 D# x) y( N$ V: W用途:将A中的值和其后面的值相加,并且加上进位位C中的值。
( B4 @2 ]0 }0 U  j说明:由于51单片机是一种8位机,所以只能做8位的数学运算,但8位运算的范围只有0-255,这在实际工作中是不够的,因此就要进行扩展,一般是将2个8位的数学运算合起来,成为一个16位的运算,这样,能表达的数的范围就能达到0-65535。如何合并呢?其实很简单,让我们看一个10进制数的例程:- `, O" c2 c8 N
66+78。
& P$ q5 z$ ~0 G" ?* e1 {8 Z这两个数相加,我们根本不在意这的过程,但事实上我们是这样做的:先做6+8(低位),然后再做6+7,这是高位。做了两次加法,只是我们做的时候并没有刻意分成两次加法来做罢了,或者说我们并没有意识到我们做了两次加法。之所以要分成两次来做,是因为这两个数超过了一位数所能表达的范置(0-9)。8 g/ x, j4 n- s) l6 H0 |/ ?
在做低位时产生了进位,我们做的时候是在适当的位置点一下,然后在做高位加法是将这一点加进去。那么计算机中做16位加法时同样如此,先做低8位的,如果两数相加产生了进位,也要“点一下”做个标记,这个标记就是进位位C,在PSW中。在进行高位加法是将这个C加进去。例:1067H+10A0H,先做67H+A0H=107H,而107H显然超过了0FFH,因此最终保存在A中的是7,而1则到了PSW中的CY位了,换言之,CY就相当于是100H。然后再做10H+10H+CY,结果是21H,所以最终的结果是2107H。
& I( J6 q! }& ~; O5 N7 J带借位的单片机减法指令4 F+ j1 X8 d; V- s3 Z
SUBB A,Rn
' }) y6 B8 D1 I# g2 _6 XSUBB A,direct
6 u. O0 G! e$ E1 a; HSUBB A,@Ri
5 K; m7 _, f4 Z. m' y" GSUBB A,#data/ @6 }: T/ q1 V  ?; x
设(每个H,(R2)=55H,CY=1,执行指令SUBB A,R2之后,A中的值为73H。
, N7 _4 ^! f# v/ q. `2 w8 T说明:没有不带借位的单片机减法指令,如果需要做不带位的减法指令(在做第一次相减时),只要将CY清零即可。
. t- P- b6 F- r0 p0 D5 o; L0 X乘法指令
  `( x$ h- E+ s3 @% vMUL AB" M0 f: y6 `1 E8 e
此单片机指令的功能是将A和B中的两个8位无符号数相乘,两数相乘结果一般比较大,因此最终结果用1个16位数来表达,其中高8位放在B中,低8位放在A中。在乘积大于FFFFFH(65535)时,0V置1(溢出),不然OV为0,而CY总是0。1 {/ p# C" |# M7 W$ j9 i  Z
例:(A)=4EH,(B)=5DH,执行指令# {! m  @1 E6 f2 e4 L9 i# l
MUL AB后,乘积是1C56H,所以在B中放的是1CH,而A中放的则是56H。! y2 U8 i/ x! M$ }+ w# Y
除法指令: |3 ?  G( e* h6 V3 P( d& ^
DIV AB+ z5 A" t. ^, Q
此单片机指令的功能是将A中的8位无符号数除了B中的8位无符号数(A/B)。除法一般会出现小数,但计算机中可没法直接表达小数,它用的是我们小学生还没接触到小数时用的商和余数的概念,如13/5,其商是2,余数是3。除了以后,商放在A中,余数放在B中。CY和OV都是0。如果在做除法前B中的值是00H,也就是除数为0,那么0V=1。2 t  t( j4 A# ?& D% \
加1指令
, ~/ g2 ^8 K- [/ `9 mINC A9 ]: A2 V, L, i; z
INC Rn! W4 f3 j& d; F$ h1 s
INC direct
( M3 ]& `" B: |# v) TINC @Ri
$ |$ Z! C% Y7 M' j5 r4 h+ wINC DPTR, @) I2 a& e: z- m5 l  d
用途很简单,就是将后面目标中的值加1。例:(A)=12H,(R0)=33H,(21H)=32H,(34H)=22H,DPTR=1234H。执行下面的指令:7 }. ]& T7 n8 ]( L
INC A (A)=13H
9 k4 S$ k! k1 c" {INC R2 (R0)=34H* \4 X  k0 i6 I9 {4 y! x( A
INC 21H (21H)=33H
* L* N5 o8 y$ N3 o4 qINC @R0 (34H)=23H2 \6 Z" @) T6 {; J5 i. P/ d
INC DPTR ( DPTR)=1235H; H9 l# ~5 a& s8 y( ], n- ^$ S( F
后结果如上所示。
( J$ ]& o- l5 Z& i4 g- T5 Q说明:从结果上看INC A和ADD A,#1差不多,但INC A是单字节,单周期指令,而ADD #1则是双字节,双周期指令,而且INC A不会影响PSW位,如(A)=0FFH,INC A后(A)=00H,而CY依然保持不变。如果是ADD A ,#1,则(A)=00H,而CY一定是1。因此加1指令并不适合做加法,事实上它主要是用来做计数、地址增加等用途。另外,加法类指令都是以A为核心的��其中一个数必须放在A中,而运算结果也必须放在A中,而加1类指令的对象则广泛得多,能是寄存器、内存地址、间址寻址的地址等等。
6 m/ c8 {; e5 Z% A6 q2 W减1指令
. C1 b3 g1 m, D# T) j减1指令
" B3 j1 G2 O( E3 j+ G2 {! h4 M. ]( [DEC A$ [; m( [8 G2 L7 D/ L
DEC RN
1 y0 P; O4 i' {6 }. k' N, B2 l. M% s; dDEC direct
+ A+ s7 R6 H# P+ a5 b+ zDEC @Ri( I2 Y6 a7 Z" ~4 k3 C- r# G
与加1指令类似,就不多说了。4 y0 H5 K' D( o/ t' M  Z+ P
综合练习:
0 S( V; m6 ]7 o. f/ cMOV A,#12H: C& S2 u; L# A3 s
MOV R0,#24H6 `( S# `5 {: t1 l
MOV 21H,#56H7 V; V# I; \! ?4 O% y7 r- `  |
ADD A,#12H* a1 k! P( o9 d/ a9 h2 k
MOV DPTR,#4316H
' b+ z' a' {. J9 W6 L4 [7 bADD A,DPH
# q6 i& ~% V+ fADD A,R0' m0 _, y% J7 S& r  x0 H6 E7 P
CLR C
) Y" N: X- U7 ]: B3 T+ FSUBB A,DPL9 D- n, ~- S* h  \
SUBB A,#25H
, ?% R5 i. V+ XINC A3 N% x, g8 t- N/ X/ [( ]# e% m
SETB C
9 B+ `( l. I  K. y' \: m# ]/ ^ADDC A,21H
3 W$ {5 D$ [- _) T9 n4 o4 V  u9 gINC R0
9 B# O) B6 w* \( p+ {# MSUBB A,R0% a# j; p' i( a9 O! `
MOV 24H,#16H
& g( J3 ], y( wCLR C
+ }6 C; m" L7 kADD A,@R0
' j! S, A( a- c+ _先写出每步运行结果,然后将以上题目建入,并在软件仿真中运行,观察寄存器及有关单元的内容的变化,是否与自已的预想结果相同。4 }* B, w' z5 O1 E$ m

该用户从未签到

2#
发表于 2022-7-22 11:20 | 只看该作者
学习学习,O(∩_∩)O哈哈~

该用户从未签到

3#
发表于 2022-7-22 14:47 | 只看该作者
非常好的资料,学习了,谢谢楼主
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-24 04:32 , Processed in 0.109375 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表