利用定时器定时翻转蜂鸣器的beep引脚,产生方波使蜂鸣器发生,所以根据定时器不同的定时产生不同的方波,就可以改变蜂鸣器的音调(与改变led灯亮度类似)。

void time0() interrupt 1
{TH0=timeh;                                //赋值,改变定时TL0=timel;beep=~beep;                            //翻转产生方波
}

用二维数组music[n][m]来存储乐谱,方便歌曲的切换和简化代码,m要开大点,要比最长的乐谱大一点。将定时器0设置最高优先等级。

电子音乐代码(还未优化):

#include <STC15F2K60S2.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep=P3^4;
sbit key1=P3^2;
sbit key2=P3^3;
uchar timeh,timel,jindu=0,gequ=0;
bit flag;
uint MusicCnt=3;        //歌曲总数uchar code music[3][500] =
{                        /*0x15,“1”代表低八音,“5”代表so*/
{                        /*0x21,“2”代表中八音,“1”代表do*/
0x15,0x20,0x21,0x10,     /*0x31,“3”代表高八音,“1”代表do*/
0x22,0x10,0x23,0x15,     /*上面是音符的记录方法,每个音符后跟的是节拍*/
0x24,0x05,0x23,0x10,     /*本代码还未优化节拍,可以利用STC-ISP生成精准延时函数,优化节拍*/
0x21,0x10,0x22,0x20,
0x21,0x10,0x16,0x10,
0x21,0x40,0x15,0x20,
0x21,0x10,0x22,0x10,
0x23,0x10,0x23,0x05,
0x24,0x05,0x25,0x10,
0x21,0x10,0x24,0x15,
0x23,0x05,0x25,0x10,
0x22,0x05,0x23,0x05,
0x23,0x05,0x22,0x05,
0x22,0x30,0x23,0x20,
0x25,0x10,0x31,0x10,
0x27,0x15,0x26,0x05,
0x26,0x20,0x25,0x10,
0x25,0x05,0x26,0x05,
0x27,0x10,0x26,0x05,
0x25,0x05,0x23,0x40,
0x24,0x15,0x24,0x05,
0x25,0x10,0x26,0x10,
0x25,0x10,0x24,0x05,
0x23,0x05,0x22,0x20,
0x17,0x10,0x17,0x05,
0x16,0x05,0x15,0x10,
0x16,0x10,0x21,0x40,
0x00,0x00
},
{
0x21,0x05,0x21,0x05,
0x21,0x05,0x23,0x05,
0x25,0x05,0x25,0x05,
0x25,0x05,0x25,0x05,
0x26,0x05,0x26,0x05,
0x26,0x05,0x31,0x05,
0x25,0x20,0x24,0x05,
0x24,0x05,0x24,0x05,
0x26,0x05,0x23,0x05,
0x23,0x05,0x23,0x05,
0x23,0x05,0x22,0x05,
0x22,0x05,0x22,0x05,
0x22,0x05,0x25,0x15,
0x25,0x05,0x21,0x05,
0x21,0x05,0x21,0x05,
0x23,0x05,0x25,0x05,
0x25,0x05,0x25,0x05,
0x25,0x05,0x26,0x05,
0x26,0x05,0x26,0x05,
0x31,0x05,0x25,0x20,
0x24,0x05,0x24,0x05,
0x24,0x05,0x26,0x05,
0x21,0x05,0x21,0x05,
0x21,0x05,0x23,0x05,
0x25,0x05,0x25,0x05,
0x25,0x05,0x25,0x05,
0x26,0x05,0x26,0x05,
0x26,0x05,0x31,0x05,
0x25,0x20,0x24,0x05,
0x24,0x05,0x24,0x05,
0x23,0x03,0x23,0x03,
0x23,0x03,0x23,0x03,
0x23,0x05,0x23,0x05,
0x22,0x05,0x22,0x05,
0x22,0x05,0x23,0x05,
0x21,0x20,0x00,0x00
},
{
0x16,0x05,0x17,0x05,
0x21,0x15,0x17,0x05,
0x21,0x10,0x23,0x10,
0x17,0x30,0x23,0x10,
0x16,0x15,0x15,0x05,
0x16,0x10,0x21,0x10,
0x15,0x30,0x13,0x10,
0x14,0x15,0x13,0x05,
0x14,0x05,0x21,0x05,
0x21,0x10,0x13,0x30,
0x21,0x10,0x17,0x10,
0x14,0x05,0x14,0x10,
0x17,0x10,0x17,0x20,
0xff,
0x16,0x05,0x17,0x05,
0x21,0x15,0x17,0x05,
0x21,0x10,0x23,0x10,
0x17,0x30,0x13,0x05,
0x13,0x05,0x16,0x15,
0x15,0x05,0x16,0x10,
0x21,0x10,0x15,0x30,
0x13,0x10,0x14,0x10,
0x21,0x05,0x17,0x05,
0x17,0x10,0x21,0x10,
0x22,0x10,0x23,0x05,
0x21,0x20,0xff,
0x21,0x05,0x17,0x05,
0x16,0x10,0x17,0x10,
0x15,0x10,0x16,0x20,
0xff,
0x21,0x05,0x22,0x05,
0x23,0x15,0x22,0x10,
0x23,0x10,0x24,0x10,
0x25,0x05,0x22,0x30,
0x15,0x10,0x22,0x03,
0x21,0x03,0x17,0x03,
0x21,0x03,0x21,0x10,
0x21,0x05,0x22,0x10,
0x23,0x05,0x23,0x40,
0x16,0x05,0x17,0x05,
0x21,0x10,0x17,0x05,
0x21,0x05,0x22,0x10,
0x21,0x15,0x15,0x05,
0x15,0x20,0x24,0x10,
0x23,0x10,0x22,0x10,
0x21,0x10,0x23,0x30,
0x16,0x05,0x17,0x05,
0x21,0x15,0x17,0x05,
0x21,0x10,0x23,0x10,
0x17,0x30,0x13,0x10,
0x16,0x15,0x15,0x05,
0x16,0x10,0x21,0x10,
0x15,0x30,0x13,0x10,
0x14,0x10,0x21,0x05,
0x17,0x05,0x17,0x10,
0x21,0x10,0x22,0x10,
0x23,0x05,0x21,0x05,
0x21,0x20,0x21,0x05,
0x17,0x05,0x16,0x10,
0x17,0x10,0x15,0x10,
0x16,0x40,0x00,0x00
}
};
uchar code quzi[] =    /*每个音对应的定时器重装值,左边一列为高位,右边一列为低位*/
{
0xf8,0x8c,//低1
0xf9,0x5b,
0xfa,0x15,//低3
0xfa,0x67,
0xfb,0x04,
0xfb,0x90,
0xfc,0x0c,
0xfc,0x44,
0xfc,0xac,
0xfd,0x09,
0xfd,0x34,
0xfd,0x82,
0xfd,0xc8,
0xfe,0x06,
0xfe,0x22,
0xfe,0x56,
0xfe,0x6e,
0xfe,0x9a,
0xfe,0xc1,
0xfe,0xe4,
0xff,0x03
};uint ss[3]={180,300,200};//因为还未优化节拍,所以引入ss数组调节节拍void delay(unsigned int x)
{uint i,j;                         for(i=x;i>0;i--)for(j=124;j>0;j--);
}void Delay5ms()        //@11.0592MHz
{unsigned char i, j;i = 54;j = 199;do{while (--j);} while (--i);
}void Delay100ms(uint x)        //@11.0592MHz
{unsigned char i, j, k;while(x--){_nop_();_nop_();i = 5;j = 52;k = 195;do{do{while (--k);} while (--j);} while (--i);}
}uchar quyin(uchar tem)        //取音调对应重装值位置
{uchar qudiao,jp,weizhi;qudiao=tem/16;jp=tem%16;if(qudiao==1)qudiao=0;else if(qudiao==2)qudiao=14;else if(qudiao==3)qudiao=28;weizhi=qudiao+(jp-1)*2;return weizhi;
}
void playmusic()
{uchar p,m,tem;    while(1)   {   if(flag==1){if(gequ==MusicCnt)gequ=0;//歌单播放完,切回第一首p=music[gequ][jindu];        if(p==0x00)              //0x00,歌曲结束标志{jindu=0;gequ++;Delay100ms(20);      //延时2s后,播放下一首break;}        else if(p==0xff)         //0xff,休止符标志,延时100ms{jindu=jindu+1;Delay100ms(1);TR0=0;break;}      else{tem=quyin(music[gequ][jindu]);//取音符的音调对应重装值的位置timeh=quzi[tem];              //取重装值timel=quzi[tem+1];jindu++;TH0=timeh;                    //重装TL0=timel;m=music[gequ][jindu];         //取节拍jindu++;}           TR0=1;            //开启定时器delay(m*ss[gequ]);//延时完成节拍,可以用精准的延时函数进行优化TR0=0;            //关闭定时器beep=0;           //保护蜂鸣器}                                      elsewhile(flag!=1);    }
}void init()
{P0M0=0xff;P0M1=0x00;P2M0=0x08;P2M1=0x00;P3M0=0x10;P3M1=0x00;TMOD=0x01;TH0=0xD8;TL0=0xEF;IE=0x87;IP=0x02;TR0=0;beep=0;
}
void main()
{init();P0=0x00;key1=1;key2=1;flag=0;while(1){playmusic();}
}                                   void time0() interrupt 1
{TH0=timeh;TL0=timel;beep=~beep;
}void ex1() interrupt 0
{Delay5ms();if(key1==0){while(!key1);Delay5ms();flag=~flag;}
}void ex2() interrupt 2
{Delay5ms();if(key2==0){while(!key2);Delay5ms();jindu=0;gequ++;        if(gequ==MusicCnt)gequ=0;}
}

也可以引入其他功能,比如调节歌曲进度,加减jindu就行(注意:进度的边界)。

(若有不足和错误,还请各位斧正)

可变调的蜂鸣器、电子音乐相关推荐

  1. 湖南大学工训创新大作业——改进电子音乐

    课程实验报告 课 程 名 称: STC实验板综合设计 实验项目名称: 改进电子音乐 专 业 班 级: 姓 名: 学 号: 指 导 教 师: 完 成 时 间: 2020 年 9 月 16 日 一. 设计 ...

  2. arduino编乐谱_基于Arduino的电子音乐发声器设计

    作者 赵云娥1 吴振强2 1.青海建筑职业技术学院(青海 西宁 810012) 2.陕西师范大学计算机科学学院(陕西 西安 710119)本文引用地址:http://www.eepw.com.cn/a ...

  3. 【FPGA】五、蜂鸣器播放音乐

    文章目录 前言 一.蜂鸣器简介 二.音频音符简介 三.任务要求 四.程序设计 1.设计思路 2.程序代码 总结 前言 蜂鸣器(Buzzer)是现代常用的一种电子发声器,主要用于产生声音信号.它是一种一 ...

  4. Mixly电子音乐:蜗牛与黄鹂鸟

    Mixly电子音乐:蜗牛与黄鹂鸟 本次实验使用无源蜂鸣器模块模拟音乐的播放,并闪亮LED灯. 使用的歌曲是儿歌<蜗牛与黄鹂鸟>! 不同的频率可以产生不同的声音,无源蜂鸣器内部无振荡源,我们 ...

  5. 【单片机】电子音乐播放器的设计与制作(说明书)

    前   言         这是本人在大学期间的<单片机控制技术>课程中,所作的结课作业项目,而我也正想要一个电子音乐播放器,而且这样设计的音乐播放器可以发出宜人的音乐旋律,能给生活增加不 ...

  6. 国外计算机音乐专业,音乐留学干货 | 国外电子音乐专业留学如何?

    原标题:音乐留学干货 | 国外电子音乐专业留学如何? 说到电子音乐, 你脑海中是否出现各种嗨翻全场的画面, 是夜场DJ, 还是百万调音师? 1.什么是电子音乐制作? 电子音乐制作又名MIDI(Musi ...

  7. 计算机和电子音乐之间的关系,浅析计算机音乐中算法作曲的特点及及作曲技法的对应关系.doc...

    浅析计算机音乐中算法作曲的特点及与作曲技法的对应关系 [摘要]计算机技术在音乐前期创作中的运用产生了算法作曲,开发的作曲程序已经能够生成已故作曲家风格的乐曲,计算机创作乐曲会更加便捷和简便,传统常规的 ...

  8. 1.计算机技术在音乐作品中的使用,数字技术在电子音乐中的应用论文

    数字技术在电子音乐中的应用论文 一.电子音乐的产生和发展 很多人会把电子音乐和计算机音乐混为一谈,其实电子音乐区别于计算机音乐,但是它们两者又是有着紧密的联系的,电子音乐是通过电子设备和电子手段生成或 ...

  9. 电子音乐包括电声乐器和计算机音乐,浅谈电子音乐制作的发展方向

    一.从"萌芽"到"成熟"阶段的回顾 1.电子音乐制作的萌芽阶段 回顾历史是为了更好的发展.电子音乐发展的最初阶段是从港台流入到大陆的录音机.把用简陋的录音机把音 ...

最新文章

  1. 分布式锁--Redis小试牛刀
  2. poj 2480 (欧拉函数应用)
  3. 在markdown编辑模式中打出彩色的文字
  4. Ubuntu 15.04 安装 boost-python
  5. python菜单栏_Python(Tkinter)创建的菜单不会显示
  6. C++类的成员变量和成员函数的介绍
  7. 这五件事发生的时候,就是 ICO 泡沫破裂的那一天
  8. scala 偏函数与 map/collect
  9. 如何在 Mac 上阻止 FaceTime 通话和 iMessage 信息?
  10. 发现eclipse红叉,查看markers发现Target runtime Apache Tomcat 6.0 is not defined
  11. oracle实施伙伴,甲骨文推出Oracle合作伙伴网络专属计划
  12. 深度学习图像分类(十三):ShuffleNet系列(V1,V2)
  13. Android语言/国家代码清单
  14. 【Ubuntu】安装H.264解码器
  15. Python中字符的匹配
  16. 红外图像处理:去竖条
  17. mysql 查询多个总和_使用MySQL查询选择多个总和,并在单独的列中显示?
  18. 21天学通Java学习笔记-Day02
  19. 2020-03-18
  20. 准备金率上调,银行贷款加息对房产的影响

热门文章

  1. stm32无感无刷电机——电位器转速控制
  2. Lesson 28 No parking 禁止停车
  3. 直播预约 | 点“数”成“金”:看腾讯云大数据如何助力金融机构激发海量数据潜能!...
  4. 人工智能与大数据的应用和指引方向
  5. 五、基于github+阿里云容器镜像服务进行docker部署
  6. 汽车点火钥匙等定义!
  7. 0064-【测序行业】-2018基因检测行业研究报告丨鲸准研究院
  8. PB5.0 QFE 下载地址
  9. 如何搭建自己的git服务器
  10. 军事标图计算机软件,基于AreEngine的军事标图系统