单片机原理.docx
《单片机原理.docx》由会员分享,可在线阅读,更多相关《单片机原理.docx(41页珍藏版)》请在冰豆网上搜索。
单片机原理
寻址方式
寻址的“址”是指操作数所在的单元地址。
绝大多数指令执行时都需要使用操作数,因此也
俄存在着到那里去取得操作数的问题。
因为在计算中只要给出单元地址,就能得到所需要的操
作数。
因此所谓寻址,其实质就是如何确定操作数单元地址的问题。
根据指令操作的需要,计算机总是提供多种寻址方式。
一般来说,寻址方式越多计算机的
筹址能力就越强,但是指令系统也就愈加复杂。
因此在设定寻址方式时应考虑到实际的需要和
可能。
单片机共有七种寻址方式,下面分别介绍。
a.寄存器寻址方式
‘-”寄存器寻址就是操作数在寄存器中,因此指定了寄存器就能得到操作数。
寄存器寻址方式
勺指令中以符号名称来表示寄存器。
例如指令:
MOVA,RO
其功能是把寄存器RO的内容传送到累加器A中。
由于操作数在RO中,因此在指令中指
起了RO,也就得到了操作数,所以是寄存器寻址方式。
寄存器寻址方式的寻址范围包括:
D四个寄存器组共32个通用寄存器。
但在指令中只能使用当前寄存器组,因此在使用前常
需通过对PSW中RS;、RS。
位的状态设置,来进行当前寄存器组的选择。
开部分专用寄存器。
例如累加器A、AB寄存器对以及数据指针DPTR等。
2.直接寻址方式
指令中操作数直接以单元地址的形式给出,就称之为直接寻址。
例如指令:
MOVA,3AH
其功能是把内部RAM3AH单元中的数据传送给累加器A。
,
因为直接寻址方式只能使用8位二进制地址,因此这种寻址方式的寻址范围只限于内部
RAM,具体说就是:
①低128单元。
在指令中直接以单元地址形式给出。
②专用寄存器。
专用寄存器除以单元地址形式给出外,还可以以寄存器符号形式给出。
应当指出,直接寻址是访间专用寄存器的唯一方法。
S.守有器间接寻址方式
寄存器寻址方式,寄存器中存放的是操作数。
而寄存器间接寻址方式,寄存器中存放的则
是操作数的地址,即操作数是通过寄存器间接得到的,因此称之为寄存器间接寻址。
寄存器间接寻址也需以寄存器符号的形式表示。
为了区别寄存器寻址和寄存器间接寻址,
在寄存器间接寻址方式中,应在寄存器的名称前面加前缀标志“@”。
假定RO寄存器的内容是3AH,则指令
MOVA,@RO
为功能是以RO寄存器内容3AH为地址,把该地址单元的内容送累加器A。
其功能示意请参
rp.@2-1。
寄存器间接寻址方式的寻址范围:
①内部RAM低128单元
对内部RAM低128单元的间接寻址,应使
用RO或RI作间址寄存器,其通用形式为
@Ri(i—0或1)。
②外部RAM64KB
对外部RAM64KB的间接寻址应使用
DPTR作间址寄存器,其形式为@DPTR。
例
如。
MOVXA,@DPTR,其功能是把
。
—。
_。
,__._-_一___、。
_。
_图2-1寄存器间接寻址示意图
DPTR指定的外部RAM单元的内容运累加一’——’””—’”—”一”一
器A。
外部RAM的低256单元是一个特殊的寻址区,除可以使用DPTR作间址寄存器寻址外,
还可使用RO或RI作间址寄存器寻址。
例如MOVXA,@RO,即把RO指定的外部RAM单
元的内容送累加器A。
此外对于堆栈操作指令(PUSH和POP)也应算作是寄存器间接寻址,即以堆栈指针(SP)
作间址寄存器的间接寻址方式。
4.立即寻址方式
所谓立即寻址就是操作数在指令中直接给出。
通常把出现在指令中的操作数称之为立即
数,因此就把这种寻址方式称之为立即寻址。
为了与直接寻址指令中的直接地址相区别,在立
即数前面加“#”标志。
例如:
MOVA,#3AH
其中3AH就是立即数,指令功能是把数据3AH送累加器A。
除8位立即数外,MCS-51指令系统中还有一条16位立即寻址指令,即:
MOVDPTR,#data16
其功能是把16位立即数送数据指针DPTR。
5.位寻址方式
MCS-sl有位处理功能,可以对数据位进行操作,因此就有相应的位寻址方式。
例如:
ANLC,30H
指令功能是累加位C的状态和地址为3OH的位状态进行逻辑与操作,并把结果保存在C中。
位寻址的寻址范围:
①内部RAM中的位寻址区。
单元地址为20H~ZFH,共16个单元128位,位地址是00H~
7FH(详见表1-2)。
对这128个位的寻址使用直接位地址表示。
例如:
MOVC,ZBH指令
功能是把位寻址区的ZBH位状态送累加位。
②专用寄存器的可寻址位。
可供位寻址的专用寄存器共有11个,实有寻址位83位。
对这些
寻址位在指令中有如下四种表示方法:
·直接使用位地址。
这些位地址在表1-4中已列出。
例如PSW寄存器位5地址为DSH。
·位名称表示方法。
专用寄存器中的一些寻址位是有符号名称的,例如PSW寄存器位5
是F。
标志位,则可使用F。
表示该位。
·单元地址加位的表示方法。
例如DOH单元(即PSW寄存器)位5,表示为DOH.5。
·专用寄存器符号加位的表示方法。
例如PSW寄存器的位5,表示为PSW.5。
一个寻址位有多种表示方法,初看起来有些乱,但实际上这将为程序设计带来方便。
.6.变址寻址方式
、MCS-51的变址寻址是以DPTR或PC作基址寄存器,以累加器A作变址寄存器,并以两
者内容相加形成的16位地址作为操作数地址。
例如指令:
MOVCA,@A+DPTR
其功能是把DPTR和A的内容相加,再把所得到的程序存储器地址单元的内容送A。
假
定指令执行前(A)=54H,(DPTR)一3F21H,则该指令的操作示意请参见图2-2。
变址寻址形成的操作数地址为3F21H+54H=3F75H,而3F75H单元的内容为7FH,故
该指令执行结果是A的内容为7FH。
对MCS-51指令系统的变址寻址方式作如下说明:
①变址寻址方式只能对程序存储器进行寻址,或者说它是专门针对程序存储器的寻址方式。
②变址寻址的指令只有三条:
MOVCA,@A+DPTR
MOVCA,@A+PC
JMP@A+DPTR
其中前两条是程序存储器读指令,后一条是无条件转移指令。
③尽管变址寻址方式较为复杂,但变址寻址的指令却都是一字节指令。
7.相对寻址方式
相对寻址方式是为实现程序的相对转移而设计的,为相对转移指令所采用。
在相对寻址的转移指令中,给出了地址偏移量(在MCS-51指令系统中以“rel”表示),把
PC的当前值加上偏移量就构成了程序转移的目的地址。
但这里的PC当前值是指执行完该转
移指令后的PC值,即转移指令的PC值加上它的字节数。
因此转移的目的地址可用如下公式
表示:
目的地址一转移指令地址十转移指令字节数一一I--rel
在MCS-51指令系统中,有多条相对转移指令,这些指令多数为二字节指令,但也有个别
为三字节的。
偏移量rel是一个带符号的8位H进制补码数。
所能表示的数的范围是一128~+127,因
此相对转移是以转移指令所在地址为基点,向前最大可转移(127十转移指令字节数)个单元地
址,向后最大可转移(128一转移指令字节数)个单元地址。
最后还应说明,因为在指令操作中有从右向左传送数据的约定,所以常把左边操作数称之
为目的操作数,而右边操作数称之为源操作数。
上面所讲各种寻址方式的举例中都是针对源操
作数的。
但实际上源操作数和目的操作数都有寻址的问题,例如指令:
MOV45H,RI
其源操作数是寄存器寻址方式,而目的操作数则是直接寻址方式,因此指令的功能是把按
寄存器寻址取出的RI内容再以直接寻址方式存放于内部RAM的45H单元中。
总的来说,源操作数的寻址方式多,而目的操作数的寻址方式较少,MCS一引中国的操作
数据的寻址只有寄存器寻址、直接寻址、寄存器间接寻址和位寻址共四种方式。
因此知道了源
操作数的寻址方式也就不难了解目的操作数的寻址问题了。
2.1.3单片机执行指令的过程
单片机的工作过程就是执行程序的过程。
而程序是由指令组成的,因此执行程序的过程,
就是执行指令的过程。
而指令的执行又分为取指令和执行指令两项基本内容,所以单片机的工
作过程,实际上就是周而复始地取指令和执行指令的过程。
在取指阶段中,单片机从程序存储器中取出指令操作码,送指令寄存器,再经指令译码器
译码,产生一系列的控制信号,然后进入指令执行阶段。
在指令执行阶段。
就是利用指令译码产
生的控制信号,进行本指令规定的数据操作。
为进一步说明单片机的工作过程,下面举一个程序实例进行说明。
例如为了使单片机进行
5+3的操作,需编写如下程序:
MOVA,#05H
ADDA,#03H
MOVRO,A
执行上述程序,就可以完成5十3的操作,并把相加结果8送RO寄存器中存放。
但是单片机并不能直接使用助记符式的汇编指令,因此需把助记符指令转换为二进制指
令代码。
上述程序表示如下:
┌─────┬─────────┬───────┬──────────────┐
│指令名称│助记符形式│指令代码│注释│
├─────┼─────────┼─────┬─┼──────────────┤
│立即数传送│MOVA,#05H│0ill0100│74│一个加数送累加器A│
│││00000101│05││
├─────┼─────────┼─────┼─┼──────────────┤
│加立即数│ADDA,#03H│00100100│24│累加器A内容(05)与立即数│
│││00000011│03│(03)相加,其和在A中│
├─────┼─────────┼─────┼─┼──────────────┤
│数据传送│MOVRO,A│1111正00O│FS│相加结果送寄存器RO│
└─────┴─────────┴─────┴─┴──────────────┘
2.1.4指令中符号意义说明
在分类介绍指令之前,先把指令中使用的一些符号意义作简单说明。
Rn——当前寄存器组的8个通用寄存器RO~R7,所以n—0~7。
Ri——可用作间接寻址的寄存器,只能是RO、RI两个寄存器,所以i=0,1。
direct——内部RAM的8位地址。
既可以是内部RAM的低128个单元地址,也可t
用寄存器的单元地址或符号。
因此在指令中dire。
t表示直接寻址方式。
#data——8位立即数。
#data16——16位立即数。
addrl6——16位目的地址,只限于在LCALL和LJMP指令中使用。
addrll——11位目的地址,只限于在ACALL和AJMP指令中使用。
rel——相对转移指令中的偏移量,为8位带符号补码数。
DPTR——数据指针。
bit——内部RAM(包括专用寄存器)中的直接寻址位。
A——累加器。
(直接寻址方式的累加器表示为ACC)。
B——B寄存器。
C——进位标志位,它是布尔处理机的累加器,也称之为累加位。
@——间址寄存器的前缀标志。
/——加在位地址的前面,表示对该位状态取反。
(X)——某寄存器或某单元的内容。
《X》——由X间接寻址的单元中的内容。
———箭头左边的内容被箭头右边的内容所取代。
2.2数据传送类指令
MCS-51指令系统中,各类数据传送指令共有29条,分述如下。
2.2.l内部RAM数据传送指令组
单片机芯片内部是数据传送最为频繁的部分,有关的传送指令也最多,包括寄存器
器、RAM单元以及专用寄存器之间的相互数据传送。
1.立即教传进指令
8位立即数传送指令共四条:
MOVA,#data;A←data
MOVdirect,#data;direct←data
MOVRn,#dsts;Rn ← data
MOV@Ri,#data;(Ri)←data
这四条指令的功能都是实现8位立即数的传送,把立即数传送到不同寻址方式的内部
RAM单元中。
此外还有16位立即数传送指令一条:
MOVDPTR,#data16;DPTR←data16
这条指令的功能是将立即数的高8位送DPH,立即数的低8位送DPL。
这条指令是三字
节指令,即操作码占一个字节,16位立即数占两个字节,其排列顺序为:
这种高位在前低位在后的存放顺序与Z-80指令系统规定的顺序正好相反。
请学习过Z-
90的读者注意。
!
.内部RAM单元之间的数据传送指令
内部RAM单元之间的数据传送指令共有五条:
MOVdirect2,directl;directZ←(directl)
MOVdirect,Rn;direct←(Rn)
MOVRn,directl;Rn←(direct)
MOVdirect,@Ri;direct←((Ri))
MOV@Ri,directl;(Ri)←(direct)
内部RAM单元之间的数据传送可以使用直接寻址、寄存器寻址以及寄存器间接寻址方
式。
例如下列指令均属于内部RAM单元之间的数据传送指令:
MOVP2,R2;寄存器RZ内容送P2口
MOVA0H,R2;寄存器RZ内容送P2口,AOH是P2口的地址。
MOVDOH,@R1;RI内容所指定的内部RAM单元的内容送PSW
寄存器,DOH是PSW的单元地址。
MOVR5,70H;内部RAM70H单元的内容送R5
3.累加器的数据传送指令
与累加器有关的数据传送指令共有六条:
MOVA,Rn;A←(Rn)
MOVRn,A;Rn←(A)
MOVA,direct;A←(direct)
MOVdirect,A;direct←(A)
MOVA,@Ri;A←((Ri))
MOV@Ri,A;(Ri)←(A)
这六条指令用于实现累加器与不同寻址方式的内部RAM单元之间的数据传送。
2.2.2外部RAM数据传进指令组
对外部RAM单元只能使用间接寻址方法,但可以分别使用DPTR和Ri作间址寄存器,
因此相应地就有两组指令:
1.使用DPTR进行间接寻址
MOVXA,@DPTR;A←《DPTR))
MOVX@DPTR,A;(DPTR)←(A)
由于DPTR是16位地址指针,因此指令的寻址范围为64KB。
2.使用Ri进行间接寻址
MOVXA,@Ri;A←((Ri))
MOVX@Ri,A;(Ri)←(A)
i—(0,1),由于RO和RI是8位地址指针,因此指令的寻址范围只限于外部RAM的低
256个单元。
对外部RAM数据传送指令作如下说明:
①MCS-51指令系统中没有专用的存储器读写指令,实际上外部数据存储器数据传送指令
就是外部RAM的读写指令。
②外部RAM数据传送指令与内部RAM数据传送指令相比,在指令助记符中增加了“X”,
“X”是代表外部之意。
③外部RAM的数据传送,只能通过累加器A进行。
2.2.3程序存储器数据传送指令组
这里所说的程序存储器既包括内部程序存储器,也包括外部程序存储器。
由于对程序存储器只能读而不能写,因此其数据传送都是单向的,即从程序存储器读出数
据,并且只能向累加器A传送。
这类指令共两条:
MOVCA,@A+DPTR;A←((A)十(DPTR))
MOVCA,@A+PC;A←((A)+(PC))
这两条指令都是一字节指令,并且都为变址寻址方式,其寻址范围为64KB。
这两条指令通常用于查表操作,因此可以看成是查表专用指令。
虽然这两条指令的功能完
”全相同,但在具体使用中却有一点差异。
前一条指令的基址寄存器DPTR能提供16位基址,
而且还能在使用前给DPTR赋值,因此查表范围可达整个程序存储器的64KB空间。
使用起来
比较方便;而后一条指令是以PC作为基址寄存器,虽然也能提供16位基址,但其基址值是固
定的,由于A的内容为8位无符号数,因此只能在当前指令下面的256个地址单元范围内进
行查表。
例如以查表方法把累加器中的十六进制数转换为ASCll码,并送回累加器中。
其查表程
序如下:
2000HBA:
INCA
2001MOVCA,@A+PC
2002RET
20C3DB30H;以下是十六进制数ASCll码表
2004DB31H
2005DB32H
...
...
...
200CDB39H
200DDB41H
200EDB42H
200FDB43H
2010DB44H
2011DB45H
2012DB46H
’由于数据表紧跟MOVC指令之后,因此以PC作为基址寄存器比较方便。
假定A中的十
,六进制数为00H,加1后为01H,取出MOVC指令后,(PC)一2002H,(A)+(PC)一2003H,从
2Q03H单元取得数据送A,则(A)=30H,此即为十六进制数0的ASCll码值。
查表之前A加1
是因为MOVC指令与数据表之间有一个地址单元的间隔(RET指令)。
2·2·4数据交换指令组。
数据交换主要是在内部RAM单元与累加器A之间进行,有整字节和半字节两种交换。
。
1.医字节交换指令
;地址单元与累加器A进行8位数据交换,共有如下三条指令:
XCHA,Rn;(A)←→(Rn)
.XCHA,direct;(A)←→(direct)
,XCHA,@Ri;(A)←→((Ri))
2.半字节交换指令
。
地址单元与累加器A进行低4位的半字节数据交换。
只有一条指令:
XCHDA,@Ri;(A)3~0←→((RI))3~0
3.累加器高低半字节交换搭个
只有一条指令:
SWAPA;(A)3~0←→(A)3~0
由于十六进制数或BCD码都是以四位二进制数表示,因此XCHD和SWAP指令主要用
于实现十六进制数或BCD码的数位交换。
例如:
(RO)=20H,(A)=3FH,(20H)=75H,
执行指令XCHDA,@RO后,(RO)=20H,(A)=35H,(20H)=7FH。
2.2.5堆栈操作指令组
堆栈操作有进栈和出栈两种,因此相应有两条指令:
进栈指令:
PUSHdirect;SP←(SP)+1,(SP)←(direct)
其功能为内部RAM低128单元或专用寄存器内容送栈顶单元。
出栈指令:
POPdirect;direct←((SP)),SP←(SP)-1
其功能为栈顶单元内容送内部RAM低128单元或专用寄存器。
堆栈操作实际上是通过堆栈指示器SP进行的读写操作,是以SP为间址寄存器的间接寻
址方式。
但因为SP是唯一的,所以在指令中把通过SP的间接寻址的操作数项隐含了,只表示
出直接寻址的操作数项。
2.2.6数据传送类指令汇总及说明
数据传送类29条指令的简单情况汇总于表2-1。
表2-1#据传送类指令一览表
┌────────────┬──────────┬───┬───┐
│指令│功│字节数│机器│
││能简述││周期数│
├────────────┼──────────┼───┼───┤
│MOVA,Rn│寄存器送累加器│l│1│
├────────────┼──────────┼───┼───┤
│MOVRn.A│累加器送寄存器│1│1│
├────────────┼──────────┼───┼───┤
│MOVA,@Ri│内部RAM单元送累加器│l│l│
├────────────┼──────────┼───┼───┤
│MOV@Ri,A│累加器送内部RAM单元│l│1│
├────────────┼──────────┼───┼───┤
│MOVA,#data│立即数送累加器│2│且│
└────────────┴──────────┴───┴───┘
┌──────────────┬──────────────────┬───┬───┐
│指令│功能简述│字节数│机器│
││││周期数│
├──────────────┼──────────────────┼───┼───┤
│MOVA,direct│直接寻址单元送累加器│2,│1│
├──────────────┼──────────────────┼───┼───┤
│MOVdirect,A│累加器送直接寻址单元│2│1│
├──────────────┼──────────────────┼───┼───┤
│MOVRn,#data│立即数送寄存器│2│1│
├──────────────┼──────────────────┼───┼───┤
│MOVdirect.#data│立即数送直接寻址单元│3│2│
├──────────────┼──────────────────┼───┼───┤
│MOV@Xi,#data│立即数送内部RAM单元│2│且│
├──────────────┼──────────────────┼───┼───┤
│mVdirect,Rn│寄存器送直接寻址单元│2│2│
├──────────────┼──────────────────┼───┼───┤
│MOVRn,direct│直接寻址单元送寄存器│2│2│
├──────────────┼──────────────────┼───┼───┤
│MOVdirect,@Xi│内部RAM单元送直接寻址单元│2│2│
├──────────────┼──────────────────┼───┼───┤
│MOV@Ri,direct│直接寻址单元送内部RAM单元│2│2│
├──────────────┼──────────────────┼───┼───┤
│MUVdirectZ,directl│直接寻址单元送直接寻址单元│3│2│
├──────────────┼──────────────────┼───┼───┤
│MOVDPTR,#data16│16位立即数送数据指针│3│2│
├──────────────┼──────────────────┼───┼───┤
│MOVXA,@Ri│外部RAM单元送累加器(8位地址)│l│2│
├──────────────┼──────────────────┼───┼───┤
│MOVX@B,A│累加器送外部RAM单元(8位地址)│且│2│
├──────────────┼──────────────────┼───┼───┤
│MOVXA,@DPTR│外部RAM单元送累加器(16位地址)│且│2│
├──────────────┼──────────────────┼───┼───┤
│MO