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

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

看一下基本原理。 也可以去我的主页看一下整个蓝桥杯的章节Do My Best的博客_CSDN博客-蓝桥杯单片机比赛学习,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的博客-CSDN博客

 

图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 位取反,而其它位不变

后续模块更新中。。。

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
蜂鸣器是一种常见的声音输出设备,用于发出蜂鸣声。根据提供的引用内容,蜂鸣器的原理图和代码可以如下给出: 原理图: 根据引用中的描述,蜂鸣器的控制电路包括有源蜂鸣器和无源蜂鸣器两种。对于51单片机,一般使用有源蜂鸣器。有源蜂鸣器需要通过高低电平来控制,类似于LED的控制方式。 代码: 根据引用中提供的示例代码,以下是一个简单的51单片机控制有源蜂鸣器的示例代码: #include <reg52.h> #define ON 0 #define OFF 1 sbit BUZZER = P0^7; void delay_ms(unsigned int nms) { unsigned int i,j; for(i=nms;i>0;i--) for(j=113;j>0;j--); } void main() { BUZZER = ON; // 打开蜂鸣器 delay_ms(200); // 延时200ms BUZZER = OFF; // 关闭蜂鸣器 delay_ms(200); // 延时200ms while(1); } 这段代码使用了P0口的第7位(即P0^7)来控制蜂鸣器的开关。通过将BUZZER变量赋值为ON或OFF来打开或关闭蜂鸣器,然后使用delay_ms函数来进行延时控制。 请注意,以上代码仅为示例,实际使用时需要根据具体的硬件接口和需求进行相应的修改。同时,如果你想在Proteus上进行仿真,蜂鸣器的响应控制可能无法直接模拟,你可能需要使用开发板进行蜂鸣器的实际测试。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [51单片机学习笔记4 -- 蜂鸣器控制](https://blog.csdn.net/qq_36955622/article/details/122404512)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Do My Best

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

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

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

打赏作者

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

抵扣说明:

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

余额充值