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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
不带进位位的单片机加法指令
4 Z. F; e9 `$ B7 a1 OADD A,#DATA ;例:ADD A,#10H6 y/ _7 D! j: s$ o- D+ o% G6 H
ADD A,direct ;例:ADD A,10H
, F* T& g# C$ ZADD A,Rn ;例:ADD A,R7
1 @+ P0 e6 B' Z/ _1 Z; L' D: L% FADD A,@Ri ;例:ADD A,@R0' D  w. u9 y# }: X( d
用途:将A中的值与其后面的值相加,最终结果否是回到A中。+ {# R9 M$ @- d$ q/ B: W
例:MOV A,#30H
. }1 X& d+ t4 G4 u4 [# E* q( S( AADD A,#10H# ^' G4 [6 w8 e1 N& O6 P7 `
则执行完本条指令后,A中的值为40H。
* D& W- }; h4 Q3 t. w下面的题目自行练习
! S0 C' @8 H: U/ p' _( H; DMOV 34H,#10H
9 w5 R' ?# t: V% pMOV R0,#13H3 ?6 J; G2 }! z# P* {( j
MOV A,34H
2 c0 K6 H0 @0 m7 P1 z) i7 o3 UADD A,R0
% }" v/ q0 E* a5 ?) l  f5 R9 ]  p: s# iMOV R1,#34H* z9 b# v& T/ Q5 h" y8 H2 R
ADD A,@R1
& e; D8 P1 Q+ V) y, T, s  ]带进位位的加法指令) Y4 o  E1 A% X4 W4 i* W. s5 r
ADDC A,Rn7 Q, A" Q0 i, w( X0 M' e+ t
ADDC A,direct
5 s" z2 m% i5 nADDC A,@Ri
: a, H, O. N# L- u' pADDC A,#data
+ e0 N- j! ]1 e$ ^' h0 G2 S( }用途:将A中的值和其后面的值相加,并且加上进位位C中的值。. C# R. c) h5 r" O
说明:由于51单片机是一种8位机,所以只能做8位的数学运算,但8位运算的范围只有0-255,这在实际工作中是不够的,因此就要进行扩展,一般是将2个8位的数学运算合起来,成为一个16位的运算,这样,能表达的数的范围就能达到0-65535。如何合并呢?其实很简单,让我们看一个10进制数的例程:
- e+ ^; o/ ]( l1 d4 |; n# W66+78。' G& z0 \3 N; `0 v
这两个数相加,我们根本不在意这的过程,但事实上我们是这样做的:先做6+8(低位),然后再做6+7,这是高位。做了两次加法,只是我们做的时候并没有刻意分成两次加法来做罢了,或者说我们并没有意识到我们做了两次加法。之所以要分成两次来做,是因为这两个数超过了一位数所能表达的范置(0-9)。
. w. p/ r9 f) a$ U在做低位时产生了进位,我们做的时候是在适当的位置点一下,然后在做高位加法是将这一点加进去。那么计算机中做16位加法时同样如此,先做低8位的,如果两数相加产生了进位,也要“点一下”做个标记,这个标记就是进位位C,在PSW中。在进行高位加法是将这个C加进去。例:1067H+10A0H,先做67H+A0H=107H,而107H显然超过了0FFH,因此最终保存在A中的是7,而1则到了PSW中的CY位了,换言之,CY就相当于是100H。然后再做10H+10H+CY,结果是21H,所以最终的结果是2107H。& N, a/ g% |$ z, G, L  `; G
带借位的单片机减法指令
( R: K6 S4 A% ]. O! S' YSUBB A,Rn
  h9 V0 U1 r: L: ~SUBB A,direct, D+ u6 _. T4 w+ `% T
SUBB A,@Ri  U' l' C  r( U) q# Z( a
SUBB A,#data% s: I( _; ~3 {
设(每个H,(R2)=55H,CY=1,执行指令SUBB A,R2之后,A中的值为73H。9 l/ ^* Q- e8 k8 ~6 R* W4 ?9 r
说明:没有不带借位的单片机减法指令,如果需要做不带位的减法指令(在做第一次相减时),只要将CY清零即可。+ v# i1 X' s& b5 C/ O% V1 a3 n1 S1 N
乘法指令7 R& h5 V9 y9 q1 ^
MUL AB2 u, ^7 e& k! {* p$ T
此单片机指令的功能是将A和B中的两个8位无符号数相乘,两数相乘结果一般比较大,因此最终结果用1个16位数来表达,其中高8位放在B中,低8位放在A中。在乘积大于FFFFFH(65535)时,0V置1(溢出),不然OV为0,而CY总是0。, o8 {+ v3 U2 }3 ^* |- U% C
例:(A)=4EH,(B)=5DH,执行指令
1 P5 Y# b" E3 S, @MUL AB后,乘积是1C56H,所以在B中放的是1CH,而A中放的则是56H。3 q$ t9 m% L1 e
除法指令# C  J; X) _) g9 b$ M2 ~# K- m
DIV AB
. g* }! Q1 X- E7 L0 h% l5 y此单片机指令的功能是将A中的8位无符号数除了B中的8位无符号数(A/B)。除法一般会出现小数,但计算机中可没法直接表达小数,它用的是我们小学生还没接触到小数时用的商和余数的概念,如13/5,其商是2,余数是3。除了以后,商放在A中,余数放在B中。CY和OV都是0。如果在做除法前B中的值是00H,也就是除数为0,那么0V=1。( N- ?- M, p- k* n: W' |! t
加1指令6 E9 w; k( T9 p/ y0 f
INC A+ j/ P1 P: c2 J
INC Rn
* F9 s- n2 D9 \$ h' o# `INC direct0 g2 P" ]7 P2 a% ~
INC @Ri
. z5 t& C; E  I9 j( v9 H4 BINC DPTR
1 }* O% e: u* f3 F1 ?用途很简单,就是将后面目标中的值加1。例:(A)=12H,(R0)=33H,(21H)=32H,(34H)=22H,DPTR=1234H。执行下面的指令:2 m! N- S2 c& B) L
INC A (A)=13H
; Z6 S  E6 N/ z; S" I7 kINC R2 (R0)=34H/ y9 a2 K; c4 d) s" L! s
INC 21H (21H)=33H! |$ k; m2 M" Z! p* n. h8 T  \' M
INC @R0 (34H)=23H
5 ]4 D3 j0 x) W( RINC DPTR ( DPTR)=1235H
% q! I: s, g! i, [: k) p; H% \9 [后结果如上所示。
. }1 H! X) d1 i+ U- |! d3 m说明:从结果上看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类指令的对象则广泛得多,能是寄存器、内存地址、间址寻址的地址等等。0 v' ]! r% ]) L- k. H
减1指令
& X4 D. D  H/ b( {, u& @减1指令
% @4 q8 E" s: ?DEC A+ |! G- w; G9 _2 P( y
DEC RN( Q$ E/ S( l" a+ r  A% ]
DEC direct7 _$ K$ B0 y! l
DEC @Ri
0 n; v% H' Z  H, r与加1指令类似,就不多说了。, j2 o, E  @) t; @& N" `1 l( p; J
综合练习:
" h! x6 C( k4 }MOV A,#12H" h- ~2 f0 z( r, d
MOV R0,#24H; Q! e: D- j4 e
MOV 21H,#56H
- K! a9 L4 E- _5 t, i1 I1 O) I0 eADD A,#12H
0 J+ {/ U  F1 N4 BMOV DPTR,#4316H
5 y& `! Q# f3 ?6 ~ADD A,DPH: T& c# F. Z  G. W  k" \; T
ADD A,R0: S3 k1 p* h0 w+ p  k' I& t  u
CLR C3 N0 e' q0 F0 E$ ^7 s" x/ v. T! `0 n5 }
SUBB A,DPL
) }$ `  O: B6 [0 [  Z1 ?* s9 }SUBB A,#25H
! E+ A* f* [- w. v" ^INC A% i6 O1 F& [8 M
SETB C
  o- c+ I1 z( w2 R" W* N) |* [; ^8 oADDC A,21H
' _* Q: {% g# ?  B: w2 ?; pINC R0( y8 P& y9 L4 C9 V
SUBB A,R0
6 H+ R4 ~1 @4 ^. r  \MOV 24H,#16H
+ r: a# q; t/ s* y; ?# \+ y4 H5 G2 bCLR C
. W- @$ x, A( K: j' `$ `ADD A,@R0- n& B' A$ G) g* Y
先写出每步运行结果,然后将以上题目建入,并在软件仿真中运行,观察寄存器及有关单元的内容的变化,是否与自已的预想结果相同。
6 N; U9 _+ f  v

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-8 18:28 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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