蜂鸣器唱两只老虎单片机程序
单片机《蜂鸣器》实验报告
单片机《蜂鸣器》实验报告实验报告:蜂鸣器实验工具和器材:Proteus仿真软件,Keil程序编写软件,蜂鸣器,AT89C51单片机。
实验原理:蜂鸣器分为压电式和电磁式两种类型。
本实验采用的是电磁式蜂鸣器。
蜂鸣器又分为有源和无源两种类型。
本实验采用的是有源蜂鸣器。
通过51单片机和C程序,将程序所设计的算法与蜂鸣器电路连接起来,采用循环函数配合多个延时来实现各个音节的有规律发声,合成一首完整的音乐。
本实验采用较为简单的一首儿歌《两只老虎》来体现。
硬件电路说明:本实验使用电磁式蜂鸣器,蜂鸣器连接单片机P2.0端口,另一端接地。
通过C程序产生的hex文件控制蜂鸣器发声,播放一首完整的歌曲。
音节的曲调和间隔时间都是构成歌曲的一个重要部分,需要调节频率和利用延时函数。
控制发声频率要产生音频脉冲,只要算出某一音频的周期/频率,然后将此周期除以2(即为半周期的时间)。
利用定时器计时这半个周期时间,就可在I/O脚上得到此频率的脉冲。
利用AT89C51的内部定时器使其工作在计数器模式下,改变计数值TH0及TL0从而产生不同频率。
此外,结束符和休止符可以分别用代码00H和XXX来表示,若查表结果为0x00,则表示曲子终了;若查表结果为0xff,则产生相应的停顿效果。
软件程序说明:主函数采用while和for循环,并且引用延时函数,对各部分程序进行调用。
与采用一般的延时函数相比,可以分别控制歌曲各个音节的持续发声。
在主函数中,使用多个for循环来控制每个音节的起始和结束,以实现蜂鸣器对一首完整歌曲的播放。
通过调用不同的延时函数,实现有节奏的音节发声,并将它们串联起来。
在调用Beep函数时,需要进行定义。
在主函数中,分别在每个音节开始前后的两个for循环中调用Beep函数。
通过Beep=~Beep和Beep=1指令的调用,实现各个音节的发声和停止,从而控制歌曲的有节奏播放。
为了实现各个音节的延时发声,我们使用了多个延时程序,例如500ms和700ms。
单片机蜂鸣器唱歌程序(二)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. 展望将来的改进和研究方向总结:本文详细介绍了单片机蜂鸣器唱歌程序(二)的实现方法和步骤。
通过连接设置、编程环境配置、发声原理及代码实现、优化和调试、实验结果及总结等五个大点的阐述,读者可以深入了解单片机控制蜂鸣器发声的原理和方法,并通过实验得到具体的唱歌效果。
同时,读者在实践过程中也要注意优化和调试,不断尝试和改进,以实现更好的音效效果。
希望本文对读者有所帮助,为单片机蜂鸣器唱歌程序的开发提供了指导和参考。
“两只老虎”EDA课程设计(详细)
课程设计课程设计名称:专业班级学生姓名:学号:指导教师:课程设计时间:1 设计任务及要求设计任务:乐曲自动播放器。
自行选择一首自己喜爱的经典乐曲,用FPGA 设计实现一个该曲目的自动演奏电路。
要求:(1)根据设计题目要求编写相应程序代码(2)对编写的VHDL程序代码进行编译和仿真(3)利用实验箱完成硬件验证(4)总结设计内容,完成课程设计说明书与利用微处理器,以纯硬件完成乐曲演奏电路的逻辑要复杂得多。
本实验设计项目作为“两只老虎”乐曲演奏电路的实现,组成每个乐曲的每个音符的发音频率值及持续的时间是乐曲能连续演奏所需要的两个基本要素。
(1)音乐硬件演奏电路基本原理硬件电路的发声原理,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA芯片某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。
乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。
乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频,就可以在扬声器上连续地发出各个音符的音调。
而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。
(2)音符频率的获得多个不同频率的信号可通过对某个基准频率进行分频器获得。
由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。
若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。
若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。
实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。
本设计中选取1MHz的基准频率。
数控分频器采用12位二进制计数器,乐曲中的休止符,只要将分频系数设为0,即初始值=4095,此时扬声器不会发声。
根据分频系数,可计算数控分频器得到的初始值。
单片机音乐播放器(两只老虎)
;sing a song//T0定时中断控制音符,T1定时中断控制节拍,基准定时50msTH1_DA TA EQU 03CHTL1_DA TA EQU 0B0HYINFU EQU 30HJIEPAI EQU 31HBUZZER BIT P1.0ORG 0000HAJMP STARTORG 000BHAJMP INT_T0 ;控制音符(音调)ORG 001BHAJMP INT_T1 ;控制节拍(音符持续时间)ORG 0100HSTART:MOV SP, #60HMOV TMOD, #11H //定时器T0/T1都是方式1MOV R2, #0 ;取歌曲音符和节拍的偏移量MOV A, R2MOV DPTR, #TABLE_SONGMOVC A, @A+DPTR ;取歌曲音符MOV YINFU, AMOV DPTR, #TABLE_TH0MOVC A, @A+DPTR ;取音符对应定时器T0的初始值MOV TH0, AMOV A, YINFUMOV DPTR, #TABLE_TL0MOVC A, @A+DPTRMOV TL0, AMOV A, R2MOV DPTR, #TABLE_LENGTHMOVC A, @A+DPTR ;取该音符对应的节拍MOV JIEPAI, AMOV TH1, #TH1_DA TA ;节拍基准定时50ms(12MHz晶振)MOV TL1, #TL1_DA TASETB PT1 ;设置节拍中断为高优先级中断SETB ET0SETB ET1SETB EASETB TR0SETB TR1SJMP $;--------------------------------------------------------;控制音符的定时中断,依据R2的值决定取歌曲中哪个音符;读到音符为0代表歌曲结束,则关中断,停止定时器。
否则继续;根据读到的音符查表选择对应的定时器初始值;---------------------------------------------------------INT_T0:PUSH ACCPUSH PSWCPL BUZZER //改变蜂鸣器状态MOV A, R2MOV DPTR, #TABLE_SONGMOVC A, @A+DPTRMOV YINFU, AJNZ SING //判断是否到歌曲结束CLR TR0CLR TR1CLR EASJMP EXITSING:MOV A, YINFUMOV DPTR, #TABLE_TH0MOVC A, @A+DPTRMOV TH0, AMOV A, YINFUMOV DPTR, #TABLE_TL0MOVC A, @A+DPTRMOV TL0, AEXIT:POP PSWPOP ACCRETI;-------------------------------------------------------------------------;控制节拍的定时中断,每个音符节拍时间到,调整R2指向下一音符INT_T1:PUSH ACCMOV TH1, #TH1_DA TA ;节拍基准定时50ms(12MHz晶振)MOV TL1, #TL1_DA TADJNZ JIEPAI, EXIT_T1INC R2MOV A, R2MOV DPTR, #TABLE_LENGTHMOVC A, @A+DPTRMOV JIEPAI, AEXIT_T1:POP ACCRETITABLE_TH0:DB 0FCH, 0FCH, 0FCH, 0FDH, 0FDH, 0FDH ,0FDHDB 0FEH, 0FEH, 0FEH, 0FEH, 0FEH, 0FEHDB 0FEH, 0FFHTABLE_TL0:DB 00H, 44H, 0ACH, 09H, 34H, 82H, 0C8HDB 06H, 22H, 56H, 85H, 9AH, 0C1HDB 0E3H, 03HTABLE_SONG:DB 1,2,3,1,1,2,3,1,3,4,5,5,3,4,5,5DB 5,6,5,4,3,2,5,6,5,4,3,2,1,5,1,1DB 1,5,1,1,0TABLE_LENGTH:DB 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10DB 5,5,5,5,10,10,5,5,5,5,10,10,10,10,10,10DB 10,10,10,10,10,10END。
单片机蜂鸣器发声代码
单片机蜂鸣器发声代码蜂鸣器是一种常见的电子元件,可以发出短促的蜂鸣声用于提醒或警示。
在单片机应用中,蜂鸣器可以用来作为声音提示的一种方式。
下面介绍一段单片机蜂鸣器的发声代码。
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端口上。
用单片机驱动蜂鸣器唱歌的设计与原理
用单片机驱动蜂鸣器唱歌的设计与原理1.蜂鸣器蜂鸣器是一种一体化结构的电子讯响器,主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型,他广泛应用于计算机、打印机、复印机、报警器、电话机等电子产品中作发声器件。
2.单片机驱动单片机上面使用的蜂鸣器一般都是无源电磁式的蜂鸣器(如下图所示)。
它由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。
接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。
单片机与蜂鸣器连接如图二所示。
图中,蜂鸣器的正极接到VCC(+5V)电源上面,蜂鸣器的负极接到三极管的发射极E,三极管的基级B经过限流电阻R1后由单片机的P3.7引脚控制,当P3.7输出高电平时,三极管T1截止,没有电流流过线圈,蜂鸣器不发声;当P3.7输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。
因此,我们可以通过程序控制P3.7脚的电平来使蜂鸣器发出声音和关闭。
程序中改变单片机P3.7引脚输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。
另外,改变P3.7输出电平的高低电平占空比,则可以控制蜂鸣器的声音大小,这些我们都可以通过编程实验来验证。
下面就是一个能够发出音乐的单片机程序,示例中所播放的音乐是《两只老虎》。
SPK EQU P3.7 ;位定义ORG 0000H ;伪指令,指定程序从0000H开始存放LJMP START ;程序跳转至START处执行ORG 0030H ;伪指令,指定程序从0030H开始存放START: MOV SP,#60H ;堆栈初始化MOV R3,#00H ;给R3赋值NEXT:MOV A,R3MOV DPTR,#TABLE ;查歌曲表MOVC A,@A+DPTRJZ START ;为00则循环播放此歌MOV R7,A ;R7/R2保存连续相邻的表数据INC R3MOV A,R3MOVC A,@A+DPTRMOV R2,AACALL SONGINC R3SJMP NEXT;==============================;=========歌曲播放子程序==========;==============================SONG:MOV A,R2 ;取出节拍RL AJNZ KEEP ;A不等于零则跳MOV A,#01H ;A等于零则赋值为1 KEEP:MOV R2,A ;REPEAT:ACALL EIGHTH ;调用1/8拍延时程序DJNZ R2,REPEAT ;RET;===============================;=======产生1/8拍延时子程序=======;===============================EIGHTH:MOV A,R7 ;查表取出延时参数,保存到R4MOV DPTR,#DELAY_TMOVC A,@A+DPTRMOV R4,AMOV A,R7 ;查表取出1/8拍周期数,保存到R5 MOV DPTR,#S_PARAMOVC A,@A+DPTRMOV R5,ANEXTCYC:ACALL SOUNDDJNZ R5,NEXTCYCRET;==============================;===========发声子程序===========;==============================SOUND:SETB SPKACALL SDELAYCLR SPKACALL SDELAYRET;============================== ;===========延时子程序=========== ;============================== SDELAY:MOV A,R4 ;延时值在R4内MOV R0,AXL2:MOV R1,#03HDL1:NOPDJNZ R1,DL1DJNZ R0,XL2RET;============================== ;===========1/8拍周期表========== ;============================== S_PARA:DS 1DHDB 15H,16H,00DB 19H,00H,1CH,00H,1FH,21H,00H,25HDB 00H,29H,2CH,00H,31H,34H,37H,00HDB 3EH,41H,00H,49H,00H,52H,57H,00HDB 62H;============================== ;===========延时参数表=========== ;============================== DELAY_T:DS 1DHDB 7EH,77H,00HDB 6AH,00H,5EH,00H,54H,4FH,00H,46HDB 00H,3FH,3BH,00H,35H,32H,2FH,00HDB 2AH,27H,00H,23H,00H,1FH,1DH,0C0HDB 1AH;============================== ;============歌曲表============= ;============================== TABLE:DW 2504H,2704H,2904H,2504HDW 2504H,2704H,2904H,2504HDW 2904H,2A04H,2C08HDW 2904H,2A04H,2C08HDW 2C02H,2E02H,2C02H,2A02H,2904H,2504H DW 2C02H,2E02H,2C02H,2A02H,2904H,2504HDW 2904H,2004H,2508HDW 2904H,2004H,2508HDW 0000HEND童鞋们可能发现了,数据表TABLE里面的数据才是歌曲数据。
单片机单音频发声_两只老虎
#define LA2_ 536
#define SI2 506
#define DO3 478
#define DO3_ 451
#define RE3 426
#define RE3_ 402
#define M3 372
#define FA3 358
#define FA3_ 338
case 4:cCount=20;break;
default:break;
}
TH1=0x2c;
TL1=0x12;
TL0=max-iPeriods;
TH0=(max-iPeriods)>>8;
if(cPeriodsNow>31) initialization();
/*
文件:Score2freq.h
功能:音符频率转换
日期: 208-12-29
说明:
1.TwoTigerP[]数为音符
2.TowTigerT[]数组为拍数(1-半拍,2-1拍,4-2拍)
3.1拍时间为1秒钟
*/
#define DO1 1908
#define DO1_ 1805
#define RE1 1700
#define RE1_ 1608
#define M1 1516
#define FA1 1433
#define FA1_ 1350
#define SO1 1276
#define SO1_ 1205
#define LA1 1136
#define LA1_ 1072
#define SO3 319
单片机实现电子琴并可播放歌曲
0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,
0xC6,0xA1,0x86,0x8e};
//中音1-7和高音1-7对应频率列表
uint16 code NoteFrequ[] = {
523,587,659,698,784,880,988, //中音1-7
for(i=0;i<4;i++)
{
P2=buff[i];
temp=P2;
temp&=0xf0;//取P2的高四位;
while(temp!=0xf0)
{
delay5ms(5);//延时5ms去除抖动;
temp=P2;
temp&=0xf0;
while(temp!=0xf0)
{
switch(temp)
{
case 0xe0:num=i*4+0;break;//获取键值;
}
if(num==8)
{
T0LoadH = 0xff;
T0LoadL = 0x00;
TR0 = 1;
flag = 0;
ADDR0 = 0;
ADDR1 = 1;
ADDR2 = 1;
P0 = 0x00;
for(i=0;i<10000;i++);//闪烁灯全亮
PlayTwoTiger();
}
}
void PlayTwoTiger()
//计算发生时间,为总时间的0.75
/***********去除抖动********************/
while(temp!=0xf0)
{
temp=P2;
单片机蜂鸣器发声代码
单片机蜂鸣器发声代码
单片机蜂鸣器是单片机开发中经常使用的一种输出设备,在很多作品中都发挥着很重要的作用。
本文将介绍如何通过单片机控制蜂鸣器发出不同频率的声音。
一、硬件设计
我们需要使用一个蜂鸣器和一块单片机开发板,比如STC89C52。
蜂鸣器有正负两个针脚,需要将正极接到控制单片机的GPIO端口上,负极接地即可。
1. 预处理指令
首先需要在头文件中定义单片机的型号和所要使用的GPIO端口。
```
#include <STC89C5xRC.H> //使用STC89C52
#define buzz P2 //定义蜂鸣器控制口
```
2. 主函数
接下来就是核心部分,主函数中需要实现的就是通过改变GPIO口的电平来控制蜂鸣器发出不同频率的声音。
对于控制蜂鸣器发出持久的“滴滴声”,可以采用下面的程序:
程序中先将GPIO口输出低电平,等待一段时间后再输出高电平,蜂鸣器发出持续的“滴滴声”。
如果想控制蜂鸣器发出不同频率的声音,可以修改上述程序中的DelayMs()函数来设置不同的延时时间。
因为蜂鸣器的振动频率与输入信号的高低电平时间比例有关,所以延时时间变化会使输出的声音频率发生变化。
比如,如果想让蜂鸣器发出音调为“咳咳声”,可以改变延时时间来实现。
如此,蜂鸣器就发出了“咳咳声”。
以上就是单片机蜂鸣器发声的基本方法,不同的延时时间可以产生不同的声音效果,可以根据实际需要进行调整。
基于c51单片机编写简单蜂鸣器音乐程序的方法
/*o*/case 0xff:j=0;break;
}
return j;
}
void sound(uint s)//给一次脉冲来进行发声的子程序,其中参数s与m_t()中的0x01等十六进制数是对应的
0x01,0x0d,0x16,0x1c,0xff,0x1c,0x1c,0x16,0x07,0x07,0x10,0x0d,0xff, 0x01,0x0d,0x16,0x1c,0xff,
0x1c,0x1c,0x22,0x1c,0x16,0x10,0x0d,0x10,0x0d,0x07,0x01,0x00} ;//*
以下是本人编写的一段简单音乐程序,程序已经在板子上调试成功,水平有限,如有不正确的地方请多包涵
*******************************************************************************************************/
#include<reg52.H>
#include <intrins.h> //内部包含延时函数_nop_();
typedef unsigned char uchar;
typedef unsigned int uint;
uint c;
sbit spk =P2^0 ; //定义p2.0口为电平信号输出端
最后在主程序中运行子程序,通过读rom里面的数组来达到连续播放各种不同音调的音的目的,这样听起来就像一首曲子了。
以下是我按以上方法编写的一个小程序:
两只老虎汇编程序
一、课程设计题目1、题目:乐曲程序(2)2、实验要求:采用定时器方式编写程序,使计算机发出音响并演奏出《两只老虎》的乐曲。
二、程序原理介绍PC机上的大多数输入/输出(I/O)都是由系统插件板上的8255(或8255A)可编程外围接口芯片(PPI)管理的。
PPI包括三个8位寄存器,两个用于输入功能,一个用于输出功能。
输入寄存器分配的I/O端口号为60H和62H,输出寄存器分配的I/O端口号为61H。
由PPI的输出寄存器中的两位来选择扬声器的驱动方式(见图一:扬声器驱动系统)。
当输出寄存器(I/O 端口61H)的第0位为1时,控制8254定时器来驱动扬声器,当第1位为1时,扬声器的门电路接通,并一直保持到位1变为0时关闭。
即控制电路能以位触发和定时器控制两种不同的方式驱动扬声器发声。
下面主要介绍利用定时器产生声音的原理.这是利用机器硬件即INTEL8253/8254定时器产生声音的一种方法。
CPU通过对定时器的通道2(端口地址为42H)进行编程,使其I/O寄存器接收一控制声音频率的16位计数值,端口61H的最低控制通道2门控的开断,以产生特殊的音响。
当定时器接收的计数值为533H 时,能产生896Hz的声音,因此产生其它频率(Freq)的计数值就可由下式计算出来:533H×896÷Freq=1234DCH÷Freq在送出频率计数值之前,还要给方式寄存器(其端口地址为43H)送一个方式值,也称为幻数,这个幻数决定对哪一个通道编程,采用什么模式,送入通道的计数和值是一字节还是两字节,是二进制码还是BCD码。
其位组合的格式如下:当通道2用于发声时,一般采用模式3,在模式3下,输出线为“1”和为“0”的时间各占计数时间的一半,因而产生一系列间隔均匀的脉冲。
(一)通用发声程序原理ROM BIOS 中有个BEEP子程序,这能根据BL中组出的时间计数值控制8254定时器,产生持续时间为1个或几个0.5秒,频率为896HZ的声音,我们可以利用并修改BEEP,使其产生任一频率的声音。
单片机使用4个独立按键控制蜂鸣器代码
单片机使用4个独立按键控制蜂鸣器代码下面是使用单片机控制蜂鸣器,使用4个独立按键的示例代码:```c#include <reg52.h> // 8052 单片机头文件sbit beep=P1^5; // 将蜂鸣器引脚定义为 P1.5sbit key1=P3^1; // 定义四个按键引脚为 P3.1 到 P3.4sbit key2=P3^2;sbit key3=P3^3;sbit key4=P3^4;void delay(unsigned int t) // 延时函数{unsigned int i,j;for(i=0;i<t;i++)for(j=0;j<125;j++);}void main(){beep = 0; // 蜂鸣器关闭while(1){if(key1 == 0) // 首先检测按键1是否按下{beep = ~beep; // 取反控制蜂鸣器开/关delay(500); // 延时以避免误触}else if(key2 == 0) // 随后检测按键2是否按下{beep = 0; // 关闭蜂鸣器delay(500);}else if(key3 == 0) // 然后检测按键3是否按下{beep = 1; // 打开蜂鸣器delay(500);}else if(key4 == 0) // 最后检测按键4是否按下{beep = 0; // 关闭蜂鸣器delay(500);}}}```在上述代码中,我们首先定义了蜂鸣器引脚 `beep`,以及四个按键引脚 `key1` 到 `key4`。
然后,我们通过 `delay` 函数来延时防止误碰。
在无限循环中,我们检测四个按键的状态,如果有按键被按下,我们会对蜂鸣器进行相应的操作。
按键1控制开/关蜂鸣器,按键2关闭蜂鸣器,按键3打开蜂鸣器,按键4同样关闭蜂鸣器。
蜂鸣器唱歌程序
蜂鸣器唱歌----生日快乐下面是我单片机入门的时候写的一个蜂鸣器唱歌的程序,用的是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表示一拍,以此类推。
蜂鸣器唱两只老虎单片机程序
蜂鸣器唱两只老虎单片机程序#include<> //包含52单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为unsigned int C; //储存定时器的定时常数//以下是C调中音的音频宏定义#define dao 523 //将"dao"宏定义为中音"1"的频率523Hz #define re 587 //将"re"宏定义为中音"2"的频率587Hz#define mi 659 //将"mi"宏定义为中音"3"的频率659Hz #define fa 698 //将"fa"宏定义为中音"4"的频率698Hz#define sao 784 //将"sao"宏定义为中音"5"的频率784Hz #define la 880 //将"la"宏定义为中音"6"的频率880Hz#define xi 987 //将"xi"宏定义为中音"7"的频率523Hz/*函数功能:1个延时单位,延时200ms/void delay(){unsigned char i,j;for(i=0;i<250;i++)for(j=0;j<250;j++);}/*函数功能:主函数/void main(void){unsigned char i,j;//以下是《两只老虎》歌曲unsigned int code f[]={dao,re,mi,dao, //每行对应一小节音符dao,re,mi,dao,mi,fa,sao,mi,fa,sao,sao,la,sao,fa,mi,dao,sao,la,sao,fa,mi,dao,dao,sao,dao,dao,sao,dao,0xff}; //以0xff作为音符的结束标志//以下是简谱中每个音符的节拍//"4"对应4个延时单位,"2"对应2个延时单位,"1"对应1个延时单位unsigned char code JP[ ]={2,2,2,2,2,2,2,2,2,2,3,2,2,3,1,2,2,1,2,2,1,2,2,1,2,2,2,2,2,2,2,2,};EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x00; // 使用定时器T0的模式1(13位计数器)while(1) //无限循环{i=0; //从第1个音符f[0]开始播放while(f[i]!=0xff) //只要没有读到结束标志就继续播放{C=460830/f[i];TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法TL0=(8192-C)%32; //可证明这是13位计数器TL0低5位的赋初值方法TR0=1; //启动定时器T0for(j=0;j<="">delay(); //延时1个节拍单位TR0=0; //关闭定时器T0i++; //播放下一个音符}}}/*****函数功能:定时器T0的中断服务子程序,使引脚输出音频的方波/void Time0(void ) interrupt 1 using 1{sound=!sound; //将引脚输出电平取反,形成方波TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法TL0=(8192-C)%32; //可证明这是13位计数器TL0低5位的赋初值方法}。
用单片机驱动蜂鸣器唱歌的设计与原理
用单片机驱动蜂鸣器唱歌的设计与原理1.蜂鸣器蜂鸣器是一种一体化结构的电子讯响器,主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型,他广泛应用于计算机、打印机、复印机、报警器、电话机等电子产品中作发声器件。
2.单片机驱动单片机上面使用的蜂鸣器一般都是无源电磁式的蜂鸣器(如下图所示)。
它由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。
接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。
单片机与蜂鸣器连接如图二所示。
图中,蜂鸣器的正极接到VCC(+5V)电源上面,蜂鸣器的负极接到三极管的发射极E,三极管的基级B经过限流电阻R1后由单片机的P3.7引脚控制,当P3.7输出高电平时,三极管T1截止,没有电流流过线圈,蜂鸣器不发声;当P3.7输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。
因此,我们可以通过程序控制P3.7脚的电平来使蜂鸣器发出声音和关闭。
程序中改变单片机P3.7引脚输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。
另外,改变P3.7输出电平的高低电平占空比,则可以控制蜂鸣器的声音大小,这些我们都可以通过编程实验来验证。
下面就是一个能够发出音乐的单片机程序,示例中所播放的音乐是《两只老虎》。
SPK EQU P3.7 ;位定义ORG 0000H ;伪指令,指定程序从0000H开始存放LJMP START ;程序跳转至START处执行ORG 0030H ;伪指令,指定程序从0030H开始存放START: MOV SP,#60H ;堆栈初始化MOV R3,#00H ;给R3赋值NEXT:MOV A,R3MOV DPTR,#TABLE ;查歌曲表MOVC A,@A+DPTRJZ START ;为00则循环播放此歌MOV R7,A ;R7/R2保存连续相邻的表数据INC R3MOV A,R3MOVC A,@A+DPTRMOV R2,AACALL SONGINC R3SJMP NEXT;==============================;=========歌曲播放子程序==========;============================== SONG:MOV A,R2 ;取出节拍RL AJNZ KEEP ;A不等于零则跳MOV A,#01H ;A等于零则赋值为1 KEEP:MOV R2,A ;REPEAT:ACALL EIGHTH ;调用1/8拍延时程序DJNZ R2,REPEAT ;RET;===============================;=======产生1/8拍延时子程序=======;===============================EIGHTH:MOV A,R7 ;查表取出延时参数,保存到R4MOV DPTR,#DELAY_TMOVC A,@A+DPTRMOV R4,AMOV A,R7 ;查表取出1/8拍周期数,保存到R5 MOV DPTR,#S_PARAMOVC A,@A+DPTRMOV R5,ANEXTCYC:ACALL SOUNDDJNZ R5,NEXTCYCRET;==============================;===========发声子程序===========;==============================SOUND:SETB SPKACALL SDELAYCLR SPKACALL SDELAYRET;==============================;============================== SDELAY:MOV A,R4 ;延时值在R4内MOV R0,AXL2:MOV R1,#03HDL1:NOPDJNZ R1,DL1DJNZ R0,XL2RET;============================== ;===========1/8拍周期表========== ;============================== S_PARA:DS 1DHDB 15H,16H,00DB 19H,00H,1CH,00H,1FH,21H,00H,25HDB 00H,29H,2CH,00H,31H,34H,37H,00HDB 3EH,41H,00H,49H,00H,52H,57H,00HDB 62H;==============================;============================== DELAY_T:DS 1DHDB 7EH,77H,00HDB 6AH,00H,5EH,00H,54H,4FH,00H,46HDB 00H,3FH,3BH,00H,35H,32H,2FH,00HDB 2AH,27H,00H,23H,00H,1FH,1DH,0C0HDB 1AH;============================== ;============歌曲表============= ;============================== TABLE:DW 2504H,2704H,2904H,2504HDW 2504H,2704H,2904H,2504HDW 2904H,2A04H,2C08HDW 2904H,2A04H,2C08HDW 2C02H,2E02H,2C02H,2A02H,2904H,2504H DW 2C02H,2E02H,2C02H,2A02H,2904H,2504H DW 2904H,2004H,2508HDW 2904H,2004H,2508HDW 0000HEND童鞋们可能发现了,数据表TABLE里面的数据才是歌曲数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<> //包含52单片机寄存器定义的头文件
sbit sound=P3^7; //将sound位定义为
unsigned int C; //储存定时器的定时常数
//以下是C调中音的音频宏定义
#define dao 523 //将"dao"宏定义为中音"1"的频率523Hz
#define re 587 //将"re"宏定义为中音"2"的频率587Hz
#define mi 659 //将"mi"宏定义为中音"3"的频率659Hz
#define fa 698 //将"fa"宏定义为中音"4"的频率698Hz
#define sao 784 //将"sao"宏定义为中音"5"的频率784Hz
#define la 880 //将"la"宏定义为中音"6"的频率880Hz
#define xi 987 //将"xi"宏定义为中音"7"的频率523Hz
/*******************************************
函数功能:1个延时单位,延时200ms
******************************************/
void delay()
{
unsigned char i,j;
for(i=0;i<250;i++)
for(j=0;j<250;j++)
;
}
/*******************************************
函数功能:主函数
******************************************/
void main(void)
{
unsigned char i,j;
//以下是《两只老虎》歌曲
unsigned int code f[]={dao,re,mi,dao, //每行对应一小节音符
dao,re,mi,dao,
mi,fa,sao,
mi,fa,sao,
sao,la,sao,fa,mi,dao,
sao,la,sao,fa,mi,dao,
dao,sao,dao,
dao,sao,dao,
0xff}; //以0xff作为音符的结束标志
//以下是简谱中每个音符的节拍
//"4"对应4个延时单位,"2"对应2个延时单位,"1"对应1个延时单位unsigned char code JP[ ]={2,2,2,2,
2,2,2,2,
2,2,3,
2,2,3,
1,2,2,1,2,2,
1,2,2,1,2,2,
2,2,2,
2,2,2,
};
EA=1; //开总中断
ET0=1; //定时器T0中断允许
TMOD=0x00; // 使用定时器T0的模式1(13位计数器)
while(1) //无限循环
{
i=0; //从第1个音符f[0]开始播放
while(f[i]!=0xff) //只要没有读到结束标志就继续播放
{
C=460830/f[i];
TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法
TL0=(8192-C)%32; //可证明这是13位计数器TL0低5位的赋初值方法
TR0=1; //启动定时器T0
for(j=0;j<JP[i];j++) //控制节拍数
delay(); //延时1个节拍单位
TR0=0; //关闭定时器T0
i++; //播放下一个音符
}
}
}
/***********************************************************
函数功能:定时器T0的中断服务子程序,使引脚输出音频的方波
************************************************************/
void Time0(void ) interrupt 1 using 1
{
sound=!sound; //将引脚输出电平取反,形成方波
TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法
TL0=(8192-C)%32; //可证明这是13位计数器TL0低5位的赋初值方法
}。