MCU-51:单片机蜂鸣器播放音乐和提示音

目录

  • 一、蜂鸣器介绍
  • 二、驱动电路
    • 2.1 三极管驱动
    • 2.2 集成电路驱动
  • 三、蜂鸣器播放音乐
    • 3.1 键盘与音符对照
    • 3.2 音符与频率对照
    • 3.3 简谱
  • 四、代码演示
    • 4.1 按键蜂鸣器播放提示音
    • 4.2 小星星
  • 注意:一定要看

一、蜂鸣器介绍

蜂鸣器是一种将电信号转换为声音信号的器件,常用来产生设备的按键音、报警音等提示信号
蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器
有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定
无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音

MCU-51:单片机蜂鸣器播放音乐和提示音_第1张图片

二、驱动电路

2.1 三极管驱动

MCU-51:单片机蜂鸣器播放音乐和提示音_第2张图片

2.2 集成电路驱动

MCU-51:单片机蜂鸣器播放音乐和提示音_第3张图片
MCU-51:单片机蜂鸣器播放音乐和提示音_第4张图片

三、蜂鸣器播放音乐

3.1 键盘与音符对照

MCU-51:单片机蜂鸣器播放音乐和提示音_第5张图片

3.2 音符与频率对照

MCU-51:单片机蜂鸣器播放音乐和提示音_第6张图片

3.3 简谱

MCU-51:单片机蜂鸣器播放音乐和提示音_第7张图片

四、代码演示

4.1 按键蜂鸣器播放提示音

main.c

#include 
#include "Delay.h"
#include "key.h"
#include "Nixie.h"
#include "Buzzer.h"


unsigned char KeyNum;

void main()
{
	Nixie(1,0);
	while(1)
	{
		KeyNum=Key();
		if(KeyNum)
		{
			Buzzer_Time(100);
			Nixie(1,KeyNum);
		}
	}
}

Nixie.c

#include 
#include "Delay.h"	//包含Delay头文件

//数码管段码表
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

//数码管显示子函数
void Nixie(unsigned char Location,Number)
{
	switch(Location)		//位码输出
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;
		case 2:P2_4=1;P2_3=1;P2_2=0;break;
		case 3:P2_4=1;P2_3=0;P2_2=1;break;
		case 4:P2_4=1;P2_3=0;P2_2=0;break;
		case 5:P2_4=0;P2_3=1;P2_2=1;break;
		case 6:P2_4=0;P2_3=1;P2_2=0;break;
		case 7:P2_4=0;P2_3=0;P2_2=1;break;
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0=NixieTable[Number];	//段码输出
//	Delay(1);				//显示一段时间
//	P0=0x00;				//段码清0,消影
}

Buzzer.c

#include 
#include 
#include "Delay.h"


//蜂鸣器端口
sbit Buzzer=P2^5;


/**
  * @brief  蜂鸣器私有延时函数,延时500us
  * @param  无
  * @retval 无
  */

void Buzzer_Delay500us()		//@12.000MHz
{
	unsigned char i;

	_nop_();
	i = 247;
	while (--i);
}

/**
  * @brief  蜂鸣器发声
  * @param  ms 发声时长
  * @retval 无
  */

void Buzzer_Time(unsigned int ms)
{
	unsigned int i;
	for(i=0;i<ms*2;i++)
			{
				Buzzer=!Buzzer;
				Buzzer_Delay500us();
			}
}


Buzzer.h

#ifndef __BUZZER_H__
#define __BUZZER_H__

void Buzzer_Time(unsigned int ms);

#endif

Nixie.h

#ifndef __NIXIE_H__
#define __NIXIE_H__

void Nixie(unsigned char Location,Number);

#endif

key.c

#include 
#include "Delay.h"

unsigned char Key()
{
	unsigned char KeyNumber=0;
	if(P3_1==0)
	{
		Delay(20);while(P2_1==0);Delay(20);KeyNumber=1;
	}
  if(P3_0==0)
	{
		Delay(20);while(P2_0==0);Delay(20);KeyNumber=2;
	}
	if(P3_2==0)
	{
		Delay(20);while(P2_2==0);Delay(20);KeyNumber=3;
	}
	if(P3_3==0)
	{
		Delay(20);while(P2_3==0);Delay(20);KeyNumber=4;
	}
		
	return KeyNumber;
	
}

key.h

#ifndef __KEY_H__
#define __KEY_H__

unsigned char Key();

#endif

Delay.c


void Delay(unsigned int i)
{
	while(i--);
}

Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int i);

#endif

4.2 小星星

#include 
#include "Delay.h"
#include "Timer0.h"

//蜂鸣器端口定义
sbit Buzzer=P2^5;

//播放速度,值为四分音符的时长(ms)
#define SPEED	50


//索引与频率对照表
unsigned int FreqTable[]={
	0,
	63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528,
	64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,
	65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283,
};

//乐谱
unsigned char  Music[]={
	13,4,
	14,4,
	20,4,
	20,4,
	22,4,
	22,4,
	20,4+4,
	0,4,
	18,4,
	18,4,
	17,4,
	17,4,
	15,4,
	15,4,
	13,4+4,
	
	0xFF,
};

unsigned char FreqSelect,MusicSelect;

void main()
{
	Timer0_Init();
	while(1)
	{
		if(Music[MusicSelect]!=0xFF)	//如果不是停止标志位
		{
			FreqSelect=Music[MusicSelect];	//选择音符对应的频率
			MusicSelect++;
			Delay(SPEED/4*Music[MusicSelect]);	//选择音符对应的时值
			MusicSelect++;
			TR0=0;
			Delay(5);	//音符间短暂停顿
			TR0=1;
		}
		else	//如果是停止标志位
		{
			TR0=0;
			while(1);
		}
	}
}

void Timer0_Routine() interrupt 1
{
	if(FreqTable[FreqSelect])	//如果不是休止符
	{
		/*取对应频率值的重装载值到定时器*/
		TL0 = FreqTable[FreqSelect]%256;		//设置定时初值
		TH0 = FreqTable[FreqSelect]/256;		//设置定时初值
		Buzzer=!Buzzer;	//翻转蜂鸣器IO口
	}
}

注意:一定要看

千万不要直接复制代码,因为是模块化编写,模块的代码没有往上复制,大家一定要自己动手跟着教学视屏自己写!!!!!

你可能感兴趣的:(51单片机学习,单片机,嵌入式硬件,51单片机,c语言)