单片机/MCU论坛
直播中

丘山

7年用户 34经验值
擅长:MEMS/传感技术 嵌入式技术
私信 关注
[问答]

P2.0/P2.1与P3.0/P3.1有什么区别,为什么P2做输入就正常?

各位大神,我有个疑惑想请教下:

我需要使用两个端口作为输入,根据电平高低对变量OC赋值,先前使用

P3端口,一直无法正常输入,换成P2就完全正常了(事先都置1了)。
难道P3.0/P3.1具有第二功能Tx/Rx,就不能作为普通的输入口,可是很

多教材上不是都写了任何Port口都能做I/O吗?

期待大神解答。

以下是能够正常工作的代码(使用P2口):
uchar ocscan(void)
{
        uchar oc;
        switch(P2)
        {
        case(0xff): oc=1;break;
        case(0xfe): oc=2;break;
        case(0xfd): oc=3;break;
        default:break;
        }
        return(oc);
}

以下是不能工作的代码(使用P3口):
uchar ocscan(void)
{
        uchar oc;
        switch(P3)
        {
        case(0xff): oc=1;break;
        case(0xfe): oc=2;break;
        case(0xfd): oc=3;break;
        default:break;
        }
        return(oc);
}

回帖(13)

小豪

2017-7-28 12:05:03

最佳答案

P0口:真正的双向口,输出锁存,输入缓冲,输入前要先置1(KEIL包含的头文件已经有动作了,如果用汇编,要人工置1),输出为漏极开路,输出一般都要上拉电阻。输入为高阻态,能驱动8个TTL负载。当有片外存储器时,作数据线使用。  P1口:是最简单的口,输入也要先置1,无高阻态,只能是输出或者输入。能驱动4个TTL负载。  P2口:I/O与P1口一样,当有片外存储器时,作地址线使用,寻址64K片外数据存储器。能驱动4个TTL负载。  P3口:I/O与P1口一样,但无论输入输出都要先置1。具有很多复用功能。 口的一般使用方法:做复用时一般不要加上拉和下拉电阻。但单输出驱动负载时都应加1K左右的上拉电阻,单输入时要加10K左右的下拉电阻,且输入为低电平触发。希望对你有帮助
举报

刘旭

2017-7-28 13:53:36
如果你用的是51单片机的话 建议不要这样写哦   P3口好多复用功能  想用P3.0 P3.1的话 建议单独用这两个IO口 而不是P3 这样子
举报

丘山

2017-7-28 14:27:23
引用: hobbye501 发表于 2017-7-28 13:53
如果你用的是51单片机的话 建议不要这样写哦   P3口好多复用功能  想用P3.0 P3.1的话 建议单独用这两个IO口 而不是P3 这样子

谢版主回复。

您说的意思,就是说如如果想用P3.0 P3.1,就在代码里面明确写出P3.0=1或P3.1=0这样吗?
举报

孙传新

2017-7-28 17:00:27
我看贴,也是带着疑惑来的··给p3.2  p3.2 p3.4输入按键信号都正常··
给p3.5输入就是没反应····
举报

王杰

2017-7-28 17:21:44
这个问题经常遇到
举报

小豪

2017-7-30 17:14:04
P2口:I/O与P1口一样,当有片外存储器时,作地址线使用,寻址64K片外数据存储器。能驱动4个TTL负载。  P3口:I/O与P1口一样,但无论输入输出都要先置1。具有很多复用功能。 口的一般使用方法:做复用时一般不要加上拉和下拉电阻。但单输出驱动负载时都应加1K左右的上拉电阻,单输入时要加10K左右的下拉电阻,且输入为低电平触发。希望对你有帮助
举报

人中狼

2017-7-30 19:27:42
试试在switch(P3)前加一个P3 = 0XFF;
举报

houjue

2017-7-31 09:51:23
      因 P3.0 和 P3.1 是下载程序必须要用到的I/O口,所以不是必须需要的话最好不要用!实在要用请单独赋值即可。
举报

lll

2017-7-31 21:18:36
在把p3口作普通io口用,要确定第二功能关了
举报

丘山

2017-8-1 10:06:32
已将“兮”的回答选为最佳回答,不过版主及其他几位的回答应该也是要注意的,总结下:

除非是使用第二功能或做复用,P3一般不建议使用,如果必须用作普通I/O口:

1、要确定第二功能关了;
2、做输入端口置1;
3、单独赋值;
4、做输出加1K左右上拉,做输入加10K左右下拉(低电平触发);

感谢!
举报

曲终人散

2017-8-1 19:46:22
唯一的区别就是P3空那俩引脚可以用作中断
举报

ELECFANS@355

2017-8-2 02:51:44
这个问题值得探讨
举报

丘山

2017-8-2 09:24:48
引用: @曲终人散@ 发表于 2017-8-1 19:46
唯一的区别就是P3空那俩引脚可以用作中断

你一回复我又有点迷糊了。

做外部中断的应该是P3.2/P3.3端口吧,本例中用的是P3.0/P3.1。
并且在本程序中,我并没有进行中断模式声明啊。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分