单片机课程设计报告(利用蜂鸣器播放音乐)

合集下载

单片机实验报告蜂鸣器

单片机实验报告蜂鸣器

一、实验目的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. 学习了蜂鸣器的驱动原理和应用。

单片机《蜂鸣器》实验报告

单片机《蜂鸣器》实验报告

单片机《蜂鸣器》实验报告实验报告:蜂鸣器实验工具和器材: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

单片机蜂鸣器唱歌程序(二)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设计的任务设计内容:动手焊接一个51单片机设计目标:利用单片机上的蜂鸣器实现音乐播放功能2 设计的过程2.1 基本结构1.STC89C52RC在本次的试验中采用了STC89C52RC单片机,STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期,工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机),工作频率范围:0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz,用户应用程序空间为8K字节。

(STC89C52RC引脚图)STC89C52RC单片机的工作模式:(1)典型功耗<0.1μA,可由外部中断唤醒,中断返回后,继续执行原程序(2)空闲模式:典型功耗2mA(3)正常工作模式:典型功耗4Ma~7mA(4)唤醒,适用于水表、气表等电池供电系统及便携设备2.蜂鸣器及其工作原理:蜂鸣器按其结构分主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。

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

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

本实验采用的是电磁式蜂鸣器。

蜂鸣器按其是否带有信号源又分为有源和无源两种类型。

有源蜂鸣器只需要在其供电端加上额定直流电压,其内部的震荡器就可以产生固定频率的信号,驱动蜂鸣器发出声音。

无源蜂鸣器可以理解成与喇叭一样,需要在其供电端上加上高低不断变化的电信号才可以驱动发出声音。

本实验采用的是有源蜂鸣器。

(蜂鸣器与单片机连接电路图)2.2 软件设计过程1.蜂鸣器发声原理本实验由于采用有源蜂鸣器,只需将引脚端口P3^4清零,蜂鸣器即可发声;P3^4置位,蜂鸣器停止发声。

51单片机蜂鸣器播放单音节音乐

51单片机蜂鸣器播放单音节音乐
// 3_ 2_ 3 1
0xFD,0x23,0x7F, 0xFC,0xAC,0x7F, 0xFD,0x23,0xFF, 0xFC,0x44,0xFF,
// 1_ 3_ 2 .5
0xFC,0x44,0x7F, 0xFD,0x23,0x7F, 0xFC,0xAC,0xFF, 0xFA,0x68,0xFF,
{
for (i =0; i < 363; i++)
{;}
}
}
*名称:Init()
*功能:设置计数器0工作方式,16位计数,溢出中断方式
**********************************************************************************/
void Init()
{
TMOD = 0x01; //定时器0处于计时方式,16位
*名称:Count1(void) interrupt 1
*功能:设置计时器0溢出中断,每中断一次改变P2_3引脚电平
*********************************************************************************/
void Count1(void) interrupt 1
void main()
{
uchar time;
Init();
TH0 = high;
TL0 = low;
while (1)
{
if (music[ptr] != 0xFF && music[ptr] != 0x00)//判断是否是正常音符
{
TR0 = 0;
P2_3 = 1;

单片机《蜂鸣器》实验报告

单片机《蜂鸣器》实验报告

单片机《蜂鸣器》实验报告单片机《蜂鸣器》实验报告一、实验目的本次实验旨在通过单片机的控制,实现对蜂鸣器的驱动和发声控制,进一步了解蜂鸣器的工作原理及应用。

二、实验原理蜂鸣器是一种电子发声器件,常用于发出警告、提示或声音信号。

其工作原理是利用电磁感应原理,在蜂鸣器线圈中通入电流时,会产生磁场,该磁场与蜂鸣器内部的一块磁铁产生相互作用力,使蜂鸣器内部的膜片发生振动,从而发出声音。

在本实验中,我们将通过单片机控制蜂鸣器的驱动信号,使其发出不同的声音,从而实现单片机对蜂鸣器的控制。

三、实验步骤1、准备实验器材:单片机开发板、蜂鸣器模块、杜邦线等。

2、将蜂鸣器模块连接至单片机开发板的某个数字引脚上。

3、通过单片机编程软件编写控制程序,实现对蜂鸣器的控制。

4、将编写好的程序下载到单片机开发板中,并进行调试。

5、通过单片机控制蜂鸣器发出不同的声音,观察其工作情况。

四、实验结果与分析1、实验结果通过本次实验,我们成功实现了单片机对蜂鸣器的控制,可以通过编写不同的程序,使蜂鸣器发出不同的声音。

以下是实验中蜂鸣器发出的声音及其对应的程序代码:(1) 发出“滴”的一声(2) 发出“嘟嘟”的警告声2、结果分析通过实验结果可以看出,通过单片机对蜂鸣器进行控制,可以实现发出不同声音的效果。

在第一个实验中,我们通过设置引脚的高低电平及延时时间,使蜂鸣器发出一声“滴”的声音。

在第二个实验中,我们通过一个无限循环,使蜂鸣器发出“嘟嘟”的警告声。

五、结论与展望通过本次实验,我们深入了解了蜂鸣器的工作原理及应用,并成功实现了单片机对蜂鸣器的控制。

实验结果表明,我们可以根据实际需要编写不同的程序,实现对蜂鸣器的灵活控制。

展望未来,我们可以进一步研究蜂鸣器的其他应用场景,例如在智能家居、机器人等领域中的应用。

我们也可以通过其他方式对蜂鸣器进行控制,例如通过传感器采集信号或者通过无线网络进行远程控制等。

单片机课程设计报告蜂鸣器

单片机课程设计报告蜂鸣器

单片机课程设计报告蜂鸣器河南师范大学新联学院单片机课程设计报告课程单片机原理及接口技术设计题目蜂鸣器演奏歌曲年级专业级计算机科学与技术学号 11学生姓名李指导教师莹6 月 15 日蜂鸣器演奏歌曲实验报告一、要求完成驱动蜂鸣器歌曲演奏的实验二、目的1、学习KEIL软件的使用方法;2、掌握BST-V51单片机学习板设计蜂鸣器音乐的发生;3、掌握设计中各模块的功能,能够填入并演奏曲子;4、学习乐谱的基本知识,掌握其演奏的原理。

三、分析1、基本原理简述声音是经过振动产生的。

单片机对某一引脚以一定的频率循环置1置0,该引脚便产生一定频率的方波,方波经过放大,作用于一定的物理实件(蜂鸣器),就产生了一定频率的声音。

若改变输出方波的频率,产生的声音随之改变。

经过控制输出方波的时间长短,声音的长短也可以得到控制,因此,根据乐谱,以类似的音及同样的节拍,单片机就能够产生电子音乐。

音乐的播放选择能够经过按键的输入得以实现。

为简便起见,以一定的频率方波产生的音在其每个周期内高低幅值得时间各占一半。

因此,输出引脚在每个方波周期内要动作两次:一次升高,一次降低。

即输出引脚的频率是原音频率的两倍。

2、单片机产生不同频率脉冲信号的原理(1)要产生音频脉冲,只要算出某一音频的脉冲(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期的时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期的时间再对I/O反相,就能够在I/O脚上得到此频率的脉冲。

(2)利用8051的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产生不同频率的方法如下:例如,频率为523Hz,其周期天/523 S=1912uS,因此只要令计数器计时956uS/1us=956,在每计数956次时就将I/O反接,就可得到中音DO(532Hz)。

计数脉冲值与频率的关系公式如下: N=Fi/2/Fr(N:计数值,Fi:内部计时一次为1uS,故其频率为1MHz,Fr:要产生的频率)(3)其计数值的求法如下:T=65536-N=65536-Fi/2/Fr计算举例:设K=65536,F=1000000=Fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的计数值。

单片机课程设计音乐播放器报告

单片机课程设计音乐播放器报告

中州大学《单片机》课程设计报告报告题目:音乐播放器作者所在系部:工程技术学院作者所在专业:电气自动化作者所在班级:B10204作者姓名:张强作者学号:20104020416指导教师姓名:雷刚完成时间:2014年10月12日课程设计任务书课题名称音乐播放器的设计完成时间 6.12 指导教师王晓职称副教授学生姓名张婷班级B10204总体设计要求和技术要点利用单片机设计一个音乐播放器,并能够播放三种音乐,音乐自行设计。

一、设计目的1.掌握单片机定时器的使用方法2.掌握单片机扩展显示器、键盘的方法二、技术指标1.键盘设置3种音乐的播放切换;2.LED显示3种音乐的提示符;3. 流水灯闪烁工作内容及时间进度安排第14周:周1到周2查阅资料,确定设计方案周3到周4编写程序并进行proteus仿真周5焊接调试第17周:周1撰写实验报告周2验收课程设计成果1.与设计内容对应的软件程序与焊接实物2.课程设计报告书内容摘要本文的主要内容是用AT89C52单片机为核心控制元件,设计一个音乐播放器,以单片机作为主控核心、蜂鸣器等模块组成。

利用单片机产生不同频率来获得要求的音阶,最终可随意编写需要的程序,播放出音乐。

在此设计中我采用12MHz的晶振,产生的频率信号即音乐信号由P3.7口输出,信号经过放大后由喇叭发出声音。

设有四个按键,其中两个能实现多首音乐的选择,另一个能实现开始功能和单曲重播的功能,最后一个能实现复位和关闭歌曲的功能。

设有一位数码管,每选择一首曲子能在数码管上显示当前的曲目(只是数字)。

设十六个发光二极管,能随歌曲频率闪烁。

关键字:单片机音乐不同频率按键目录一、概述 (1)二、方案设计与论证 (1)1.硬件设计 (1)2.软件设计 (2)三、单元电路设计与分析 (3)1.单片机最小系统 (3)2. 数码管显示 (4)3.发光二级管和按键 (4)4.蜂鸣器发声 (5)5.软件部分程序和流程图 (5)四、总原理图及元器件清单 (11)1.总原理图 (11)2元器件清单 (11)五、结论 (12)六、心得体会 (12)七、参考文献 (12)一、概述作为单片机的重要硬件资源之一,利用定时器可以产生各种固定频率的方波信号,也可以产生包括“Do“、“Re“、“Me“--等音阶在内的各种频率声音。

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

单片机课程设计报告(利用蜂鸣器播放音乐)成绩课程设计:电子设计题目名称:音乐流水灯姓名:戴锦超学号:08123447班级:信科12-3班完成时间:2014年10月23日1设计的任务设计内容:动手焊接一个51单片机设计目标:利用单片机上的蜂鸣器以及二极管实现音乐播放以及根据音乐的节奏而规律性闪亮的二极管。

并且通过程序调节音乐节奏的快慢。

2 设计的过程2.1 基本结构1.STC89C52RC在本次的试验中采用了STC89C52RC单片机,STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期,工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机),工作频率范围:0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz,用户应用程序空间为8K字节。

(STC89C52RC引脚图)STC89C52RC单片机的工作模式:(1)典型功耗<0.1μA,可由外部中断唤醒,中断返回后,继续执行原程序(2)空闲模式:典型功耗2mA(3)正常工作模式:典型功耗4Ma~7mA(4)唤醒,适用于水表、气表等电池供电系统及便携设备2.蜂鸣器及其工作原理:蜂鸣器按其结构分主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。

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

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

本实验采用的是电磁式蜂鸣器。

蜂鸣器按其是否带有信号源又分为有源和无源两种类型。

有源蜂鸣器只需要在其供电端加上额定直流电压,其内部的震荡器就可以产生固定频率的信号,驱动蜂鸣器发出声音。

无源蜂鸣器可以理解成与喇叭一样,需要在其供电端上加上高低不断变化的电信号才可以驱动发出声音。

本实验采用的是有源蜂鸣器。

(蜂鸣器与单片机连接电路图)2.2 软件设计过程1.蜂鸣器发声原理本实验由于采用有源蜂鸣器,只需将引脚端口P1^4清零,蜂鸣器即可发声;P1^4置位,蜂鸣器停止发声。

采用置1置0的方法只能使蜂鸣器发声或停止发声,想要使蜂鸣器发出声音,必须对蜂鸣器发出声音的音频和节拍进行控制。

(音乐基础音调:不同音高的乐音是用C、D、E、F、G、A、B来表示,这7个字母就是音乐的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,即唱成简谱的1、2、3、4、5、6、7,相当于汉字“多来米发梭拉西”的读音,这是唱曲时乐音的发音,所以叫“音调”,即Tone。

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

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

在钢琴等键盘乐器上,C–D、D–E、F–G、G–A、A–B两音之间隔着一个黑键,他们之间的距离就是全音;E–F、B–C两音之间没有黑键相隔,它们之间的距离就是半音。

通常唱成1、2、3、4、5、6、7的音叫自然音,那些在它们的左上角加上﹟号或者b号的叫变化音。

﹟叫升记号,表示把音在原来的基础上升高半音,b叫降记音,表示在原来的基础上降低半音。

例如高音DO的频率(1046Hz)刚好是中音DO的频率(523Hz)的一倍,中音DO的频率(523Hz)刚好是低音DO频率(266 Hz)的一倍;同样的,高音RE的频率(1175Hz)刚好是中音RE的频率(587Hz)的一倍,中音RE的频率(587Hz)刚好是低音RE频率(294 Hz)的一倍。

节拍:节拍是让音乐具有旋律(固定的律动),而且可以调节各个音的快满度。

“节拍”,即Beat,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。

若1拍实0.5s,则1/4 拍为0.125s。

至于1拍多少s,并没有严格规定,就像人的心跳一样,大部分人的心跳是每分钟72下,有些人快一点,有些人慢一点,只要听的悦耳就好。

音持续时间的长短即时值,一般用拍数表示。

休止符表示暂停发音。

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

利用定时器计时这半个周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。

利用STC89C52RC的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0从而产生不同频率。

此外结束符和休止符可以分别用代码00H和FFH来表示,若查表结果为0x00,则表示曲子终了;若查表结果为0xff,则产生相应的停顿效果。

以标准音高A为例,A的频率是440Hz,周期T=1/440=2272us。

在占空比为50%的情况下,导通时间=断开时间=半周期t=2272us/2=1136us,利用P3^4端口的位操作,经过不断地反相变换即可得到标准音高A的音频脉冲。

端口导通时间与断开时的时间利用定时器实现。

具体的方法是将单片机定时器的中断触发时间设为半周期t,这样每隔半周期端口反相,输出连续的对应音高的频率。

设晶振的频率为f0,中断触发时间(半周期)为t,定时器工作在模式1时计数器的初值为THL,高8位为THL,低8位为TL。

时钟周期即为1/f0,定时器每一次累加用去一个机器周期,一个机器周期包含12个时钟周期,即定时器每次加一所用时间是12/f0。

定时器在模式1下计时采用16位数,最大计数为2^16-1(65535),再次加一(65536)溢出触发中断。

根据以上分析可得如下关系:音频对应定时器初值的高8位TH=THL/(2^8)=(65536-t*f/12)/256;音频对应定时器初值的低8位TL=THL%(2^8)=(65536-t*f/12)%256;附:八度12音阶定时器初值表(只含自然音)低音音名频率Hz 晶振12MHz 中音音名频率Hz 晶振12MHz高音音名频率Hz 晶振12MHzDo 262 0xF885 Do 523 0xFC43 Do 1046 0xFE21 Re 294 0xF95A Re 587 0xFCAD Re 1175 0xFE56 Mi 330 0xFA13 Mi 659 0xFD0A Mi 1318 0xFE85 Fa 349 0xFA68 Fa 698 0xFD34 Fa 1397 0xFE9A So 392 0xFB04 So 784 0xFD82 So 1568 0xFEC1La 440 0xFB90 La 880 0xFDC8 La 1760 0xFEE4 Si 494 0xFC0C Si 988 0xFE06 Si 1976 0xFF03 2)控制发声节拍每个音符的节拍可通过延时一定的时间来实现,在具体实现时需要有一个基本的带参延时程序,用于主函数根据不同的音符调用不同的时延。

若以十六分之一音符的时长为基本延时时间,则十六分音符只需调用一次延时程序,八分音符则需调用两次延时程序,以此类推。

*简谱编码将简谱中的每个音符进行编码,每个音符用一个unsigned char字符类型表示,简谱可用一个unsigned char字符数组表示。

字符的前四位表示音频,可以表示0-f共十六个音符。

本实验中采用了中音区和高音区。

中音do-si分别编码为1~7,高音do-si分别编码为8~E,停顿编为0。

字符的后四位表示节拍,节拍以十六分音符为单位(在本程序中为165ms),一拍即四分音符等于4个十六分音符,编为4,其它的播放时间以此类推。

以0xff作为曲谱的结束标志。

程序从数组中取出一个数,然后分离出高4位得到音调,将值赋给定时器0,得到音调;接着分离出该数的低4位,得到节拍。

本实验中播放音乐使用简谱如下:将其编码成:uchar code sb[]={//定义送别简谱0x54,0x32,0x52,0x88,0x64,0x84,0x58,0x54,0x12,0x22,0x34,0x2 2,0x12,0x28,0x00,0x00,0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x4 6,0xf2,0x18,0x00,0x00,0x64,0x84,0x88,0x74,0x62,0x72,0x88,0x62,0x72,0x82,0x62,0x6 2,0x52,0x32,0x12,0x28,0x00,0x00,0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x4 6,0xf2,0x18,0x00,0x00,0x54,0x32,0x52,0x88,0x64,0x84,0x58,0x54,0x12,0x22,0x34,0x2 2,0x12,0x28,0x00,0x00,0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x4 6,0xf2,0x18,0x00,0x00};2.3 程序流图及说明开始定义全局变量a。

变量temp,j,jp。

初始化;定时器TMOD=0x0;IE=0x87。

外部中断1,2;IT0=1;EX0=1;IT1=1;大循环1从简谱数组中读出音符付给临时变量 temp=sb【i】判断简谱是否到达终点 temp=0xffNjp=temp/16点亮二极管 lightTemp=(1<<jp)-1;P2=~lightTemp/0x100;P0=~lightTemp%0x100Jp=0N在初值数组中找对应的高8位低8位timeh=chuzhi[jp*2];timel=chuzhi[jp*2+1]; TR0=1;delay(temp%16); TR0=0;fm=1; delay1(5); i++;中断服务程序TR0=0; Fm=1YY结束(主程序流程图)程序代码:#include <reg52.h>#define uchar unsigned char#define uint unsigned intuint a=0;//全局变量控制速度变换sbit fm=P1^4;//蜂鸣器控制端口sbit int0=P3^2;sbit int1=P3^3;uchar timeh,timel;//用于存放定时器的高8位和低8位uchar code sb[]={//定义送别简谱0x54,0x32,0x52,0x88,0x64,0x84,0x58,0x54,0x12,0x22,0x34,0x22,0x12, 0x28,0x00,0x00,0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0xf2, 0x18,0x00,0x00,0x64,0x84,0x88,0x74,0x62,0x72,0x88,0x62,0x72,0x82,0x62,0x62,0x52, 0x32,0x12,0x28,0x00,0x00,0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0xf2, 0x18,0x00,0x00,0x54,0x32,0x52,0x88,0x64,0x84,0x58,0x54,0x12,0x22,0x34,0x22,0x12, 0x28,0x00,0x00,0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0xf2, 0x18,0x00,0x00};//适合12M的晶振定时器初值表,高低8位分开uchar code chuzhi[]={0xff,0xff,//占位0xFC,0x43,//中央C调1-70xFC,0xad,0xFd,0x0a,0xFD,0x34,0xFD,0x82,0xFD,0xc8,0xFE,0x06,0xFe,0x21,//高音0xFe,0x56,0xFe,0x85,0xFe,0x9a,0xFe,0xc1,0xFe,0xe4,0xFf,0x03,0xFc,0x0c//0xF8,0x18,//高八度1-7};void timer0() interrupt 1 //定时器0中断服务程序{TH0=timeh; //将timeh赋给计时器的高8位TL0=timel; //将timel赋给计时器的低8位fm=~fm; //定时器每次到时将蜂鸣器反相}void delay(uint z) //延时165MS,即十六分音符{ uint y;for(z;z>0;z--)for(y=19000-a;y>0;y--);//大致时间}void delay1(uint z) //延时1MS{ uint y;for(z;z>0;z--)for(y=112;y>0;y--);//大致时间}void main(){uint temp; //存放简谱数组中的每一个音符的临时变量uint lightTemp; //存放音符uchar i=0;uchar jp; //jp用于取出temp中的高8位和低8位IT0=1; //INT0IT1=1; //INT1TMOD=0x01;//设置定时器T0工作于方式1IE=0x87; //允许T0中断while(1){temp=sb[i];if(temp==0xff)break;jp=temp/16; //取数的高4位,音频数值lightTemp=(1<<jp)-1;P2=~lightTemp/0x100;P0=~lightTemp%0x100;if(jp!=0){timeh=chuzhi[jp*2];//构造定时器初值高8位timel=chuzhi[jp*2+1]; //构造定时器初值低8位TR0=1; //开定时器}else{TR0=0; //关定时器fm=1; //关蜂鸣器}delay(temp%16); //取数的低4位,节拍(音符总时延)TR0=0; //唱完一个音停5MSfm=1;delay1(5);i++;}TR0=0; //关定时器fm=1; //关蜂鸣器}void delay_ms(uint a){int i,j;for(i=a;i>=0;i--)for(j=110;j>=0;j--){}}void INT0_svr(void) interrupt 0 {delay_ms(10);if(int0==0){a+=2000;if(a>18000)a=0;}}void INT1_svr(void) interrupt 2 {delay_ms(10);if(int1==0){a-=2000;if(a<=0)a=0;}}3 运行结果或者测试结果测试结果:利用蜂鸣器实现了播放音乐的功能,并有节奏的闪灭二极管,可以进行速度的变换。

相关文档
最新文档