单片机指令
详细内容
单片机指令(一)
指令就是编程者给单片机下的命令,也就是我们平常所说的单片机软件,前面我们已经陆续地讲到了一些指令,但还远远不够,从这一课开始就要全面的讲解指令了,希望大家多动手实验,巩固所学的知识,说实在的,其实单片机并不难学。
为了让大家比较容易记忆,按照常规分类,我把单片机的111 条指令分成了五类—即数据传递类指令、算术运算类指令、逻辑运算类指令、控制转移类指令和位操作指令。这一课先来看数据传递类指令:一.数据传递类指令数据传递类指令是单片机中用的最多的指令,在51 系列单片机的111 条指令中共有28 条是数据传递类指令,前面我们已经学到了几条,比如MOV R1,#250;MOV A,R6 等,那么它们是怎么分类的呢?请往下看:
1. 以累加器为目的操作数的指令
(1)MOV A,Rn
(2)MOV Rn,A
(3)MOV A,direct
(4)MOV A,@Ri
(5)MOV A,#data
指令(1)把Rn 中的数送入累加器A,Rn 代表工作寄存器R0-R7(以后我们只要写到Rn 都代表R0-R7 ,这一点请大家记住了);
指令(2)则相反,把工作寄存器中的数送入累加器A 中;
指令(3)是把直接地址中的数送入累加器A 中,driect 就代表直接地址(以后也相同);
指令(4)就是上一课我们讲的寄存器间接寻址,什么意思?这里再重复一遍,就是看一下工作寄存器中是什么值,把这个值作为地址,把这个地址中的数送入累加器A 中,Ri 代表什么意思呢?就是工作寄存器R0 或者R1(以后如果写Ri 都代表R0 或R1);
指令(5)就是把立即数(也叫常数)直接送入累加器A 中,很显然data 就代表立即数(以后也相同),其实这个我们以前提到过,加#的数就代表送入的是这个数的本身。
接下来举几个实例加以说明,大家可以用DUBG8051 这个软件验证一下:
A.MOV R7,#250;MOV A,R7 ;将工作寄存器R7 中的值250 送入A,R7 中的值保持不变。
B.MOV A,#250;MOV R7,A;将A 中的值250 送入工作寄存器R7,A 中的值保持不变。
C.MOV 30H,#250;MOV A,30H ;将内存30H 单元中的值250 送入A,30H 单元中的值保持不变。
D.MOV 20H,#250;MOV R0,#20;MOV A,@R0 ;先看R0 中是什么值,把这个值作为地址,并将这个地址单元中的值送入A 中。执行命令前R0 中的值为20H,则是将20H 单元中的值250 送入A 中。
E.MOV A,#250 ;将立即数250 送入A 中,执行完本条指令后,A 中的值是250。
2.以寄存器Rn 为目的操作数的指令
(1)MOV Rn,A
(2)MOV Rn,direct
(3)MOV Rn,#data 举几个实例大家自行分析一下:
A.MOV R7,A ;
B.MOV R7,30H ;
C.MOV R7,#20 ;
这组指令功能是把源地址单元中的内容送入工作寄存器,源操作数不变。
3.以直接地址为目的操作数的指令
34 _ 单片机教程(MCS-51 系列) (1) MOV direct,A 例如:MOV 30H,A(将累加器A 中的数送入内存单元30H)(2)MOV direct,Rn 例如:MOV 30H,R7(将寄存器R7 中的数送入内存单元30H)(3)MOV direct,direct 例如:MOV 30H,20H(将内存单元20H 中的数送入内存单元30H)(4)MOV direct,@Ri 例如:MOV 30H,@R0 (看一下R0 中是什么值,把这个值作为地址,并将这个地址单元中的值送入A 中。如执行指令前R0 中的值为20H,则是将20H 单元中的值送入A 中)。(5)MOV direct,#data 例如:MOV 30H,#20(将立即数20 送入内存单元30H)
4. 以间接地址为目的操作数的指令
(1)MOV @Ri,A (2)MOV @Ri,direct (3)MOV @Ri,#data16 这三条指令就不介绍了,大家自行分析一下,不过有一点希望大家记住,Ri只能用工作寄存器R0或者R1。
5. 十六位数的传递指令
MOV DPTR,#data16 指令说明:这是51 单片机中唯一的一条16 位立即数传递指令,大家知道51 系列单片机是一种8 位单片机,8 位单片机所能表示的最大数只能是28=0-255 。讲到这里大家应该明白了,为什么我们前面的实验中立即数不能大于255 。如果现在有个数是1234H (即二进制0001 0010 0011 0100),我们要把它送入DPTR ,该怎么办呢?当然有办法,INTEL 公司已经把DPTR 分成了两个寄存器,DPH 和DPL (看一下前面的特殊功能寄存器介绍),我们只要把12H( 高8 位)送入DPH ,把34H( 低8 位)送入DPL 中去就可以了,所以执行指令MOV DPTR,#1234H 和执行指令MOV DPH,#12H(1); MOV DPL,#34H(2);是一样的。二.指令练习请写出下列每条指令的执行结果,并用DUBG8051 软件进行验证,看结果是否正确。
1.MOV 12H,#34H
2.MOV R0,#23H
3.MOV R7,#22H
4.MOV R1,12H
5.MOV A,@R0
6.MOV 34H,@R1
7.MOV 45H,34H
8.MOV 12H,DPH
9.MOV R0,DPL