锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2022-10-13 00:00:00 单片机高低边驱动引脚控制继电器三极管dp3080y1三极管电流正规的大电流混装连接器d6020d固态继电器1114p固体继电器

??目录

  • ??蜂鸣器实验
    • ??实现项目代码
    • ??刨根问底环节
      • ??蜂鸣器介绍
        • 蜂鸣器的分类
        • 蜂鸣器的有源无源可分
        • 放大引入电路
      • ??代码设计
      • ??项目代码
  • ??静态数码管实验
    • ??实现项目代码
    • ??刨根问底环节
      • ??浅识数码管
        • 1.数字管的分类
        • 2.了解共阳极数码管和共阴极数码管
      • ??代码设计
      • ??项目代码
  • ??动态数码管实验
    • ??实现项目代码
    • ??刨根问底环节
      • ??多数码管简介
        • 数字管静态显示说明
        • 动态显示和阐述数码管
        • 74HC245 和74HC138 芯片介绍
          • ① 74HC245 芯片简介
          • ②74HC138 芯片简介
      • ??代码设计
      • ??项目代码
  • ??总结

??蜂鸣器实验

在这里插入图片描述
蜂鸣器最重要的实验是IO当设备不足以直接支撑时,需要使用放大电路意识。其次,对蜂鸣器类型和代码实施的理解并不那么重要。


??实现项目代码


实验的效果是听到不太好听的蜂鸣声…

??刨根问底环节

??蜂鸣器介绍

浅看一下,知道有这个东西,就当做硬件常识积累起来就好。
蜂鸣器常用作电子产品发声器件

蜂鸣器的分类

主要分为压电蜂鸣器电磁蜂鸣器两种类型

提供一定频率的脉冲信号;
想要电磁蜂鸣器发声,只需提供电源。

压电蜂鸣器主要由多谐
振荡器、压电蜂鸣器、阻抗匹配器和共振箱组成
等等。多谐振荡器由晶体管或集成电路组成.5~15V 直流工
多谐振荡器振动,输出1.5~5kHZ 阻抗匹配器推动压电
蜂鸣片发声。


电磁蜂鸣器由振荡器、电磁线圈、磁铁、振动膜和外壳组成。打开电源后,振荡器产生的音频信号电流通过电磁线圈产生磁场,振动膜在电磁线圈和磁铁的相互作用下定期振动。

蜂鸣器的有源无源可分

51开发板上使用的蜂鸣器是无源蜂鸣器属于压电蜂鸣器类型。这里提到的有源和无源不是指电源,而是蜂鸣器是否含有电源振荡电路
有源蜂鸣器内部有自己的振荡电路,只需提供电源即可发出声音;
无源蜂鸣器需要提供一定频率的脉冲信号才能发出声音,频率通常为1.5-5KHz 之间。

两者的明显差异
对于无源蜂鸣器,可以改变频率调节蜂鸣器音调,产生不同音色和音调的声音。如果改变输出电平的高低电平占空比,蜂鸣器的声音大小可以改变。
通常对于有源蜂鸣器,频率固定在内部,蜂鸣器的音调和音量可能无法改变调节频率或占空比

放大电路引入

常规情况下,想要驱动蜂鸣器大约需要30mA的电流

可以看到倘若直接使用单片机的IO口的电流来直接驱动蜂鸣器,应该够呛。

此时就可以引入咱的应该着重拿捏的思想——放大电路
通过三极管把电流放大后再去驱动蜂鸣器,这样51 单片机的IO 口只需要提供不到1mA 的电流就可控制蜂鸣器。
51单片机中并没有直接简单粗暴的上一个三极管进行电流放大,而是使用ULN2003 芯片来驱动,但是本质仍旧是对电流的放大。

🍏代码设计

代码要根据开发板文档中提供蜂鸣器电路图来思考咱们要怎么控制它。

这个电路图中涉及一个网络标号的知识点,需要积累一下
简单来说就是具备相同标号的节点,是可以连接在一起的,比如上图中框起来的两个位置节点,其实是相连的。

从图中可以看出,蜂鸣器控制管脚直接连接到51 单片机的P2.5 管脚上。
这个ULN2003芯片的具体的了,暂时不展开,不然会很冗杂,现在记住在使用ULN2003芯片来驱动的时候,有点像一个非门。当P25输出高电平,BEEP输出低电平;当P25输出低电平,BEEP则输出高电平。
因为使用的是无源蜂鸣器,它需要使用一定频率的脉冲(即出现高低电平)才会发出声音,因此需要让P25引脚用一定的频率不断的输出高低电平信号才能够控制蜂鸣器发出声音。

📌项目代码

#include "reg52.h"
typedef unsigned int u16; 
typedef unsigned char u8;

sbit BEEP = P2^5;//操作和蜂鸣器相连的P2.5引脚
//延时函数
void delay_10us(u16 ten_us)
{ 
        
	  while(ten_us--);
}
void main()
{ 
        
	u16 i=1,j=2000;
	while(i)
	{ 
        
		 while(j--)
		 { 
        
			 //通过反转赋值,产生一定频率的脉冲信号
			 BEEP=1;
			delay_10us(190);
			BEEP=0;
			delay_10us(10);
		 	BEEP = !BEEP;
			delay_10us(100);//延时鸣响一段时间
		 }	
		i = 0;//结束循环
		BEEP = 0;//关闭蜂鸣器
	}
}

💓静态数码管实验

在这里插入图片描述
我感觉静态数码管这块更多的是对硬件知识的再认识吧,其中关于程序设计方面可以拿出来评赏的东西其实不多。目前get到的是对高低电平的在认识以及使用十六进制来灵活的表示十进制。

📁项目实现代码

关于实验代码这块了,我不太想直接让大家CV吧,因为代码量不是特别大,然后小伙伴们对照我的代码敲一遍,可以更好的发现自己看不到的一些问题。

实验效果:

🔖刨根问底环节

🍪浅识数码管

数码管是一种半导体发光器件,其基本单元仍旧是发光二极管。数码管有时候也称LED数码管

1、数码管的分类

① 数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点(DP),这个小数点可以更精确的表示数码管想要显示的内容;

② 按能显示多少个(8)可分为1 位、2 位、3 位、4 位、5 位、6 位、7 位等数码管。

③ 按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。

2、共阳极数码管和共阴极数码管的认识

共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM 接到+5V。
当某一字段发光二极管的阴极为低电平时,相应字段就点,当某一字段的阴极为高电平时,相应字段就不亮。


共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM 接到地线GND 上,它们的阳极是独立的。
当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。


这里有个小常识需要作为知识储备。对于开发板这种集成电路而言,共阳极数码管更为常用,这是因为数码管的非公共端一般都是接在IC芯片的I/O口上,但是I/O口的驱动能力其实是比较差的,使用共阳极数码管能够接驱动电流到公共端,这样下来,芯片的负担会小很多。

但是51用的数码管是2 个四位一体的共阴极数码管,也就是8 个LED的阳极全部并联一起引出,阴极分别引出如A、B、C、D、E、F、G、DP。

对于共阴极数码管了,举个例子,如果要让共阴数码管显示数字0,即对应的段ABCDEF 要点亮即给它高电平,其他的段熄灭即给它低电平


在清楚了怎么通过高低电平点亮数码管中的LED灯之后,我们就可以设计出不同的组合来显示我们需要的内容,为后续的代码落实做铺垫。
下图就是通过改变高低电平来显示0 ~ 9以及显示A ~ F


🍏代码设计

单片机的东西,想要把代码写出来,主要还是要会看电路图,通过电路图清楚那些引脚来控制当前的这个设备。


和我一起浅看一下数码管的电路图吧

首先观察上面一个电路图,控制a~dp八个LED灯的引脚是P0,意思就是,我们要操作P0引脚输出的高低电才能够得到咱想要显示的数字。
下面这个是这八个LED灯的总汇的图,74HC138是一个译码器,P22、P23、P24默认是高电平了,现在就保持默认,不动它,待会动态数码管实验详细阐述这个译码器。

📌项目代码

感觉很像算法里面的打表,提前把共阴极的表打出来,在主函数里直接使用表中数据即可。

/******************************************************************** ****************** 实验名称:静态数码管实验 接线说明: 实验现象:下载程序后“数码管模块”最左边数码管显示数字0 注意事项: ********************************************************************* ******************/
#include "reg52.h"
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;

#define SMG_A_DP_PORT P0 //使用宏定义数码管段码口

//共阴极数码管显示0 ~F 的段码数据
u8 gsmg_code[17]={ 
        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

/******************************************************************** *********** * 函数名: main * 函数功能: 主函数 * 输入: 无 * 输出: 无 ********************************************************************* **********/
void main()
{ 
        
	SMG_A_DP_PORT=gsmg_code[0];//将数组第1 个数据赋值给数码管段选口
}

💓动态数码管实验

在这里插入图片描述

📁项目实现代码


实验现象:

🔖刨根问底环节

🍪多位数码管简介

多位数码管,是两个或两个以上单个数码管并列集中在一起形成一体的数码管。
当多位一体时,它们内部的公共端是独立的,而负责显示什么数字的段线(a-dp)全部是连接在一起的。

独立的公共端可以控制多位一体中的哪一位数码管点亮, 而连接在一起的段线可以控制这个能点亮数码管亮什么数字;通常我们把公共端叫做位选线,连接在一起的段线叫做段选线
有他俩以后,通过单片机及外部驱动电路就可以控制任意的数码管显示任意的数字了

数码管静态显示阐述

多位数码管依然可以静态显示,但是显示时要么只显示一位数码管,要么多位同时显示相同内容。
当多位数码管应用于某一系统时,它们的位选是可独立控制的,而段选是连接在一起的,我们可以通过位选信号控制哪几个数码管亮。
而在同一时刻,因为它们的段选是连接在一起的,送入所有数码管的段选信号都是相同的,因此位选选通的所有数码管上显示的数字始终都是一样的。

数码管动态显示阐述

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

74HC245 和74HC138 芯片介绍

数码管动态显示这部分的内容,我觉得积累这两个芯片的知识其实蛮重要的。
因为单纯依靠单片机的IO口的输出电流来驱动整个硬件是心有余而力不足的,所以这个实验就额外使用了两类芯片:
74HC245芯片作为增加的外设驱动芯片来弥补IO口驱动能力弱的缺陷。


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

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

① 74HC245 芯片简介

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

2、管脚功能定义


现在咱们就来读这个管脚定义说明吧。
第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、主要特性

2、管脚功能定义

给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 输出有效电平(低电平)。


学着读芯片的事儿就暂时告一段落啦~

🍏代码设计

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

数码管的段选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的数量不足的情况。

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

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章