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合法时,流水灯亮时伴随着蜂鸣器响,灯灭时蜂鸣器也停止。