学习过51单片机的朋友,相信大家对蜂鸣器并不陌生。蜂鸣器分有源蜂鸣器和无源蜂鸣器两种,无源蜂鸣器可以通过代码来设置频率。在学习的过程中,我们大都需要做蜂鸣器发声的实验,这里呢,我将和大家分享,基于Keil和Proteus仿真,如何使用无源蜂鸣器演奏乐曲——《敢问路在何方》。希望能和大家多多交流,如有什么不当之处,还望指正。
放置单片机芯片(这里我选择的是AT89C52)。在上一讲《【Keil+Proteus仿真】51单片机实现心形流水灯》中我们已经详细讲过,感兴趣的话,大家可以在百度搜索它的标题,然后就可以看到。首先在搜索框中以关键字来搜索,然后再搜索结果中找到并选中“AT89C52”,接着单击“OK”按钮,最后回到绘图界面中单击左键即可放置单片机。具体操作如下图所示:
放置蜂鸣器。同样,先在搜索框中输入“sounder”来搜素蜂鸣器,再在搜索结果中选择SOUNDER,最后放置在绘图区内合适的地方,具体情况如下图所示:
连接线路,将蜂鸣器正确地和单片机连接起来。这里我们使用的是P1口的5管脚,具体情况如下图所示:
【说明】:在整个项目工程中,我们采用自顶向下的设计方法,先写PlayMusic()函数,然后再在PlayMusic()函数中调用Buzzer(Tone_Beat[tone],Tone_Beat[beat])函数来使蜂鸣器发出不同频率的声调,再加上延时时间的控制,自然形成节拍,有了音调和节拍,自然就可以演奏乐曲了。这里我们使用定时器中断0来控制节拍,音调则由我们自己编写的延时函数来控制,通过延时来实现发出不同频率的音调。
建立工程。其中Buzzer_Music.c文件用于存放关于蜂鸣器的各个功能的子函数,,最后主函数直接调用Buzzer_Music.c源文件中的子函数即可。具体操作如下图所示:
在Buzzer_Music.c文件中编写PlayMusic()函数,以便主函数调用。具体情况如图:
在Buzzer_Music.c文件中编写Buzzer(int Tone,int Beat)函数,以便PlayMusic()函数调用。具体情况如图:
在主函数中编写中断函数,每1ms产生一次中断,用来控制节拍。编写完中断函数后,还要在Buzzer_Music.c文件中编写定时器初始化函数Timer0_Init(),在这里我们采用定时器0中断,具体情况如图:
下载电视剧《西游记》主题曲《敢问路在何方》的乐谱。可以在百度文库中下载的到。乐谱如下图:
根据乐谱在Buzzer_Music.h头文件中编写关于音调和节拍定义的宏,以便后面使用代码编写乐谱,让程序更加直观。具体情况如下图:
根据乐谱在Buzzer_Music.c源文件中用代码编写乐谱(本质上是一个存放着音调和节拍的一维数组)。具体情况如下图:
关于如何将Keil编译后生成的hex文件下载到Proteus中的单片机中,在上一讲的《【Keil+Proteus仿真】51单片机实现心形流水灯》中我们已经详细讲述,这里就不需要再赘述了。感兴趣的话,大家可以在百度中搜索“【Keil+Proteus仿真】51单片机实现心形流水灯”,即可看到。具体情况如下图:
运行仿真电路,观察效果。具体情况如下图: