标题: 关于51单片机的IO位定义 [打印本页]

作者: WANG....    时间: 2017-10-22 13:13
标题: 关于51单片机的IO位定义
各位大佬小弟有个地方不明白能不能帮忙解释一下;
为什么51单片机的IO在用的时候要进行位定义,进行sbit;
不然就会出错;而直接用哪个口就不会。
比如:我用P0口就不会;
用P0^0;就会出错;必须进行宏定义或者位操作才不会

作者: 芦苇劫    时间: 2017-10-22 14:30
不用位定义,异或结果为一个字节,如果位定义,编译汇编后使用setb,clr操作位。 所以你现在不用位定义,使用p1异或某一位时,是字节运算,把p1的其它位屏蔽掉,否则取反没什么 意义。
作者: xfliu    时间: 2017-10-22 17:25
编译器编译规则的问题吧
作者: HC6800-ES-V2.0    时间: 2017-10-23 09:03
其实,这个问题出在REG51.H头文件上。
你查看一下这个头文件就知道,它里面定义了P0、P1、P2、P3,而没有定义位,所以,你的程序在开始时,就要进行位定义sbit,而不用对口进行定义。
如果你在头文件中,加上I/O口位的定义,程序里也是可以不定义就直接使用的。
像STC15的头文件,就定义了位的,可以不再定义而直接使用。
好好理解一下头文件的作用吧。
作者: yzwzfyz    时间: 2017-10-23 13:50
其实,每一个都是要定义的,否则编译系统不认识它,包括P0也不认识。
只是有些定义被“隐藏”了,你不知道而矣,这其中就有P0。
这个隐藏的场所,常常在:INCLUDE XXXX.H中,不信你打开XXXX.H看看,里面有没有对P0的定义。
作者: xbook_ben    时间: 2017-10-24 17:21
看看头文件就明白了,在头文件里,明确的将P0映射到对应的寄存器地址上,P0就变成一个代号,也就是说,P0已经登记在册,只要我们在文件中使用它,编译器知道它指的是什么东西。而P0^0在其他的地方并没有出现过,要使用当然要自己先声明或者定义了(注意:P0^0是在异或运算)。

作者: lcmmain    时间: 2017-10-24 22:11
位绑定是位,sbit
作者: wskjinfen    时间: 2017-10-25 12:15
头文件没加载或者有问题reg51.h
作者: jden    时间: 2017-10-25 14:02
sfr P0    = 0x80; sfr P1    = 0x90; sfr P2    = 0xA0; sfr P3    = 0xB0;
作者: jden    时间: 2017-10-25 14:05
sfr P0    = 0x80; sfr P1    = 0x90; sfr P2    = 0xA0; sfr P3    = 0xB0;这是reg52.h头文件中的定义,之所以你用P0口不会报错,就是因为头文件中已经有定义,但是没有P0^0之类的定义,所以就错误,总之,定义一下是没错的,即使只是为了增加程序可读性,对吧!!
作者: ChunyuY19    时间: 2017-10-25 19:39
P0 P1也是定义过的 在reg52.h里看下
作者: 569103160    时间: 2023-4-26 08:19
重复定义了 头文件里面有  就直接用P00......Pxx
作者: mtt661    时间: 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;
作者: Hephaestus    时间: 2023-4-26 21:01
因为在c语言里面P0^0是P0异或0的意思。

C51为了扩展c语言让其能更好的支持51单片机,借用了异或运算符^,但是同时规定必须与sbit配合服用才表示位定义,这样才不会跟基本c语言语法发生冲突。
作者: jning    时间: 2023-4-27 09:21
在头文件里,明确的将P0映射到对应的寄存器地址上,P0就变成一个代号,也就是说,P0已经登记在册,只要我们在文件中使用它,编译器知道它指的是什么东西。
作者: wufa1986    时间: 2023-4-27 10:01
这是编译器的限制和规则,没必要深究STC的头文件有定义可以直接P00
作者: coody_sz    时间: 2023-4-27 10:01
楼主,你将头文件去掉,你会发现连P0都认不得。




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