基于c51单片机编写简单蜂鸣器音乐程序的方法.docx

上传人:asd****56 文档编号:70334317 上传时间:2023-01-19 格式:DOCX 页数:4 大小:151.96KB
返回 下载 相关 举报
基于c51单片机编写简单蜂鸣器音乐程序的方法.docx_第1页
第1页 / 共4页
基于c51单片机编写简单蜂鸣器音乐程序的方法.docx_第2页
第2页 / 共4页
点击查看更多>>
资源描述

《基于c51单片机编写简单蜂鸣器音乐程序的方法.docx》由会员分享,可在线阅读,更多相关《基于c51单片机编写简单蜂鸣器音乐程序的方法.docx(4页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、很多初学单片机的朋友会接触到如何使用蜂鸣器来编曲的的问题,今天用到蜂鸣器,就顺便写了这个帖子,希望能对一些初学的朋友能有些帮助。据我所知,声音的音调不同是因为声音的频率不同造成的。那么,就可以通过单片机发送不同频率的脉冲信号给蜂鸣器,来达到让蜂鸣器发出不同音调声音的目的。不同频率的脉冲信号就意外着每个脉冲之间必须有着不一样的时差,这可以通过延时或者定时计数器定时的方式来实现。定时计数器定时的方法是相对精确的,然而我们人耳对于声音在相位上的变化的感应是不敏感的,而且普通蜂鸣器在商业上的用途不是专门用来发音乐,误差较大,因此通过延时程序延时的方法往往也能达到想要的目的。因此我认为,使一个蜂鸣器发出

2、一定频率的程序是可以这样写的:首先是了解你要发出声音音调的频率。可以通过一张简单的表得知:从表中你可以计算出你要的音的周期,例如低1DO,为262hz,那么它的周期为1/262s也就是每次脉冲取反的中间延时半个周期即可。然后,编写一个能发相应频率声音的子程序。这个子程序中往往须包括以下二个部分:一,控制脉冲形成的代码,电平取反过程中含有相应的延时;二,控制脉冲持续时间的代码,持续的时间时候常常和音乐的拍子有相关性。最后在主程序中运行子程序,通过读rom里面的数组来达到连续播放各种不同音调的音的目的,这样听起来就像一首曲子了。以下是我按以上方法编写的一个小程序:/*以下是本人编写的一段简单音乐程

3、序 ,程序已经在板子上调试成功,水平有限,如有不正确的地方请多包涵*/#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,0x

4、0d,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

5、=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 0x0

6、7: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 0x

7、13: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

8、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+)sound(s); if(s=0xff)break;/*void main() /主函数while(1)c=0; /用来使数组从头开始读取while(musicc)play_sound(musicc,500);c+;友情提示:谱子可以上网查,或者通过360浏览器获得:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com