全栈计划——Part_02:玩转单片机,掌握LED灯的底层输入输出

🔔文章目录

  • 💓1、实现代码
  • 💓2、为什么代码要这种写呢
  • 🌃 2.1、51 单片机GPIO 介绍
  • 🌻一、 GPIO 概念
  • 💒二、 GPIO 结构框图与工作原理
  • 🌱(1)P0 端口
  • 🍈① 数字门电路——掌握与门、或门、非门
  • 🍓 ② 输入缓冲器——认识三态门+缓冲器
  • 🍒 ③ D 锁存器—— 认识D触发器
  • 🍍④ 多路开关
  • 🍇⑤ 场效应管输出驱动
  • 📁 ⑥ P0口作为I/O 端口输出使用时的工作原理
  • 📁 ⑦ P0口作为I/O 端口输入使用时的工作原理
  • ⏳(2)P1 端口
  • 🎒(3)P2 端口
  • 🔯(4)P3 端口
  • 💖P0、P1、P2、P3端口小总结
  • 🌇 2.2、LED简介
  • 🌆2.3、硬件设计
  • 💓3、总结
  • 往期精彩

    🔖 第一天 14天玩转51单片机第一天——捋不清单片机数字电路基础?已经忘记C语言啦~这篇文章横扫你的疑惑,重拾你的记忆呀^ – ^

    💓1、实现代码

    大家常规印象中的博客可能首先看到一堆的看着有点打脑壳的原理阐释,然后再去实现项目的代码的。
    我写这个专栏想换种玩法,先直接把我的代码粘贴过去,或者比对着我的代码先把实验现象跑出来,咱们再去琢磨为什么要这种编写代码了。
    用需求刺激输入

    ① 点亮第一个LED灯
    项目代码:
    实验效果

    ② 让第一个LED灯闪烁
    项目代码:
    实验效果

    ③ 流水灯

    项目代码:

    实验效果就是那八个LED灯逐渐闪烁

    💓2、为什么代码要这种写呢


    咱们先系统的认识一下单片机上最为突出的GPIO引脚吧~

    🌃 2.1、51 单片机GPIO 介绍

    🌻一、 GPIO 概念

    GPIO的全称是general purpose intput output。从这个英文名字中的input和output应该可以发现这东西应该是和输入输出有关的。

    GPIO(general purpose intput output)是通用输入输出端口的简称,可以通过软件来控制其输入和输出。51 单片机芯片的GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能

    GPIO最入门的玩法就是上文代码中的点亮LED灯了。

    对于现阶段而言,以下内容是拓展知识,浅浅过一遍,心中有个底就好,后面随着实验的开展,潜移默化中会更加熟悉这些知识点


    我们开发板上使用的51 单片机型号是STC89C52 或STC89C516,此芯片共有40 引脚,芯片引脚图如下图所示:

    大致的扫一遍芯片引脚图,看着可能依旧是比较蒙的,继续跟着我的思路走吧。

    其实可以看到不是所有引脚都是GPIO引脚的。
    系统的说来,单片机的引脚大致分为以下五种:
    1)电源引脚:引脚图中的VCC、VSS/GND 都属于电源引脚。
    2)晶振引脚:引脚图中的XTAL1、XTAL2 都属于晶振引脚。
    (3)复位引脚:引脚图中的RST/VPD 属于复位引脚,不做其他功能使用。
    (4)下载引脚:51 单片机的串口功能引脚(TXD、RXD)可以作为下载引脚使用。
    (5) GPIO 引脚:引脚图中带有Px.x 等字样的均属于GPIO 引脚。

    从引脚图可以看出,GPIO 占用了芯片大部分的引脚,共达32 个,分为了4 组,P0、P1、P2、P3,每组为8 个IO,而且在P3 组中每个IO 都具备额外功能,只要通过相应的寄存器设置即可配置对应的附加功能,同一时刻,每个引脚只能使用该引脚的一个功能。

    学习建议:
    单单基础的51就有这么多引脚了,假如到了STM32,引脚就更多的了,咱们需要做的其实只是浅浅的知道它们是什么,这些引脚的具体功能是可以根据配套的芯片资料中查阅到。


    随着大家的修为逐渐增长了,其实开发板芯片原理图已经将引脚所有功能都标进去的,所以后面也不需要这么麻烦的查找具体引脚有什么功能,直接看原理图即可喔。

    STC89Cxx中文参考手册.pdf——已上传到gitee ^ – ^

    💒二、 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的状态

    好了,详细分析了P0端口的内部逻辑,输入输出流程,下面的P1、P2、P3端口就换汤不换药啦

    ⏳(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)//这个循环放不放都没有影响的,出于考虑还在熟悉模板,就放吧
    	{
    	
    	}
    }
    

    倘若不清楚sbit关键字的小伙伴可以去看看前面的文章喔
    这里是引用
    拓展——内存操作,单片机的灵魂

    > 单片机的内存是真的小,所以这就需要操作单片机的咱们对内存的操作,使用上清清楚楚的了。
    浅看一下咱们刚才的文件的编译结果,里面有几个需要注意的点

    浅看编译后的结果,假如忘记了怎么编译的小伙伴可以看看这张图

    回归正题,编译之后首先看有没有报错和警告吧,然后重心就可以转到Program Size上了。。从编译信息可以看出,我们的代码占用FLASH 大小为:19 字节,所用的SRAM 大小为:9 个字节

    然后框出来的三个数据都要清楚,因为以后随时都要打交道的。
    code:表示程序所占用FLASH 的大小。
    data:数据储存器内部RAM 占用大小。
    xdata:数据储存器外部RAM 占用大小。

    💓3、总结

    ① 能够独立的把三个小项目的代码写出来,然后得到相应的实验效果就取得了很大的进步啦。

    ② 能够清楚LED的基本构造,分清楚阳极和阴极,能够结合开发板的硬件设计来知道哪个引脚控制哪个LED灯
    ③ 这篇博客最重要的是GPIO的知识。知道什么是GPIO,知道GPIO用于输入输出就可以啦,至于拓展的端口知识,尽量去理解就好,现阶段不是特别依赖这些知识点。

    物联沃分享整理
    物联沃-IOTWORD物联网 » 全栈计划——Part_02:玩转单片机,掌握LED灯的底层输入输出

    发表评论