数据、地址、指令:之所以将这三者放在一同,是因为这三者的实质都是相同的──数字,或者说都是一串‘0’和‘1’组成的序列。换言之,地址、指令也都是数据。
指令:具体可参考文章
由单片机芯片的设计者规则的一种数字,它与咱们常用的指令助记符有着严厉的一一对应联系,不能由单片机的开发者更改。
地址:
是寻觅单片机内部、外部的存储单元、输入输出口的根据,内部单元的地址值已由芯片设计者规则好,不行更改,外部的单元能由单片机开发者自行决定,但有一些地址单元是一定要有的(详见程序的履行进程)。
通俗解释:
地址是存储单元的编号,如果把存储单元看成一排排的房子,地址就是房子的门牌号,c语言里地址即指针。
有点像澡堂里放衣服的箱子,需要拿衣服的时候,按照箱子的编号去拿衣服。但是有时候直接告诉你箱子号码,你过去,打开箱子,拿到了衣服——直接寻址;找到一个箱子,打开却发现是一把钥匙,钥匙上写着另一个箱子的号码。你拿着钥匙过去打开那个箱子拿出衣服来——间接寻址
8位单片机256的存储器,就像是一座256户16层16个单元,每个单元每层是1户,1户有八个房间的大楼,
存储器容量就是户数=256。
存储器地址就是门牌号,如5AH就是5单元10楼,H是十六进制的意思
每一户里的八个房间就是8个位
八个房间的名字就是位地址
单片机的几种寻址方式
此内容转自文章,如有侵权请联系作者删除
https://blog.csdn.net/baidu_37503452/article/details/83016841
寻址就是寻找指令中操作数或操作数所在的地址。所谓寻址方式,就是如何找到存放操作数的地址,把操作数提取出来的方法。通常指源操作数的寻址方式。
MCS-51系列单片机寻址方式共有七种:寄存器寻址、直接寻址、立即数寻址、寄存器间接寻址、变址寻址、相对寻址、位寻址。
1、寄存器寻址
寄存器寻址是指操作数存放在某一寄存器中,指令中给出寄存器名,就能得到操作数。寄存器可以使用寄存器组R0~R7中某一个或其它寄存器(A,B,DPTR等)。
例如:
MOV A,R0 ;(R0 )→A
MOV P1,A ;(A)→P1
ADD A, R0 ;(A)+(R0) →A
2、直接寻址
在指令中直接给出操作数所在的存储单元的地址,称为直接寻址方式。在8051中,使用直接寻址方式可访问片内RAM的128个单元以及所有的特殊功能寄存器(SFR),对于特殊功能寄存器,既可以使用他们的地址,也可以使用他们的名字。
例如:
MOV A, 3AH ;(3AH) →A
又如:
MOV A, P1 ;(P1口) →A
也可写为:
MOV A, 90H ; 90H是P1口的地址。
3、立即数寻址
指令操作码后面紧跟的是一字节或两字节操作数,用 # 号表示,以区别直接地址。例如:
MOV A, #3AH ;3AH→A
MCS-51系列单片机有一条指令,要求操作码后面紧跟的是两个字节立即数,即
MOV DPTR, #DATA16
4、寄存器间接寻址
寄存器中的内容是一个地址,由该地址单元寻址到所需的操作数.
例如: MOV R1,#30H ;(R1)← 立即数30H
MOV @R1,#0FH ;(30H)←立即数0FH
MOV A,@R1 ;(A)←((30H))=#0FH
注意:
“间接”表示某寄存器中的“内容”只是一个“单元地址”,这个地址单元中存放的数据才是要找的“操作数”。
例如,指令MOV A,@R0执行的操作是将R0的内容作为内部RAM的地址,再将该地址单元中的内容取出来送到累加器A中,如图所示。
5、变址寻址 ,也称为: 基址寄存器+变址寄存器间接寻址
以16位的地址指针寄存器DPTR或 16位的PC寄存器为基址寄存器,以累加器 A 为变址寄存器,两者中的“内容”形成一个16位的“地址”,该“地址”所指的存储单元中的内容才是操作数。用变址寻址方式只能访问程序存储器,访问的范围为64KB,当然,这种访问只能从ROM中读取数据而不能写入。
例如: MOVC A, @A+DPTR 😭(A)+ (DPTR))→A
设:A中已存有#30H,DPTR中已存有#1000H
MOVC A,@A+DPTR;(A)←((A)+(DPTR))
操作:将30H+1000H=1030H单元中的数放进累加器A
6、相对寻址
相对寻址只出现在相对转移指令中。相对转移指令执行时,是以当前的PC值加上指令中规定的偏移量rel而形成实际的转移地址。这里所说得PC的当前值是执行完相对转移指令后的PC值,一般将相对转移指令操作码所在的地址称为源地址,转移后的地址称为目的地址。于是有:目的地址=源地址+2(相对转移指令字节数)+rel
51单片机指令系统中相对转移指令既有双字节的,也有三字节的。
7、位寻址
采用位寻址方式的指令,操作数是8位二进制数中的某一位。指令中给出的是位地址,是片内RAM某个单元中的某一位的地址。位地址在指令中用bit表示。
例: CLR P1.0 ;(P1.0) ← 0
SETB ACC.7 ;(ACC.7)← 1
CPL C 😭 C )← NOT( C )
位地址常用下列三种方式表示;
(1)直接使用位地址表示。对于20H2FH的16个单元共128位,位地址分布是00H7FH。
(2)对于特殊功能寄存器,可以直接用寄存器名字加位数表示,如PSW.3、ACC.5等。
(3)对于定义了位名字的特殊位,可以直接用其位名表示,例如:CY、AC等。
寻址方式及对应存储器空间
寻址方式中常用符号注释
(1) Rn(n=0~7) 当前选中的工作寄存器R0~R7 。
(2) Ri(i=0,1) 当前选中的工作寄存器组中,可作为间址寄存器
的两个工作寄存器R0、R1。
(3) #data 8位立即数。
(4) # data16 16位立即数。
(5) direct 8位片内RAM单元(包括SFR)的直接地址。
(6) addr11 11位目的地址,用于ACALL和AJMP指令中。
(7) addr16 16位目的地址,用于LCALL和LJMP指令中。
(8) rel 补码形成的8位地址偏移量。
(9) bit 片内直接寻址位地址。
(10)@ 间接寻址方式中,表示间址寄存器的符号。
(11)/ 位操作指令中,表示对该位先取反再参与操作,但
不影响该位原值。
(12)(X) 表示X中的内容。
(13)((X)) 由X指出的地址单元中的内容。
(14) → 指令操作流程,将箭头左边的内容送入箭头右边的单元。
首先,地址的作用只有一个,就是用来寻址
补充
51单片机的的片内寄存器都是可以字节寻址的。
字节地址就是用来寻址一个字节的内容,和位地址相对应,位地址就只能寻址一个位(bit)。在单片机指令中寻址任何一个字节都需要字节地址,寻址任何一个位都需要位地址。所谓的IP、IE不过是我们给这个寄存器取了另外一个名字而已。如:MOV
IP,#00H和
MOV B8H,#00H
这两条语句是一样的效果。另外,从这些寄存器的使用上来说,IP、IE等特殊功能寄存器既可以字节寻址也可以位寻址,是同样的效果。比如:SETBPX0;和MOV IP,#01H;是一样的,都是将IP的第0位即PX0置1。不同的是,字节寻址的时候是8位一起操作的,会对其它的位赋值,有时不想改变其它位的值,就用位寻址。
所以,字节地址是用来寻址字节的,位地址是用来寻址位的。就这样。另外,IP也好,IE也好,也都是寄存器,要访问它们也需要地址(访问字节用字节地址,访问位用位地址),不同的是它们用来对处理器进行配置,我们给它们取了一些特定的名字而已。
数据:
这是由微处理机处理的目标,在各种不相同的使用电路中各不相同,一般来说,被处理的数据可能有这么几种状况:
- 地址(如MOV DPTR,#1000H),即地址1000H送入DPTR。
- 方法字或操控字(如MOV TMOD,#3),3便是操控字。
- 常数(如MOV TH0,#10H)10H即守时常数。
- 实践输出值(如P1口接彩灯,要灯全亮,则履行指令:MOV P1,#0FFH,要灯全暗,则履行指令:MOV P1,#00H)这儿0FFH和00H都是实践输出值。又如用于LED的字形码,也是实践输出的值。
总线概述
计算机系统是以微处理器为核心的,各器件要与微处理器相连,且必须协调工作,所以在微处理机中引入了总线的概念,各器件共同享用总线,任何时候只能有一个器件发送数据(可以有多个器件同时接收数据) 。
计算机的总线分为控制总线、地址总线和数据总线等三种。而数据总线用于传送数据,控制总线用于传送控制信号, 地址总线则用于选择存储单元或外设。
单片机的三总线结构
51系列单片机具有完善的总线接口时序,可以扩展控制对象,其直接寻址能力达到64k( 2的16次方) 。在总线模式下,不同的对象共享总线,独立编址、分时复用总线,CPU 通过地址选择访问的对象,完成与各对象之间的信息传递。
数据总线
51单片机的数据总线为P0口,P0口为双向数据通道,CPU从P0 口送出和读回数据。
控制总线
51系列单片机的控制总线包括读控制信号P3.7和写控制信号P3.6等,二者分别作为总线模式下数据读和数据写的使能信号。
地址总线
单片机内部或者外部存储器及其它器件中有存储单元,这些存储单元要被分配地址,才能使用,分配地址当然也是以电信号的形式给出的,由于存储单元比较多,所以,用于地址分配的线也较多,这些线被称为地址总线。地址总线(Address Bus)是一种计算机总线,是CPU或有DMA能力的单元,用来沟通这些单元想要访问(读取/写入)计算机内存组件/地方的物理地址。
51系列单片机的地址总线为16位。
为了节约芯片引脚,采用P0口复用方式,除了作为数据总线外,在ALE信号时序匹配下,通过外置的数据锁存器,在总线访问前半周期从P0口送出低8位地址,后半周期从P0 口送出8位数据。
高8位地址则通过P2口送出。
地址总线驱动: