C51-流水灯+蜂鸣器实验程序

C51-流水灯+蜂鸣器实验程序

注意:请结合前面已发布文章一起阅读,因为前面已经提及到的不再重复讲述。

1 项目需求

基于STC89C52单片机,进行蜂鸣器控制实验,并将蜂鸣器加入到上一期中的流水灯实验中,配合流水灯的节奏来发出声音。

2 蜂鸣器

2.1 蜂鸣器介绍

蜂鸣器分为有源蜂鸣器和无源蜂鸣器两种。

  • 有源蜂鸣器
    • 底部封装没有电路板,是使用黑胶封闭的;
    • 有源的“源”是振荡源,指蜂鸣器内部自带振荡源;因此,只要一通电就会发出声音;
    • 因为自带振荡电路,所以价格比无源蜂鸣器高;
    • 程序控制简单、方便。
  • 无源蜂鸣器
    • 底部封装有电路板,不是使用黑胶封闭的;
    • 直流信号无法使无源蜂鸣器发声,必须使用2~5KHz的方波驱动;
    • 因为无自带的振荡电路,所以价格比有源蜂鸣器低;
    • 声音频率可控,可以发出“多来米发梭拉西”的效果。

2.2 硬件原理图分析

蜂鸣器工作电流通常较大,无法通过单片机的I/O口直接驱动,需要通过放大器(即图中Q1-8550三极管)对电流进行放大,以驱动蜂鸣器。

根据电路原理图可知,当单片机P2.3输出低电平时,有源蜂鸣器发出声音;当输出高电平时,蜂鸣器关闭。
在这里插入图片描述

3 项目实施

3.1 代码编写

以下通过3种方式实现了对蜂鸣器的控制,且将蜂鸣器加入到上一期中的流水灯实验中,配合流水灯的节奏来发出声音。

/************************************
功能:(1)蜂鸣器实验;
      (2)且在上期流水灯实验中加入蜂鸣器。

作者:eCoderY  时间:2024.01.20
************************************/

#include <reg52.h>

#define SWITCH_METHOD   (2) /* 1,2,3 */

/* 方式1:寄存器操作打开、关闭蜂鸣器IO口 */
#if(SWITCH_METHOD == 1)
#define ON_BEEZER do{P2 = 0xf7;}while(0);
#define OFF_BEEZER do{P2 = 0xff;}while(0);
#endif
/* 方式2:位操作打开、关闭蜂鸣器IO口 */
#if(SWITCH_METHOD == 2)
#define ON_BEEZER do{P2 &= ~(1 << 3);}while(0);
#define OFF_BEEZER do{P2 |= (1 << 3);}while(0);
#endif

/* 方式3:位寻址打开、关闭蜂鸣器IO口 */
#if(SWITCH_METHOD == 3)
sbit beezer = P2^3;
#define ON_BEEZER do{beezer = 0;}while(0);
#define OFF_BEEZER do{beezer = 1;}while(0);
#endif

/* LED控制 */
#define LED P1 /* 定义LED为P1寄存器 */
#define ON_LED(led, x) do{led &= ~(1 << x);}while(0);
#define OFF_LED(led, x) do{led |= (1 << x);}while(0);

/* ms级软件延时函数 */
void delay_soft_ms(unsigned int ms_time)
{
	unsigned int i = 0, j = 0;
	for(i = ms_time; i > 0; i--)
		for(j = 112; j > 0; j--);
}

/* 上期LED流水灯中加入蜂鸣器,且可控制使用led灯的数量1~8个 */
void led_method2_beezer(unsigned int ms_time, unsigned char ledNum)
{
	unsigned char num = 0;
	
	/* 检查led灯数量是否合法 */
	if(ledNum < 1 || ledNum > 8)
	{
		/* 非法数量输入,灯全亮闪烁+蜂鸣器标识出错警告 */
		while(1)
		{
			ON_BEEZER
			LED = 0x0;
			delay_soft_ms(ms_time);
			LED = 0xff;
			delay_soft_ms(ms_time);
		}
	}
	
	/* 流水灯实现-加入蜂鸣器 */
	while(1)
	{
		for(num = 0; num < ledNum; num++)
		{
			ON_LED(LED, num)
			ON_BEEZER
			delay_soft_ms(ms_time);
			OFF_LED(LED, num)
			OFF_BEEZER
			delay_soft_ms(ms_time);
		}
	}
}

void main(void)
{
	led_method2_beezer(200, 6);
}

3.2 实验现象

通过更改SWITCH_METHOD(1, 2, 3),选择3种不同方式驱动蜂鸣器,然后编译烧录,均能达到对蜂鸣器的控制,加入到上一期流水灯实验中,可以观察效果为:

  • 当输入的加入流水灯的led数量ledNum不合法时,8个led灯闪烁,且蜂鸣器长鸣警告;
  • 当ledNum合法时,流水灯亮时伴随着蜂鸣器响,灯灭时蜂鸣器也停止。

EOF

  • 30
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值