首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

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

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

用单片机驱动蜂鸣器唱歌的设计与原理 1.蜂鸣器 蜂鸣器是一种一体化结构的电子讯响器,主要分为压电式蜂鸣器和电 磁式蜂鸣器两种类型,他广泛应用于计算机、打印机、复印机、报警器、 电话机等电子产品中作发声器件。
2.单片机驱动 单片机上面使用的蜂鸣器一般都是无源电磁式的蜂鸣器(如下图所 示)。它由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源 后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振 动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振 动膜发声的,因此需要一定的电流才能驱动它,单片机 IO 引脚输出的电 流较小,单片机输出的 TTL 电平基本上驱动不了蜂鸣器,因此需要增加一 个电流放大的电路。单片机与蜂鸣器连接如图二所示。
Created with SmartPrinter trail version www.i-enet.com
图中,蜂鸣器的正极接到 VCC(+5V)电源上面,蜂鸣器的负极接到 三极管的发射极 E,三极管的基级 B 经过限流电阻 R1 后由单片机的 P3.7 引脚控制,当 P3.7 输出高电平时,三极管 T1 截止,没有电流流过线圈, 蜂鸣器不发声;当 P3.7 输出低电平时,三极管导通,这样蜂鸣器的电流 形成回路,发出声音。因此,我们可以通过程序控制 P3.7 脚的电平来使 蜂鸣器发出声音和关闭。 程序中改变单片机 P3.7 引脚输出波形的频率, 就可以调整控制蜂鸣器 音调,产生各种不同音色、音调的声音。另外,改变 P3.7 输出电平的高 低电平占空比,则可以控制蜂鸣器的声音大小,这些我们都可以通过编程 实验来验证。 下面就是一个能够发出音乐的单片机程序,示例中所播放的音乐是 《两只老虎》。 SPK EQU P3.7 ORG 放 LJMP ORG 放 START: MOV NEXT: MOV MOV A,R3 DPTR,#TABLE ;查歌曲表 MOV SP,#60H ;堆栈初始化 ;给 R3 赋值 START 0030H ;程序跳转至 START 处执行 ;伪指令,指定程序从 0030H 开始存 0000H ;位定义 ;伪指令,指定程序从 0000H 开始存
R3,#00H
Created with SmartPrinter trail version www.i-enet.com
MOVC JZ MOV INC MOV MOVC MOV ACALL INC SJMP
A,@A+DPTR START R7,A R3 A,R3 A,@A+DPTR R2,A SONG R3 NEXT ;为 00 则循环播放此歌 ;R7/R2 保存连续相邻的表数据
;============================== ;=========歌曲播放子程序========== ;============================== SONG: MOV RL JNZ MOV KEEP: MOV REPEAT: ACALL DJNZ EIGHTH R2,REPEAT ; ;调用 1/8 拍延时程序 R2,A ; A,R2 A KEEP A,#01H ;A 不等于零则跳 ;A 等于零则赋值为 1 ;取出节拍
Created with SmartPrinter trail version www.i-enet.com
RET ;=============================== ;=======产生 1/8 拍延时子程序======= ;=============================== EIGHTH : MOV MOV MOVC MOV MOV MOV MOVC MOV NEXTCYC: ACALL DJNZ RET ;============================== ;===========发声子程序=========== ;============================== SOUND: SETB ACALL SPK SDELAY SOUND R5,NEXTCYC A,R7 DPTR,#DELAY_T A,@A+DPTR R4,A A,R7 DPTR,#S_PARA A,@A+DPTR R5,A ;查表取出 1/8 拍周期数,保存到 R5 ;查表取出延时参数,保存到 R4
Created with SmartPrinter trail version www.i-enet.com
CLR ACALL RET
SPK SDELAY
;============================== ;===========延时子程序=========== ;============================== SDELAY: MOV MOV XL2: MOV DL1: NOP DJNZ DJNZ RET ;============================== ;===========1/8 拍周期表========== ;============================== S_PARA: DS DB DB 1DH 15H,16H,00 19H,00H,1CH,00H,1FH,21H,00H,25H R1,DL1 R0,XL2 R1,#03H A,R4 R0,A ;延时值在 R4 内
Created with SmartPrinter trail version www.i-enet.com
DB DB DB
00H,29H,2CH,00H,31H,34H,37H,00H 3EH,41H,00H,49H,00H,52H,57H,00H 62H
;============================== ;===========延时参数表=========== ;============================== DELAY_T: DS DB DB DB DB DB 1DH 7EH,77H,00H 6AH,00H,5EH,00H,54H,4FH,00H,46H 00H,3FH,3BH,00H,35H,32H,2FH,00H 2AH,27H,00H,23H,00H,1FH,1DH,0C0H 1AH
;============================== ;============歌曲表============= ;============================== TABLE: DW DW DW DW DW DW 2504H,2704H,2904H,2504H 2504H,2704H,2904H,2504H 2904H,2A04H,2C08H 2904H,2A04H,2C08H 2C02H,2E02H,2C02H,2A02H,2904H,2504H 2C02H,2E02H,2C02H,2A02H,2904H,2504H
Created with SmartPrinter trail version www.i-enet.com
DW DW DW END
2904H,2004H,2508H 2904H,2004H,2508H 0000H
童鞋们可能发现了,数据表 TABLE 里面的数据才是歌曲数据。也就是 说,只要我们改变 TABLE 表里面的数据,就可以播放不同的歌曲了。比 如下面这一首《兰花草》: ;============================== ;============歌曲表============= ;============================== TABLE: DW DW DW DW DW DW DW DW DW END 2202H,2902H,2902H,2902H,2906H,2702H 2502H,2702H,2502H,2402H,2208H 2E02H,2E02H,2E02H,2E02H,2E06H,2C02H 2902H,2C02H,2D02H,2A02H,2908H 2902H,2E02H,2E02H,2C02H,2906H,2702H 2502H,2702H,2502H,2402H,2206H,1D02H 1D02H,2502H,2502H,2402H,2206H,2902H 2702H,2502H,2402H,2002H,2208H 0000H ;我从山中来 ;带着兰花草 ;种在小园中 ;祈祷花开早 ;一日看三回 ;看得花时过 ;兰花却依然 ;苞也无一个
Created with SmartPrinter trail version www.i-enet.com
在 TABLE 表里面的数据都是字类型的,也就是说可以拆分成 2 个 DB 数据。 前一个 DB 数据, 我们用来存放音色, 也就是“dao.rai.mi.fa.sao.la.xi”; 后一个 DB 我们用来存放音长,就是每个音的长度。 对于音色,可以查下面的表,数值越大,频率越高,音色也就越高(X. 的意思是低音)。而对于音长,数值越大,响的越持久。 1 2 3 4 5 6 7 25H 1. 27H 2. 29H 3. 2AH 4. 2CH 5. 2EH 6. 30H 7. 19H 1BH 1DH 1FH 20H 22H 24H
如果写出来的歌曲不是很像,多调试一下就可以了。
返回列表