想问一下单片机中字节和地址的关系?

一个地址对应的是一个字节还是一位,
sfr P1 = 0x90; //这样的一行即定义P1与地址0x90对应,P1口的地址就是0x90.
换句话说上面这个语句编译后,P1.1,P1.2的地址是0x91、0x92,还是P1.0-P1.7都是0x90

你对这个示图可有印象??

而每一个地址对应一个内存单元,至于内存单元的数据宽度,通常有8位、16位、32位;

但是单片机的内存单元的数据宽度是8位;

当你采用P1、P2作为输出16位地址时,每一个地址就指向一个8位的内存单元;

另外,sfr P1 = 0x90;要知道P1口可是8位的,就已经包含了 P1.1、P1.2等的取值;

P1 = 0x90 = 1001 0000b,就是对应的位 P1.7=P1.4=1,其余的位 P1.1=P1.2=P1.3=P1.5=p1.6=0;

先说这些,不明白可追问;

追问

sfr P1 = 0x90;是把P1口的地址设置为0x90吧,不是赋值
先sfr P1 = 0x90;然后P1 = 0x90;才是你说的那个意思

追答

哦,粗心了,sfr P1 = 0x90 的意思是定义一个字符来代替 0x90;

这样书写语句
mov P1, #data

mov P1, A

mov A,P1
就合法了,因为 P0,1,2,3 等不是机器指令中可使用的有效寄存器,为了书写和阅读方便,才弄个 sfr P1 = 0x90 。
首先端口P0,1,2,3 的内部地址对应是 80,90,a0,b0,是固定不变的;
你要是 sfr P1 = 0x91,那么 P1=0x5,在P1端口上是得不到这个数的;
另外,sfr P1 = 0x90 通常不需要我们去写的,编译系统中自己会处理的;

温馨提示:内容为网友见解,仅供参考
第1个回答  2021-09-13
你举的这个例子恰好牵扯出了另一个问题:51单片机的寻址方式。
当按字节寻址时,整个P1映射在直接寻址空间的地址0x90。如果这时候用间接寻址,就可能会访问到高128字节SRAM空间去了……
当按位寻址时,位寻址空间的地址0x90对应的是P1.0的锁存器/管脚(取决于指令的类型,要特别注意读-修改-写指令)。追问

感谢回答,那我怎么知道他是按位寻址还是按字节寻址呢?

第2个回答  2021-09-13
0x90是寄存器地址,这个特殊功能寄存器是8位,其中的P1.0 P1.1等管脚也是有地址的,但寄存器地址和位地址是两个概念,它们的操作指令是不同的。用同样的地址也不会冲突。追问

好的,再请教一下,既然寄存器地址和位地址是两个概念,地址不会冲突,那P1寄存器的地址和P1.0~P1.7的地址不是没关系了?那为什么P1.0~P1.7的地址是0x90~0x97,而不是0x80~0x87?

追答

你可以看一下51单片机全部寄存器地址,包括增强型51单片机的寄存器地址,P1寄存 器地址是0x90,不假,但0x91 0x92......等地址也没有闲着,是P1模式配置寄存器(STC12A60S2单片机)。普通51单片机0x80是P0口,0x81 0x82分别是堆栈指针SP和数据指针DPTR的低8位,和P0位地址是重合的,但操作时指令完全不同。例如SETB指令,后面只能跟位地址,INC DEC指令后面只能跟寄存器地址。 数据传送指令MOV C,BIT MOV BIT ,C 都是只对位操作,BIT是位地址。 而对寄存器数据传送操作是 MOV A,direct或 MOV direct, A等,direct是寄存器地址,还有相同操作符号罗辑运算也能区分,如逻辑与运算 ANL A,Rn ANL A,dircet ,这是对寄存器操作。而对位操作ANL C,bit 或 ANL C,/bit 。每条指令是由操作码和操作数组成的, ANL A ANL C他们的操作码不同,后面跟的寄存器地址或位地址是操作数就可以相同了。

追问

明白了,意思寄存器地址和位地址可能重合,只是用不同的指令进行操作,那我在想既然地址重合了,不会产生冲突吗

追答

学过汇编语言的人对单片机内部寄存器结构了解更深一些。

本回答被提问者采纳
第3个回答  2021-09-13
0x90是特殊功能寄存器的地址,这条定义表示P1口的8位数据存放在以0x90为地址的8位寄存器中,P1.0对应这个寄存器的最低位,p1.7对应这个寄存器的最高位。追问

以0x90为地址的8位寄存器中,那P1.7的地址是0x90还是0x97?

追答

P1.7的地址是位地址0x90.7,和0x97没关系

第4个回答  2021-09-13
答:sfr P1 = 0x90;

//这样的一行即定义P1口的开始地址0x90对应,
换句话说上面这个语句编译后,P1.1,P1.2的地址是0x91、0x92, 明白没。追问

再请教一下,那这样一个地址对应的是一个位?一个字节有八个地址?

追答

答:IO 口一个地址对应的是一位,

想问一下单片机中字节和地址的关系?
而每一个地址对应一个内存单元,至于内存单元的数据宽度,通常有8位、16位、32位;但是单片机的内存单元的数据宽度是8位;当你采用P1、P2作为输出16位地址时,每一个地址就指向一个8位的内存单元;另外,sfr P1 = 0x90;要知道P1口可是8位的,就已经包含了 P1.1、P1.2等的取值;P1 = 0x90 ...

单片机中的位地址与字节地址有什么联系和区别?
单片机从20H到2FH的16个字节单元,共128位可以按位寻址,对应位寻址空间00H到7FH,所以位地址为40H的单元地址为40H\/8+20H=28H。另外特殊功能寄存器中,有16个可以位寻址,查一下表格就行了88H对应的字节地址也为88H。同理2AH-20H=0AH,0AH*8=50H。单片机片内RAM的20H~2FH,这十六字节,可以按...

单片机的问题,怎么理解位地址和字节地址
位地址和字节地址是单片机编程中的重要概念。在单片机中,内存是按字节划分的,每个字节包含8个位。因此,当我们提到位地址时,我们实际上是指字节内的特定位的位置,从0开始计数,直到7。而字节地址则是指内存中特定字节的地址,也是从0开始计数。理解位地址和字节地址对于进行有效的内存管理和数据操作至...

单片机中的位单元、位地址是什么意思?
1字节=8位 (1Byte=8bit)又叫(1B=8b)举个例子,1套房子有8个房间,字节地址就是房子号,位地址就是房间号,你要把一件新买的家具放在其中一个房间里,就相当于把0或者1放在其中一个位那里。

单片机中位地址与字节地址有什么区别?谢谢!~
地址本身没有区别,是8位二进制,但区别是前面的命令。如果命令是字节寻址则这个字节就是字节地址,相应地如果命令是位寻址则这个字节就是位地址。希望你能明白我说的。

单片机里面的寄存器的字节地址是用来干什么的?怎么用?
在单片机指令中寻址任何一个字节都需要字节地址,寻址任何一个位都需要位地址。所谓的IP、IE不过是我们给这个寄存器取了另外一个名字而已。如:MOV IP,#00H 和 MOV B8H,#00H 这两条语句是一样的效果。另外,从这些寄存器的使用上来说,IP、IE等特殊功能寄存器既可以字节寻址也可以位寻址,是同样...

字节地址和位地址有什么区别?
1、存储 单片机中的存储器通常以字节(8bit)为单位来进行组织,即每一个字节有一个地址,通过“字节”地址可以访问到存储器中的任何一个字节,这是最常见的形式。问题当中以“sfr”开头的,就是在定义字节地址,相当于给指定的地址又起了一个别名,以后可以通过这个别名访问字节存储单元。2、操作对象 ...

单片机仲的数据存储器的位地址和字节地址分别代表什么?它们有什么区 ...
简单的说,一栋大楼,字节就是某一层,位就是某一层的某一个房间

单片机位地址和字节地址的问题
第一个问题:一个字节是8位的,所以是2^8 不是你说的2^10 第二个问题:51单片机位地址区域是20H~2FH,对应的位地址为00H~7FH,从80H开始是特殊功能寄存器区,比如P0,地址为80H,其每一位对应的“位”地址为80H~87H,所以特殊功能寄存器,只能被8整除的地址,才能位寻址。其余的特殊功能寄存器...

51单片机的位地址和字节地址有什么区别?
1. 位地址是指向一个二进制位的位置,相当于给每个二进制位编了一个号码。2. 字节地址指向单个字节,即每8个二进制位作为一个组编一个号。

相似回答