用户注册 | 登录 | 帮助中心 | 网站地图 | 加入收藏 | English

网站首页 产品列表 软件下载 技术资料 付款方式 发货查询 关于我们 淘宝商城 论坛
搜索 高级/组合搜索
网站文章
所有文章
站内新闻
单片机工具资料
汇编程序实例
C语言程序实例
单片机提高资料
单片机初学资料
单片机软件下载
单片机技术资料
  您的位置: 首页 >> 文章列表 >> 单片机指令(三)
单片机指令(三)

作者:单片机爱好者  转载自:单片机工具之家  发布日期:2011-6-28

由“单片机工具之家”收集 链接网址:http://www.pic16.net

单片机指令(三)

  算术、逻辑运算类指令也是单片机中极为重要的指令系统,在很多教科书中都把它们归为一类,实际上它们还是有区别的,为了让大家便于记忆,这里把它们分了开来。在单片机中,算术运算类指令有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. 本网转载自其它媒体的信息,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。
  3. 未经本站明确许可,任何网站不得非法盗链软件下载连接及抄袭本网站原创内容资源。
  4. 违反上述声明者,本网将追究其相关法律责任。谢谢!


关于我们
网站介绍
联系我们
付款方式
银行汇款
货到付款
发货方式
快递运输
上门自提
售后服务
退换货政策
质保承诺
购买方式
购物流程
在线订购

公司名称:深圳市乾龙盛电子科技有限公司    网站名称:单片机工具之家
公司地址:广东省深圳市宝安区龙华镇民治路潜龙花园惠宁阁13-G   联系电话:0755-28187975  13715306011  传真:0755-28187976
展销柜台:广东省深圳市福田区新亚洲电子商城二期三楼N3D033室(华强电子世界附件)【查看地图】   联系电话:0755-82543360
:淘宝商店   :qls@cxqmcu.com   :qls@cxqmcu.com
销售点击Q我:243355504 (唐永红)先生   技术支持点击Q我:443935535 (钟先生)
网站版权:单片机工具之家  粤ICP备09028690号