找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于51单片机的IO位定义

  [复制链接]
跳转到指定楼层
楼主
ID:228371 发表于 2017-10-22 13:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大佬小弟有个地方不明白能不能帮忙解释一下;
为什么51单片机的IO在用的时候要进行位定义,进行sbit;
不然就会出错;而直接用哪个口就不会。
比如:我用P0口就不会;
用P0^0;就会出错;必须进行宏定义或者位操作才不会
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:240022 发表于 2017-10-22 14:30 | 只看该作者
不用位定义,异或结果为一个字节,如果位定义,编译汇编后使用setb,clr操作位。 所以你现在不用位定义,使用p1异或某一位时,是字节运算,把p1的其它位屏蔽掉,否则取反没什么 意义。
回复

使用道具 举报

板凳
ID:241864 发表于 2017-10-22 17:25 | 只看该作者
编译器编译规则的问题吧
回复

使用道具 举报

地板
ID:164602 发表于 2017-10-23 09:03 | 只看该作者
其实,这个问题出在REG51.H头文件上。
你查看一下这个头文件就知道,它里面定义了P0、P1、P2、P3,而没有定义位,所以,你的程序在开始时,就要进行位定义sbit,而不用对口进行定义。
如果你在头文件中,加上I/O口位的定义,程序里也是可以不定义就直接使用的。
像STC15的头文件,就定义了位的,可以不再定义而直接使用。
好好理解一下头文件的作用吧。

评分

参与人数 1黑币 +5 收起 理由
botgs + 5 赞一个!

查看全部评分

回复

使用道具 举报

5#
ID:123289 发表于 2017-10-23 13:50 | 只看该作者
其实,每一个都是要定义的,否则编译系统不认识它,包括P0也不认识。
只是有些定义被“隐藏”了,你不知道而矣,这其中就有P0。
这个隐藏的场所,常常在:INCLUDE XXXX.H中,不信你打开XXXX.H看看,里面有没有对P0的定义。
回复

使用道具 举报

6#
ID:212797 发表于 2017-10-24 17:21 | 只看该作者
看看头文件就明白了,在头文件里,明确的将P0映射到对应的寄存器地址上,P0就变成一个代号,也就是说,P0已经登记在册,只要我们在文件中使用它,编译器知道它指的是什么东西。而P0^0在其他的地方并没有出现过,要使用当然要自己先声明或者定义了(注意:P0^0是在异或运算)。
回复

使用道具 举报

7#
ID:242568 发表于 2017-10-24 22:11 | 只看该作者
位绑定是位,sbit
回复

使用道具 举报

8#
ID:242746 发表于 2017-10-25 12:15 | 只看该作者
头文件没加载或者有问题reg51.h
回复

使用道具 举报

9#
ID:242770 发表于 2017-10-25 14:02 | 只看该作者
sfr P0    = 0x80; sfr P1    = 0x90; sfr P2    = 0xA0; sfr P3    = 0xB0;
回复

使用道具 举报

10#
ID:242770 发表于 2017-10-25 14:05 | 只看该作者
sfr P0    = 0x80; sfr P1    = 0x90; sfr P2    = 0xA0; sfr P3    = 0xB0;这是reg52.h头文件中的定义,之所以你用P0口不会报错,就是因为头文件中已经有定义,但是没有P0^0之类的定义,所以就错误,总之,定义一下是没错的,即使只是为了增加程序可读性,对吧!!
回复

使用道具 举报

11#
ID:242895 发表于 2017-10-25 19:39 | 只看该作者
P0 P1也是定义过的 在reg52.h里看下
回复

使用道具 举报

12#
ID:1032632 发表于 2023-4-26 08:19 | 只看该作者
重复定义了 头文件里面有  就直接用P00......Pxx
回复

使用道具 举报

13#
ID:1010435 发表于 2023-4-26 16:28 | 只看该作者
在REGX52.H中每个针脚都定义了,用的是P0_0,不是P0^0,直接用P0_0就可以。
sbit P0_0 = 0x80;
sbit P0_1 = 0x81;
sbit P0_2 = 0x82;
sbit P0_3 = 0x83;
sbit P0_4 = 0x84;
sbit P0_5 = 0x85;
sbit P0_6 = 0x86;
sbit P0_7 = 0x87;
回复

使用道具 举报

14#
ID:883242 发表于 2023-4-26 21:01 | 只看该作者
因为在c语言里面P0^0是P0异或0的意思。

C51为了扩展c语言让其能更好的支持51单片机,借用了异或运算符^,但是同时规定必须与sbit配合服用才表示位定义,这样才不会跟基本c语言语法发生冲突。
回复

使用道具 举报

15#
ID:1074288 发表于 2023-4-27 09:21 | 只看该作者
在头文件里,明确的将P0映射到对应的寄存器地址上,P0就变成一个代号,也就是说,P0已经登记在册,只要我们在文件中使用它,编译器知道它指的是什么东西。
回复

使用道具 举报

16#
ID:879348 发表于 2023-4-27 10:01 | 只看该作者
这是编译器的限制和规则,没必要深究STC的头文件有定义可以直接P00
回复

使用道具 举报

17#
ID:1034262 发表于 2023-4-27 10:01 | 只看该作者
楼主,你将头文件去掉,你会发现连P0都认不得。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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