IO口操作是单片机实践中最基本最重要的一个知识,本篇花了比較长的篇幅介绍IO口的原理。

也是查阅了不少资料,确保内容正确无误,花了非常长时间写的。

IO口原理原本须要涉及非常多深入的知识,而这里尽最大可能做了简化方便理解。这样对于以后解决各种IO口相关的问题会有非常大的帮助。

IO口等效模型是本人独创的方法。通过此模型,能有效的减少对IO口内部结构理解的难度。而且经查阅资料确认,这样的模型和实际工作原理基本一致。

==========================================

前面说了非常多东西,不少人也许已经迫不及待的想要实际操作单片机了。IO口作为单片机与外界通信最基本的手段,是单片机学习最基本也最重要的一个知识。

前面我们编程实现了IO口点亮LED的实验,本篇继续对IO口相关知识进行介绍。

为了更好的学习IO口操作。有必要了解一下IO口的内部结构和相关概念。这些知识对于兴许的学习非常有帮助。重点是理解,全然不须要刻意去记。

不记得就回来再看看即可了。用得多了自然就记住了。

官方资料(最权威准确)

我们说过,要了解一个芯片,最准确有效的方法,是查看官方给出的芯片手冊等资料。可是初学单片机,直接看芯片手冊资料恐怕非常难弄明确,尤其是看到一堆英文、陌生的电路、名词术语。假设是我,一定也会抓狂的。

可是这里我还是给出一张从Atmel官方的《Atmel 8051 Microcontrollers Hardware Manual》中截取的图片。

给出这张图片并非为了打击大家学习热情,而是希望大家能明确。我们所见过的各种单片机资料究竟是怎么来的,究竟是否准确,这一切都能够通过官方资料弄清楚,对于大家以后深入学习一些东西有一定的帮助。

第二功能简单介绍

上图正是官方给出的权威的51单片机IO口结构图。

能够看出,单片机的四组IO口内部结构各不同样。原因是有些IO口有第二功能,入门篇里面提到过。

还记得这张管脚图吗?括号里标注的就是IO口的第二功能名称。

除了P1以外,每一个接口都有第二功能。介绍单片机系统模块时,我提到51单片机有预留扩展存储器的接口,正是图中的P0和P1的第二功能(同一时候还要用到29、30等管脚)。

由于用的不多,涉及知识也比較深入,就不做详细研究了。顺便一提,事实上这里我们看到的AD0~AD7,就是用于并行口的。而P3口的第二功能,就包含串口等,后面学到了还会详细介绍。

IO口等效电路

因为深入理解IO口的原理涉及到非常多电路甚至微机原理相关知识,这里仅仅做简化介绍,能满足绝大多数情况下的须要。

作为普通IO口使用时。四个IO口的工作原理基本一致。

以下的图是从前面图中的P1电路中裁剪出来的,也是我们须要理解的关键。

右边的P1.X表示P1的一个IO口,如P1.0。电阻右边写的英文是内部上拉电阻的意思。之所以叫上拉电阻。是由于电阻的一端接在VCC上。

以下的三角形表示接地,相当于GND。

除此之外,最关键的一个器件是以下这个。

这个器件的本质是晶体管,起到电子开关的作用(假设想深入了解,能够学习模拟电路相关的知识,或者等到原理篇中介绍)。上面的电路能够大致等效成下图。注意。这种结构仅仅是一个IO口,整个单片机中有32个这种结构。

图中的R为阻值10k的上拉电阻。S是由前面的晶体管等效的电子开关。蓝色框中的部分在单片机内部。

S的开关状态由CPU控制。当用程序设置P1.0管脚为低电平时。电子开关S闭合。实际上电子开关S闭合时,两端还有非常小的电阻。

依据分压原理。P1.0上会有一个非常低的电压,近似0V,已经能够视为低电平了。

当设置管脚为高电平时S断开。P1.0通过10k上拉电阻接到VCC上。假设用电压表測量。由于电压表内阻非常大。所以能够得出其电压值为高电平。

IO口的输出:点亮LED

前面介绍了点亮第一个LED的程序和电路。程序例如以下:

#include <reg52.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两端有合适的电压于是点亮。结合单片机内部IO口等效电路,整个电路例如以下图

灌电流与拉电流

在上面的样例中,P1.0输出低电平点亮LED。能不能反过来,P1.0输出高电平点亮LED呢?我们能够考虑电路连接成以下这样,并在程序中编写LED=1。

当运行LED=1时,S断开。电流通过10k上拉电阻R从P1.0流出,并进入LED。因为上拉电阻的阻值太大。电流太小,导致LED不亮,或者亮度非常微弱。

所以通常不採用这样的方法。

这两种方法,前者电流从外部流入单片机内部,我们称之为灌电流接法。后者电流方向相反,称为拉电流接法。

对照能够看出,对于51单片机。灌电流接法电流较大,拉电流接法因为受到上拉电阻限制。电流较小。

在实际其中灌电流的最大电流也是有限的,由于电子开关S中能通过的电流有限。

依据STC官方的芯片手冊,对于STC单片机,建议单个IO口灌电流建议不超过20mA。全部IO口灌电流之和不超过55mA,否则easy烧坏IO口。

而拉电流大小仅仅有230uA左右。

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

拉电流是从上拉电阻流出来的,是否能提高拉电流大小呢?答案是能够。我们仅仅须要在单片机外部再加入一个上拉电阻。就能够增大拉电流,而且能成功点亮LED,例如以下图所看到的。

图中的电路。相当于R和R0并联了,整个上拉电阻的阻值减小了。

可是这样做有个缺陷。在这个电路中,当单片机输出低电平时,S闭合,此时电流从VCC通过上拉电阻和S流入GND。此时尽管LED熄灭了,可是却有较大电流通过上拉电阻而浪费掉。所以上拉电阻过大,会导致驱动力不足。而上拉电阻过小,又会在输出低电平时浪费电能。

上拉电阻的作用是什么呢?对电路了解多一点的人非常快能发现,假设没有上拉电阻。IO口就无法输出高电平,也就是下图这种。开关闭合时能输出低电平,可是开关断开时,P1.0就悬空了,什么也没连接。

这时IO口的电压就是不确定的了,这种状态无法推断它是低电平还是高电平,叫做高阻态。非常巧的是。单片机的P0口确实就没有上拉电阻,而其它三组IO口都有上拉电阻。

所以当P0输出高电平,而且没有外接上拉电阻时,就是高阻态,不能正常输出高电平。后面我会通过详细样例来让大家感受一下高阻态。

注:尽管P1.0似乎是同一时候连接到CPU的IO输入端了,即图中写着“输入”的绿色箭头,可是这部分电路仅仅有在读取管脚输入的时候才会导通,而且是单向的。

上拉电阻的存在,将原本的高阻态转变成了高电平,也因此得名。和上拉电阻相相应的。还有下拉电阻,差别在于下拉电阻还有一端不是连接VCC而是接到GND。

IO口的输入

IO口之所以叫IO口(IO=Input/Output),意味着它既能够输出又能够输入。前面讲的都是IO口的输出,以下讲IO口的输入。IO口的输出我们通过LED来介绍。而IO口的输入我们则通过开关来说明。在非常多单片机中。IO的输入和输出须要通过电路切换,而对于51单片机来说。输入和输出使用的是同一套电路。也就是上面我们分析的电路。

图中的S0是一个单刀双掷开关。往上切换能够将P1.0接到VCC,往下切换能够接到GND。

读取时CPU会通过特定电路获取图中橙色导线上的电平。我们想要实现的效果是。让CPU读取P1.0port的电平,从而获得开关S0的状态。

当S断开时。CPU通过获取P1.0上的电平能够知道外部开关S0的状态,从而运行对应的操作。

而S闭合时,S0往下切换,P1.0确实是低电平。

而S保持闭合且S0往上切换时,VCC通过S0和S直接接到GND就短路了。此时电子开关S通过大量电流,可能会烧坏单片机。于是我们加入了电阻R0。S仍然保持闭合,S0往上切换。此时P1.0仍然是低电平,于是CPU无法推断外部开关S0的状态,例如以下图。

总结起来就是在读取IO口电平时,应先设置输出高电平(即断开S)。再读取数据。这个规则适用于全部IO口。

类似的,还能够读取单刀单掷开关(或按键开关)的状态。读取前先设置输出高电平,电路图例如以下。

上面这样的电路须要依赖上拉电阻才干工作。P0口由于没有上拉电阻。须要在外部加入一个上拉电阻(由于假设没有上拉电阻,而且S和S0都断开时,IO口变成高阻态。读取的电平结果不确定,于是无法正确推断S0的开关状态)。

双向IO口/准双向IO口

标准双向IO口的特点有两条:

1、在输出模式下。能够输出高低电平;

2、在输入模式下,假设没有接外部电路。应呈现高阻态。

对于51单片机的P1、P2、P3口,因为有内部上拉电阻。输入模式下不可能出现高阻态,所以称之为准双向IO口。

而P0口作为IO口工作时,假设不加上拉电阻就无法输出高电平;而加了上拉电阻,输入时又不会出现高阻态。所以也是准双向IO口。

备注1:51单片机的P0口假设工作在第二功能状态下,则是双向IO口。初学时详细原理不须要研究的非常透彻。以下一段对此进行分析,仅供有兴趣的读者參考。

对比官方的完整IO口结构图。P0口内部有上下两个晶体管。当P0口工作在IO口模式下。上面那个晶体管断开,能够直接忽略。前面的等效电路就没有考虑上面那个晶体管。而当P0口工作在第二功能状态下,两个晶体管都能够工作。

假设上面的晶体管断开。以下的导通,就输出低电平。反之上面的导通以下的断开。就输出高电平而且不须要上拉电阻。假设两个晶体管都断开,则能够作为输入,而且在没有外界电路时呈现高阻态。所以是双向IO口。

备注2:关于双向IO口和准双向IO口的概念存在一定争议,这里的介绍综合了网上多方面的观点,被多数人所接受。

线与逻辑

假设把两个单片机IO口连接在一起会发生什么现象呢?以下就是我们的电路图。

当设置两个IO口都输出低电平。即S和S1都闭合时,整体是低电平。而当设置当中一个IO口输出低电平还有一个输出高电平时,即S或S1闭合,此时两个IO口上都会呈现低电平。仅仅有当P1.0、P1.1都输出高电平,即S和S1都断开时,才会呈现高电平。

能够简单表述成:两个IO口连接在一起。仅当P1.0与P1.1都设置输出高电平时,两者接线上才会呈现高电平。这就是所谓的线与逻辑。不仅是两个,假设是非常多的这种IO口连在一起,仅仅有全部IO都设置输出高电平。接线上才会呈现高电平。

线与逻辑会在后面的矩阵键盘中使用到。

总结

最后总结起来,主要就是以下几点。内容有点多。可是实际上经常使用的仅仅有当中的几点。

再次强调,不须要刻意去记,明确了原理,用多了自然就记住了。

1、灌电流比拉电流能通过更大的电流;点亮LED一般用灌电流方式

2、上拉电阻越小,拉电流输出能力越大,但输出低电平时越费电

3、读取IO口前,要先设置输出高电平

4、P0作为输出,需外接上拉电阻

5、按键开关作为输入时,接在IO口和GND之间,另外须要上拉电阻

6、51单片机的四个IO口在普通IO状态下都是准双向口

7、51单片机IO口遵从线与逻辑

=======================================================

《单片机小白学步》系列教程(原名《单片机入门指南》)介绍

本系列教程从最主要的入门知识開始。逐步深入介绍单片机系统设计。内容包含:

1、入门篇:单片机等基本概念、各种电子设计基本知识

2、思想篇:单片机/计算机系统设计的project思想

3、学习篇:单片机学习过程、方法和技巧,以51单片机为例介绍,并推广到其它单片机

4、应用篇:遵循规范的project方法,设计单片机系统实例(计划设计的系统有:计算器、电子表、password锁、简易手机。详细看有没有时间再确定)

5、原理篇:从模拟电路、数字电路開始,逐步深入介绍单片机/计算机系统原理。并自行设计简易的CPU(因为个人水平有限,这部分没有把握写好。详细内容视情况而定)

教程特点

1、技术知识点全面。从入门到精通

包括了各种基本知识,尤其是对单片机基本概念的介绍、为什么要用单片机等。在非常多同类书籍教程中都被忽略了。同一时候也包括了一些深入的知识,包括原理篇考虑对单片机的基本原理进行介绍,有助于深入理解单片机。

本系列教程以51单片机为例进行介绍。

通过51介绍完单片机的基本知识。我会再把430进行简要介绍,尤其是对照两者之间的优缺点。让大家非常快感受到430的巨大优势。而学习51正好为高速了解430打下了坚实的基础。

2、除了单片机知识,还有思想、方法、技巧的介绍

本系列教程中,介绍单片机各种模块编程知识的主要是学习篇。而学习篇仅仅是整个教程的一部分。在学习篇中我会贯穿各种方法技巧。怎样理解一些模块功能,怎么看时序图,严格遵守project思想进行编程。程序发生了错误怎么调试等等。

而在思想篇中会整体介绍非常多重要的思想,为后面的学习做好准备工作。

3、知识先后顺序的设计

单片机学习过程中,涉及大量的知识,并且非常多知识之间相互依赖,关联非常强。

本系列教程对知识的先后顺序进行比較明白的规划。尽最大可能符合人的认知过程。

可是实际规划时发现,不管怎么调整知识的顺序,总有一些知识之间相互依赖。关系复杂。

比如開始讲IO口的时候肯定会提到寄存器,而寄存器这个词的理解,须要深厚的背景知识。

可是这些背景知识在没有进行实践的时候也非常难理解。

刚開始学习的人经常就会在这种地方感觉疑惑不解,不知所措。

而每次遇到类似这种知识,我会向刚開始学习的人指出,应该怎样对待。

这个知识是应该自己去学习补充。还是等到学完原理篇再做理解,而如今又应该怎么去看待这个名词。

另外,在整个教程的学习前。须要掌握一定的C语言等基础知识,详细可參考教程第〇篇《序》中的相关说明

http://www.hainter.com/mcu-primer-0

4、语言通俗易懂

本系列教程力求语言通俗易懂,而不会用一堆新手不懂的词语去解释还有一个不懂的词语。可是受限于个人语言表达能力,可能有些地方表述的比較繁琐。或者不清楚,希望大家可以帮忙指出。

其它问题

假设认为我写的对你有帮助。欢迎多多反馈。包含写的不对、不合理、不太明确都能够指出来。这样方便我对其进行完好。

很多其它可參见:《怎样以学习单片机为契机。逐步成为优秀的project师》

http://www.hainter.com/mcu-engineer

本系列教程首发于我的个人主页,欢迎訪问(因为是国外server。速度略微有点慢):

http://www.hainter.com/category/hacker/mcu-primer

同一时候会将其转发到CSDN、电子发烧友等网站,欢迎关注。

CSDN专栏网址 http://blog.csdn.net/column/details/mcu-introduction.html

电子发烧友论坛 http://bbs.elecfans.com/zhuti_mcu_1.html

本文首发自我的个人主页,转载请注明来源:http://www.hainter.com/mcu-primer-20

单片机小白学步系列(二十) IO口原理的更多相关文章

  1. 单片机小白学步系列(十四) 点亮第一个LED的程序分析

    本篇我们将分析上一篇所写的程序代码.未来学习单片机的大部分精力,我们也将放在程序代码的编写上. 可是不用操心.我会很具体的介绍每一个程序的编写思路和各种注意事项等. 之前我们写的程序例如以下: #in ...

  2. 单片机小白学步系列(十三) 点亮第一个LED——好的開始,成功的一半

    前面介绍了非常多概念知识.做了非常多准备工作,从这一节開始,我们正式開始单片机的学习.我们将使用单片机完毕一项非常easy的工作:点亮一个发光二极管(即LED:Light-Emitting Diode ...

  3. Web 开发人员和设计师必读文章推荐【系列二十九】

    <Web 前端开发精华文章推荐>2014年第8期(总第29期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  4. Web 前端开发人员和设计师必读文章推荐【系列二十八】

    <Web 前端开发精华文章推荐>2014年第7期(总第28期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  5. Web 前端开发人员和设计师必读精华文章【系列二十六】

    <Web 前端开发精华文章推荐>2014年第5期(总第26期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  6. Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十二】

    <Web 前端开发精华文章推荐>2014年第一期(总第二十二期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML ...

  7. Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列二十】

    <Web 前端开发精华文章推荐>2013年第八期(总第二十期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 C ...

  8. SSE图像算法优化系列二十五:二值图像的Euclidean distance map(EDM)特征图计算及其优化。

    Euclidean distance map(EDM)这个概念可能听过的人也很少,其主要是用在二值图像中,作为一个很有效的中间处理手段存在.一般的处理都是将灰度图处理成二值图或者一个二值图处理成另外一 ...

  9. SSE图像算法优化系列二十:一种快速简单而又有效的低照度图像恢复算法。

    又有很久没有动笔了,主要是最近没研究什么东西,而且现在主流的趋势都是研究深度学习去了,但自己没这方面的需求,同时也就很少有动力再去看传统算法,今天一个人在家,还是抽空分享一个简单的算法吧. 前段日子在 ...

随机推荐

  1. 【LeetCode】41. First Missing Positive (3 solutions)

    First Missing Positive Given an unsorted integer array, find the first missing positive integer. For ...

  2. C# 调节图片亮度

    原文地址:https://www.cnblogs.com/wjr408/p/6727118.html 昨天去客户那里测试,需求才开始,所以很简单,就是测一下能不能接受到视频或图片,然后保存下来,现场客 ...

  3. AspxPivotGrid和WebChartControl数据联动处理日志

    AspxPivotGrid具有很好的表格样式体验,WebChartControl也是个很内容丰富的做图控件,我希望实现的功能是这样的, 处理题库统计分析图表,用户点AspxPivotGrid绑定知识点 ...

  4. OAF_OAF控件系列2 - LOV的实现(案例)

    2014-06-02 Created By BaoXinjian

  5. AVL平衡二叉搜索树原理及各项操作编程实现

    C语言版 #include<stdio.h> #include "fatal.h" struct AvlNode; typedef struct AvlNode *Po ...

  6. VS2010中遇到_WIN32_WINNT not defined

    VS2010中编程时遇到这个问题 _WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h) 解决办法: ...

  7. oracle各种常用管理sql及其他 ---待续

    启动客户端工具:sqlplus /nolog 使用sysdba链接:conn / as sysdba; select * from dba_users; --查看数据库里面所有用户,前提是你是有dba ...

  8. 使用 bat cmd命令杀掉 删掉运行的程序

    删掉所有xx.exe开启的进程 taskkill /f /im xx.exe 开启xx.exe start xx.exe 根据标题栏信息删除 taskkill /f /FI "windows ...

  9. C 指向指针的指针

    #include <stdio.h> int main() { char *cBooks[] = { "C程序设计语言", "C专家编程", &qu ...

  10. typedef的用法再思考

    最近重读c语法,有所感悟,记录. 有时候感悟,其实就是猜,假想,作者创建语言的想法,通俗的讲就是丹尼斯灵魂附体了,这个时候任何c语言难点对于你来说,就像吃饭喝水一样简单了,同时还能发现它优美动人之处. ...