基于c51单片机编写简单蜂鸣器音乐程序的方法.docx_第1页
基于c51单片机编写简单蜂鸣器音乐程序的方法.docx_第2页
基于c51单片机编写简单蜂鸣器音乐程序的方法.docx_第3页
基于c51单片机编写简单蜂鸣器音乐程序的方法.docx_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

很多初学单片机的朋友会接触到如何使用蜂鸣器来编曲的的问题,今天用到蜂鸣器,就顺便写了这个帖子,希望能对一些初学的朋友能有些帮助。据我所知,声音的音调不同是因为声音的频率不同造成的。那么,就可以通过单片机发送不同频率的脉冲信号给蜂鸣器,来达到让蜂鸣器发出不同音调声音的目的。不同频率的脉冲信号就意外着每个脉冲之间必须有着不一样的时差,这可以通过延时或者定时计数器定时的方式来实现。定时计数器定时的方法是相对精确的,然而我们人耳对于声音在相位上的变化的感应是不敏感的,而且普通蜂鸣器在商业上的用途不是专门用来发音乐,误差较大,因此通过延时程序延时的方法往往也能达到想要的目的。因此我认为,使一个蜂鸣器发出一定频率的程序是可以这样写的:首先是了解你要发出声音音调的频率。可以通过一张简单的表得知:从表中你可以计算出你要的音的周期,例如低1DO,为262hz,那么它的周期为1/262s也就是每次脉冲取反的中间延时半个周期即可。然后,编写一个能发相应频率声音的子程序。这个子程序中往往须包括以下二个部分:一,控制脉冲形成的代码,电平取反过程中含有相应的延时;二,控制脉冲持续时间的代码,持续的时间时候常常和音乐的拍子有相关性。最后在主程序中运行子程序,通过读rom里面的数组来达到连续播放各种不同音调的音的目的,这样听起来就像一首曲子了。以下是我按以上方法编写的一个小程序:/*以下是本人编写的一段简单音乐程序 ,程序已经在板子上调试成功,水平有限,如有不正确的地方请多包涵*/#include#include /内部包含延时函数 _nop_();typedef unsigned char uchar;typedef unsigned int uint;uint c; sbit spk =P20 ; /定义p2.0口为电平信号输出端uint code music= / 这是一个“童话”谱子的数组,与m_t()子程序中的十六进制数一一对应 ,0xff代表每次音乐的停顿 ,0x00表示音乐的结束0x16,0x10,0x0d,0xff, 0x0d,0x10,0x0d, 0xff, 0x0d,0x10,0x0d,0x10,0x0d,0x07,0x01,0xff, 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 ;/*/*void delay_us(uint i) /延时nus的程序uchar j;for(j=0;ji;j+) _nop_();void delay_ms(uint j) /延时nms的子程序uint i;while(j-)for(i=0;i128;i+);uint m_t(uint i) /*这是一个用来把音调与延时的时长一一对应的子程序uint j,s;s=100000; switch (i) /*下面让不同音高的音调与各十六进制数相对应 ,例如其中“1“有6种音高可选择(不懂音乐,我自己的说法)/*1*/case 0x01:j=s/262;break;case 0x02:j=s/277;break;case 0x03:j=s/523;break;case 0x04:j=s/554;break;case 0x05:j=s/1046;break;case 0x06:j=s/1109;break;/*2*/case 0x07:j=s/294;break;case 0x08:j=s/311;break;case 0x09:j=s/587;break;case 0x0a:j=s/622;break;case 0x0b:j=s/1175;break;case 0x0c:j=s/1245;break;/*3*/case 0x0d:j=s/330;break;case 0x0e:j=s/659;break;case 0x0f:j=s/1318;break;/*4*/case 0x10:j=s/349;break;case 0x11:j=s/370;break;case 0x12:j=s/698;break;case 0x13:j=s/740;break;case 0x14:j=s/1379;break;case 0x15:j=s/1480;break;/*5*/case 0x16:j=s/392;break;case 0x17:j=s/425;break;case 0x18:j=s/784;break;case 0x19:j=s/831;break;case 0x1a:j=s/1568;break;case 0x1b:j=s/1661;break;/*6*/case 0x1c:j=s/440;break;case 0x1d:j=s/466;break;case 0x1e:j=s/880;break;case 0x1f:j=s/932;break;case 0x20:j=s/1760;break; case 0x21:j=s/1865;break;/*7*/case 0x22:j=s/494;break;case 0x23:j=s/998;break;case 0x24:j=s/1967;break;/*o*/case 0xff:j=0;break;return j;void sound(uint s) /给一次脉冲来进行发声的子程序 ,其中参数s与m_t()中的0x01等十六进制数是对应的 uint k; k=m_t(s); if(k!=0); spk=0; delay_us(k/2); spk=1; delay_us(k/2);if(k=0)delay_ms(100) ; void play_sound(uint s,uint jp) /该子程序用来进行一个拍子的发声,jp是用来调节一个拍子的长短参数uint i; for(i=0;ijp;i+)s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论