单片机IO口原理解析

参考:http://m.elecfans.com/article/581431.html
@[TOP]

第二功能

单片机有4组IO口,内部结构各不同,有些IO口具有第二功能
在这里插入图片描述
上面除了P1外,其他接口都有第二功能。

IO口等效电路

作为普通IO口使用时,4个IO口的工作原理基本一致。
下面的图是P1电路图
在这里插入图片描述
右边P1.X是P1的一个IO口,如P1.0;PULL-UP*是内部上拉电阻的意思,之所以叫上拉,是因为电阻一端接在VCC上。下面的三角形表示接地,相当于GND。
最关键的器件是下面这个
在这里插入图片描述
这个器件的本质是晶体管,起到电子开关的作用。
上面的电路大致等效成下图。
在这里插入图片描述
图中的R是上拉电阻,S是前面晶体管等效的电子开关。蓝色框中的部分在单片机内部。
S的开关状态由CPU控制。当用程序设置P1.0管脚为低时,电子开关S闭合。实际S闭合时,两端还有很小的电阻。根据分压原理,P1.0上还有一个很低的电压,近似为0V,可视为低电平。当设置管脚为高电平时,S断开,P1.0通过10K欧电阻接到VCC上。如果用电压表测量,因为电压表内阻很大,所以可得出其电压值为高电平。
备注1:“输入”绿色箭头,这部分电路只有在读取管脚输入时才会导通,并且是单向的,可以想象成内阻较大的电压表输入端。
备注2:51单片机IO口工作在普通IO口状态下,电子开关使用晶体管实现的(包括三极管和MOS管两种)。下图中实现的这种电平输出结构,如果是MOS管实现,则被称为漏极开路输出(OD=Open Drain,或简称(“开漏”)),漏极是MOS管的一个管脚,对应与图中S和R的节点处。如果是三极管实现,则称为集电极开路输出(OC=Open Collector),两者原理基本一致。
在这里插入图片描述

IO口输出:点亮LED

#include<reg51.h>

sbit LED = P1^0;

void main()
{
	LED = 0;
	while(1);
}

在这里插入图片描述
电路关键部分,将VCC通过1K欧电阻接到LED正极,LED负极接到P1.0口。
单片机执行LED = 0的时候,电子开关S由CPU控制闭合,P1.0上输出低电平。电流流过1K电阻和LED流入P1.0,在经过S流入GND,LED两端有合适电压,于是被点亮。

灌电流与拉电流

在上面例子中,P1.0输出低电平点亮LED。能否反过来,P1.0输出高电平,点亮LED呢?将电路连接成下面这样,并程序中编写LED = 1。
在这里插入图片描述
执行LED = 1时,S断开,电流通过10K欧上拉电阻从P1.0流出,并进入LED。由于上拉电阻阻值很大,电流过小,LED不亮。
这两种方法,前者电流从单片机外部流入单片机内部,称为灌电流接法;后者电流由单片机内部留到外部,称为拉电流接法。对51单片机,灌电流接法,电流比拉电流接法电流大。
实际中,灌电流的最大电流也是有限的,因为电子开关S中能通过的电流有限。STC官方手册中,建议单个IO口灌电流不超过20mA,所有IO口灌电流之和不超过55mA,否则容易烧坏IO口。而拉电流大小只有230UA左右。

上拉电阻/下拉电阻/高阻态

拉电力是从上拉电阻流出来的,能否提高拉电流大小呢?可以。只需要在单片机外部加一个上拉电阻,就可以增大电流,并能成功点亮LED。如下图所示。
在这里插入图片描述
但是当单片机输出低电平时,S闭合,电流从VCC通过上拉电阻和S流入GND,造成电流浪费。上拉电阻过大,会导致驱动力不足,过小,输出低电平时浪费电能。
上拉电阻的作用是什么呢?使IO口输出高电平。如果没有上拉电阻时,开关闭合时能输出高电平,但是开关断开时,P1.0悬空,什么也没连接,这时IO口的电压就是不确定的,这种状态无法判断它是高电平还是低电平,叫做高阻态

IO口的输入:开关控制

IO口(Input/Output),意味着可以作输入或输出。
在这里插入图片描述
图中S0是一个单刀双掷开关,往上切换,可将P1.0连接到VCC,往下切换可以接到GND。读取时CPU会通过特定电路获取上图中橙色导线的电平。我们要实现的效果是,让CPU读取P1.0端口的电平,从而获得开关S0的状态。
设置输出高电平时,S断开,CPU通过获取P1.0上的电平,知道外部开关S0的状态。
设置处处低电平时,S闭合,S0往下切换,P1.0低电平,S0往上切换,P1.0仍是低电平。于是CPU无法判断外部开关S0的状态。
总结就是,在读取IO电平时,应先设置输出高电平(即断开S),再读取数据

  • 23
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值