前言
C51单片机被广泛用于教学演示
通常在学习中,C51的P1,P2,P3,P4这四组引脚,被称作准双向口,而P0组引脚用作开漏输出
相信你一定见过这样检测按键是否被按下:
void main() { P1_1 = 1; while (1) { if (P1_1 == 0) { // P1_1被按下 } } }是否有这样的疑惑
为什么
P1_1被内部设置为1后,又能被外部置为0?
或者为什么P0组引脚本身不能输出高电平,需要外接电源与电阻?
在本篇文章中,我们来探究C51的引脚的内部结构,解决这些疑惑
前置知识
P1/P2/P3/P4 引脚内部结构
乍一看,准双向口结构复杂,难以理解,实际上,简化一下,就是下面这个样子:
实际上就是有两部分晶体管,
当控制信号为1时,上方晶体管打开,引脚与内部电源连接
当控制信号为0时,下方晶体管打开,引脚与内部接地链接
所以当控制信号变化时,引脚也可以同样变化:
其中,因为弱上拉晶体管的等效阻值很大,所以如果内部拉高,外部接地,就会使引脚拉低,因为此时构成通路,电压被弱上拉晶体管"消耗":
这就是为什么准双向口可以置1然后被外部拉到0的原因
本质就是内部接到电源,外部接地,形成通路,此时的电压被弱上拉晶体管分压,引脚的电压就是低电平了
如果内部接到电源,但外部什么也不接,就无法形成通路,自然不存在集体管分压,引脚的电压仍是电源电压
而原设计中的强上拉,极弱上拉则是应对不同状态时切换,保证引脚稳定工作
而对于当控制信号为0时,下方晶体管打开,引脚与接地直接相连:
因为这是"强下拉晶体管"(等效阻值小),所以导通时,等效直接与接地相连,外部不可直接连接电源,必须存在电阻等分压,否则短路造成元件损坏
P0引脚内部结构
相比于准双向口,P0的开漏输出要简单
当控制信号为1时,引脚悬空(既没接电源,也没接地)
当控制信号为0时,晶体管打开,引脚与内部接地链接
所以如果想用P0口输出高电平,一般外接电源: