标题: 51单片机中,这个SFR定义的是啥意思? [打印本页]

作者: 忆1709    时间: 2021-5-17 12:23
标题: 51单片机中,这个SFR定义的是啥意思?
本帖最后由 忆1709 于 2021-5-17 12:35 编辑

在STC单片机的头文中看到如下定义:
sfr P0          =   0x80;
① sfr是特殊功能寄存器的意思,以上P0不是端口号吗,为何变成了特殊功能寄存器了呢? IO口跟特殊功能寄存器的关系是什么?

② 以上语句,写在头文件里,它有什么用处吗?不这样定义会出什么问题?

③ 能否把sfr换成#define?










作者: munuc_w    时间: 2021-5-17 13:40
1. SFR是关键字,用来定义特殊功能寄存器。在51系列单片机中,IO口的地址是映射到寄存器上的,即IO口的地址就是对应特殊功能寄存器的地址。P0是PORT0的名字,0x80是P0口对应的内部特殊功能寄存器的地址。
2. 将这个语句放到头文件中,是便于使用,在应用程序中只要包含这个头文件,就不用再定义特殊功能寄存器了,直接使用其名字即可。
3. 如果用 #define 定义,语句是这样的:#define P0 (BYTE *)0X80; 这样定义后,在汇编语言中就不能使用 P0 这个名字了。
作者: npn    时间: 2021-5-17 14:15
P0口对应的0x80数字,就和地铁几号线一样,不同号线去了不同的地方,不同地址都去控制了不同的特殊功能寄存器。
作者: game灬boy    时间: 2021-5-17 15:21
sfr 定义了 P0 端口对应的物理地址为0x80 ,相当于给0x80地址的内存区域(寄存器)取别名P0
#define  是  把P0 定义为常量0x80;
P0 =  0x00  是给P0对应的寄存器赋值,就是把 0x00写到对应的物理地址的0x80处;
作者: 忆1709    时间: 2021-5-17 16:30
game灬boy 发表于 2021-5-17 15:21
sfr 定义了 P0 端口对应的物理地址为0x80 ,相当于给0x80地址的内存区域(寄存器)取别名P0
#define  是   ...

如果不取别名,能直接寻址0x80进行读写吗?
作者: tyrl800    时间: 2021-5-17 17:39
忆1709 发表于 2021-5-17 16:30
如果不取别名,能直接寻址0x80进行读写吗?

不能直接对0X80读写
作者: tyrl800    时间: 2021-5-17 19:33
忆1709 发表于 2021-5-17 16:30
如果不取别名,能直接寻址0x80进行读写吗?

如果你用汇编语言就可以
作者: munuc_w    时间: 2021-5-18 08:29
忆1709 发表于 2021-5-17 16:30
如果不取别名,能直接寻址0x80进行读写吗?

可以上的,但在操作前要把数字0X80转换成地址。(U8 *)0X80.
作者: tyrl800    时间: 2021-5-18 09:20
munuc_w 发表于 2021-5-18 08:29
可以上的,但在操作前要把数字0X80转换成地址。(U8 *)0X80.

强制转换成地址好像不行
作者: eb900001    时间: 2021-5-18 17:40
SFR是关键字,用来定义特殊功能寄存器。在51系列单片机中,IO口的地址是映射到寄存器上的,即IO口的地址就是对应特殊功能寄存器的地址。P0是PORT0的名字,0x80是P0口对应的内部特殊功能寄存器的地址。
作者: 漠城    时间: 2021-5-18 18:02
个人认为,51单片机是直接对寄存器操作,定义管脚就是对寄存器进行定义。定义51单片机的IO口是需要使用特定寄存器定义的
作者: dzc3458    时间: 2021-10-30 13:35
定义P0这个东西指向p0端口寄存器,你往里面写什么,p0端口就输出什么
作者: dzc3458    时间: 2021-10-30 13:38
不这样定义你就没办法用有关于和P0端口的所有操作,必须定义一个名称指向p0端口寄存器才能操作p0端口。sfr是指向寄存器的,define只是定义一个名称,代表的是把后面的字符和这个名称替换,不能替代sfr
作者: 188610329    时间: 2021-10-30 13:47
忆1709 发表于 2021-5-17 16:30
如果不取别名,能直接寻址0x80进行读写吗?

可以, 用汇编就可以了。
MOV  80H,A

就就可以把累加器A的内容复制到P0了。
作者: Hephaestus    时间: 2021-11-26 14:35
本帖最后由 Hephaestus 于 2021-11-26 16:28 编辑

看来真懂51体系的人还是太少了。80H这个地址有两个东西啊!直接访问是P0,用地址间接访问是RAM。
MOV R0,#80H
MOV A,@R0
上句是把80H地址的RAM内容送到ACC里面。

用地址访问会混淆这两个东西,用SFR限制一下,不就清爽多了?
作者: 188610329    时间: 2021-11-26 15:47
Hephaestus 发表于 2021-11-26 14:35
看来真懂51体系的人还是太少了。80H这个地址有两个东西啊!直接访问是P0,用地址间接访问是RAM。
MOV R0,8 ...

把80H地址的RAM内容送到ACC里面,一般要这么写:
MOV R0,#80H
MOV A,@R0






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1