找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10430|回复: 15
打印 上一主题 下一主题
收起左侧

51单片机中,这个SFR定义的是啥意思?

  [复制链接]
跳转到指定楼层
楼主
ID:847776 发表于 2021-5-17 12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 忆1709 于 2021-5-17 12:35 编辑

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

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

③ 能否把sfr换成#define?









分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:752974 发表于 2021-5-17 13:40 | 只看该作者
1. SFR是关键字,用来定义特殊功能寄存器。在51系列单片机中,IO口的地址是映射到寄存器上的,即IO口的地址就是对应特殊功能寄存器的地址。P0是PORT0的名字,0x80是P0口对应的内部特殊功能寄存器的地址。
2. 将这个语句放到头文件中,是便于使用,在应用程序中只要包含这个头文件,就不用再定义特殊功能寄存器了,直接使用其名字即可。
3. 如果用 #define 定义,语句是这样的:#define P0 (BYTE *)0X80; 这样定义后,在汇编语言中就不能使用 P0 这个名字了。
回复

使用道具 举报

板凳
ID:57657 发表于 2021-5-17 14:15 | 只看该作者
P0口对应的0x80数字,就和地铁几号线一样,不同号线去了不同的地方,不同地址都去控制了不同的特殊功能寄存器。
回复

使用道具 举报

地板
ID:367369 发表于 2021-5-17 15:21 | 只看该作者
sfr 定义了 P0 端口对应的物理地址为0x80 ,相当于给0x80地址的内存区域(寄存器)取别名P0
#define  是  把P0 定义为常量0x80;
P0 =  0x00  是给P0对应的寄存器赋值,就是把 0x00写到对应的物理地址的0x80处;
回复

使用道具 举报

5#
ID:847776 发表于 2021-5-17 16:30 | 只看该作者
game灬boy 发表于 2021-5-17 15:21
sfr 定义了 P0 端口对应的物理地址为0x80 ,相当于给0x80地址的内存区域(寄存器)取别名P0
#define  是   ...

如果不取别名,能直接寻址0x80进行读写吗?
回复

使用道具 举报

6#
ID:275826 发表于 2021-5-17 17:39 | 只看该作者
忆1709 发表于 2021-5-17 16:30
如果不取别名,能直接寻址0x80进行读写吗?

不能直接对0X80读写
回复

使用道具 举报

7#
ID:275826 发表于 2021-5-17 19:33 | 只看该作者
忆1709 发表于 2021-5-17 16:30
如果不取别名,能直接寻址0x80进行读写吗?

如果你用汇编语言就可以
回复

使用道具 举报

8#
ID:752974 发表于 2021-5-18 08:29 | 只看该作者
忆1709 发表于 2021-5-17 16:30
如果不取别名,能直接寻址0x80进行读写吗?

可以上的,但在操作前要把数字0X80转换成地址。(U8 *)0X80.
回复

使用道具 举报

9#
ID:275826 发表于 2021-5-18 09:20 | 只看该作者
munuc_w 发表于 2021-5-18 08:29
可以上的,但在操作前要把数字0X80转换成地址。(U8 *)0X80.

强制转换成地址好像不行
回复

使用道具 举报

10#
ID:45026 发表于 2021-5-18 17:40 | 只看该作者
SFR是关键字,用来定义特殊功能寄存器。在51系列单片机中,IO口的地址是映射到寄存器上的,即IO口的地址就是对应特殊功能寄存器的地址。P0是PORT0的名字,0x80是P0口对应的内部特殊功能寄存器的地址。
回复

使用道具 举报

11#
ID:808225 发表于 2021-5-18 18:02 | 只看该作者
个人认为,51单片机是直接对寄存器操作,定义管脚就是对寄存器进行定义。定义51单片机的IO口是需要使用特定寄存器定义的
回复

使用道具 举报

12#
ID:964308 发表于 2021-10-30 13:35 来自手机 | 只看该作者
定义P0这个东西指向p0端口寄存器,你往里面写什么,p0端口就输出什么
回复

使用道具 举报

13#
ID:964308 发表于 2021-10-30 13:38 来自手机 | 只看该作者
不这样定义你就没办法用有关于和P0端口的所有操作,必须定义一个名称指向p0端口寄存器才能操作p0端口。sfr是指向寄存器的,define只是定义一个名称,代表的是把后面的字符和这个名称替换,不能替代sfr
回复

使用道具 举报

14#
ID:624769 发表于 2021-10-30 13:47 | 只看该作者
忆1709 发表于 2021-5-17 16:30
如果不取别名,能直接寻址0x80进行读写吗?

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

就就可以把累加器A的内容复制到P0了。
回复

使用道具 举报

15#
ID:883242 发表于 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限制一下,不就清爽多了?
回复

使用道具 举报

16#
ID:624769 发表于 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

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表