蜂鸣器歌唱原理以及代码

合集下载

单片机蜂鸣器唱歌程序(二)2024

单片机蜂鸣器唱歌程序(二)2024

单片机蜂鸣器唱歌程序(二)引言概述:本文档主要介绍了单片机蜂鸣器唱歌程序(二),包括使用单片机控制蜂鸣器发出不同音乐的方法和具体实现步骤。

本文将从五个大点进行阐述,每个大点包含5-9个小点,以便读者更好地理解和实践。

正文:一、引脚连接设置1. 确定单片机的输出引脚和蜂鸣器的输入引脚2. 将单片机的输出引脚与蜂鸣器的输入引脚连接3. 确保连接的稳定性和正确性4. 利用电路图进行布线二、编程环境配置1. 安装适合单片机的编程软件2. 创建新的项目3. 配置单片机的型号及选项4. 导入相关的库文件5. 编写代码框架三、发声原理及代码实现1. 理解蜂鸣器工作原理2. 使用单片机的PWM输出功能控制蜂鸣器的频率3. 利用PWM输出的方式实现不同音调的发声4. 编写音调转换函数5. 编写歌曲的音乐片段代码四、优化和调试1. 测试不同频率的声音2. 调整蜂鸣器的音量3. 避免噪音的干扰4. 检查代码的正确性和合理性5. 不断尝试,优化代码和音效五、实验结果及总结1. 运行程序,测试蜂鸣器的唱歌效果2. 记录实验结果和观察结果3. 分析实验过程中遇到的问题和解决方法4. 总结实验经验和注意事项5. 展望将来的改进和研究方向总结:本文详细介绍了单片机蜂鸣器唱歌程序(二)的实现方法和步骤。

通过连接设置、编程环境配置、发声原理及代码实现、优化和调试、实验结果及总结等五个大点的阐述,读者可以深入了解单片机控制蜂鸣器发声的原理和方法,并通过实验得到具体的唱歌效果。

同时,读者在实践过程中也要注意优化和调试,不断尝试和改进,以实现更好的音效效果。

希望本文对读者有所帮助,为单片机蜂鸣器唱歌程序的开发提供了指导和参考。

单片机蜂鸣器工作原理单片机驱动蜂鸣器原理与编程

单片机蜂鸣器工作原理单片机驱动蜂鸣器原理与编程

单片机蜂鸣器工作原理单片机驱动蜂鸣器原理与编程蜂鸣器是一种一体化结构的电子讯响器,本文介绍如何用单片机驱动蜂鸣器,他广泛应用于计算机、打印机、复印机、报警器、电话机等电子产品中作发声器件。

蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。

电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。

接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。

压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。

多谐振荡器由晶体管或集成电路构成,当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。

下面是电电磁式蜂鸣器实物图:磁式蜂鸣器的外形图片及结构图。

电磁式蜂鸣器结构示意图:图1电磁式蜂鸣器内部构成:1.防水贴纸2.线轴3.线圈4.磁铁图25.6.7.8.底座引脚外壳铁芯9.封胶10.小铁片11.振动膜12.电路板一、电磁式蜂鸣器驱动原理蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。

S51增强型单片机实验板通过一个三极管C8550来放大驱动蜂鸣器,原理图见下面图3:S51增强型单片机实验板蜂鸣器驱动原理图:图3如图所示,蜂鸣器的正极接到VCC(+5V)电源上面,蜂鸣器的负极接到三极管的发射极E,三极管的基级B经过限流电阻R1后由单片机的P3.7引脚控制,当P3.7输出高电平时,三极管T1截止,没有电流流过线圈,蜂鸣器不发声;当P3.7输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。

因此,我们可以通过程序控制P3.7脚的电平来使蜂鸣器发出声音和关闭。

程序中改变单片机P3.7引脚输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。

单片机蜂鸣器发声代码

单片机蜂鸣器发声代码

单片机蜂鸣器发声代码蜂鸣器是一种常见的电子元件,可以发出短促的蜂鸣声用于提醒或警示。

在单片机应用中,蜂鸣器可以用来作为声音提示的一种方式。

下面介绍一段单片机蜂鸣器的发声代码。

1. 引脚连接在使用单片机控制蜂鸣器发声之前,需要将蜂鸣器与单片机的引脚连接。

通常情况下,蜂鸣器有两个引脚,其中一个为正极,一个为负极。

将蜂鸣器的正极连接到单片机的一个IO口上,将负极连接到单片机的GND上。

2. 代码实现单片机发出频率为f的声音,需要将IO口以1/f的频率高低电平切换。

以下是一个基本的单片机蜂鸣器发声代码:#include 'reg51.h' //单片机头文件#define BEEP P1_5 //定义蜂鸣器连接的IO口void Delay(unsigned int Time) //延时函数{unsigned int i,j;for(i=Time;i>0;i--)for(j=110;j>0;j--);}void Beep(unsigned int Time) //发出一次蜂鸣声{BEEP = 0; //使IO口输出低电平Delay(Time); //延时BEEP = 1; //使IO口输出高电平Delay(Time); //延时}void main(void){while(1){Beep(100); //发出100ms的蜂鸣声}}在上述代码中,我们首先定义了蜂鸣器连接的IO口为P1_5,然后定义了一个延时函数Delay和一个发出蜂鸣声函数Beep。

Delay函数用于延时,Beep函数用于发出一次蜂鸣声。

在main函数中,我们使用一个while循环不停地发出蜂鸣声。

在Beep函数中,我们首先使IO口输出低电平,然后延时一段时间,再使IO口输出高电平,再延时一段时间,从而在IO口上形成一个频率为1/(2*Time)的方波信号,从而发出蜂鸣声。

3. 修改参数如果我们想要修改蜂鸣器发出的声音的频率和时长,只需要在Beep函数中修改Time的值即可。

单片机蜂鸣器音乐

单片机蜂鸣器音乐

单片机蜂鸣器音乐单片机在我们的生活中无处不在,它被广泛地应用在各种电子产品中,为我们的生活带来了便利。

今天,我要向大家介绍的是一种基于单片机的蜂鸣器音乐播放器。

一、硬件部分1、单片机:我们选用的是AT89C51单片机,它具有低功耗、高性能的特点,非常适合用于音乐播放器。

2、蜂鸣器:蜂鸣器是用来发出声音的,我们将其连接在单片机的输出口上。

3、存储芯片:为了能够播放存储在芯片中的音乐,我们需要将音乐以某种格式存储在芯片中。

常用的存储芯片有EEPROM和Flash芯片。

4、按键:为了能够选择播放不同的音乐,我们需要添加一个按键。

二、软件部分1、音乐编码:我们需要将音乐转换成二进制编码,这样才能被单片机读取并播放。

常用的音乐编码格式有MIDI、WAV等。

2、音乐播放:当按下按键时,单片机读取存储芯片中的音乐数据,并通过蜂鸣器播放。

3、音乐选择:通过按键可以选择不同的音乐进行播放。

4、音量控制:我们可以通过编程来控制蜂鸣器的音量大小。

三、调试与测试1、硬件调试:检查连接是否正确,确保没有短路或断路的情况。

2、软件调试:将程序下载到单片机中进行调试,确保能够正常播放音乐。

3、综合测试:将所有硬件和软件都连接起来进行测试,确保能够正常工作。

四、总结与展望通过本次实验,我们成功地制作了一个基于单片机的蜂鸣器音乐播放器。

它具有简单、实用的特点,可以用来播放存储在芯片中的音乐。

未来,我们可以进一步扩展其功能,例如添加更多的按键来选择不同的音乐、添加显示屏来显示歌曲名称等。

我们也可以将其应用到其他领域,例如智能家居、智能安防等。

单片机蜂鸣器唱歌程序在许多应用中,单片机蜂鸣器经常被用来发出声音或音乐。

下面是一个使用单片机蜂鸣器唱歌的程序示例。

我们需要确定单片机和蜂鸣器的连接方式。

通常,单片机具有一个内置的蜂鸣器输出引脚,可以将蜂鸣器连接到这个引脚上。

在以下的示例中,我们将假设单片机具有一个内置蜂鸣器输出引脚,并将其连接到P1.0端口上。

单片机蜂鸣器工作原理

单片机蜂鸣器工作原理

单片机蜂鸣器工作原理单片机蜂鸣器是一种输出音频信号的装置,通过产生声波来传递信息或提示用户。

本文将介绍单片机蜂鸣器的工作原理。

第一步:硬件接线单片机蜂鸣器通常接在单片机的I/O口上,需要使用I/O口的电压信号作为输入。

因此,需要将蜂鸣器的一端连接到I/O口的输出端,另一端连接到单片机的地线上。

这样,当单片机给出高电平信号时,蜂鸣器就会发出声音。

第二步:软件编程单片机蜂鸣器的工作需要在软件层面进行控制。

通过对I/O口的输出信号进行控制,就可以实现蜂鸣器的开关和控制声音的频率和持续时间。

在编写代码时,需要指定需要操控的I/O口和配置相应的寄存器。

这些寄存器通常包括模式寄存器、数据寄存器等。

模式寄存器用于选择输入/输出模式、开启/关闭中断等。

数据寄存器则用于存储实际的输入/输出数据。

第三步:控制声音的频率和持续时间通过改变I/O口输出信号的频率,可以控制蜂鸣器发出不同的音高。

通常,每一个频率会对应一种音高,因此需要根据所需的频率计算每个周期的时间间隔,并设置定时器,定时器可以使用单片机内部的计数器或者外部的晶振控制。

此外,还需要指定蜂鸣器的持续时间。

通过控制输出信号的时间,来控制蜂鸣器的响停时间。

这通常由计数器或定时器来实现。

第四步:运行程序编写好控制蜂鸣器的代码后,可以使用单片机的开发环境将程序下载到单片机上,并连接蜂鸣器进行测试。

在程序正常运行时,蜂鸣器会发出相应的声音,以示提醒或提示。

总结:单片机蜂鸣器的工作原理包括硬件接线和软件编程两个部分,需要指定I/O口、控制信号的频率和持续时间。

在编写代码后,可以将程序下载到单片机上测试运行。

掌握单片机蜂鸣器的工作原理可以为使用单片机开发提供便利。

单片机蜂鸣器发声代码

单片机蜂鸣器发声代码

单片机蜂鸣器发声代码
单片机蜂鸣器是单片机开发中经常使用的一种输出设备,在很多作品中都发挥着很重要的作用。

本文将介绍如何通过单片机控制蜂鸣器发出不同频率的声音。

一、硬件设计
我们需要使用一个蜂鸣器和一块单片机开发板,比如STC89C52。

蜂鸣器有正负两个针脚,需要将正极接到控制单片机的GPIO端口上,负极接地即可。

1. 预处理指令
首先需要在头文件中定义单片机的型号和所要使用的GPIO端口。

```
#include <STC89C5xRC.H> //使用STC89C52
#define buzz P2 //定义蜂鸣器控制口
```
2. 主函数
接下来就是核心部分,主函数中需要实现的就是通过改变GPIO口的电平来控制蜂鸣器发出不同频率的声音。

对于控制蜂鸣器发出持久的“滴滴声”,可以采用下面的程序:
程序中先将GPIO口输出低电平,等待一段时间后再输出高电平,蜂鸣器发出持续的“滴滴声”。

如果想控制蜂鸣器发出不同频率的声音,可以修改上述程序中的DelayMs()函数来设置不同的延时时间。

因为蜂鸣器的振动频率与输入信号的高低电平时间比例有关,所以延时时间变化会使输出的声音频率发生变化。

比如,如果想让蜂鸣器发出音调为“咳咳声”,可以改变延时时间来实现。

如此,蜂鸣器就发出了“咳咳声”。

以上就是单片机蜂鸣器发声的基本方法,不同的延时时间可以产生不同的声音效果,可以根据实际需要进行调整。

蜂鸣器唱歌程序

蜂鸣器唱歌程序

蜂鸣器唱歌----世上只有妈妈好#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit sound=P2^0;uint counter=0;uchar code FREQH[3][8]= //音符定时器初值,三个8度音的高八位{//注意每行起始都为0xff,因为音调中没有0 这个音,所以随便填了个数字,后面不不会引用它// 低音:// 1 2 3 4 5 6 7{0xff,0xf9, 0xfa, 0xfa, 0xfb, 0xfb, 0xfc, 0xfc},//中音://1 2 3 4 5 6 7{0xff,0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe},//高音://1 2 3 4 5 6 7{0xff,0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0x00}//0x00};uchar code FREQL[3][8]= //音符定时器初值,三个8度音的低八位{// 低音:// 1 2 3 4 5 6 7{0xff,0x5b, 0x15, 0xb9, 0x04, 0x90, 0x0c, 0x79},//中音:// 1 2 3 4 5 6 7{0xff,0xac, 0x09, 0x5c, 0x82, 0xc8, 0x05, 0x3c},//高音://1 2 3 4 5 6 7{0xff,0x55, 0x84, 0xad, 0xc0, 0xe3, 0x02, 0x00}//0x00};uchar code MUSIC[]={//生日快乐//歌曲代码,每三个表示一个音符及节拍,第一个表示音符1234567,第二个表示音高,0表示低音,1表示中音,2表示高音,第三个表示节拍长度,1表示半拍,2表示一拍,以此6,1,3, 5,1,1, 3,1,2, 5,1,2, 1,2,2, 6,1,1, 5,1,1, 6,1,4, 3,1,1, 5,1,1, 6,1,1, 5,1,2, 3,1,2,1,1,1, 6,0,1, 5,1,1, 3,1,1, 2,1,4, 2,1,3, 3,1,1, 5,1,2, 5,1,1, 6,1,1,3,1,2, 2,1,2, 1,1,4, 5,1,4, 3,1,1, 2,1,1, 1,1,1, 6,0,1, 1,1,1, 5,0,8, 0};void init(){//定时器初始化TMOD=0x11;TH0=0xd8;TL0=0xef;EA=1;ET0=1;}void timer0(void) interrupt 1 using 3{//timer0中断服务程序,中断一次延时10mscounter++;//节拍次数计数TH0=0xd8; //定义单位节拍的延时大小TL0=0xef;}void delay(uchar n){ //延时n毫秒uchar i;while(n--)for(i=0;i<125;i++);}void sound_delay(uchar sound_signalhigh,uchar sound_signallow)//音调延时{TH1=sound_signalhigh;TL1=sound_signallow;TR1=1;while(TF1==0);TR1=0;TF1=0;}void main(){uint i,j,k=0;uchar sound_signalhigh,sound_signallow;//定义音符大小uchar sound_pace;//定义节拍大小while(1){k=0;while(MUSIC[k]!=0)//因为歌曲的结尾处人为的加入了标示符0{j=MUSIC[k++];//从表中取得音符大小i=MUSIC[k++];sound_signalhigh=FREQH[i][j];sound_signallow=FREQL[i][j];//从表中取得节拍大小sound_pace=30*MUSIC[k++];//600为一拍的时长,在此修改一拍的时长。

c语言 stm32蜂鸣器代码

c语言 stm32蜂鸣器代码

要编写C语言的STM32蜂鸣器代码,首先需要了解蜂鸣器的工作原理和STM32的基本操作。

在编写代码之前,建议按照以下步骤进行准备和规划。

一、了解蜂鸣器的工作原理蜂鸣器是一种能够产生声音的电子元件,它通常由振膜和驱动电路组成。

当有电流通过时,振膜会受到驱动而振动,从而产生声音。

我们在编写蜂鸣器代码时需要考虑如何控制电流输出来操控蜂鸣器的声音。

二、学习STM32的基本操作STM32是由意法半导体公司制造的一系列32位的嵌入式处理器芯片,它具有强大的功能和丰富的外设。

在使用STM32芯片时,需要了解其基本操作,包括寄存器的配置、时钟的设置、外设的控制等。

三、准备开发环境在编写C语言的STM32蜂鸣器代码之前,需要准备好相应的开发环境,包括编译器、调试器、下载器等工具。

常见的开发环境包括Keil、IAR等,选择一款适合自己的开发环境,进行相应的设置和配置。

四、编写蜂鸣器代码在以上准备工作完成之后,就可以着手编写C语言的STM32蜂鸣器代码了。

在编写代码时,需要注意以下几点:1. 选择合适的GPIO引脚首先需要选择一个合适的GPIO引脚来连接蜂鸣器,以便控制蜂鸣器的电流输出。

在选择引脚的需要了解其对应的端口号和引脚号,以便在代码中正确设置。

2. 配置引脚通过设置GPIO的相应寄存器,配置选定的GPIO引脚为输出模式,并初始化为低电平状态,以防止蜂鸣器在开始时就发出声音。

3. 控制蜂鸣器通过设置GPIO引脚的输出状态,来控制蜂鸣器的声音输出。

可以通过循环控制引脚的输出状态,从而产生不同频率和音调的声音。

4. 完善代码在编写完基本的蜂鸣器代码之后,可以考虑添加一些额外的功能,比如控制蜂鸣器的响声时长、声音的音量等,以使代码更加完善和实用。

五、调试和测试代码在编写完代码后,需要进行调试和测试,确保代码能够正常运行。

可以通过连接调试器,使用仿真器进行调试,或者直接下载到STM32芯片中进行测试,检查蜂鸣器是否按照预期工作。

单片机控制蜂鸣器唱歌的原理

单片机控制蜂鸣器唱歌的原理

单片机控制蜂鸣器唱歌的原理Document serial number【NL89WT-NY98YT-NC8CB-NNUUT-NUT108】一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率,也就是说不能象电子琴那样能奏出多种音色的声音。

因此单片机奏乐只需弄清楚两个概念即可,也就是“音调”和“节拍”。

音调表示一个音符唱多高的频率,节拍表示一个音符唱多长的时间。

1)音调的确定音调就是我们常说的音高。

它是由频率来确定的!我们可以查出各个音符所对应的相应的频率,那么现在就需要我们来用51来发出相应频率的声音!我们常采用的方法就是通过单片机的定时器定时中断,将单片机上对应蜂鸣器的 I/O口来回取反,或者说来回清零,置位,从而让蜂鸣器发出声音,为了让单片机发出不同频率的声音,我们只需将定时器予置不同的定时值就可实现。

那么怎样确定一个频率所对应的定时器的定时值呢?以标准音高A 为例:A 的频率f = 440 Hz, 其对应的周期为:T = 1/ f = 1/440 =2272μs那么,单片机上对应蜂鸣器的I/O 口来回取反的时间应为:t = T/2 = 2272/2 = 1136 μs ,也就是清零、置位在一个周期内完成.这个时间t 也就是单片机上定时器应有的中断触发时间。

一般情况下,单片机奏乐时,其定时器为工作方式1,它以振荡器的十二分频信号为计数脉冲。

设振荡器频率为f0 ,则定时器的予置初值由下式来确定:t = 12 * (TALL – THL)/ f0 式中TALL = 216= 65536,THL为定时器待确定的计数初值。

因此定时器的高低计数器的初值为:TH =THL/ 256 = ( TALL – t* f0/12) / 256TL = THL % 256 = ( TALL – t* f0/12) %256将t=1136 μs 代入上面两式(注意:计算时应将时间和频率的单位换算一致)即可求出标准音高A 在单片机晶振频率f0=12Mhz,定时器在工作方式1 下的时器高低计数器的予置初值为:TH440Hz = (65536 – 1136 * 12/12) /256 = FBHTL440Hz = (65536 – 1136 * 12/12)%256 = 90H就这样,我们通过延时,发出了我们所需要的频率以单片机12MHZ晶振为例,例出高中低音符与单片机计数T0相关的计数值如下表所示:2)节拍的确定在一张乐谱中,我们经常会看到这样的表达式,如1=C (4/4) 、1=G(3/4) ……等等,这里1=C (4/4),1=G(3/4) 表示乐谱的曲调,和我们前面所谈的音调有很大的关联,4/4、3/4 就是用来表示节拍的。

单片机教程实战2_蜂鸣器唱歌

单片机教程实战2_蜂鸣器唱歌

单片机教程实战2 蜂鸣器唱歌发布: 2009-11-04 09:01 | 作者: 平凡 | 来源: 网络 | 查看: 189次利用单片机(或单板机)奏乐大概是无线电爱好者感兴趣的问题之一。

本文从单片机的基本发间实验出发,谈谈音乐程序的设计原理,并给出具体实例,以供参考。

单片机的基本发音实验我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单处机某个口线的“高”电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调。

例如,要产生200HZ的音频信号,按图1接入喇叭(若属临时实验,也可将喇叭直接接在P1口线上),实验程序为:其中子程序DEL为延时子程序,当R3为1时,延时时间约为20us,R3中存放延时常数,对200HZ音频,其周期为1/200秒,即5ms。

这样,当P1.4的高电平或低电平的持续时间为2.5ms,即R3的时间常数取2500/20=125(7DH)时,就能发出200HZ 的音调。

将上述程序键入学习机,并不断修改R3的常数可以感到音调的变化。

乐曲中,每一音符对应着确定的频率,表1给出C调时各音符频率及其相应的时间常数。

读者可以根据表1所提供的常数,将其16进制代码送入R3,反复练习体会。

根据表1可以奏出音符。

仅这还不够,要准确奏出一首曲子,必须准确地控制乐曲节奏,即一音符的持续时间。

音符的节拍我们可以用定时器T0来控制,送入不同的初值,就可以产生不同的定时时间。

便如某歌曲的节奏为每分钟94拍,即一拍为0.64秒。

其它节拍与时间的对应关系见表2。

但时,由于T0的最大定时时间只能为131毫秒,因此不可能直接用改变T0的时间初值来实现不同节拍。

我们可以用T0来产生10毫秒的时间基准,然后设置一个中断计数器,通过判别中断计数器的值来控制节拍时间的长短。

表2中也给出了各种节拍所对应的时间常数。

单片机-利用蜂鸣器演奏音乐

单片机-利用蜂鸣器演奏音乐

实验三-利用蜂鸣器演奏音乐一、实验目的1.了解BlueSkyC51单片机实验板中蜂鸣器的硬件电路2.学会利用蜂鸣器实现音乐的演奏3.掌握蜂鸣器实现音乐演奏的编程二、实验硬件设计及电路1. BlueSkyC51单片机实验板2.单片机最小系统3.蜂鸣器电路连接三极管主要是做驱动用的。

因为单片机的IO口驱动能力不够让蜂鸣器发出声音,所以我们通过三极管放大驱动电流,从而可以让蜂鸣器发出声音,你要是输出高电平,三极管导通,集电极电流通过蜂鸣器让蜂鸣器发出声音,当输出低电平时,三极管截止,没有电流流过蜂鸣器,所以就不会发出声音。

三、实验原理1.音调及节拍用一个口,输出方波,这个方波输入进蜂鸣器就会产生声音,通过控制方波的频率、时间,就能产生简单的音乐。

一般说来,单片机演奏音乐基本都是单音频率,因此单片机奏乐只需控制音调和节拍。

(1)音调的确定音调是由频率来确定的。

通过单片机的定时器定时中断,将单片机上对应蜂鸣器的I/O 口来回取反,从而让蜂鸣器发出不同频率的声音。

只需将定时器给以不同的定时值就可实现。

通过延时,即可发出所需要的频率。

(2)节拍的确定一拍的时长大约为400—500ms,每个音符的时长通过节拍来计算。

详细见程序代码。

2.软件设计相关(1)头文件#include<reg51.h>#define uint unsigned int#define uchar unsigned char#define ulong unsigned longsbit beep=P1^4; //蜂鸣器与P1.4口连接(2)歌曲曲谱uchar code diaodata[30]={ //音调代码0x10,0x0e,0x0c,0x10,0x0e,0x0c,0x10,0x0e,0x10,0x0c,0x10,0x15,0x13,0x10,0x13,0x15,0x15,0x13,0x15,0x13,0x10,0x0e,0x0c,0x0e,0x0e,0x10,0x0e,0x0c,0x0e,0x00};uchar code jiedata[30]={ //音长代码0x04,0x04,0x08,0x06,0x02,0x08,0x04,0x04,0x04,0x04,0x02,0x06,0x08,0x02,0x02,0x04,0x04,0x04,0x04,0x08,0x02,0x02,0x04,0x04,0x02,0x02,0x04,0x04,0x0c,0x00};(3)音阶表uchar code freq[36*2]={ //音阶码表0xf7,0xd8, //440hz , 1 //00xf8,0x50, //466hz , 1# //10xf8,0xbc, //494hz , 2 //20xf9,0x26, //524hz , 2# //30xf9,0x85, //554hz , 3 //40xf9,0xe5, //588hz , 4 //50xfa,0x3d, //622hz , 4# //60xfa,0x92, //660hz , 5 //70xfa,0xdd, //698hz , 5# //80xfb,0x29, //740hz , 6 //90xfb,0x70, //784hz , 6# //100xfb,0xb0, //830hz , 7 //110xfb,0xef, //880hz , 1 //120xfc,0x29, //932hz , 1# //130xfc,0x62, //988hz , 2 //140xfc,0x95, //1046hz, 2# //150xfc,0xc7, //1108hz, 3 //160xfc,0xf5, //1174hz, 4 //170xfd,0x20, //1244hz, 4# //180xfd,0x4c, //1318hz, 5 //190xfd,0x72, //1396hz, 5# //200xfd,0x97, //1480hz, 6 //210xfd,0xbb, //1568hz, 6# //220xfd,0xdc, //1662hz, 7 //230xfd,0xfb, //1769hz, `1 //240xfe,0x18, //1864hz, `1# //250xfe,0x34, //1976hz, `2 //260xfe,0x4e, //2092hz, `2# //270xfe,0x67, //2218hz, `3 //280xfe,0x7d, //2350hz, `4 //290xfe,0x94, //2488hz, `4# //300xfe,0xa8, //2639hz, `5 //310xfe,0xbc, //2794hz, `5# //320xfe,0xcf, //2960hz, `6 //330xfe,0xe0, //3136hz, `6# //340xfe,0xf1, //3322hz, `7 //35};(4) 音符发生程序(中断服务程序)void timer0() interrupt 1 //用于产生音符的T0中断服务程序{TH0=th0_f;TL0=tl0_f;beep=~beep; //取反beep引脚,发声}三、实验过程及问题1.Keil开发过程(1)新建“Project”,选择单片机为“AT89C52”(2)新建c文件“music.c”,并添加到工程中(3)设置生成“HEX”文件,编译(4)将生成的“HEX”文件烧录到单片机,检验(5)不断修改完善2.编译实验相关问题(1)实际发音颤音重解决方法为修改蜂鸣器的驱动频率.(2)实际节奏过快或者过慢调整延时四、C51程序代码(部分来源于网络)#include<reg51.h>#define uint unsigned int#define uchar unsigned char#define ulong unsigned longsbit beep=P1^4; //蜂鸣器与P1.4口连接uchar th0_f; //中断装载T0高8位uchar tl0_f; //T0低8位uchar code freq[36*2]={ //音阶码表0xf7,0xd8, //440hz , 1 //00xf8,0x50, //466hz , 1# //10xf8,0xbc, //494hz , 2 //20xf9,0x26, //524hz , 2# //30xf9,0x85, //554hz , 3 //40xf9,0xe5, //588hz , 4 //50xfa,0x3d, //622hz , 4# //60xfa,0x92, //660hz , 5 //70xfa,0xdd, //698hz , 5# //80xfb,0x29, //740hz , 6 //90xfb,0x70, //784hz , 6# //100xfb,0xb0, //830hz , 7 //110xfb,0xef, //880hz , 1 //120xfc,0x29, //932hz , 1# //130xfc,0x62, //988hz , 2 //140xfc,0x95, //1046hz, 2# //150xfc,0xc7, //1108hz, 3 //160xfc,0xf5, //1174hz, 4 //170xfd,0x20, //1244hz, 4# //180xfd,0x4c, //1318hz, 5 //190xfd,0x72, //1396hz, 5# //200xfd,0x97, //1480hz, 6 //210xfd,0xbb, //1568hz, 6# //220xfd,0xdc, //1662hz, 7 //230xfd,0xfb, //1769hz, `1 //240xfe,0x18, //1864hz, `1# //250xfe,0x34, //1976hz, `2 //260xfe,0x4e, //2092hz, `2# //270xfe,0x67, //2218hz, `3 //280xfe,0x7d, //2350hz, `4 //290xfe,0x94, //2488hz, `4# //300xfe,0xa8, //2639hz, `5 //310xfe,0xbc, //2794hz, `5# //320xfe,0xcf, //2960hz, `6 //330xfe,0xe0, //3136hz, `6# //340xfe,0xf1, //3322hz, `7 //35};uchar code diaodata[30]={ //音调代码0x10,0x0e,0x0c,0x10,0x0e,0x0c,0x10,0x0e,0x10,0x0c,0x10,0x15,0x13,0x10,0x13,0x15,0x15,0x13,0x15,0x13,0x10,0x0e,0x0c,0x0e,0x0e,0x10,0x0e,0x0c,0x0e,0x00};uchar code jiedata[30]={ //音长代码0x04,0x04,0x08,0x06,0x02,0x08,0x04,0x04,0x04,0x04,0x02,0x06,0x08,0x02,0x02,0x04,0x04,0x04,0x04,0x08,0x02,0x02,0x04,0x04,0x02,0x02,0x04,0x04,0x0c,0x00};void timer0() interrupt 1 //用于产生音符的T0中断服务程序{TH0=th0_f;TL0=tl0_f;beep=~beep; //取反beep引脚,发声}void main(void){uchar i,j,k=0;uint n;TMOD=0X01; //T0方式1TR0=0; //关闭T0(不发声)ET0=1; //允许T0中断EA=1; //允许总中断while(1){TR0=1; //开T0for(i=0;diaodata[i]!=0;i++){th0_f=freq[diaodata[i]*2];tl0_f=freq[diaodata[i]*2+1];for(j=0;j<20000;n++); //(jiedata*20000)TR0=0;for(n=0;n<256;n++); //音符之间的短暂延时TR0=1;}TR0=0;}}(注:可编辑下载,若有不当之处,请指正,谢谢!)。

蜂鸣器唱歌程序

蜂鸣器唱歌程序

蜂鸣器唱歌----生日快乐下面是我单片机入门的时候写的一个蜂鸣器唱歌的程序,用的是stc89c52的单片机和12MHZ的晶振。

它大致是这样工作的。

我们知道歌曲都是由最基本的音调和节拍组成的。

音调就是该音符的频率,节拍就是该音符持续的时间。

也就是说发出一个最基本的音我们需要两个参数,一个是频率,一个是节拍。

那么在单片机中如何产生这两个参数呢?首先我们需要知道该音符的频率,然后用单片机的I/O口不断地变高变低来产生这个频率。

比如 1 这个音在低音,中音,高音三种情况下会有3种频率,至于到底是哪种音,在歌曲的乐谱中会给出详细的标识。

现在我们假设1 这个音为低音,在d调(什么是d调?看文章尾附录)下频率为293hz,一个周期为T=1/293 s。

那么I/O口被置1和置0的时间各占一半也就是T/2。

然后算出相应的定时器初值,那么单片机就可以发出这个音了。

接下来就是一个音符要唱多久,那就要看这个音符占据多少个节拍了,同样在歌曲的乐谱中会给出详细的标示。

那么一拍是多长呢,下面有说明。

慢节奏一般600ms一拍,快节奏一般400ms一拍。

如果你要知道更准确的节拍时长,只有拿着乐谱去听歌了,记下唱一拍的时间就行了。

我用的是定时器0控制节拍长度,在每个音符开始时开启它,它是10ms 中断一次,并且让里面的计数值增加1。

如果我要唱一拍的话(假设为600ms),那么我只需要判断计数值是否达到60,如果达到那么就停止计时然后跳到下一拍。

以上就是蜂鸣器唱歌的基本原理了,希望能对你有所帮助。

#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit sound=P3^7;uint counter=0;uchar code FREQH[3][8]= //音符定时器初值,三个8度音的高八位{//注意每行起始都为0xff,因为音调中没有0 这个音,所以随便填了个数字,后面不不会引用它// 低音:// 1 2 3 4 5 6 7{0xff,0xf9, 0xfa, 0xfa, 0xfb, 0xfb, 0xfc, 0xfc},//中音://1 2 3 4 5 6 7{0xff,0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe},//高音://1 2 3 4 5 6 7{0xff,0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0x00}//0x00};uchar code FREQL[3][8]= //音符定时器初值,三个8度音的低八位{// 低音:// 1 2 3 4 5 6 7{0xff,0x5b, 0x15, 0xb9, 0x04, 0x90, 0x0c, 0x79},//中音:// 1 2 3 4 5 6 7{0xff,0xac, 0x09, 0x5c, 0x82, 0xc8, 0x05, 0x3c},//高音://1 2 3 4 5 6 7{0xff,0x55, 0x84, 0xad, 0xc0, 0xe3, 0x02, 0x00}//0x00};uchar code MUSIC[]={//生日快乐//歌曲代码,每三个表示一个音符及节拍,第一个表示音符1234567,第二个表示音高,0表示低音,1表示中音,2表示高音,第三个表示节拍长度,1表示半拍,2表示一拍,以此类推。

蜂鸣器与音乐编程

蜂鸣器与音乐编程

蜂鸣器与音乐编程一、体验蜂鸣器演奏音乐没有亲自体验过自己导出的代码可以让蜂鸣器奏乐的人,怎么会想着会有学习音乐编程的冲动呢。

在向下进行之前,小编在这希望即将走向热爱音乐编程道路上的朋友将下面附录1中的代码复制粘贴,然后烧写到开发板中,体验一把音乐编程的快乐。

二、认识蜂鸣器奏乐原理其实,这个也没有必要,因为我学习音乐编程的过程中也没有走这个过程,不过原因呢是我小时候学过一段时间的乐理知识,现在有那么一点印象。

假如你没有我那么好的音乐功底(呵呵,开个玩笑,我也只是低等玩家),没关系,告诉你捷径,看好了-------跳过此部分。

我们都知道,音调和音调的时长是音符的主要特征,通过产生不同的音调和音调的时长可以奏出不同的音符来。

然后一个个音符串联在一起就可以产生美妙的音乐来了。

音调主要由声音的频率决定,通过单片机给蜂鸣器不同的音频脉冲来产生不同的音调。

要产生音频脉冲,只要算出某一音频的周期(周期=1/频率),然后将此周期除以2即为半周期的时间。

利用单片机的定时器工作在计数模式MODE1下,设定TH0和TL0的值以产生这半个周期,每当计时到达时就将输出脉冲的I/O(即接蜂鸣器的那个管脚)反相,然后重复计时此半个周期再对I/O反相,就可以在I/O引脚上得到此频率的脉冲。

如果没有必要进行精确的计时,可以用for循环空语句来粗略计时即可(本文选用此法)。

当单片机使用11.0592Mhz的晶振时,for(i=0;i<115;i++);这个空循环延时约为1ms;当晶振选用12Mhz时,可使用for(i=0;i<125;i++);这个空循环来延时1ms。

在这个空循环外头再进行一次循环就可以实现延时若干ms。

首先介绍蜂鸣器的发声原理。

如:下面附上不同音调所对应的频率表:三、准备相关基础知识假如你只是想体验一把让自己的开发板唱歌,那你在这里可以找到好几个完整源码。

假如你是想让自己掌握音乐编程,那你必须具备以下小编认为的能力:1、开发板初级使用能力2、使用框架的能力3、细心、认真、耐心以上三种能力,让你在往下的学习中可以掌握音乐编程的其中之一的方法。

单片机蜂鸣器工作原理

单片机蜂鸣器工作原理

单片机蜂鸣器工作原理
单片机蜂鸣器是一种电子器件,用于产生声音信号。

其工作原理基于数字信号的控制和蜂鸣器内部的振动装置。

蜂鸣器内部通常由封装在柱状外壳中的震荡器、共振腔和发声膜组成。

震荡器由铁片和线圈组成,当线圈中通过电流时,铁片受到磁场的作用而振动。

同时,共振腔能够增强振动的效果。

单片机蜂鸣器通过控制IO口的输出电平来控制蜂鸣器的工作
状态。

通常情况下,将IO口设置为高电平,使得蜂鸣器内部
的振动装置受到激励,开始振动。

振动会产生一系列的声波,形成连续的声音。

通过在单片机中编写程序控制IO口的输出电平的变化,可以
产生不同频率和节奏的声音。

通过改变输出电平的高低时间,可以实现不同频率的振动和声音效果。

总结而言,单片机蜂鸣器通过控制IO口的输出电平来控制振
动装置的工作状态,从而产生声音信号。

不同的振动和声音效果通过编写程序中不同的输出电平变化来实现。

单片机驱动蜂鸣器唱国歌的设计与原理

单片机驱动蜂鸣器唱国歌的设计与原理

蜂鸣器演奏国歌(11机自创新1班王丽红1110100736)1设计任务本设计是以AT89C51芯片的电路为基础,外部加上三级管驱动蜂鸣器,以此来实现音乐演奏控制的硬件电路,通过软件程序来控制单片机内部的定时器使其演奏出优美动听的音乐。

按照要求选择音乐,在本次设计中以演奏《国歌》为例,将其转化为机器码存入单片机的存储器中。

2设计原理蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此驱动需要一定的电流,单片机引脚输出的电流较小,基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。

三极管的发射极E接电源,集电极C接蜂鸣器正极,蜂鸣器负极接地,三极管的基级B经过限流电阻R后由单片机引脚控制。

当输出高电平时,三极管T1截止,没有电流流过线圈,蜂鸣器不发声;当输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。

程序中改变单片引脚输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。

另外,改变输出电平的高低电平占空比,则可以控制蜂鸣器的声音大小,这些我们都可以通过编程实验来验证。

3 软件设计3.1音调、节拍以及编码的确定一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率,也就是说不能像电子琴那样能奏出多种音色的声音。

因此单片机奏乐只需弄清楚两个概念即可,也就是“音调”和节拍表示一个音符唱多长的时间。

3.1.1音调的确定不同音高的乐音是用C、D、E、F、G、A、B来表示,这7个字母就是音乐的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,即唱成简谱的1、2、3、4、5、6、7,这是唱曲时乐音的发音,所以叫“音调”。

把C、D、E、F、G、A、B这一组音的距离分成12个等份,每一个等份叫一个“半音”。

两个音之间的距离有两个“半音”,就叫“全音”。

1) 要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。

蜂鸣器电路工作原理

蜂鸣器电路工作原理

所谓的蜂鸣器是一种一体化结构的电子讯响器,在电路中用字母“H”或“HA”(旧标准用“FM”、“LB”、“JD”等)表示。

蜂鸣器采用直流电压供电,其能发出单调的或者某个固定频率的声音,如嘀嘀嘀,嘟嘟嘟等。

蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型,通常在计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件使用。

1.蜂鸣器电路图符号2.蜂鸣器电路工作原理蜂鸣器工作原理:PWM 输出口直接驱动蜂鸣器方式由于PWM 只控制固定频率的蜂鸣器,所以可以在程序的系统初始化时就对PWM 的输出波形进行设置。

首先根据SH69P43 的PWM 输出的周期宽度是10 位数据来选择PWM 时钟。

系统使用4MHz 的晶振作为主振荡器,一个tosc 的时间就是0.25μs,若是将PWM 的时钟设置为tosc 的话,则蜂鸣器要求的波形周期500μs 的计数值为500μs/0.25μs=(2000)10=(7D0)16,7D0H 为11 位的数据,而SH69P43 的PWM输出周期宽度只是10 位数据,所以选择PWM 的时钟为tosc 是不能实现蜂鸣器所要的驱动波形的。

这里将PWM 的时钟设置为4tosc,这样一个PWM 的时钟周期就是1μs 了,由此可以算出500μs 对应的计数值为500μs/1μs=(500)10=(1F4)16,即分别在周期寄存器的高2 位、中4 位和低4 位三个寄存器中填入1、F 和4,就完成了对输出周期的设置。

再来设置占空比寄存器,在PWM 输出中占空比的实现是通过设定一个周期内电平的宽度来实现的。

当输出模式选择为普通模式时,占空比寄存器是用来设置高电平的宽度。

250μs 的宽度计数值为250μs/1μs=(250)10=(0FA)16。

只需要在占空比寄存器的高2 位、中4 位和低4 位中分别填入0、F 和A 就可以完成对占空比的设置了,设置占空比为1/2duty。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3.3 蜂鸣器播放歌曲原理
一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率。

因此单片机奏乐只需弄清楚两个概念即可,也就是“音调”和“节拍”。

音调表示一个音符唱多高的频率,节拍表示一个音符唱多长的时间。

1)音调的确定
音调就是我们常说的音高。

它是由频率来确定的!我们可以查出各个音符所对应的相应的频率,那么现在就需要我们来用51来发出相应频率的声音!我们常采用的方法就是通过单片机的定时器定时中断,将单片机上对应蜂鸣器的I/O口来回取反,或者说来回清零,置位,从而让蜂鸣器发出声音,为了让单片机发出不同频率的声音,我们只需将定时器予置不同的定时值就可实现。

2)节拍的确定
一般说来,如果乐曲没有特殊说明,一拍的时长大约为400—500ms 。

3.3 蜂鸣器播放歌曲程序
#include <reg52.h>
sbit speaker = P1^5; //定义蜂鸣器端口
unsigned char timer0h, timer0l, time;
//--------------------------------------
//单片机晶振采用11.0592MHz
// 频率-半周期数据表高八位本软件共保存了四个八度的28个频率数据code unsigned char FREQH[] = {
0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音1234567
0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音 234567
0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF}; //超高音 1234567
// 频率-半周期数据表低八位
code unsigned char FREQL[] = {
0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, //低音1234567
0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i 0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, //高音 234567
0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16}; //超高音 1234567
//--------------------------------------
//世上只有妈妈好数据表要想演奏不同的乐曲, 只需要修改这个数据表
code unsigned char sszymmh[] = {
6, 2, 3, 5, 2, 1, 3, 2, 2, 5, 2, 2, 1, 3, 2, 6, 2, 1, 5, 2, 1, //一个音符有三个数字。

前为第几个音、中为第几个八度、后为时长(以半拍为单位)。

//6, 2, 3 分别代表:啦, 中音, 3个半拍;
//5, 2, 1 分别代表:嗦, 中音, 1个半拍;
//3, 2, 2 分别代表:咪, 中音, 2个半拍;
//5, 2, 2 分别代表:嗦, 中音, 2个半拍;
//1, 3, 2 分别代表:哆, 高音, 2个半拍;
6, 2, 4, 3, 2, 2, 5, 2, 1, 6, 2, 1, 5, 2, 2, 3, 2, 2, 1, 2, 1,
6, 1, 1, 5, 2, 1, 3, 2, 1, 2, 2, 4, 2, 2, 3, 3, 2, 1, 5, 2, 2,
5, 2, 1, 6, 2, 1, 3, 2, 2, 2, 2, 2, 1, 2, 4, 5, 2, 3, 3, 2, 1,
2, 2, 1, 1, 2, 1, 6, 1, 1, 1, 2, 1, 5, 1, 6, 0, 0, 0};
//--------------------------------------
void t0int() interrupt 1 //T0中断程序,控制发音的音调
{
TR0 = 0; //先关闭T0
speaker = !speaker; //输出方波, 发音
TH0 = timer0h; //下次的中断时间, 这个时间, 控制音调高低
TL0 = timer0l;
TR0 = 1; //启动T0
}
//--------------------------------------
void delay(unsigned char t) //延时程序,控制发音的时间长度
{
unsigned char t1;
unsigned long t2;
for(t1 = 0; t1 < t; t1++) //双重循环, 共延时t个半拍for(t2 = 0; t2 < 8000; t2++); //延时期间, 可进入T0中断去发音 TR0 = 0; //关闭T0, 停止发音
}
//--------------------------------------
void song() //演奏一个音符
{
TH0 = timer0h; //控制音调
TL0 = timer0l;
TR0 = 1; //启动T0, 由T0输出方波去发音
delay(time); //控制时间长度
}
//--------------------------------------
void main(void)
{
unsigned char k, i;
TMOD = 1; //置T0定时工作方式1
ET0 = 1; //开T0中断
EA = 1; //开CPU中断
while(1)
{
i = 0;
time = 1;
while(time)
{
k = sszymmh[i] + 7 * sszymmh[i + 1] - 1;
//第i个是音符, 第i+1个是第几个八度
timer0h = FREQH[k]; //从数据表中读出频率数值
timer0l = FREQL[k]; //实际上, 是定时的时间长度time = sszymmh[i + 2]; //读出时间长度数值
i += 3;
song(); //发出一个音符
}
}
}。

相关文档
最新文档