www.8951.com

进入论坛

淘宝网店

软件下载

返回主页

单片机教程

单片机软件

电路设计

电子基础

网站产品

购买方式

 进入论坛

软件下载

单片机指令(三)

  算术、逻辑运算类指令也是单片机中极为重要的指令系统,在很多教科书中都把它们归为一类,实际上它们还是有区别的,为了让大家便于记忆,这里把它们分了开来。在单片机中,算术运算类指令有24 条;逻辑运算类指令有25 条。这一课我们先来讲解算术运算类指令,下面我们分别加以讲解:
一.算术运算类指令
1。不带进位的加法指令
(1)ADD A,Rn ;例:ADD A,R7

(2)ADD A,@Ri ;例:ADD A,@R1
(3)ADD A,direct;例:ADD A,30H
(4)ADD A,#data ;例:ADD A,#30H指令说明:这些指令的意思就是把后面的值与A 中的值相加,结果送到A 中去。举例:MOV A,30H ;
ADD A,10H ;执行结果A=40H


2。带进位的加法指令
(1)ADDC A,Rn ;例:ADDC A,R7

(2)ADDC A,@Ri ;例:ADDC A,@R1

(3)ADDC A,direct;例:ADDC A,30H

(4)ADDC A,#data ;例:ADDC A,#30H
指令说明:这些指令的作用都是将A 中的值和其后面的值相加,并且加上进位位CY 中的值。为什么要这样做呢?我们知道51 单片机是一种8 位单片机,所以只能做8 位的数学运算,也就是说最大运算的范围只能是0-255 ,这在实际工作中是不够的,因此就要进行扩展,怎么扩展,就是将2 个8 位的数学运算合起来,成为一个16 位的运算,这样可以表达的数的范围就能达到0-65535 。如何合并呢?其实很简单,让我们看一个十进制数的加法例子:66+78 ,这两个数相加,我们根本不会在意它的过程,但事实上我们是这样做的:先做6+8 (低位),然后再做6+7 ,这是高位。做了两次加法,只是我们做的时候并没有刻意分成两次加法来做罢了,或者说我们并没有意识到我们做了两次加法,之所以要分成两次来做,是因为这两个数超过了一位数所能表达的范置(0-9)。在做低位时产生了进位,我们通常的办法是在适当的位置点一下,然后在做高位加法时将这一点加进去;其实计算机中做16 位加法时同样如此,先做低8 位的,如果两数相加产生了进位,也要“点一下”做个标记,这个标记就是进位位CY,在PSW 中,我们前面已经讲过,在进行高位加法时将这个CY 加进去。例如做2 个16 进制数相加:1067H+10A0H ,先做67H+A0H=107H ,而107H 显然超过了0FFH ,因此最终保存在A 中的是7,而1 则进到了PSW 中的CY 位去了,换言之,CY 位就相当于是100H ,然后再做10H+10H+CY ,结果是21H ,所以最终的结果是2107H。


3。带借位的减法指令

(1)SUBB A,Rn ;

(2)SUBB A,@Rn ;

(3)SUBB A,direct;

(4)SUBB A,#data ;
指令说明:没有不带借位的减法指令,如果需要做不带借位的减法指令(在做第一次相减时),只要将CY 清零即可。


4.乘法指令
(1)MUL AB ;
指令说明:此指令的功能是将A 和B 中的两个8 位无符号数相乘,两数相乘结果一般比较大,因此最终结果用1 个16 位数来表达,其中高8 位放在B 中,低8 位放在A 中。在乘积大于FFFFFH(65535)时,PSW 的0V 位置“1”(溢出),否则OV 为“0”,而CY 位总是为“0”。
例:(A)=4EH,(B)=5DH;MUL AB ;乘积是1C56H,所以在B 中放的是1CH,而A 中放的则是56H。


5.除法指令
(1)DIV AB(A/B)
指令说明:此指令的功能是将A 中的8 位无符号数除以B 中的8 位无符号数(什么是无符号数?简单的说就是没有负数的数,也就是整数,比如1,2,3,1.2,4.5 等等这样的数)。除法一般会出现小数,但计算机中可没法直接表达小数,它用的是我们小学生用的商和余数的概念,如13/5 ,其商是2,余数是3。除了以后,商放在A 中,余数放在B 中。CY 位和OV 位都是“0”,如果在做除法前B 中的值是00H,也就是除数为0,那么0V=1。


6.加1 指令
(1)INC A ;例如:A=20H INC A; A=21H
(2)INC Rn ;例如:R7=20H INC A; R7=21H
(3)INC direct;例如:30H=20H INC 30H; 30H=21H
(4)INC @Ri ;
(5)INC DPTR ;例如:DPTR=20H INC DPTR; DPTR=21H
指令说明:从结果上看INC A 和ADD A,#1 差不多,但INC A 是单字节单周期指令,而ADD A,#1 则是双字节双周期指令,而且INC A 不会影响PSW 位,如(A)=0FFH,INC A 后(A)=00H ,而CY 依然保持不变;如果是ADD A ,#1,则(A)=00H ,而CY 一定是“1”。因此加1 指令并不适合做加法,事实上它主要是用来做计数、地址增加等用途。另外,加法类指令都是以A 为核心的,其中一个数必须放在A 中,而运算结果也必须放在A 中,而加1 类指令的对象则广泛得多,可以是寄存器、内存地址、间址寻址的地址等等。


7.减1 指令
(1)DEC A ;例如:A=20H DEC A; A=19H
(2)DEC Rn ;例如:R7=20H DEC A; R7=19H
(3)DEC direct;例如:30H=20H DEC 30H; 30H=19H

(4)DEC @Ri ;


指令说明:既然加1 指令可以用于计数、定时、地址等加1,那么有加也必然有减,所以减1 指令的功能与加1 指令类似,这里就不多说了。


8.十进制加法调整指令
DA A ;这是一条对十进制加法进行调整的指令,等下册用到时再介绍。
另外需要了解的是:在算术运算类指令中,除了加1 和减1 指令外,其他的算术运算类指令都要把结果放到累加器A 中,这与数据传递类指令有所不同。

 

二.逻辑运算类指令
什么是逻辑运算?相信大家不会陌生,在数字电路中我们学过“与门”、“或门”、“非门”等,在单片机中也有类似的运算。那么它们是如何分类的呢?接下来我们就来一一讲解,先来看对累加器A 的逻辑运算指令:
1。对累加器A 的逻辑运算指令
(1)CLR A
指令说明:累加器A 清零。效果同MOV A,#00H 是一样的,只不过它是单周期指令,而MOV A,#00H 是双周期指令。
(2)CPL A
指令说明:将累加器A 逐位取反。相当于数字电路的“非”逻辑,例如:A=12H CPL A ;12H 化为二进制是00010010,逻辑取反后为11101101,即A=EDH。
(3) RL A
指令说明:将累加器A 的值逻辑左移。例如:A=12H RL A;化为二进制为00010010 ,逐位左移后为0010100 ,即24H 。这里把第7 位移到了第0,第0 位移到了第1 位,第1 位移到了第2 位,其余的依次类推。

(4)RLC A
指令说明:加上进位位CY 并逻辑左移。例如:CY=1 A=12H RLC A;加上进位位CY 后1 00010010 逻辑左移变为0 00100101(即CY=0,A=25H)。

(5)RR A
指令说明:将累加器A 中的值逻辑右移。同RL A 类似。
(6)RRC A
指令说明:加上进位位CY 并逻辑右移。同RLC A 类似。
(7)SWAP A
指令说明:将A 中的值的高、低4 位进行交换。

例如:(A)=39H,SWAP A 之后,A 中的值就是93H 。怎么正好是这么前后交换呢?因为这是一个十六进制数,每1 个十六进位数代表4 个二进制数。注意☺,如果是这样的:(A)=39D ,后面没加H,执行SWAP A 之后,可不是(A)=93 。要将它化成二进制数再算:39D 化为二进制是10111 ,也就是0001,0111 高4 位是0001 ,低4 位是0111 ,交换后是01110001,也就是71H,即113D。 2。两个寄存器之间的逻辑运算指令

上面的指令都是针对累加器A 的逻辑运算指令,也就是说对一个寄存器的逻辑运算,那么如果两个寄存器之间的逻辑运算又是怎么样的呢?接着往下看:

指令说明:什么是逻辑“与”?数字电路中我们已经学过:就是F=A*B ,简记为“全1 出1,有0 出0”。如果忘了,没关系,找本书再看一下,这里就不详细的阐述了。
例如:71H 和56H 相“与”,将两数写成二进制形式:(71H) 01110001 和(56H) 00100110 。逐位相“与”结果就是00100000 即20H,从上面的例子可以看出,两个参与运算的值只要其中有一个位上是“0”,则这位的结果就是“0”,两个同是“1”,结果才是“1”,是不是符合逻辑“与”的结果?
知道了逻辑“与”指令的功能后,逻辑“或”和逻辑“异或”的功能就很简单了。逻辑“或”是逐位相“或”,即有1 出1,全0 出0。例:71H 和56H 相“或”结果就是77H ;而“异或”则是逐位“异或”,即相同出0,相异出1。仍旧71H 和56H 相“异或”,结果是57H。

两个寄存器之间的逻辑“或”以及逻辑“异或”的指令如下:

 

ORL A,Rn ;A 与Rn 中的值按位‘或',结果送入A 中
ORL A,direct ;A 与direct 中的值按位‘或',结果送入A 中
ORL A,@Ri ;A 与间址寻址单元@Ri 中的值按位‘或',结果送入A 中
ORL A,#data ;A 与立即数data 按位‘或',结果送入A 中
ORL direct,A ;direct 中值与A 中的值按位‘或',结果送入direct 中
ORL direct,#data ;direct 中的值与立即数data 按位‘或',结果送入direct 中。

 

(3)XRL A,Rn ;A 与Rn 中的值按位‘异或',结果送入A 中

XRL A,direct ;A 与direct 中的值按位‘异或',结果送入A 中
XRL A,@Ri ;A 与间址寻址单元@Ri 中的值按位‘异或',结果送入A 中XRL A,

#data ;A 与立即数data 按位‘异或',结果送入A 中

XRL direct,A ;direct 中值与A 中的值按位‘异或',结果送入direct 中

XRL direct,#data;direct 中的值与立即数data 按位‘异或',结果送direct 中。


连续好几节课将讲了许多的基本知识,大家是不是又觉得有些枯燥和无聊了,别急,接下来让我们轻松一下,做一个实验来证明一下几节课所学的内容:

START:MOV SP,#5FH ;

MOV A,#80H ; LOOP:MOV P1,A ;

RL A ; LCALL DELAY ;

LJMP LOOP ;

DELAY:MOV R7,#255 ;

D1:MOV R6,#255 ;
D2:NOP NOP NOP NOP
DJNZ R6,D2 ;

DJNZ R7,D1 ;

RET ;

END。
好久没做实验了,大家还记得实验的步骤吗?调试→编译→下载,看到了什么,有一个暗点在流动;想象一下,如果我们把P1.0-1.7 的LED 换成8 只可控硅来控制霓虹灯,是不是就有点实用价值了。


2.程序分析:
前面的ORG 0000H 、LJMP START 、ORG 30H 我们以后分析。

从START 开始,MOV SP,#5FH,这是初始化堆栈,在本程序中有无此句无关紧要,不过我们慢慢开始接触正规的编程,我也就慢慢地给大家培养习惯吧。

MOV A,#80H ,将80H 这个数送到A 中去。干什么呢?不知道,往下看:

MOV P1,A 将A 中的值送到P1 端口去,此时A 中的值是80H,所以送出去的也就是80H,因此P1 口的值是80H,也就是二进制10000000 ,对应P1.7-P1.0 这8 位。我们应当知道,此时P1.7 接的LED8 是不亮的,而其它的LED 都是亮的,所以就形成了一个“暗点”,继续往下看

RL A;将A 中的值进行左移,算一下,移之后的结果是什么?对了,是01H ,也就是二进制00000001 ,这样,应当是接在P1.0 上的LED1 不亮了,而其它的都亮了,从现象上看就是“暗点”移到了后面;

然后是调用延时程序,这里有一条指令NOP,它是空操作指令,也就是什么都不做,用于短暂的延时,其他的指令我们很熟悉了,就是让这个“暗点”暗一会儿,然后又跳转到LOOP 处(LJMP LOOP),请大家计算一下,下面该哪个灯不亮了⋯⋯对了,应当是接在P1.1 上灯不亮了,这样依次不断的循环,就形成了“暗点流动”的现象。

单片机经典教程

 第一课 单片机的概述和分类

 第二课 单片机引脚功能介绍

 第三课 单片机内部结构(一)

 第四课 单片机内部结构(二)

 第五课 单片机内部结构(三)

 第六课 单片机内部结构(四)

 第七课 单片机内部结构(五)

 第八课 单片机内部结构(六)

 第九课  单片机是如何工作的?

 第十课 寻址是如何实现的

 第十一课 单片机的指令(一)

 第十二课 单片机的指令(二)

 第十三课 单片机的指令(三)

 第十四课 单片机的指令(四)

 第十五课 单片机的指令(五)

 第十六课 单片机程序的设计

 第十七课 单片机定时/计数器

 第十八课 单片机的中断系统

 第十九课 定时与中断实验一

 第二十课 定时与中断实验二

 第二十一课 键盘接口与编程一

 第二十二课 键盘接口与编程二

 第二十三课 数码管接口与编程1

 第二十四课 数码管接口与编程2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

XL2000单片机开发板&实验仪

XL600+51mini仿真器

xl400+51mini开发板

XL400单片机学习开发板

XL600编程实验单片机开发板

 

EP3.0支持stc双串口编程器

Ep51 单片机编程器

Top853 usb通用编程器

Top2007多功能编程器

GENIUS UPL800通用编程  

编辑:学林单片机@ 修订1.3 2010-01-25  学林电子,中国单片机学习板和开发板第一品牌   本文8951.com版权所有,未经书面批准转载必究。

当前共1030篇单片机基础入门文章,更多精彩内容请进入学林单片机论坛   联系我们 法律声明  粤ICP备05015330号