二、 GPIO 结构框图与工作原理
对于当前来说,知道GPIO是用于输入输出的这点其实就够了,
下面的结构图和工作原理阐述的是数字电路的知识,现阶段不会它们丝毫不影响咱们把小灯灯搞亮,根据小伙伴们的选择进行阅读吧。
倘若想了解底层原理的话可以耐心慢慢读,假如想知道咱们的LED灯到底是怎么点亮的了,就可以直接读下面的LED简介模块的
51单片机的GPIO引脚主要是有四组,咱们详细剖析P0端口,其他三个端口可以从P0端口的理解中类比。
(1)P0 端口
先浅看一下P0端口的结构框图,从分析结构图的各个模块,同时也就能够加深对一些数字电路的理解。
在没有数电基础下,直接看端口的结构框图可能够呛。建议跟着我的描述,一点一点的理解。
观察上图,P0 端口由锁存器、输入缓冲器、切换开关(或者说是多路开关)、一个非门、一个与非门及场效应管驱动电路(即上图中的V1、V2)构成。
图的最右边,标号为P0.x 引脚的图标,也就是说P0.x 引脚可以是P0.0 到P0.7 的任何一位,即在P0 口有8 个与上图相同的电路组成。
这几个电路中,容易混淆的应该是门电路这里吧,其他的电路的图标都可以直接从结构框图找到的。趁着看P0端口,顺便把门电路的知识点记录一下
① 数字门电路——掌握与门、或门、非门
现阶段,知道有七种(完整是有八种的)逻辑门电路以及它们对应的电路符号。
然后能够根据咱们学习的编程知识中按位与(&)、按位或(|)、按位非(!)去理解逻辑门电路中的与门、或门、非门就可以了
下面开始划重点了
① 与门
② 或门
③ 非门
④ 组合
② 输入缓冲器——认识三态门+缓冲器
① 浅识三态门:
三态指其输出既可以是一般二值逻辑电路,即正常的高电平(逻辑1)或低电平(逻辑0),还可以保持特有的高阻抗状态。高阻态相当于隔断状态(电阻很大,相当于开路)。高阻态的意义在于实际电路中不可能断开电路。三态电路的输出逻辑状态的控制,是通过一个输入引脚实现的。
三态门都有一个EN控制使能端,来控制门电路的通断。 可以具备这三种状态的器件就叫做三态器件。
当EN有效时,三态电路呈现正常的0或1的输出;
当EN无效时,三态电路给出高阻态输出。
② 缓冲器
缓冲寄存器又称缓冲器(buffer),它分输入缓冲器和输出缓冲器两种。
前者的作用是将外设送来的数据暂时存放,以便处理器将它取走;
后者的作用是用来暂时存放处理器送往外设的数据。
有了数控缓冲器,就可以使高速工作的CPU与慢速工作的外设起协调和缓冲作用,实现数据传送的同步。由于缓冲器接在数据总线上,故必须具有三态输出功能
③ 原理运用
P0端口中主要是有两个三态缓冲器。
上面一个是读锁存器的缓冲器,也就是说,要读取D 锁存器输出端Q 的数据,那就得使读锁存器的这个缓冲器的三态控制端(上图中标号为读锁存器端)有效。
下面一个是读引脚的缓冲器,要读取P0.x引脚上的数据,也要使标号为读引脚的这个三态缓冲器的控制端有效,引脚上的数据才会传输到我们单片机的内部数据总线上。
③ D 锁存器—— 认识D触发器
构成一个锁存器,依赖时序电路。
51单片机的32根I/O口都是用户一个D触发器来构成锁存器的。上图中的D锁存器,D端是数据输入端,CP(CLK)端是控制端(也就是时序控制信息输入端),Q端是输出端,Q非是反向输出端。
D触发器工作模拟:
对于D触发器而言,当D输入端有一个输入信号,但是这个时候,控制端CP(CLK)是没有信号的,此时输入端D的数据是无法传到输出端Q以及反向输出端Q非的。
但是当时序控制端CP的时序脉冲一旦到了,这时D端输入的数据可以传到输出端Q以及输出端Q非。
数据传输过来之后,当CP时序控制端的时序信号消失了,这时输出端还会保持上次输入端D的数据(也就是所谓的把上次的数据锁存起来了)。如果下一个时序控制脉冲信号来了,这时输出端D的数据才能又传到输出端,改变输出端的状态。
④ 多路开关
多路选择开关是用于选择是做为普通I/O 口使用还是作为数据/地址总线使用的选择开关
⑤ 场效应管输出驱动
这两个MOS 管一次只能导通一个,当V1 导通时,V2 就截止,当V2 导通时,V1 截止。
⑥ P0口作为I/O 端口输出使用时的工作原理
了解逻辑门的作用+巩固锁存器
P0端口作为I/O端口使用的时候,多路开关的控制信号为0(低电平),上图中的控制信号,也就是那根红线是和与门连接在一起的,与门的工作原理是全1则1,有0则0。所以与门输出的是一个低电平(0),那么V1管这儿就截止了。
在多路控制开关的信号是0的时候,多路开关是余锁存器的Q非端相连的。P0口作为I/O口的时候,其由数据总线向引脚输出(即输出状态Output),其工作过程是:
当锁存器信号CP有效时,数据总线信号 ===> 锁存器输入端 ===> 锁存器的反向输出Q非端 ===> 多路开关 ===> V2管的栅极 ===> V2的漏极到输出端P0.X。
实际效果如下图
⑦ P0口作为I/O 端口输入使用时的工作原理
数据输入时(读P0 口)有两种情况:
1、读引脚
读芯片引脚上的数据,读引脚的时候,读引脚缓冲器打开,也就是此时三态缓冲器的控制端要有效,通过内部数据总线进行输入。
2、读锁存器
通过打开读锁存器的三态缓冲器,读取锁存器输出端Q的状态
(2)P1 端口
P1 端口是具有输出锁存的静态口。
P1 口的结构最简单,用途也单一,仅作为数据输入/输出端口使用。输出的信息有锁存,输入有读引脚和读锁存器之分
P1 端口与P0 端口的主要差别在于,P1 端口用内部上拉电阻R 代替了P0 端口的场效应管V1,并且输出的信息仅来自内部总线。由内部总线输出的数据经锁存器反相和场效应管反相后,锁存在端口线上,所以,P1 端口是具有输出锁存的静态口。
对于P1端口而言,想从引脚读取信息,需要使场效应管先关闭,以便于由外部输入的信息确定引脚的状态。
为此,在作引脚读入之前,必须先对该端口写入1。具备这种特征的输入/输出端口被称为准双向I/O口。51单片机中P1、P1、P3端口都是准双向口。因为P0端口的输出具有三态功能,输入前,端口线已经处于高阻态,无序进行先写入1才能进行读的操作。
单片机复位之后,P1、P2、P3端口的各个引脚会被自动写入1,此时可以直接进行输入操作的,如果在应用端口的过程中,人为的向P1——P3端口线输出过0,要再次输入的时候,必须先写入1,再读取引脚。
(3)P2 端口
P2 端口在片内既有上拉电阻,又有切换开关,所以P2 端口在功能上兼有P0 端口和P1 端口的特点。
最主要体现在输出功能上:
当切换开关向下接通时,从内部总线输出的一位数据经与门和场效应管反相后,输出在端口引脚线上;
当切换开关向上接通时,输出的一位地址信号也经与门和场效应管反相后,输出在端口引脚线上。
P2 端口的多路开关总是在进行切换,分时地输出从内部总线来的数据和从地址信号线上来的地址,因此P2 端口是动态的I/O 端口,用来周期性地输出从外存中取指令的地址(高8 位地址)。
(4)P3 端口
P3 口是一个多功能口,它除了可以作为I/O 口外,还具有第二功能
观察上面的结构图,P3 端口和Pl 端口的结构相似,区别仅在于P3 端口的各端口线有两种功能选择。
当处于第一功能时,第二输出功能线为1,此时,内部总线信号经锁存器和场效应管输入/输出,其作用与P1 端口作用相同,也是静态准双向I/O 端口。
当处于第二功能时,锁存器输出1,通过第二输出功能线输出特定的内含信号,在输入方面,即可以通过缓冲器读入引脚信号,还可以通过替代输入功能读入片内的特定第二功能信号。
由于输出信号锁存并且有双重功能,故P3 端口为静态双功能端口
P0、P1、P2、P3端口小总结
①P0 口是漏极开路,要使其输出高电平,必须外接上拉电阻,通常选择4.7K~10K 阻值。
②P0、P1、P2 几乎都用作普通I/O 口使用,既可作为输入,又可作为输出。
③P3 口既可用作普通I/O 口,又可作为第二功能使用,比如串口、外部中断、计数器等。
2.2、LED简介
LED
LED即发光二极管,具有单向导电性,通过5mA左右的电流就可以使其发光,电流越大,LED的亮度就越强。但是也得有个度,倘若电流太大,emmmm,灯也是会被烧毁的。常规情况下,我们会将电流控制在3mA ~ 20mA 之间。
这里还有一个小知识,为了避免不必要的烧毁,LED管脚上其实是串联了一个电阻的(串联分流),这个电阻也可以称为限流电阻,其主要目的是为了使通过发光二极管的电流不要太大。
当发光二极管正在发光时,测量它的两端电压,这个电压被叫做发光二极管的导通降压
常见的为直插式发光二极管和贴片式发光二极管实物图。
发光二极管正极又称阳极,负极又称阴极,电流只能从阳极流向阴极。直插式发光二极管长脚为阳极,短脚为阴极。贴片式发光二极管正面的一端有彩色标记,通常有标记的一端为阴极。
2.3、硬件设计
开发板上LED 模块电路如下图所示
① 别的花里花哨的咱先不看。首先找到咱们要点亮的LED灯,首先先进行实验一中的点亮第一个LED灯,也就是图中的D1。
② 要点亮它,那么得给它一个输入的电流吧。观察原理图,D1 ~ D8的LED灯分别和P2引脚的0~7的八个IO口相连,咱们要点亮D1,就需要对与其直接相连的P20进行操作了。
③ 原理图中LED 采用共阳接法,即所有LED 阳极管脚接电源VCC,阴极管脚通过一个471 欧的限流电阻接到P2 口上。根据前面LED 的介绍我们知道,要让LED 发光即对应的阴极管脚应该为低电平,若为高电平则熄灭。
因此就出现了上面代码中,使用sbit 关键字来定义P2.0 管脚,定义好后即可使用LED1 来替代P2.0口的操作再其为低电平的操作了。
#include "reg52.h" sbit LED1=P2^0; //将P2.0 管脚定义为LED1 void main() { LED1=0; //LED1 端口设置为低电平 while(1)//这个循环放不放都没有影响的,出于考虑还在熟悉模板,就放吧 { } }
拓展——内存操作,单片机的灵魂
浅看编译后的结果,假如忘记了怎么编译的小伙伴可以看看这张图
回归正题,编译之后首先看有没有报错和警告吧,然后重心就可以转到Program Size上了。。从编译信息可以看出,我们的代码占用FLASH 大小为:19 字节,所用的SRAM 大小为:9 个字节
然后框出来的三个数据都要清楚,因为以后随时都要打交道的。
code:表示程序所占用FLASH 的大小。
data:数据储存器内部RAM 占用大小。
xdata:数据储存器外部RAM 占用大小。
3、总结
① 能够独立的把三个小项目的代码写出来,然后得到相应的实验效果就取得了很大的进步
② 能够清楚LED的基本构造,分清楚阳极和阴极,能够结合开发板的硬件设计来知道哪个引脚控制哪个LED灯
③ 这篇博客最重要的是GPIO的知识。知道什么是GPIO,知道GPIO用于输入输出就可以啦,至于拓展的端口知识