蓝桥杯单片机比赛学习:2、蜂鸣器和继电器的使用和基本原理

本节是接着上节讲的,可以先看本节,如果不懂可以去蓝桥杯单片机比赛学习:1、led点亮原理_Do My Best的博客-优快云博客

看一下基本原理。 也可以去我的主页看一下整个蓝桥杯的章节Do My Best的博客_优快云博客-蓝桥杯单片机比赛学习,sim800c模块领域博主

蜂鸣器和继电器的基本原理:

如图1,图2为继电器的部分电路图,图1中的m2连接图2中的m2,当继电器吸合时GND、K1、m2、L10、VCC组成完整电路使得继电器LED点亮。那什么时候吸合呢?图2中的RELAY-SPDT是一个有磁性的线圈,当N_RELAY为低电平0的时候组成完整的电路使线圈有磁性,从而吸合继电器。

图1 继电器部分电路图
图2 继电器部分电路图

如图3所示,为蜂鸣器的部分电路图 ,当图中的N_BUZZ为低电平时,蜂鸣器发出响声。

图3 蜂鸣器部分电路图

 上面图2中的N_RELAY和图3中的N_BUZZ连接图4中的ULN2003达林顿管,可能你这里不理解ULN2003,我们也不需要详细理解,我们只需要知道这里是取反的作用(输入1输出0或者输入0输出1)。(图5是达林顿管的内部电路图,它的内部是由多个非门组成的电路)。接着向前是一个573锁存器,只要LE(Y5C)为高电平1锁存器导通,此处就不再详细讲如有不懂请去上一节蓝桥杯单片机比赛学习:1、led点亮原理_Do My Best的博客-优快云博客

 

图4
图5 达林顿管内部电路图

 J13中的WR为低电平0,要使Y5C为高电平1则Y5为低电平0。Y5与图7中的138译码器的输出端相连,要使Y5为低电平0就要选中Y5,则输入P27/P26/P25就要为101。到此整个继电器和蜂鸣器的原理到此结束,下面按上述原理写代码。

图6 或非门
图7 74HC138译码器

 代码实现:

 实现每500ms LED闪烁3下、继电器吸合三下、蜂鸣器响三下 循环,此处代码注释很重要!

 

#include "stc15f2k60s2.h"

/* 选择通道并且输入数据 */
void slect_138_573(unsigned char channel, unsigned char dat)
{
	P0 = 0x00;									    /* 将原来P0口中的数据清0 */
	P0 = dat;										/* 这里用P0而不用其他端口是因为我们操作LED、数码管、继电器、蜂鸣器都是对P0进行操作 */
	switch(channel)							        /* 选择通道 */
	{
		case 4:										/* 使Y4输出低电平0,也就是操作LED */
			P2 = (P2 & 0x1f) | 0x80;                /* (P2 & 0x1f)就是将前3位清0,再操作前3位。将0x80转为2进制1000 0000,这里只看前3位100就是Y4 */
		break;
		case 5:										/* 使Y5输出低电平0,也就是操作继电器和蜂鸣器 */
			P2 = (P2 & 0x1f) | 0xa0;
		break;
		case 6:										/* 使Y6输出低电平0,也就是操作8个数码管 */
			P2 = (P2 & 0x1f) | 0xc0;
		break;
		case 7:										/* 使Y7输出低电平0,也就是操作8个数码管中的1个数码管显示值 */
			P2 = (P2 & 0x1f) | 0xe0;
		break;
		case 0:										/* 关闭所有通道 */
			P2 = (P2 & 0x1f) | 0x00;
		break;
	}
	P2 = (P2 & 0x1f) | 0x00;		                /* 使用后,关闭所有通道 */
	
}

void Delay1ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 12;
	j = 169;
	do
	{
		while (--j);
	} while (--i);
}

void delay(int time)
{
	while(time--)
	{
		Delay1ms();
	}
}

void summing(void)				
{
	char i;
 
	/* LED闪烁三次 */
	for(i=0;i<3;i++)
	{
		slect_138_573(4, 0x00);	//打开LED灯
		delay(500);
		slect_138_573(4, 0xff);	//关闭LED灯
		delay(500);
	}
	
	/* 继电器吸合三次 */
	for(i=0;i<3;i++)
	{
		
		slect_138_573(5, 0x10);			//打开继电器  P0^4==0x10(0001 0000)
		delay(500);
		slect_138_573(5, 0xaf);			//关闭继电器和蜂鸣器(必须同时关掉,会相互影响)0xaf(1010 1111),P0端口其它位不变,只将P0^4清0、P0^6清0
		delay(500);
	}
	
	/* 蜂鸣器闪烁三次 */
	for(i=0;i<3;i++)
	{
		slect_138_573(5, 0x40);			//打开蜂鸣器  P0^6==0x40(0100 0000)
		delay(500);
		slect_138_573(5, 0xaf);			//关闭继电器和蜂鸣器(必须同时关掉,会相互影响)      
		delay(500);
	}
	
}


void main()
{
	slect_138_573(0,0x00);
	while(1)
	{
		summing();
	}
}

 扩展知识——位操作 很重要!!!

1.把变量的某位清零

把变量a 的某一位清零,且其它位不变。

若设 a=1111 1111,进行如下操作

a &= ~(1<<3)

则a = 1111 0111
a 的 bit3 位被置零,而其它位不变

2.把变量的某几个连续位清零

把变量a 的某几个连续位清零,且其它位不变。

若设 a=1111 1111,进行如下操作

连续两位清0:a &= ~(3<<3)    3在2进制中就是11,则a = 1110 0111

a 的 bit3、bit4 位被置零,而其它位不变

连续三位清0:a &= ~(7<<3)    7在2进制中就是111,则a = 1100 0111

a 的 bit3、bit4、bit5 位被置零,而其它位不变

....

3.对变量的某几位进行赋值

把变量a 的某几位赋值,且其它位不变。

若设 a=0000 0000,进行如下操作

例1:a |= (1<<3)  则a = 0000 1000
a 的 bit3 位被置1,而其它位不变

例2:a |= 0x55  则a = 0101 0101

a 的 bit0、bit2、bit4、bit6 位被置1,而其它位不变

4.对变量的某位取反

某个位进行取反操作,即 1 变 0 , 0 变 1,这可以直接用如下操作,其它位不变。

若设 a=0000 0000,进行如下操作
a ^=(1<<3)   则a = 0000 1000

a 的 bit3 位取反,而其它位不变

后续模块更新中。。。

<think>好的,用户想了解蓝桥杯比赛中如何配置蜂鸣器继电器的开启方法。首先,我需要回忆相关的知识点。根据引用[1]到[3],蜂鸣器继电器蓝桥杯单片机中都是通过Y5C锁存器的P0口控制的。记得引用[2]提到,虽然它们都是低电平工作,但因为反相器的存在,实际需要给高电平来开启。 接下来要确定硬件连接。引用[3]指出继电器由P0^4控制,而蜂鸣器可能由另一个端口控制,比如P0^5或者P0^6,需要具体看原理图。不过蓝桥杯常见的配置可能不同,可能需要确认。 然后是配置步骤。首先需要打开Y5C锁存器,这样才能操作P0口的状态。根据引用[1],锁存器的操作涉及地址选择,比如Y5C对应的地址可能是0xA0或0x8FFF等,但具体地址可能需要根据比赛提供的原理图确定。通常使用特定的函数来操作,比如设置P2的高两位,再写入P0的数据。 另外,引用[2]提到赋1开启,因为反相器的存在。所以当需要开启继电器时,设置对应P0口为高电平,比如P04=1;蜂鸣器同理,比如P06=1。需要注意在操作前关闭其他锁存器,避免冲突。 可能还需要考虑初始化设置,比如关闭所有外设,初始状态为低电平。同时,代码中可能需要包含头文件,如reg52.h,以及使用sbit定义相关引脚。 用户可能需要具体的代码示例,比如如何同时开启继电器蜂鸣器,或者单独控制。此外,可能需要注意操作顺序,先选择锁存器,再设置P0口,最后关闭锁存器。 最后,常见问题比如外设不工作,可能是锁存器未正确选择,或者电平设置错误。需要提醒用户检查硬件连接代码中的地址是否正确,以及是否使用了反相器的逻辑。</think>在蓝桥杯单片机开发中,蜂鸣器继电器的配置方法如下: ### 一、硬件控制原理 1. 两者共用**Y5C锁存器**的P0端口控制[^1] 2. 继电器由$P0^4$控制,蜂鸣器由$P0^6$控制[^3] 3. 通过反相器连接,**高电平有效**(代码写1时开启)[^2] ### 二、配置步骤 1. **选择Y5C通道** ```c P2 = (P2 & 0x1F) | 0xA0; // 打开Y5C锁存器 ``` 2. **设置P0端口状态** ```c P0 = 0x50; // 二进制01010000,同时开启继电器蜂鸣器(P0^4=1,P0^6=1) ``` 3. **关闭锁存器** ```c P2 &= 0x1F; // 关闭Y5C锁存器 ``` ### 三、独立控制函数示例 ```c void Buzzer_Relay_Control(bit relay, bit buzzer) { P2 = (P2 & 0x1F) | 0xA0; // 开启Y5C P0 = (relay << 4) | (buzzer << 6); // 位运算生成控制信号 P2 &= 0x1F; // 关闭Y5C } ``` 调用方式: ```c Buzzer_Relay_Control(1, 1); // 同时开启继电器蜂鸣器 Buzzer_Relay_Control(1, 0); // 仅开启继电器 Buzzer_Relay_Control(0, 0); // 关闭所有 ``` ### 四、注意事项 1. 操作前需关闭其他锁存器,避免信号干扰[^1] 2. 继电器状态变化时会产生电磁干扰,建议在关键代码段关闭继电器 3. 蜂鸣器持续发声需配定时器实现频率控制
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Do My Best

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值