蜂鸣器音乐发生器实验报告
蜂鸣器实训报告

一、实训目的本次蜂鸣器实训的主要目的是通过实际操作,掌握蜂鸣器的工作原理、电路连接方法及其在电子项目中的应用。
通过实训,提升对电子元件的认识,增强动手实践能力,并培养解决实际问题的能力。
二、实训时间2023年X月X日至2023年X月X日三、实训地点电子实验室四、实训内容1. 蜂鸣器基本原理蜂鸣器是一种电子元件,它可以将电信号转换为声信号。
当通过蜂鸣器的电流发生变化时,蜂鸣器内部的电磁铁会产生振动,从而发出声音。
蜂鸣器分为无源蜂鸣器和有源蜂鸣器两种类型。
2. 蜂鸣器电路连接在本次实训中,我们主要学习了无源蜂鸣器的电路连接方法。
首先,我们需要准备以下材料:蜂鸣器、面包板、导线、电源、电阻等。
具体步骤如下:(1)将蜂鸣器的正负极分别与面包板上的两个孔相连;(2)将电阻的一端与蜂鸣器的正极相连,另一端与电源的正极相连;(3)将电源的负极与蜂鸣器的负极相连;(4)将电阻的另一端与电源的负极相连,形成一个完整的电路。
3. 蜂鸣器应用在电子项目中,蜂鸣器可以用来发出警告声、提示音等。
以下是一些蜂鸣器的应用实例:(1)电子门铃:当有人按下按钮时,蜂鸣器发出铃声;(2)温度报警器:当温度超过设定值时,蜂鸣器发出警报声;(3)水位报警器:当水位超过设定值时,蜂鸣器发出警报声。
五、实训过程1. 准备阶段在实训开始前,我们首先对蜂鸣器的基本原理进行了学习,了解了蜂鸣器的种类、工作原理以及电路连接方法。
2. 实践操作在实验室老师的指导下,我们按照步骤将蜂鸣器连接到电路中。
在连接过程中,我们注意了以下几点:(1)确保电路连接正确,避免短路或断路;(2)注意电源电压的选择,避免对蜂鸣器造成损害;(3)观察蜂鸣器的工作状态,确保其能够正常发出声音。
3. 问题解决在实训过程中,我们遇到了一些问题,如电路连接错误、蜂鸣器不发声等。
通过查阅资料、与同学讨论以及向老师请教,我们成功解决了这些问题。
六、实训总结通过本次蜂鸣器实训,我收获颇丰。
单片机实验报告蜂鸣器

一、实验目的1. 熟悉51单片机的基本结构和工作原理。
2. 掌握51单片机的I/O口编程方法。
3. 学习蜂鸣器的驱动原理和应用。
4. 通过实验,提高动手实践能力和问题解决能力。
二、实验原理蜂鸣器是一种将电信号转换为声音信号的器件,常用于产生按键音、报警音等提示信号。
根据驱动方式,蜂鸣器可分为有源蜂鸣器和无源蜂鸣器。
1. 有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定。
2. 无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才能发声,调整提供振荡脉冲的频率,可发出不同频率的声音。
在本次实验中,我们使用的是无源蜂鸣器。
51单片机通过控制P1.5端口的电平,产生周期性的方波信号,驱动蜂鸣器发声。
三、实验器材1. 51单片机实验板2. 蜂鸣器3. 连接线4. 电路焊接工具5. 编程软件(如Keil)四、实验步骤1. 电路连接:- 将蜂鸣器的正极连接到51单片机的P1.5端口。
- 将蜂鸣器的负极接地。
2. 程序编写:- 使用Keil软件编写程序,实现以下功能:1. 初始化P1.5端口为输出模式。
2. 通过循环,不断改变P1.5端口的电平,产生方波信号。
3. 调整方波信号的频率,控制蜂鸣器的音调。
3. 程序下载:- 将程序下载到51单片机中。
4. 实验观察:- 启动程序后,观察蜂鸣器是否发声,以及音调是否与程序设置一致。
五、实验结果与分析1. 实验结果:- 成功驱动蜂鸣器发声,音调与程序设置一致。
2. 结果分析:- 通过实验,我们掌握了51单片机的I/O口编程方法,以及蜂鸣器的驱动原理。
- 在程序编写过程中,我们学习了方波信号的生成方法,以及如何调整方波信号的频率。
六、实验总结本次实验成功地实现了51单片机控制蜂鸣器发声的功能,达到了预期的实验目的。
通过本次实验,我们提高了以下能力:1. 对51单片机的基本结构和工作原理有了更深入的了解。
2. 掌握了51单片机的I/O口编程方法。
3. 学习了蜂鸣器的驱动原理和应用。
单片机实验报告蜂鸣器

单片机实验报告蜂鸣器单片机实验报告:蜂鸣器引言:单片机是现代电子技术中的重要组成部分,其广泛应用于各个领域。
蜂鸣器作为一种常见的声音输出设备,在单片机实验中也被广泛使用。
本文将介绍蜂鸣器的原理、实验过程以及实验结果,并对实验中遇到的问题进行分析和解决。
一、蜂鸣器的原理蜂鸣器是一种能够产生声音的装置,其原理基于压电效应。
压电材料在受到外力作用时会产生电荷,而当外力消失时,压电材料则会产生相反方向的电荷。
利用这种特性,蜂鸣器可以通过施加电压来使压电材料振动,从而产生声音。
二、实验过程1. 准备工作:首先,我们需要准备一块单片机开发板、一个蜂鸣器和相关电路连接线。
2. 连接电路:将单片机的IO口与蜂鸣器连接,注意正确连接正负极。
一般情况下,蜂鸣器的正极连接到单片机的IO口,负极连接到GND。
3. 编写程序:使用单片机开发工具,编写一个简单的程序来控制蜂鸣器。
例如,我们可以通过控制IO口的高低电平来控制蜂鸣器的开关状态。
4. 烧录程序:将编写好的程序烧录到单片机中。
5. 实验测试:将单片机开发板连接到电源,观察蜂鸣器是否发出声音。
可以通过改变程序中IO口的电平来控制蜂鸣器的开关状态,从而产生不同的声音。
三、实验结果经过实验,我们成功地控制了蜂鸣器的开关状态,并产生了不同的声音效果。
通过改变程序中IO口电平的高低,我们可以调节蜂鸣器的频率和音调。
此外,我们还可以通过控制IO口的输出时间来调节蜂鸣器发声的时长。
四、问题分析与解决在实验过程中,我们可能会遇到一些问题,例如蜂鸣器无法发声或声音不稳定等。
这些问题可能是由以下原因引起的:1. 连接错误:检查蜂鸣器的正负极是否正确连接到单片机的IO口和GND。
确保连接线没有松动或接触不良。
2. 程序错误:检查程序中的代码是否正确,特别是IO口的控制部分。
确保程序正确地控制了蜂鸣器的开关状态。
3. 电源问题:检查单片机开发板的电源是否正常。
如果电源电压不稳定,可能会导致蜂鸣器无法正常工作。
蜂鸣器谱曲实验报告

一、实验目的1. 了解蜂鸣器的工作原理和特性;2. 掌握蜂鸣器谱曲的基本方法;3. 通过实验,验证蜂鸣器演奏音乐的效果。
二、实验原理蜂鸣器是一种电磁声音变换器,它利用电信号的变化产生声音。
蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。
当接通电源后,多谐振荡器起振,输出音频信号,阻抗匹配器推动压电蜂鸣片发声。
蜂鸣器谱曲的基本方法是通过编程控制蜂鸣器发出不同频率的音频信号,从而实现演奏音乐的效果。
音乐由音调和节拍两个主要元素组成,对于蜂鸣器来说,频率的高低决定了音调的高低。
三、实验器材1. 蜂鸣器;2. 电脑;3. 编程软件(如C语言、Python等);4. 连接线和电源。
四、实验步骤1. 连接蜂鸣器将蜂鸣器的正负极分别连接到电脑的GPIO(通用输入输出)端口,确保连接正确。
2. 编写程序使用编程软件编写程序,实现以下功能:(1)初始化蜂鸣器端口;(2)定义音乐音符频率表,包括音符、频率和持续时间;(3)根据音符频率和持续时间,通过GPIO端口控制蜂鸣器发出相应频率的音频信号;(4)循环播放音乐音符,实现整首歌曲的演奏。
3. 编译程序将编写好的程序编译成可执行文件。
4. 播放音乐将编译好的程序运行在电脑上,观察蜂鸣器是否能够演奏出预定的音乐。
五、实验结果与分析1. 实验结果通过编程控制蜂鸣器,成功演奏了一首简单的歌曲。
播放过程中,蜂鸣器能够发出不同频率的音频信号,实现音乐演奏的效果。
2. 分析(1)蜂鸣器能够发出不同频率的音频信号,说明蜂鸣器具有较好的音质表现。
(2)通过编程控制蜂鸣器,可以实现音乐演奏的效果,说明蜂鸣器在音乐领域的应用前景广阔。
(3)实验过程中,由于蜂鸣器受到电源、环境等因素的影响,可能导致音质不够理想。
在今后的实验中,可以尝试优化程序,提高音质。
六、实验总结1. 通过本次实验,了解了蜂鸣器的工作原理和特性,掌握了蜂鸣器谱曲的基本方法。
2. 实验结果表明,蜂鸣器能够发出不同频率的音频信号,实现音乐演奏的效果。
单片机《蜂鸣器》实验报告

单片机《蜂鸣器》实验报告单片机《蜂鸣器》实验报告一、实验目的本次实验旨在通过单片机的控制,实现对蜂鸣器的驱动和发声控制,进一步了解蜂鸣器的工作原理及应用。
二、实验原理蜂鸣器是一种电子发声器件,常用于发出警告、提示或声音信号。
其工作原理是利用电磁感应原理,在蜂鸣器线圈中通入电流时,会产生磁场,该磁场与蜂鸣器内部的一块磁铁产生相互作用力,使蜂鸣器内部的膜片发生振动,从而发出声音。
在本实验中,我们将通过单片机控制蜂鸣器的驱动信号,使其发出不同的声音,从而实现单片机对蜂鸣器的控制。
三、实验步骤1、准备实验器材:单片机开发板、蜂鸣器模块、杜邦线等。
2、将蜂鸣器模块连接至单片机开发板的某个数字引脚上。
3、通过单片机编程软件编写控制程序,实现对蜂鸣器的控制。
4、将编写好的程序下载到单片机开发板中,并进行调试。
5、通过单片机控制蜂鸣器发出不同的声音,观察其工作情况。
四、实验结果与分析1、实验结果通过本次实验,我们成功实现了单片机对蜂鸣器的控制,可以通过编写不同的程序,使蜂鸣器发出不同的声音。
以下是实验中蜂鸣器发出的声音及其对应的程序代码:(1) 发出“滴”的一声(2) 发出“嘟嘟”的警告声2、结果分析通过实验结果可以看出,通过单片机对蜂鸣器进行控制,可以实现发出不同声音的效果。
在第一个实验中,我们通过设置引脚的高低电平及延时时间,使蜂鸣器发出一声“滴”的声音。
在第二个实验中,我们通过一个无限循环,使蜂鸣器发出“嘟嘟”的警告声。
五、结论与展望通过本次实验,我们深入了解了蜂鸣器的工作原理及应用,并成功实现了单片机对蜂鸣器的控制。
实验结果表明,我们可以根据实际需要编写不同的程序,实现对蜂鸣器的灵活控制。
展望未来,我们可以进一步研究蜂鸣器的其他应用场景,例如在智能家居、机器人等领域中的应用。
我们也可以通过其他方式对蜂鸣器进行控制,例如通过传感器采集信号或者通过无线网络进行远程控制等。
基于51单片机的蜂鸣器实验

第5讲
蜂鸣器的使用
蜂鸣器的发声
• 本讲任务: •如何驱动蜂鸣器发声 •简单蜂鸣器发声实验 •给上节课的流水灯加入报警效果 •蜂鸣器演奏音器:有绿色电路板的一
种是无源蜂鸣器,没有电路板而用黑胶封 闭的一种是有源蜂鸣器。
蜂鸣器
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,
蜂鸣器驱动电路
由于蜂鸣器的工作电流一般比较大,
以致于单片机的I/O 口是无法直接 驱动的,所以要利用放大电路来驱 动,一般使用三极管来放大电流就 可以了
了解一下实验板蜂鸣器电路
蜂鸣器软件设计方法
• 软件设计方法 • IO口电平取反方法:I/O 口的电平进行翻转一 次,直到蜂鸣器不需要鸣叫的时候,将I/O 口 的电平设置为高电平即可。
广泛应用于计算机、打印机、复印机、报警器、电子玩具、 汽车电子设备、电话机、定时器等电子产品中作发声器件。 蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂 鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“LB”、 “JD”等)表示。 有源蜂鸣器和无源蜂鸣器:判断有源蜂鸣器和无源蜂鸣器, 还可以用万用表电阻档Rxl档测试:用黑表笔接蜂鸣器"+"引脚, 红表笔在另一引脚上来回碰触,如果触发出咔、咔声的且电 阻只有8Ω(或16Ω)的是无源蜂 蜂鸣器,如果能发出持续声音 的,且电阻在几百欧以上的,是有源蜂鸣器。
有源蜂鸣器和无源蜂鸣器
这里的“源”不是指电源。而是指震荡源。 也就是 说有源蜂鸣器内部带震荡源,所以只要一通电就会 叫。 而无源内部不带震荡源,所以如果用直流信号无法 令其鸣叫。必须用2K~5K的方波去驱动它。 有源蜂鸣器往往比无源的贵,就是因为里面多个震 荡电路。 无源蜂鸣器的优点是:1。便宜,2。声音频率可控, 可以做出“多来米发索拉西”的效果。3。在一些 特例中,可以和LED复用一个控制口 有源蜂鸣器的 优点是:程序控制方便 。
蜂鸣器音乐发生器实验报告

蜂鸣器音乐发生器实验报告一、实验目的(1)学习用数控分频器设计蜂鸣器音乐发生电路。
(2)了解乐谱的基本知识,可以将乐谱转换为Quartus II 文件,掌握其演奏的原理。
(3)掌握设计中各模块的功能,能够填入并演奏新的曲子。
二、实验设备与器件Quartus II 软件、EP2C8Q208C8实验箱三、实验方案设计1. 实验可实现的功能(1)蜂鸣器可以演奏四首音乐,四首音乐通过两个拨码开关控制,可以随意更改想听的曲目。
(2)在播放音乐的同时,用一位数码管显示当前音乐的简谱,并且用两个发光二极管显示高、中、低不同的音调。
(3)在用拨码开关选择曲目的同时,可以在LCD1602液晶屏上看到当前音乐的名称。
2. 音频方案设计蜂鸣器音乐发生器的基本原理:组成乐曲的每个音调的频率值以及音长所延续的时间是乐曲能够连续演奏的两个基本数据,所以只要控制输出到蜂鸣器的时钟信号频率的高低和持续的时间,就可以使蜂鸣器发出连续的乐曲声。
(1)音调频率值的控制简谱中音调与音频的对应关系如表3.2.1所示,表中的低、中、高音的频率遵循二倍规则,就是说中音1是低音1频率的2倍,高音1是中音1频率的2倍,以此类推。
已知低音的频率,可以通过如下的MATLAB程序计算出中、高音的频率,并且可以得出各音调的分频值与频率预直数,其中预置数是用11位计数器来表示的。
计算中、高音及各音调分频值与频率预置数的MATLAB程序:clc;f=50000000; %50MHzbilv=2^(1/12); %相邻音调频率之间的比率a(6)=440.0; %低音6的频率为440Hza(7)=a(6)*bilv*bilv; %低音7的频率a(5)=a(6)/bilv/bilv; %低音5的频率a(4)=a(5)/bilv/bilv; %低音4的频率a(3)=a(4)/bilv; %低音3的频率a(2)=a(3)/bilv/bilv; %低音2的频率a(1)=a(2)/bilv/bilv; %低音1的频率b=a*2; %中音的频率c=b*2; %高音的频率counter=2^11; %分频值对应的位数为11位f=f/50/2; %50MHz,50分频,再2分频for i=1:7zhia(i)=counter-f/a(i); %低音的分频预置数zhib(i)=counter-f/b(i); %中音的分频预置数zhic(i)=counter-f/c(i); %高音的分频预置数end音调、分频值及频率预置数的表格如下:表3.2.1 音符、音频及其预置数低音音符 1 2 3 4 5 6 7 音频/Hz 262 294 330 349 392 440 494 预置数137 345 531 616 772 912 1036中音音符 1 2 3 4 5 6 7 音频/Hz 523 587 659 698 784 880 988 预置数1092 1197 1290 1332 1410 1480 1542高音音符 1 2 3 4 5 6 7 音频/Hz 1047 1175 1319 1397 1568 1760 1976 预置数1570 1622 1669 1690 1729 1764 1795(2)音调持续时间的控制音乐中的银除了有高低音之分外,还有长短之分。
蜂鸣器实验心得与建议

蜂鸣器实验心得与建议蜂鸣器是一种常见的声音发生器,通过控制信号的频率和持续时间,可以产生不同的声音效果。
在学习电子技术和嵌入式系统时,蜂鸣器是一个很好的实验对象,可以帮助我们深入理解数字信号处理和控制电路的原理。
在进行蜂鸣器实验的过程中,我有一些心得和建议,希望能对初学者有所帮助。
一、实验心得1. 熟悉蜂鸣器的基本原理在进行蜂鸣器实验之前,我们要先了解蜂鸣器的基本工作原理。
蜂鸣器是一种电声转换器,将电信号转换为声音信号。
在控制蜂鸣器时,我们需要关注两个参数,一个是频率,一个是持续时间。
通过控制这两个参数,可以产生不同的声音效果。
2. 学习控制蜂鸣器的方法控制蜂鸣器可以使用数字信号处理的方法,也可以使用模拟电路的方法。
在学习控制蜂鸣器时,我们需要了解各种控制方法的原理和优缺点,选择适合自己的方法。
3. 多做实验多做实验是学习蜂鸣器的关键。
通过实验,我们可以深入了解蜂鸣器的工作原理,掌握控制蜂鸣器的方法。
在实验过程中,如果出现问题,我们要仔细分析原因,找到解决办法。
4. 掌握调试技巧调试是实验过程中最关键的一步。
如果调试不好,实验结果可能会偏差很大。
在调试过程中,我们需要掌握一些基本的调试技巧,如断点调试、单步调试、变量监视等,可以帮助我们快速找到问题所在。
二、实验建议1. 准备好必要的工具和材料在进行蜂鸣器实验之前,我们需要准备好必要的工具和材料,如面包板、电路图、电阻、电容、开关、蜂鸣器等。
在选择材料时,我们要注意其参数是否符合要求,以免影响实验效果。
2. 先进行模拟电路实验在进行数字信号处理实验之前,我们可以先进行模拟电路实验。
模拟电路实验可以帮助我们了解蜂鸣器的基本工作原理和控制方法,为后续的数字信号处理实验打下基础。
3. 选择适合自己的控制方法控制蜂鸣器可以使用数字信号处理的方法,也可以使用模拟电路的方法。
在选择控制方法时,我们要考虑自己的技术水平和实验要求,选择适合自己的方法。
4. 注意电路的稳定性蜂鸣器实验中,电路的稳定性非常重要。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
蜂鸣器音乐发生器实验报告一、实验目的(1)学习用数控分频器设计蜂鸣器音乐发生电路。
(2)了解乐谱的基本知识,可以将乐谱转换为Quartus II 文件,掌握其演奏的原理。
(3)掌握设计中各模块的功能,能够填入并演奏新的曲子。
二、实验设备与器件Quartus II 软件、EP2C8Q208C8实验箱三、实验方案设计1. 实验可实现的功能(1)蜂鸣器可以演奏四首音乐,四首音乐通过两个拨码开关控制,可以随意更改想听的曲目。
(2)在播放音乐的同时,用一位数码管显示当前音乐的简谱,并且用两个发光二极管显示高、中、低不同的音调。
(3)在用拨码开关选择曲目的同时,可以在LCD1602液晶屏上看到当前音乐的名称。
2. 音频方案设计蜂鸣器音乐发生器的基本原理:组成乐曲的每个音调的频率值以及音长所延续的时间是乐曲能够连续演奏的两个基本数据,所以只要控制输出到蜂鸣器的时钟信号频率的高低和持续的时间,就可以使蜂鸣器发出连续的乐曲声。
(1)音调频率值的控制简谱中音调与音频的对应关系如表3.2.1所示,表中的低、中、高音的频率遵循二倍规则,就是说中音1是低音1频率的2倍,高音1是中音1频率的2倍,以此类推。
已知低音的频率,可以通过如下的MATLAB程序计算出中、高音的频率,并且可以得出各音调的分频值与频率预直数,其中预置数是用11位计数器来表示的。
计算中、高音及各音调分频值与频率预置数的MATLAB程序:clc;f=50000000; %50MHzbilv=2^(1/12); %相邻音调频率之间的比率a(6)=440.0; %低音6的频率为440Hza(7)=a(6)*bilv*bilv; %低音7的频率a(5)=a(6)/bilv/bilv; %低音5的频率a(4)=a(5)/bilv/bilv; %低音4的频率a(3)=a(4)/bilv; %低音3的频率a(2)=a(3)/bilv/bilv; %低音2的频率a(1)=a(2)/bilv/bilv; %低音1的频率b=a*2; %中音的频率c=b*2; %高音的频率counter=2^11; %分频值对应的位数为11位f=f/50/2; %50MHz,50分频,再2分频for i=1:7zhia(i)=counter-f/a(i); %低音的分频预置数zhib(i)=counter-f/b(i); %中音的分频预置数zhic(i)=counter-f/c(i); %高音的分频预置数end音调、分频值及频率预置数的表格如下:表3.2.1 音符、音频及其预置数低音音符 1 2 3 4 5 6 7 音频/Hz 262 294 330 349 392 440 494 预置数137 345 531 616 772 912 1036中音音符 1 2 3 4 5 6 7 音频/Hz 523 587 659 698 784 880 988 预置数1092 1197 1290 1332 1410 1480 1542高音音符 1 2 3 4 5 6 7 音频/Hz 1047 1175 1319 1397 1568 1760 1976 预置数1570 1622 1669 1690 1729 1764 1795(2)音调持续时间的控制音乐中的银除了有高低音之分外,还有长短之分。
简谱中用一条横线“—”在音符的右面或者下面来标注音的长短。
表3.2.2列出了常用音符及其长度标记。
表3.2.2 常用音符及其长度标记音符名称写法时值全音符1———四拍二分音符1—二拍四分音符 1 一拍八分音符 1 半拍十六分音符 1 四分之一拍从表3.2.2可以看出横线有记在音符后面的,也有记在音符下面的,横线标记的位置不同,被标记音符的时值也不同。
要使音符时值延长,在四分音符右边加横线“—”,这时的横线叫做延时线。
延时线越多,音调持续的时间就越长。
音乐中除了有音的高低、长短之外,也有音的休止。
表示音的休止的符号叫休止符,用“0”标记。
每增加一个0,就增加一个四分休止符的时值。
3.系统工作原理本系统共分为4个模块组成,其中Songer.v是顶层设计文件,其内部有4个功能模块:jianpu.v、zhuanhuan.v、fenpin.v、lcd1602.v,功能模块如图3.3.1所示。
图3.3.1 系统功能模块电路(1)音符的频率可以由图3.3.1中的模块fenpin获得。
这是一个数控分频器,由其clk端输入50MHz的时钟信号,通过fenpin分频之后由spkout输出。
fenpin 对clk输入信号的分频比由11位预置数tone决定。
Spkout的输出频率将决定每一音符的音调。
这样,分频预置数tone与spkout的输出频率就对应起来了。
(2)音符的持续时间是根据乐曲的速度及每个音符的节拍数来确定的,图3.3.1中模块zhuanhuan的功能首先是为fenpin提供决定所发音符分频预置数,而此数在fenpin输入口停留的时间即为此音符的节拍值。
模块zhuanhuan是乐曲简谱与相应的分频预置数之间的转换电路,其中设置了高、中、低音全部音符所对应的分频预置数,共21个,每一音符的停留时间由音乐节拍和音调发生器模块jianpu的clk的输入频率决定,这里为4Hz。
这21个值的输入由对应于zhuanhuan的5位输入值index确定,而index最多有32种可选值。
Toneindex输向zhuanhuan中的index,其值与持续时间由模块jianpu决定。
(3)在jianpu中设置了,一个9位二进制计数器,作为简谱数据ROM的地址指针。
这个计数器的计数频率选为4Hz,即每一计数值的停留时间为0.25s,恰为当全音符设为1s时,四四拍的4分音符的持续时间。
ROM中的低音用0~7表示,中音在低音的基础上再加7,用8~14表示,同理高音用15~21表示。
当jianpu中的计数器按4Hz的时钟速率做加法计数时,ROM中的简谱通过toneindex 端口输向zhuanhuan模块,乐曲就可以连续的演奏了。
此外还设置了一个两位的乐曲选择端sel,当sel为00时,可演奏高、中、低音的循环演奏;当sel为01时,演奏《两只老虎》;当sel为10时,演奏《天空之城》;当sel为11时,演奏《快点告诉你》。
(4)在lcd1602模块中设置了歌曲名称显示功能,由sel作为选择端口,当sel 为00时,可以在lcd1602液晶显示屏的第一行显示“gao zhong di yin”;当sel为01时,显示“liang zhi lao hu”;当sel为10时,显示“tiankongzhicheng”;当sel为11时,显示“kuaidiangaosuni ”。
4.各模块程序设计(1)蜂鸣器音乐发生器顶层程序设计module Songer(song_sel,clk,ledpos,ledneg,spkout,sms,smb,rst_n,lcd_data,lcd_e, lcd_rs,lcd_rw,SEL0,SEL1,SEL2);input [1:0] song_sel; //对四首乐曲进行选择input clk; //音调频率信号input rst_n; //节拍频率信号output [1:0] ledpos; //发光二极管的阳极output [3:0] ledneg; //发光二极管的阴极output [7:0] sms; //数码管的段选output [7:0] smb; //数码管的位选output spkout; //蜂鸣器输出output [7:0] lcd_data; //数据总线output lcd_e; //使能信号output lcd_rs; //指令、数据选择output lcd_rw; //读、写选择output SEL0; //LCD1602读写选择output SEL1; // LCD1602读写选择output SEL2; // LCD1602读写选择wire [10:0] tone; //分频预置数--跟音调相匹wire [4:0] toneindex; //音符reg clk4hz;reg [24:0] cnt1; //计数器reg [24:0] cnt2; //计数器always @ (posedge clk)beginif(cnt2>=25'b101111101011110000100000)beginclk4hz=~clk4hz; //对50MHz进行4Hz分频cnt2<=25'b0;endelsebegincnt2 <= cnt2 + 1'b1;endendjianpu u1(.sel(song_sel),.clk(clk4hz),.toneindex(toneindex));zhuanhuan u2(.index(toneindex),.tone(tone),.ledpos(ledpos),.ledneg(ledneg),.sms(sms),.smb(smb));fenpin u3(.clk(clk),.tone(tone),.spks(spkout));lcd1602 u4(.clk(clk),.rst_n(rst_n),.lcd_data(lcd_data),.lcd_e(lcd_e),.lcd_rs(lcd_rs),.lcd_rw(lcd_rw),.SEL0(SEL0),.SEL1(SEL1),.SEL2(SEL2),.sel(song_s el));endmodule(2)fenpin模块程序设计module fenpin(clk,tone,spks);input clk;input [10:0] tone; //分频预置数--跟音调相匹配output reg spks; //声音输出reg preclk,fullspks;always@(posedge clk)beginreg [3:0] count4;preclk<=0;if(count4>49)beginpreclk<=1; //将clk进行50分频count4=0;endelsecount4=count4+1;endalways@(posedge preclk)beginreg [10:0] count11; //11位可预置计数器if(count11==11'h7FF)begincount11=tone;fullspks<=1; //按照预置数进行分频endelsebegincount11=count11+1;fullspks<=0;endendalways@(posedge fullspks)beginreg count2;count2=~count2;if(count2==1)spks<=1; //将输出再次2分频,展宽脉冲,使扬声器有足够功率发音elsespks<=0;endendmodule(3)zhuanhuan模块程序设计module zhuanhuan(index,sms,smb,ledpos,ledneg,tone);input [4:0] index; //音符output reg [7:0] sms; //数码管段选,用于显示简谱output reg [7:0] smb; //数码管位选,用于显示简谱output reg [1:0] ledpos; //发光二极管阳极,用于区分低、中、高音output reg [3:0] ledneg; //发光二极管阴极,用于区分低、中、高音output reg [10:0] tone; //分频预置数--跟音调相匹配reg [3:0] code;always@(index)begincase(index) //将简谱音符与分频预置数相匹配5'b00000:tone<=11'b11111111111;5'b00001:tone<=11'd137;5'b00010:tone<=11'd345;5'b00011:tone<=11'd531;5'b00100:tone<=11'd616;5'b00101:tone<=11'd773;5'b00110:tone<=11'd912;5'b00111:tone<=11'd1036;5'b01000:tone<=11'd1092;5'b01001:tone<=11'd1197;5'b01010:tone<=11'd1290;5'b01011:tone<=11'd1332;5'b01100:tone<=11'd1410;5'b01101:tone<=11'd1480;5'b01110:tone<=11'd1542;5'b01111:tone<=11'd1570;5'b10000:tone<=11'd1622;5'b10001:tone<=11'd1668;5'b10010:tone<=11'd1690;5'b10011:tone<=11'd1728;5'b10100:tone<=11'd1764;5'b10101:tone<=11'd1795;default:;endcaseendalways@(index)beginreg [4:0] temp;if(index>=15)begintemp<=index+2;code<={1'b0,temp[2:0]};ledpos<=temp[4:3]; //高音显示endelse if(index>=8)begintemp<=index+1;code<={1'b0,temp[2:0]};ledpos<=temp[4:3]; //中音显示endelsebegintemp<=index;code<={1'b0,temp[2:0]};ledpos<=temp[4:3]; //低音显示endendalways@(code)begincase(code) //八段译码程序4'd0:sms=8'hC0;4'd1:sms=8'hF9;4'd2:sms=8'hA4;4'd3:sms=8'hB0;4'd4:sms=8'h99;4'd5:sms=8'h92;4'd6:sms=8'h82;4'd7:sms=8'hF8;default:sms=7'hC0;endcaseendalways@(*)beginsmb=8'b10000000; //选通第八位数码管ledneg=4'b0111; //选通二极管endendmodule(4)jianpu模块程序设计module jianpu(sel,clk,toneindex);input [1:0] sel; //乐曲选择信号input clk;output reg [4:0] toneindex; //乐曲中的音符输出wire [4:0] toneindex1,toneindex2,toneindex3,toneindex4;reg [9:0] counter; //计数器,用于读取ROM中的简谱always@(posedge clk)beginif(sel==2'b00)beginif(counter>=88)counter<=8'd0;elsecounter<=counter+1;endelse if(sel==2'b01)beginif(counter>=128)counter<=8'd0;elsecounter<=counter+1;endelse if(sel==2'b10)beginif(counter>=190)counter<=8'd0;elsecounter<=counter+1;endelse if(sel==2'b11)beginif(counter>=416)counter<=8'd0;elsecounter<=counter+1;endendmusic u1(.address(counter),.q(toneindex1),.clock(clk));laohu u2(.address(counter),.q(toneindex2),.clock(clk));tiankong u3(.address(counter),.q(toneindex3),.clock(clk));gaosuni u4(.address(counter),.q(toneindex4),.clock(clk));always@(*)case(sel)2'b00:toneindex=toneindex1; //选择第一首歌--低、中、高音依次循环2'b01:toneindex=toneindex2; //选择第二首歌--两只老虎2'b10:toneindex=toneindex3; //选择第三首歌--天空之城2'b11:toneindex=toneindex4; //选择第四首歌--快点告诉你default:;endcaseendmodule(5)lcd1602模块程序设计module lcd1602(clk,rst_n,lcd_data,lcd_e,lcd_rs,lcd_rw,SEL0,SEL1,SEL2,sel); input clk; // 50MHz时钟input rst_n; // 复位信号input [1:0] sel;output reg [ 7:0] lcd_data; // 数据总线output lcd_e; // 使能信号output reg lcd_rs; // 指令、数据选择output lcd_rw; // 读、写选择output SEL0; // LCD1602读写选择output SEL1; // LCD1602读写选择output SEL2; // LCD1602读写选择reg [127:0] row1_val ;always@(sel)begincase(sel)2'b00: row1_val="gao zhong di yin";2'b01: row1_val="liang zhi lao hu";2'b10: row1_val="tiankongzhicheng";2'b11: row1_val="kuaidiangaosuni ";default:;endcaseendassign SEL0 = 1'b0;assign SEL1 = 1'b0;assign SEL2 = 1'b1;// 分频模块开始reg [15:0] cnt; // 计数子always @ (posedge clk, negedge rst_n)if (!rst_n)cnt <= 0;elsecnt <= cnt + 1'b1;wire lcd_clk = cnt[15];// 分频模块结束// LCD1602驱动模块开始parameter IDLE = 8'h00;// 写指令,初始化parameter DISP_SET = 8'h01; // 显示模式设置parameter DISP_OFF = 8'h03; // 显示关闭parameter CLR_SCR = 8'h02; // 显示清屏parameter CURSOR_SET1 = 8'h06; // 显示光标移动设置parameter CURSOR_SET2 = 8'h07; // 显示开及光标设置// 显示第一行parameter ROW1_ADDR = 8'h05; // 写第1行起始地址parameter ROW1_0 = 8'h04;parameter ROW1_1 = 8'h0C;parameter ROW1_2 = 8'h0D;parameter ROW1_3 = 8'h0F;parameter ROW1_4 = 8'h0E;parameter ROW1_5 = 8'h0A;parameter ROW1_6 = 8'h0B;parameter ROW1_7 = 8'h09;parameter ROW1_8 = 8'h08;parameter ROW1_9 = 8'h18;parameter ROW1_A = 8'h19;parameter ROW1_B = 8'h1B;parameter ROW1_C = 8'h1A;parameter ROW1_D = 8'h1E;parameter ROW1_E = 8'h1F;parameter ROW1_F = 8'h1D;// 显示第二行reg [5:0] current_state, next_state; // 现态、次态// FSM: always1always @ (posedge lcd_clk, negedge rst_n)if(!rst_n) current_state <= IDLE;else current_state <= next_state;// FSM: always2alwaysbegincase(current_state)IDLE : next_state = DISP_SET;// 写指令,初始化DISP_SET : next_state = DISP_OFF;DISP_OFF : next_state = CLR_SCR;CLR_SCR : next_state = CURSOR_SET1;CURSOR_SET1 : next_state = CURSOR_SET2;CURSOR_SET2 : next_state = ROW1_ADDR;// 显示第一行ROW1_ADDR : next_state = ROW1_0;ROW1_0 : next_state = ROW1_1;ROW1_1 : next_state = ROW1_2;ROW1_2 : next_state = ROW1_3;ROW1_3 : next_state = ROW1_4;ROW1_4 : next_state = ROW1_5;ROW1_5 : next_state = ROW1_6;ROW1_6 : next_state = ROW1_7;ROW1_7 : next_state = ROW1_8;ROW1_8 : next_state = ROW1_9;ROW1_9 : next_state = ROW1_A;ROW1_A : next_state = ROW1_B;ROW1_B : next_state = ROW1_C;ROW1_C : next_state = ROW1_D;ROW1_D : next_state = ROW1_E;ROW1_E : next_state = ROW1_F;ROW1_F : next_state = ROW1_ADDR;default : next_state = IDLE ;endcaseend// FSM: always3always @ (posedge lcd_clk, negedge rst_n) beginif(!rst_n)beginlcd_rs <= 0;lcd_data <= 8'hxx;endelsebegin// 写lcd_rscase(next_state)IDLE : lcd_rs <= 0;// 写指令,初始化DISP_SET : lcd_rs <= 0;DISP_OFF : lcd_rs <= 0;CLR_SCR : lcd_rs <= 0;CURSOR_SET1 : lcd_rs <= 0;CURSOR_SET2 : lcd_rs <= 0;// 写数据,显示第一行ROW1_ADDR : lcd_rs <= 0;ROW1_0 : lcd_rs <= 1;ROW1_1 : lcd_rs <= 1;ROW1_2 : lcd_rs <= 1;ROW1_3 : lcd_rs <= 1;ROW1_4 : lcd_rs <= 1;ROW1_5 : lcd_rs <= 1;ROW1_6 : lcd_rs <= 1;ROW1_7 : lcd_rs <= 1;ROW1_8 : lcd_rs <= 1;ROW1_9 : lcd_rs <= 1;ROW1_A : lcd_rs <= 1;ROW1_B : lcd_rs <= 1;ROW1_C : lcd_rs <= 1;ROW1_D : lcd_rs <= 1;ROW1_E : lcd_rs <= 1;ROW1_F : lcd_rs <= 1;endcase// 写lcd_datacase(next_state)IDLE : lcd_data <= 8'hxx;// 写指令,初始化DISP_SET : lcd_data <= 8'h38;DISP_OFF : lcd_data <= 8'h08;CLR_SCR : lcd_data <= 8'h01;CURSOR_SET1 : lcd_data <= 8'h06;CURSOR_SET2 : lcd_data <= 8'h0C;// 写数据,显示第一行ROW1_ADDR : lcd_data <= 8'h80;ROW1_0 : lcd_data <= row1_val[127:120];ROW1_1 : lcd_data <= row1_val[119:112];ROW1_2 : lcd_data <= row1_val[111:104];ROW1_3 : lcd_data <= row1_val[103: 96];ROW1_4 : lcd_data <= row1_val[ 95: 88];ROW1_5 : lcd_data <= row1_val[ 87: 80];ROW1_6 : lcd_data <= row1_val[ 79: 72];ROW1_7 : lcd_data <= row1_val[ 71: 64];ROW1_8 : lcd_data <= row1_val[ 63: 56];ROW1_9 : lcd_data <= row1_val[ 55: 48];ROW1_A : lcd_data <= row1_val[ 47: 40];ROW1_B : lcd_data <= row1_val[ 39: 32];ROW1_C : lcd_data <= row1_val[ 31: 24];ROW1_D : lcd_data <= row1_val[ 23: 16];ROW1_E : lcd_data <= row1_val[ 15: 8];ROW1_F : lcd_data <= row1_val[ 7: 0];endcaseendendassign lcd_e = lcd_clk; // 数据在时钟高电平被锁存assign lcd_rw = 1'b0; // 只写endmodule(6)ROM文件设计①低、中、高音ROM文件music.mif如图3.4.1所示:图3.4.1 高、中、低音演奏简谱②两只老虎ROM文件laohu.mif如图3.4.2所示:图3.4.2 两只老虎简谱③天空之城ROM文件tiankong.mif如图3.4.3所示:图3.4.3 天空之城简谱④快点告诉你ROM文件gaosuni.mif如图3.4.4所示:图3.4.4 快点告诉你简谱5.下载电路及引脚分配设计设计用拨码开关BM8和BM7作为歌曲选择端口,决定四首歌的播放;用实验箱自带的50MHz时钟信号作为clk输入;用发光二极管LED3和LED1作为高、中、低音的指示显示,高音时LED3红灯亮,中音时LED1绿灯亮,低音时两个都不亮;将发音输出spkout接蜂鸣器;并用lcd1602显示歌曲名称。