【全栈计划 —— 单片机】——Part_03 使用放大电路或拓展芯片解决GPIO的输出电流不足够支持驱动设备的问题(3)

简介: 【全栈计划 —— 单片机】——Part_03 使用放大电路或拓展芯片解决GPIO的输出电流不足够支持驱动设备的问题(3)

动态数码管实验


项目实现代码

微信图片_20221019162828.jpg实验现象

微信图片_20221019162900.jpg

刨根问底环节


多位数码管简介


多位数码管,是两个或两个以上单个数码管并列集中在一起形成一体的数码管。

当多位一体时,它们内部的公共端是独立的,而负责显示什么数字的段线(a-dp)全部是连接在一起的。


独立的公共端可以控制多位一体中的哪一位数码管点亮, 而连接在一起的段线可以控制这个能点亮数码管亮什么数字;通常我们把公共端叫做位选线,连接在一起的段线叫做段选线。

有他俩以后,通过单片机及外部驱动电路就可以控制任意的数码管显示任意的数字了。


数码管静态显示阐述

多位数码管依然可以静态显示,但是显示时要么只显示一位数码管,要么多位同时显示相同内容。

当多位数码管应用于某一系统时,它们的位选是可独立控制的,而段选是连接在一起的,我们可以通过位选信号控制哪几个数码管亮。

而在同一时刻,因为它们的段选是连接在一起的,送入所有数码管的段选信号都是相同的,因此位选选通的所有数码管上显示的数字始终都是一样的。


数码管动态显示阐述

动态显示,就是利用减少段选线,分开位选线,利用位选线不同时选择通断,改变段选数据来实现。

假如举个栗子了,是这种的:

在第一次进行选择的时候,让位选线选中第一个数码管,给段选数据0,下次位选选中第二个数码管的时候显示1,。在1显示的时间里,要在肉眼察觉不到的时间(小于24ms的间隔)里再次点亮第一个点亮的数字0。此时可以观察到数码管点亮是在向右或者向走一位一位点亮,形成了动态效果,倘若延长时间间隔,这种现象就会十分明显了。


74HC245 和74HC138 芯片介绍

数码管动态显示这部分的内容,我觉得积累这两个芯片的知识其实蛮重要的。

因为单纯依靠单片机的IO口的输出电流来驱动整个硬件是心有余而力不足的,所以这个实验就额外使用了两类芯片:

74HC245芯片作为增加的外设驱动芯片来弥补IO口驱动能力弱的缺陷。


同时考虑到IO口的数量有时候可能不够,所以使用IO拓展芯片来解决这个问题,比如74HC138、74HC164、74HC595 芯片等就是常见的IO拓展芯片,有了IO拓展芯片,就可以只需要很少的单片机IO 口就可以扩展出8 个控制口,通过级联方式甚至可扩展出更多的控制口


接下来简单了解一下这两个芯片吧,其实芯片不重要,因为新的芯片层出不穷,我想传达给大家的是怎么看硬件的说明书、管脚定义说明来学会使用这个硬件。


① 74HC245 芯片简介

74HC245 是一种三态输出、八路信号收发器,主要应用于大屏显示,以及其它的消费类电子产品中增加驱动。

1、主要特性:

微信图片_20221019163052.png

2、管脚功能定义

微信图片_20221019163118.jpg

现在咱们就来读这个管脚定义说明吧。

第1引脚DIR,写的是方向控制,DIR = 1,A——>B,DIR = 0,B——>A。其意思就是,为输入输出端口转换用,DIR=1高电平时信号由A端输入B端输出,DIR=0低电平时信号由B端输入A端输出。


再看2~9引脚都是A开头的,其意思就是,当OE为低电平0的时候,DIR为1,此时就是A开头的端口作为输入,B开头的端口作为对应的输出,比如A1作为输入,B1作为输出;倘若OE为低电平0的时候,DIR为0的时候,此时就是刚好反过来。


>第11~18是B开头的端口,和上面的A开头的端口是配套的,就不赘述了。


第19引脚叫做OE,称为输出使能,其效果就是,当前引脚是1的时候,A/B端的信号不导通,只有为0的时候,才能够进行导通,有开关的作用。


至于第10脚的GND电源接地和第20脚的VCC电源正极就不必复述啦~


②74HC138 芯片简介

74HC138 是一种三通道输入、八通道输出译码器,主要应用于消费类电子产品。

1、主要特性

微信图片_20221019163159.png

2、管脚功能定义

微信图片_20221019163224.jpg

给E1、E2 使能管脚低电平,E3 管脚为高电平,至于哪个管脚输出有效电平(低电平),要看A0,A1,A2 输入管脚的电平状态。

可能小伙伴想问为什么低电平是有效电平,常规情况下不是1为真吗,大家注意Y1~Y7是被取过非的,只有在低电平的时候,经过取非才能得到设备需要的高电平,上面的74HC245芯片的OE使能端也是类似的。



至于A1~A3的输入,Y1 ~ Y7的输出,可以这种理解:A0、A1、A2 输入就相当于3 位2 进制数,A0 是低位,A1 是次高位,A2 是高位。而Y0-Y7 具体哪一个输出有效电平,就看输入二进制对应的十进制数值。比如输入是101(A2,A1,A0),其对应的十进制数是5,所以Y5 输出有效电平(低电平)。


代码设计


代码的设计依旧离不开咱们可爱的电路图

image.jpeg

数码管的段选a-dp连接在74HC245 驱动芯片输出口,由P0 端口控制。

位选是由P2.2、P2.3、P2.4 管脚控制74HC138 译码器输入从而进行控制。


现在要求八个LED灯都要使用,按照上面我阐述的使用二进制的思想来理解了,我现在只需要对进行输入的P22、P23、P24分别赋八种组合的高低电平,就可以分别控制这八个灯了。


项目代码

/********************************************************************
******************
实验名称:动态数码管实验
接线说明:
实验现象:下载程序后“数码管模块”显示01234567
注意事项:
*********************************************************************
******************/
#include "reg52.h"
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
#define SMG_A_DP_PORT P0 //使用宏定义数码管段选所依赖的P0端口
//定义数码管位选信号控制脚
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
//提前打表共阴极数码管显示0 ~ F 的段码数据
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/********************************************************************
***********
* 函数名: delay_10us
* 函数功能: 延时函数,ten_us=1 时,大约延时10us
* 输入: ten_us
* 输出: 无
*********************************************************************
**********/
void delay_10us(u16 ten_us)
{
  while(ten_us--);
}
/*******************************************************************************
* 函数名: smg_display
* 函数功能: 动态数码管显示
* 输入: 无
* 输出: 无
*******************************************************************************/
void smg_display(void)
{
    u16 i;
    for(i=0;i < 8;i++)
    {
        //模拟位选的过程
      switch(i)
      {
        //注意这里写P22、P23、P24的时候, 按照P22是最低位,P24是最高位的思维走
        //才能对应上74HC138译码器中二进制理解法
        case 0: LSC = 1,LSB = 1,LSA = 1;break;
        case 1: LSC = 1,LSB = 1,LSA = 0;break;
        case 2: LSC = 1,LSB = 0,LSA = 1;break;
        case 3: LSC = 1,LSB = 0,LSA = 0;break;
        case 4: LSC = 0,LSB = 1,LSA = 1;break;
        case 5: LSC = 0,LSB = 1,LSA = 0;break;
        case 6: LSC = 0,LSB = 0,LSA = 1;break;
        case 7: LSC = 0,LSB = 0,LSA = 0;break;
      }
      SMG_A_DP_PORT =  gsmg_code[i];  //确定P0端口具体的段选
      delay_10us(100);//放置延时,让其稳定显示
      SMG_A_DP_PORT =  0x00;//将段选口清零即消隐(消除之前的显示)
    }
}
/********************************************************************
***********
* 函数名: main
* 函数功能: 主函数
* 输入: 无
* 输出: 无
*********************************************************************
**********/
void main()
{
  while(1)
  {
    //调用这个函数
    smg_display();
  }
}

总结


这篇文章了,看似是在阐述怎么让蜂鸣器响起来,怎么让数码管显示想要的东西,其实这些都是表层的东西


最主要的是要掌握,当输出电流不足的时候,怎么解决。

因为这些设备直接使用单片机的IO口来驱动是够呛的,所以才会考虑使用放大电路,考虑使用一些拓展芯片来解决IO口提供的电流不足,IO的数量不足的情况。

同时了,因为芯片是会不断更新的,但是通过芯片的说明书、电路图来学会怎么使用这个硬件的思想是变不了的


相关文章
|
存储 芯片
SGM58031与单片机驱动实现
SGM58031与单片机驱动实现
243 0
|
传感器
蓝桥杯之单片机学习(二十八)——详解A/D、D/A、PCF8591、AD与DA的综合使用(附官方驱动的一个坑)
蓝桥杯之单片机学习(二十八)——详解A/D、D/A、PCF8591、AD与DA的综合使用(附官方驱动的一个坑)
540 0
蓝桥杯之单片机学习(二十八)——详解A/D、D/A、PCF8591、AD与DA的综合使用(附官方驱动的一个坑)
|
2月前
|
传感器
基于51单片机的自动浇花器电路
该文档是一个基于AT89C51单片机的自动浇水灌溉系统的设计方案。系统由5V供电模块、土壤湿度传感器模块、ADC0832模数转换模块、水泵控制模块、按键输入模块、LCD显示模块和声光报警模块组成。它通过检测土壤湿度并将其转换为数字信号,与预设的湿度上下限值进行比较,以决定是否启动水泵进行灌溉。用户可以通过按键设置湿度上下限值,LCD屏幕实时显示当前湿度和上下限值。如果湿度低于下限,系统会启动声光报警并打开水泵;当湿度超过上限,声光报警关闭,但水泵会继续工作,直至湿度下降到下限以下。设计中还提供了Proteus仿真电路图和C代码实现。
38 1
|
2月前
|
存储 芯片
【期末不挂科-单片机考前速过系列P12】(第十二章:单片机的并行拓展例题)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P12】(第十二章:单片机的并行拓展例题)经典例题盘点(带图解析)
【单片机】简易计算器完整代码带电路图
【单片机】简易计算器完整代码带电路图
281 0
【单片机】简易计算器完整代码带电路图
|
2月前
|
物联网 芯片
STC51单片机-应用系统并行扩展电路设计(存储器扩展)-物联网应用系统设计
STC51单片机-应用系统并行扩展电路设计(存储器扩展)-物联网应用系统设计
55 0
|
2月前
|
芯片
单片机中GPIO八种工作模式详细分析
单片机中GPIO八种工作模式详细分析
156 0
|
10月前
|
安全 芯片
单片机检测220V交流电通断电路
单片机检测220V交流电通断电路
|
10月前
|
芯片
STM32F0单片机快速入门五 GPIO中断
STM32F0单片机快速入门五 GPIO中断
|
C# Android开发 C++
c#(nanoframework)安装单片机环境;如何使用c#写类似于c的单片机驱动
c#(nanoframework)安装单片机环境;如何使用c#写类似于c的单片机驱动
187 0
c#(nanoframework)安装单片机环境;如何使用c#写类似于c的单片机驱动