【蓝桥杯单片机】1.2 蜂鸣器和继电器_蓝桥杯板子蜂鸣器引脚-爱代码爱编程
序言
通过对LED的学习,相信大家的对74HC138译码器和74HC573锁存器有了较为详细的了解,但是只对其中的一个74HC573锁存器进行了学习,此次我们会学习控制蜂鸣器的继电器的锁存器,同时也会对在74HC138译码器上选择74HC573锁存器的选择代码进行优化处理。
让我们开始吧~
一、实物图
图中左侧的为蜂鸣器模块,右侧为L10(继电器吸合时点亮,断开时关闭)。
特别注意:红色箭头所指内容为继电器和蜂鸣器开关,记得要把键帽插在ON上。
二、原理图及硬件部分
此处可以得知,控制蜂鸣器引脚(BUZZ)和继电器引脚(RELAY)的锁是“Y5” 。
1. 74HC573锁存器的功能
数据存储:573锁存器可以将输入的数据在时钟信号的作用下暂时存储起来,以便后续处理或输出。
数据输出控制:当时钟信号到来时,锁存器会将存储的数据输出,实现对数据输出的控制。这对于确保数据在特定时刻得到正确输出非常重要。
并行数据传输:573锁存器通常具有多个并行输入和输出引脚,可以实现并行数据的传输,适用于需要处理多个数据信号的场合。
时序控制:通过控制时钟信号的频率和时序,可以精确地控制数据存储和输出的时间,确保系统的稳定性和可靠性。
2. 74HC573锁存器的使用
数据输入端(D1~D8)的输入=数据输出端(Q1~Q8)的输出,且输出端的电平状态不影响输入端。
3.ULN2003达林顿管
(1)特点
ULN2003芯片具有以下特点:
多通道输出:ULN2003芯片具有7个高电压、高电流输出通道,每个通道都有一个达林顿对输出。这使得它能够同时控制多个负载。
达林顿对输出:每个输出通道都包含了一个达林顿对,它是一种高效率的电流放大器,能够承受较高的负载电流。
内部反向电压保护二极管:ULN2003芯片的每个输出引脚都内置了反向电压保护二极管,用于保护输出引脚免受感性负载的损害。
大功率能力:ULN2003芯片能够承受较高的电流和电压,适用于驱动各种类型的高功率负载,如继电器、步进电机等。
(2)功能
电流放大和负载驱动:ULN2003内部集成了7个达林顿对输出,能够提供高电流放大和电流输出,使其适合驱动各种高功率负载,如继电器、步进电机等。
多通道控制:ULN2003具有7个输出通道,每个通道都可以独立控制,这使得它可以同时控制多个负载,提高了系统的灵活性和多功能性。
电压反向保护:每个输出通道都内置了反向电压保护二极管,可以保护输出引脚免受感性负载的损害,提高了系统的稳定性和可靠性。
适应性强:ULN2003能够承受较高的电流和电压,适用于各种工业和消费电子应用,如汽车电子、家电控制、机器人等领域。
简化电路设计:ULN2003的集成设计简化了电路设计过程,减少了外部元件的数量和复杂性,降低了系统成本并提高了系统的可靠性。
此处,我们可以直接将其理解为“非门”。
三、代码部分
1. 选择锁存器
在LED部分中我们学习了74HC138译码器的使用(详情见我的作品:1.1LED流水灯http://t.csdnimg.cn/nBlFU)。
例如此处我们选择Y5通道对应的锁存器:
sbit HC138_A2=P2^7; //重新定义HC138_A2连接P27引脚
sbit HC138_A1=P2^6; //重新定义HC138_A1连接P26引脚
sbit HC138_A0=P2^5; //重新定义HC138_A0连接P25引脚
void SelectHC573()//定义函数名称
{
HC138_A2=1; //P2^7引脚输出高电平1
HC138_A1=0; //P2^6引脚输出高电平0
HC138_A0=1; //P2^5引脚输出高电平1
}
如此对应的二进制数为:101,即十进制数5,因此选择了Y5通道。
2. 74HC138译码器代码优化
在前文中我们说过如此写代码过于冗杂,此处我们对代码进行优化。
首先我们先观察一下74HC138译码器的原理图:
(1) 由图中我们可以得知A、B、C所对于的引脚分别为P25、P26、P27,因此我们只对这三个引脚进行赋值,以免造成不必要的错误。
P2=P2 & 0x1f; //0001 1111
(2) 然后,我们将高三位的值清0(即P25,P26,P27),然后第五位保持不变,我们在此基础上对高三位进行赋值。
若:A2、A1、A0组成的二进制数为100,即十进制数4,因此选择通道4
若:A2、A1、A0组成的二进制数为101,即十进制数5,因此选择通道5
若:A2、A1、A0组成的二进制数为110,即十进制数6,因此选择通道6
若:A2、A1、A0组成的二进制数为111,即十进制数7,因此选择通道7
(3) 将二进制某一位上的数字置“1” ,我们通常使用“或”(|)操作。此处举例我们所选的为Y4:
P2= P2 | 0x80; //P2 | 1000 0000
此时P2的高三位的值为100,十进制数为4(此处我们已将P2的高三位单独拿出来分析,因此读者不必纠结实际上P2的值)
(4)因此我们可以延伸写出其他寄存器的选择:
void SelectHC573(unsigned char n) //定义函数,调用时写入需要调用的寄存器号
{
switch(n)
{
case 4:
P2=(P2 & 0x1f) | 0x80; //选择寄存器4 (100)
break;
case 5:
P2=(P2 & 0x1f) | 0xa0; //选择寄存器5 (101)
break;
case 6:
P2=(P2 & 0x1f) | 0xc0; //选择寄存器6 (110)
break;
case 7:
P2=(P2 & 0x1f) | 0xe0; //选择寄存器7 (111)
break;
}
}
至此我们74HC138译码器的优化代码已完成(后续会有更进一步的优化)。
3.继电器和蜂鸣器的使用
首先我们选择其对应的寄存器:
SelectHC573(5);
由原理图可知,我们若想在BUZZ处输出高电平,则需要ULN2003达林顿管输出高电平,因此74HC573锁存器输出低电平,即P06口输出低电平、
P0=0x40; //1011 1111 蜂鸣器工作
同样,我们打开继电器,则需使P04口输入低电平
P0=0x10; //1110 1111 继电器工作
这样,继电器和蜂鸣器都可以工作了!
四、代码纯享版
此处写一个先打开蜂鸣器,一段时间后关闭,再打开继电器,一段时间后关闭。
#include <STC15F2K60S2.H> //引入头文件
void SelectHC573(unsigned char n) //定义函数,调用时写入需要调用的寄存器号
{
switch(n)
{
case 4:
P2=(P2 & 0x1f) | 0x80; //选择寄存器4 (100)
break;
case 5:
P2=(P2 & 0x1f) | 0xa0; //选择寄存器5 (101)
break;
case 6:
P2=(P2 & 0x1f) | 0xc0; //选择寄存器6 (110)
break;
case 7:
P2=(P2 & 0x1f) | 0xe0; //选择寄存器7 (111)
break;
}
}
void Delay(unsigned int t)
{
while(t--);
}
void main()
{
SelectHC573(5); //选择寄存器
while(1)
{
P0=0x40; //打开蜂鸣器
Delay(60000);
P0=0x40; //关闭蜂鸣器
Delay(60000);
P0=0x10; //打开继电器
Delay(60000);
P0=0x10; //关闭继电器
Delay(60000);
}
}