蓝桥杯单片机开发及应用-基础模块02-蜂鸣器和继电器
一、先前知识
74HC138译码器(在基础模块01中有介绍,此处再次介绍是为了加深我们对基础芯片的印象)
74HC138译码器是一款高速CMOS器件,74HC138引脚兼容低功耗肖特基TTL(LSTTL)系列。74HC138译码器可接受3位二进制加权地址输入(A, B和C),并当使能时,提供8个互斥的低有效输出(Y0至Y7)。
74HC138特有3个使能输入端:两个低有效(G2A和G2B)和一个高有效(G1)。除非G2A和G2B置低且G1置高,否则74HC138将保持所有输出为高。
图一、74HC138译码器模块
图二、74HC138译码器输出经或非门
图三、74HC138译码器功能表
74HC573锁存器(在基础模块01中有介绍,此处再次介绍是为了加深我们对基础芯片的印象)
74HC573锁存器是八路三态输出的非反转透明锁存器。
当锁存器使能端LE为高时,这些器件的锁存对于数据是透明的(也就是说输出同步)。当锁存器使能变低时,符合建立时间和保持时间的数据会被锁存。
图四、74HC573锁存器模块
图五、74HC573锁存器功能表
蜂鸣器模块介绍
蜂鸣器分有源蜂鸣器和无源蜂鸣器,蓝桥杯板子上使用的蜂鸣器是有源蜂鸣器。有源蜂鸣器的工作原理是直流电源输入经过振荡系统的放大取样电路在谐振装置作用下产生声音信号。由下图可知,蜂鸣器的正极接了一个 VCC 高电平,当 N_BUZZ 引脚输入高电平的时候蜂鸣器就会发出响声;输入低电平的时候蜂鸣器关闭。
图六、蜂鸣器模块
继电器模块介绍
该继电器为电磁继电器,是利用输入电路内电流在电磁铁铁芯与衔铁之间产生的吸力作用而工作。当单片机输出低电平时,也就是对继电器模块的输入引脚 N_RELAY 给低电平时,二极管的正极就是低电平了,此时二极管截止,线路没有电流流过,继电器不反应;当输入 N_RELAY 引脚给高电平时,二极管导通,内部形成电流,电磁铁铁芯“ RELAY_SPDT ”产生吸力将K1吸下来,继电器吸合。
图七、继电器模块
蜂鸣器和继电器模块原理图
图八、蜂鸣器和继电器模块原理图
二、模块控制实现过程简述
要控制LED模块,就需要先往74HC138译码器中写入二进制数100(十进制数4),输出就是Y4为低电平,经过一个或非门输出的Y4C就为高电平,再输入74HC573锁存器。再控制LED灯的点亮。
要控制蜂鸣器和继电器模块,就需要先往74HC138译码器中写入二进制数101(十进制数5),输出就是Y5为低电平,经过一个或非门输出的Y5C就为高电平,再输入74HC573锁存器。再控制蜂鸣器和继电器。
三、所要实现的功能
首先让继电器吸合一定时间后关闭,再让蜂鸣器响一定时间后关闭,然后8个LED灯以一秒为间隔闪烁两次。再让继电器吸合一定时间后关闭,让蜂鸣器响一定时间后关闭,然后依次点亮LED灯,再依次熄灭LED灯。程序循环实现上述功能。
四、代码实现
①系统初始化-先关闭蜂鸣器和继电器,否则下载程序之后可能会乱叫
// 关闭蜂鸣器和继电器
void Init_System(void)
{
// 138译码器输出Y5为低电平,则输出的Y5C为高电平,573锁存器正常工作
HC138_C = 1;
HC138_B = 0;
HC138_A = 1;
// 低电平有效
P0 = 0xaf; // 1010 1111 关闭蜂鸣器和继电器
}
②蜂鸣器模块
// 打开蜂鸣器
void Beep_Open(void)
{
// 138译码器输出Y5为低电平,则输出的Y5C为高电平,573锁存器正常工作
HC138_C = 1;
HC138_B = 0;
HC138_A = 1;
// 低电平有效
P0 = 0xef; // 1110 1111 打开蜂鸣器
}
③继电器模块
// 打开继电器
void Relay_Open(void)
{
// 138译码器输出Y5为低电平,则输出的Y5C为高电平,573锁存器正常工作
HC138_C = 1;
HC138_B = 0;
HC138_A = 1;
// 低电平有效
P0 = 0xbf; // 1011 1111 打开继电器
}
④延时函数
void Delay_tms( unsigned int t )
{
int i;
while( t-- )
{
for( i=115 ; i>0 ; i-- )
{
}
}
}
⑤LED灯、蜂鸣器和继电器功能整合
// 工作
void At_Work(void)
{
int i;
Relay_Open(); // 继电器吸合
Delay_tms(500);
Init_System(); // 关
Beep_Open(); // 蜂鸣器响
Delay_tms(500);
Init_System(); // 关
LED_Init();
// 闪两下
for( i=0 ; i<2 ; i++ )
{
P0 = 0x00; // 全部灯亮
Delay_tms( 2000 );
P0 = 0xff; // 全部灯灭
Delay_tms( 2000 );
}
Relay_Open(); // 继电器吸合
Delay_tms( 500 );
Init_System(); // 关
Beep_Open(); // 蜂鸣器响
Delay_tms( 500 );
Init_System(); // 关
LED_Init();
// LED按顺序亮灭
for( i=1 ; i<=8 ; i++ ) // 亮
{
P0 = 0xff << i;
Delay_tms( 250 );
}
for( i=1 ; i<=8 ; i++ ) // 灭
{
P0 = ~( 0xff << i );
Delay_tms( 250 );
}
}
⑥整个函数展示
#include <STC15F2K60S2.H>
#include "Delay_ms.h"
// 引脚定义
sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;
// 关闭蜂鸣器和继电器
void Init_System(void)
{
// 138译码器输出Y5为低电平,则输出的Y5C为高电平,573锁存器正常工作
HC138_C = 1;
HC138_B = 0;
HC138_A = 1;
// 低电平有效
P0 = 0xaf; // 1010 1111 关闭蜂鸣器和继电器
}
// LED灯初始化
void LED_Init(void)
{
// 138译码器输出Y4为低电平,则输出的Y4C为高电平,573锁存器正常工作
HC138_C = 1;
HC138_B = 0;
HC138_A = 0;
}
// 打开蜂鸣器
void Beep_Open(void)
{
// 138译码器输出Y5为低电平,则输出的Y5C为高电平,573锁存器正常工作
HC138_C = 1;
HC138_B = 0;
HC138_A = 1;
// 低电平有效
P0 = 0xef; // 1110 1111 打开蜂鸣器
}
// 打开继电器
void Relay_Open(void)
{
// 138译码器输出Y5为低电平,则输出的Y5C为高电平,573锁存器正常工作
HC138_C = 1;
HC138_B = 0;
HC138_A = 1;
// 低电平有效
P0 = 0xbf; // 1011 1111 打开继电器
}
// 工作
void At_Work(void)
{
int i;
Relay_Open(); // 继电器吸合
Delay_tms(500);
Init_System(); // 关
Beep_Open(); // 蜂鸣器响
Delay_tms(500);
Init_System(); // 关
LED_Init();
// 闪两下
for( i=0 ; i<2 ; i++ )
{
P0 = 0x00; // 全部灯亮
Delay_tms( 2000 );
P0 = 0xff; // 全部灯灭
Delay_tms( 2000 );
}
Relay_Open(); // 继电器吸合
Delay_tms( 500 );
Init_System(); // 关
Beep_Open(); // 蜂鸣器响
Delay_tms( 500 );
Init_System(); // 关
LED_Init();
// LED按顺序亮灭
for( i=1 ; i<=8 ; i++ ) // 亮
{
P0 = 0xff << i;
Delay_tms( 250 );
}
for( i=1 ; i<=8 ; i++ ) // 灭
{
P0 = ~( 0xff << i );
Delay_tms( 250 );
}
}
int main(void)
{
Init_System(); // 系统初始化
while(1)
{
At_Work(); // 工作
}
}