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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
不带进位位的单片机加法指令- j3 D8 P$ u! A4 S6 S+ S
ADD A,#DATA ;例:ADD A,#10H
; o2 A: v1 i2 F: S; w0 LADD A,direct ;例:ADD A,10H% Y2 s: O* S  G. ]0 ^
ADD A,Rn ;例:ADD A,R7" X! ]& n3 r# f* ]4 ?7 _0 [
ADD A,@Ri ;例:ADD A,@R0
" R! V3 Z2 L. J" w& `用途:将A中的值与其后面的值相加,最终结果否是回到A中。0 Y$ ]) S6 Q. ^0 j* D
例:MOV A,#30H
# @. Z+ a9 J; [7 {9 oADD A,#10H2 X, d/ N$ G1 v: v* N+ n9 y0 D
则执行完本条指令后,A中的值为40H。. i5 r1 o/ e  I" T6 Z/ |' A
下面的题目自行练习! m: P8 ^5 A: _- t
MOV 34H,#10H8 F, ~! A7 H' v/ t3 v
MOV R0,#13H! [/ s2 x0 s7 H) g4 y7 c
MOV A,34H
% j( {5 o4 Q' t/ J8 ^) WADD A,R08 O; h7 C5 c2 t3 S3 h" }
MOV R1,#34H# _- s+ d" E! [
ADD A,@R1' Z- S: p4 l" P% e: U. K9 v$ q$ K
带进位位的加法指令6 L% K' v7 J# a1 G
ADDC A,Rn* ?- l+ L9 J' F9 q2 y
ADDC A,direct: [- b  Y1 v, E4 k# Q7 \
ADDC A,@Ri, g) \' S$ s5 e6 N2 p
ADDC A,#data
. k2 q4 y# I+ N$ h2 }4 S: `9 `用途:将A中的值和其后面的值相加,并且加上进位位C中的值。9 T& U5 x* b3 d, e$ A
说明:由于51单片机是一种8位机,所以只能做8位的数学运算,但8位运算的范围只有0-255,这在实际工作中是不够的,因此就要进行扩展,一般是将2个8位的数学运算合起来,成为一个16位的运算,这样,能表达的数的范围就能达到0-65535。如何合并呢?其实很简单,让我们看一个10进制数的例程:% b7 Z' R2 H1 H; j
66+78。, m# T; {! r; U7 F% }0 H0 l
这两个数相加,我们根本不在意这的过程,但事实上我们是这样做的:先做6+8(低位),然后再做6+7,这是高位。做了两次加法,只是我们做的时候并没有刻意分成两次加法来做罢了,或者说我们并没有意识到我们做了两次加法。之所以要分成两次来做,是因为这两个数超过了一位数所能表达的范置(0-9)。
: Y3 {3 x* k1 v7 l' O  m在做低位时产生了进位,我们做的时候是在适当的位置点一下,然后在做高位加法是将这一点加进去。那么计算机中做16位加法时同样如此,先做低8位的,如果两数相加产生了进位,也要“点一下”做个标记,这个标记就是进位位C,在PSW中。在进行高位加法是将这个C加进去。例:1067H+10A0H,先做67H+A0H=107H,而107H显然超过了0FFH,因此最终保存在A中的是7,而1则到了PSW中的CY位了,换言之,CY就相当于是100H。然后再做10H+10H+CY,结果是21H,所以最终的结果是2107H。5 J# f1 R; ~: C- ]6 B  z- W: R
带借位的单片机减法指令
8 k7 G5 `0 @% w$ ~9 ]5 ?SUBB A,Rn
% e! \/ \" c  b5 |SUBB A,direct
' I/ B9 F/ C/ ^1 K" Q' ISUBB A,@Ri
: {) E3 T  g; R- P/ cSUBB A,#data/ z" B6 u. @7 W4 }+ F3 |
设(每个H,(R2)=55H,CY=1,执行指令SUBB A,R2之后,A中的值为73H。" I) P% P0 `; h* K# g
说明:没有不带借位的单片机减法指令,如果需要做不带位的减法指令(在做第一次相减时),只要将CY清零即可。! X- Y& ]6 s. e
乘法指令
& u, \  |0 i2 m, c/ f) qMUL AB( d  Z/ G; @5 R/ L2 G8 I/ {1 d
此单片机指令的功能是将A和B中的两个8位无符号数相乘,两数相乘结果一般比较大,因此最终结果用1个16位数来表达,其中高8位放在B中,低8位放在A中。在乘积大于FFFFFH(65535)时,0V置1(溢出),不然OV为0,而CY总是0。
4 B- [: ?5 e- I/ t例:(A)=4EH,(B)=5DH,执行指令1 g! Z" _% d; a
MUL AB后,乘积是1C56H,所以在B中放的是1CH,而A中放的则是56H。
0 v  w+ g& F0 e除法指令
  u  R# m. ?3 A. j! kDIV AB
* u* p$ [5 x( _+ F& k, K此单片机指令的功能是将A中的8位无符号数除了B中的8位无符号数(A/B)。除法一般会出现小数,但计算机中可没法直接表达小数,它用的是我们小学生还没接触到小数时用的商和余数的概念,如13/5,其商是2,余数是3。除了以后,商放在A中,余数放在B中。CY和OV都是0。如果在做除法前B中的值是00H,也就是除数为0,那么0V=1。" T$ y7 z) [6 n  \7 F7 z
加1指令  |: a! p$ q0 c
INC A: @; T! b: x" w& q, z9 H
INC Rn* f7 r) [4 A9 H( w  F7 L+ |# T
INC direct5 X) H( I4 R1 f4 x1 V6 h
INC @Ri' n2 d7 ^5 h7 U7 ^; ?9 y# R
INC DPTR% a) a8 K. V( b' ^3 e& T
用途很简单,就是将后面目标中的值加1。例:(A)=12H,(R0)=33H,(21H)=32H,(34H)=22H,DPTR=1234H。执行下面的指令:
" d. z7 R' ]) W0 H, kINC A (A)=13H
7 U: G% Z- I7 L' h3 yINC R2 (R0)=34H* I# I$ a7 V  ?/ J3 h, E
INC 21H (21H)=33H
, q& h6 f. h0 ~2 R/ r/ I" w, DINC @R0 (34H)=23H1 r: m% B5 _" K1 s0 f! N9 s
INC DPTR ( DPTR)=1235H, V. s$ D& }5 h6 i
后结果如上所示。
, n/ j$ i# f- c% s/ c8 w3 ~说明:从结果上看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类指令的对象则广泛得多,能是寄存器、内存地址、间址寻址的地址等等。3 X* T+ O# ]) f7 t' C6 E4 U( }+ |, x' }
减1指令, P% ]% U, V8 H8 J5 R) B, O% q! o
减1指令
, Z' \% j# j) \DEC A9 l4 L, H& I& v0 U4 A" P
DEC RN9 t/ c1 t# u2 `3 ^
DEC direct* h; w! Y) `8 N& s4 K0 N, C, v9 R
DEC @Ri
9 l0 l0 @4 ^  D与加1指令类似,就不多说了。
, R- b7 L7 b; H+ t6 \) j7 i1 P综合练习:
2 o% m# P2 P3 M7 R% KMOV A,#12H
! l) l7 d: r% A$ ~& U3 @MOV R0,#24H
* X* D! I0 r  ~, @' [# VMOV 21H,#56H
, Q  ?* Q9 x( f3 E$ fADD A,#12H
8 F) w' \. c  ?- u% WMOV DPTR,#4316H2 ~# a& u+ k+ V! t( l/ ]8 {" Y
ADD A,DPH" R# D- L3 C; R5 a7 c1 `7 [
ADD A,R0
' b6 J4 y/ i6 j9 T) l# dCLR C
* u' t% M$ b. g% HSUBB A,DPL
9 ]! H0 s. Z3 H! _SUBB A,#25H
6 d4 Y( T  g$ i9 e5 E1 s% b. c+ {  VINC A' I: S- @4 S+ l+ @
SETB C4 s) c5 Z/ C. Y& G; V- s6 z
ADDC A,21H
( }, T; {0 d( L1 N7 uINC R0
' B& g5 y7 c/ S0 w4 F5 FSUBB A,R0* T9 v- z  }, W9 @  j, T/ a# h/ S
MOV 24H,#16H9 @: H- h: B! }
CLR C0 e# w. q- h2 E7 c2 c$ v0 h% a8 m
ADD A,@R0
* k* [8 f; c. w3 n6 a& G先写出每步运行结果,然后将以上题目建入,并在软件仿真中运行,观察寄存器及有关单元的内容的变化,是否与自已的预想结果相同。
" x  P" ]5 s1 u* S1 D7 {. w

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-18 12:21 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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