51单片机STC89C52RC——11.1 蜂鸣器播放音乐

目录

目的/效果

一,STC单片机模块

二,蜂鸣器

 2.1 介绍

2.2 板子位置+电路图

2.3 发声原理

2.4 音符和频率

三,创建Keil项目

四,代码 

4.1 乐谱代码

4.1.1 《义勇军进行曲》

 4.1.2 《天空之城》

4.1.3 《小美满》 

4.1.4 《兰花草》

4.1.5 《救护车》

4.1.6 《消防车》

乐谱待优化点

 4.2 蜂鸣器播放的音乐代码

五,代码编译、下载到51单片机


目的/效果

1:让蜂鸣器响起来

2:蜂鸣器播放音乐(《义勇军进行曲》《天空之城》《小美满》《兰花草》等) 

一,STC单片机模块

二,蜂鸣器

2.1 介绍

蜂鸣器是一种将电信号转换为声音信号的器件,常用来产生设备的按键音、报警音等提示信号

蜂鸣器按驱动方式可分为有源蜂鸣器无源蜂鸣器。

有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定

无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音(本节内容全部基于无源蜂鸣器)

2.2 板子位置+电路图

2.3 发声原理

翻转蜂鸣器的IO口,

    while(1){
        P2_5=!P2_5;//翻转蜂鸣器端口
    }

上面这段代码 执行时,可能听不到声音。

根据人耳朵的听力范围20-20000Hz

那么我们延时周期时长范围为

12000000/12/20000=50us,(最高频率时间间隔)

12000000/12/20=50000us=50ms (最低频率时间间隔)


/**
 * 函    数:主函数
 * 参    数:无
 * 返 回 值:无
 */
void main()
{
	while(1){
		Delay_ms(2);//延时2毫秒【1秒钟翻转500次,相当于500Hz】
		P2_5=!P2_5;//翻转蜂鸣器端口
	}
}

2.4 音符和频率

标准的A的频率为440(每秒440次),相邻两个半音之间的比值是\sqrt[12]{2},所以我们根据标准音去计算其他音的频率,如下表

音符 频率/Hz(计算值,保留小数) 频率/Hz(每秒震动次数 取整)
低音1 411.5292003 412
低音1# 436 436
低音2 412.4730746 412
低音2# 437 437
低音3 413.416949 413
低音4 438 438
低音4# 414.3608233 414
低音5 439 439
低音5# 415.3046976 415
低音6(标准) 440 440
低音6# 466.1637615 466
低音7 493.8833013 494
中音1 523.2511306 523
中音1# 554.365262 554
中音2 587.3295358 587
中音2# 622.2539674 622
中音3 659.2551138 659
中音4 698.4564629 698
中音4# 739.9888454 740
中音5 783.990872 784
中音5# 830.6093952 831
中音6 880 880
中音6# 932.327523 932
中音7 987.7666025 988
高音1 1046.502261 1047
高音1# 1108.730524 1109
高音2 1174.659072 1175
高音2# 1244.507935 1245
我可以为您提供一个简单的c51单片机蜂鸣器歌曲示例程序,您可以根据需要进行修改。 ```c #include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit beep=P1^5; //定义蜂鸣器控制引脚 //定义简单的音符和节拍 uchar code song[]={ 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x01, //音符 0x01,0x02,0x03,0x04,0x04,0x05,0x06,0x01, //音符 0x03,0x03,0x04,0x05,0x06,0x06,0x07,0x01, //音符 0x05,0x06,0x07,0x01,0x02,0x03,0x02,0x01, //音符 0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04, //音符 0x05,0x05,0x06,0x06,0x07,0x07,0x01,0x01, //音符 0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05, //音符 0x06,0x06,0x07,0x07,0x01,0x01,0x02,0x02, //音符 0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06, //音符 0x07,0x07,0x01,0x01,0x02,0x02,0x03,0x03, //音符 0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07, //音符 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, //音符 }; uchar code time[]={ 1,1,1,1,1,1,2,1, //节拍 1,1,1,1,1,1,2,1, //节拍 1,1,1,1,1,1,2,1, //节拍 1,1,1,1,1,1,2,1, //节拍 1,1,1,1,1,1,1,1, //节拍 1,1,1,1,1,1,2,1, //节拍 1,1,1,1,1,1,1,1, //节拍 1,1,1,1,1,1,2,1, //节拍 1,1,1,1,1,1,1,1, //节拍 1,1,1,1,1,1,2,1, //节拍 1,1,1,1,1,1,1,1, //节拍 1,1,1,1,1,1,1,1, //节拍 }; void delay(uint z) //延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void main() { uchar i,j; while(1) { for(i=0;i<72;i++) //循环播放歌曲 { for(j=0;j<time[i];j++) //根据节拍播放音符 { beep=0; delay(song[i]*10); beep=1; delay(1); } delay(10); //每个音符之间的间隔 } } } ``` 这个示例程序使用了一个简单的歌曲,可以通过修改 `song[]` 和 `time[]` 数组来播放不同的歌曲。同时,根据需要还可以修改每个音符的持续时间和间隔时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值