IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 14天玩转51单片机第三天——当GPIO的输出电流不足够支持驱动设备的时候,此时该怎么办呢,有问必答,疑惑横扫~ -> 正文阅读

[嵌入式]14天玩转51单片机第三天——当GPIO的输出电流不足够支持驱动设备的时候,此时该怎么办呢,有问必答,疑惑横扫~

💓蜂鸣器实验

在这里插入图片描述
蜂鸣器这个实验最重要的是当IO不足以直接支撑设备时,要使用放大电路的意识。其次的蜂鸣器类型的认识以及代码落实相对都没有这么重要的。


📁项目实现代码

在这里插入图片描述
实验的效果了,就是听到一阵不太好听的蜂鸣吧…
在这里插入图片描述

在这里插入图片描述

🔖刨根问底环节

在这里插入图片描述

🍪蜂鸣器介绍

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

蜂鸣器的分类

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

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

压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳
等组成。多谐振荡器由晶体管或集成电路构成,当接通电源后(1.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的数量不足的情况。

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

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章           查看所有文章
加:2022-05-03 09:26:36  更:2022-05-03 09:26:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:54:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码