理论知识部分和模块构建:

继电器的作用:

继电器是一个电控开关,相当于一个用小电流控制大电流的电子开关

主要功能:

  1. 控制高电压/大电流设备

    • 控制220V交流电(如电灯、风扇、电机)

    • 控制大功率设备(如水泵、加热器)

  2. 电气隔离

    • 将单片机低压部分(5V/3.3V)与外部高压部分隔离开

    • 保护单片机不受高压损坏

蜂鸣器的作用

蜂鸣器是一个发声器件,用于发出提示音或报警声。

主要功能:

  1. 声音提示

    • 按键按下提示音

    • 操作成功/失败提示

  2. 报警功能

    • 温度超限报警

    • 设备故障报警

    • 安防入侵报警

方面 继电器 蜂鸣器
干什么 控制外部设备通断 发出声音提示/报警
关系 执行器(动手) 提示器(动口)
配合 继电器执行动作时,蜂鸣器提示状态变化
比喻 像电工,负责开关电源 像门铃,负责提醒通知

简单来说:继电器负责"做事"(控制设备),蜂鸣器负责"说话"(发出提示)。在实际项目中,它们常常配合使用:蜂鸣器提示"我要开始工作了",继电器执行"打开设备"的动作。

继电器和蜂鸣器的工作原理:

蜂鸣器和继电器在这里的跳线帽上控制开关(J6),他们是在同一个跳线帽的,证明了他们有一点的联系。

内部结构梳理和联系:

DIODE的作用:保护电路

当N RELAY由低电平转换成高电平的时候,线圈产生感生电动势,电流就会强加在电路上对电路进行损坏,此时并联一个二极管,通过DIODE回到VCC形成一个回路,让电流慢慢的释放。(我是这样来理解的)

继电器内部结构的扩展:

右图是继电器结构的扩展,看到了蜂鸣器和继电器他们有一个共同的端口——VB,他们就是通过这个端口相互配合的。当J6开关2、3相连,那么此时VB是接到了高电平(VCC),此时继电器就会和上图所说的一样看N_RELAY情况工作。

L10的作用:

当线圈有磁性的时候(K1往下跳),此时就是继电器工作的时候,L10就会亮起来,所以他是用来检测继电器是否有工作的。

位置如图:

蜂鸣器和继电器的信息流情况:

如图可知,他和我们LED点亮的原理是大差不差的,关键在于一个设备——ULN2003

ULN2003的作用:改变电流的强度和取反

因为蜂鸣器和继电器启动所需要的电流是远远大于二极管所需要的电流的,又因为74HC573锁存器输出的电流是没有这么强的,如果通过74HC573直接接通到N_BUZZ是不够的,这样还可能会对芯片造成损害。

从图我们可以看到,ULN2003是有一个自己独立的电源的VCC,通过这个电源增强电流的强度。

同时ULN2003还是一个非门。如果1B输出低电平那么1C对应取反输出高电平。

总结:

我们要开启蜂鸣器就要N_BUZZ为低电平那么就是要让P06输出高电平即可

同理的我们让N_RELAY是低电平那么就让P04输出高电平即可。

实践部分:

main.c

#include "STC15F2K60S2.H"
#include "init.h"
#include "peripheral.h"

void main()
{
	Cls_Peripheral();//清除外设
	
	Set_Peripheral(0,1);//关键
	while(1)
	{
	
	}
}

关键部分:peripheral.c

peripheral.c

#include "peripheral.h"

void Set_Peripheral(unsigned char Buzzer_Status, unsigned char Relay_Status)
{
	unsigned char Peripheral_Val = 0x00;// 初始化//0000 0000 |  0001 0000
	
	if(Buzzer_Status == 1)//蜂鸣器部分
	{
		Peripheral_Val |= 0x40;//0100 0000(位6是1)对应上图的P06=1(高电平),启动蜂鸣器
	}
	
	if(Relay_Status == 1)//继电器部分
	{
		Peripheral_Val |= 0x10;//0001 0000 (位4是1),对应图上P04(高电平),启动继电器
	}
	
	P0 = Peripheral_Val;//存到P0,如上面两个都成立就是 0101 0000(蜂鸣器和继电器都启动)
	P2 = P2 & 0x1F | 0xA0;//锁存到锁存器内,Y5C有关,1010 0000(0xA0)
	P2 &= 0x1F;//高三位置为0
}

//

注意:

    if(Buzzer_Status == 1)//蜂鸣器部分
	{
		Peripheral_Val = 0x40;//0100 0000(位6是1)对应上图的P06=1(高电平),启动蜂鸣器
	}
	
	if(Relay_Status == 1)//继电器部分
	{
		Peripheral_Val = 0x10;//0001 0000 (位4是1),对应图上P04(高电平),启动继电器
	}
	

注意:

这个部分为什么不能这样写:(没有|符号):

假如Buzzer_Status和Relay_Status==1,

那么的话,Peripheral_Val=0100 0000;

接下来就是,Peripheral_Val = 0001 0000,之前Buzzer_Status成立的那个位置的1就被覆盖掉了,执行到了P0 = Peripheral_Val这个代码的时候,只有继电器那个部分启动了,就与预期不符了。

最后部分:peripheral.c

#include "STC15F2K60S2.H"

void Set_Peripheral(unsigned char Buzzer_Status, unsigned char Relay_Status);

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐