写在前面:想要做电子音乐盒首先要保证单片机上的蜂鸣器为无源蜂鸣器,有源蜂鸣器是不能放歌的,因为有源蜂鸣器只要通电就发出声音,没有起伏。

一、设计思路

电子音乐盒说难也难,说简单也简单,只要知道如何编制音乐代码就可以,其余的东西也就一个连接蜂鸣器,有点新意还可以结合按键做出选择播放,退出播放,下一首,上一首的功能,还可以结合LCD显示当前播放的音乐。本篇文章中介绍的程序只有选择播放和退出当前播放的的功能,至于其他的功能看以后会不会做这方面的程序吧。

二、编制音乐代码

简单介绍一下如何编制音乐代码,可以快速阅读,有个印象就好,后面会提供两个音乐的音乐代码和一个乐谱编辑的应用。
首先一首歌创建一个单独的数组,数组中每两个元素为一组,分别为频率常数和节拍常数,频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍; 休止符为0xff,结束符为0x00.
乐谱编辑的软件打开后的界面如下:

这个软件是普中科技开发板光盘里自带的,文末我会添加两个音乐的乐谱代码和这个软件的百度网盘链接。

三、按键控制

首先定义要控制的按键连接的I/O口:

sbit k1=P3^5;    //定义P35口是k1

下面是检测k1是否按下的函数,包含去抖动,如果按下返回值为1,反之为0。

unsigned char keypros1()
{key=0;if(k1==0)       //检测按键K1是否按下{ delay(100);   //消除抖动 一般大约10msif(k1==0)     //再次判断按键是否按下{  key=1;     }while(!k1);     //检测按键是否松开}if(key==1)return 1;else return 0;
}

我设计的这个程序里需要用到四个按键,也就是说要定义四个这样的函数,我目前没找到如何能够只用一个函数并只改变实参就能控制四个按键的方法(有想过直接判断P3整个8位I/O口的电位情况,但是P3^6连接蜂鸣器,放音乐时电位一直在变化)。

四、音乐播放原理

以下为播放音乐的函数:

unsigned char p,m;   //m为频率常数变量    unsigned char i=0;   TMOD&=0x0f;   TMOD|=0x01;   TH0=0xd8;TL0=0xef;   IE=0x82;
play:   while(1)   {   a: p=music_tab[i];   if(p==0x00)       { i=0, delayms(1000); goto play;}     //如果碰到结束符,延时1秒,回到开始再来一遍    else if(p==0xff)  { i=i+1;delayms(100),TR0=0; goto a;}  //若碰到休止符,延时100ms,继续取下一音符    else         {m=music_tab[i++], n=music_tab[i++];}  //取频率常数 和 节拍常数    TR0=1;                                             //开定时器1    while(n!=0) Beep=~Beep,delay(m);                         //等待节拍完成, 输出音频(可多声道哦!)    TR0=0;                                             //关定时器1    }

下面是中断函数:

void int0()  interrupt 1   //采用中断0 控制节拍
{  TH0=0xd8;   TL0=0xef;   n--;
}

前面有提到0x00代表结束符,0xff代表休止符,选择定时器并赋初值后进入播放音乐的程序,遍历乐谱代码的数组,每次频率常数赋值给m,节拍常数赋值给n,打开定时器,按照频率常数和节拍常数启动蜂鸣器;若遇到0xff,延时100ms再返回遍历数组,再遍历数组的下一位;若遇到0x00则代表已经播放完毕,将遍历的指针i取零并返回重新播放。

五、按键选择音乐和退出音乐

1)按键选择音乐

首先将主函数选择定时器模式和赋初值后的内容改成如下循环,每一步我都在旁边加了注释,不难理解。

while(1)
{Beep=1;//无源蜂鸣器Beep=1不会发出声音,只有循环Beep=1和Beep=0才会发出声音if(keypros1())检测按键k1是否按下,若按下会返回1,进入music1()函数music1();进入播放祝你平安的函数if(keypros2())检测按键k2是否按下,若按下会返回1,进入music2()函数music2();进入播放八月桂花的函数
}

2)按键退出音乐,返回主函数等待重新进入某个音乐函数

原理很简单,在播放音乐的函数里正常播放,遇到休止符和遇到结束符的程序内容中都加入如下内容:

if(k4==0)//检测k4是否按下key=4;//若是,键值为4
if(key==4)//如果键值为4
{TR0=0;//关闭定时器i=0;//遍历音乐代码的数组指针i归零break;//退出循环
}

PS:《祝你平安》乐谱代码:

//祝你平安
unsigned char code music_tab1[] =
{   0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00
};

《八月桂花》乐谱代码:

//八月桂花
unsigned char code music_tab2[] =
{   0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,
0x20, 0x40, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x10,
0x1C, 0x10, 0x18 , 0x40,
0x1C, 0x20, 0x20 , 0x20,
0x1C, 0x20, 0x18 , 0x20,
0x20, 0x80, 0xFF , 0x20,
0x30, 0x1C, 0x10 , 0x18,
0x20, 0x15, 0x20 , 0x1C,
0x20, 0x20, 0x20 , 0x26,
0x40, 0x20, 0x20 , 0x2B,
0x20, 0x26, 0x20 , 0x20,
0x20, 0x30, 0x80 , 0xFF,
0x20, 0x20, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x20, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x20, 0x15 , 0x20,
0x1C, 0x20, 0x20 , 0x20,
0x26, 0x40, 0x20 , 0x20,
0x2B, 0x20, 0x26 , 0x20,
0x20, 0x20, 0x30 , 0x80,
0x20, 0x30, 0x1C , 0x10,
0x20, 0x10, 0x1C , 0x10,
0x20, 0x20, 0x26 , 0x20,
0x2B, 0x20, 0x30 , 0x20,
0x2B, 0x40, 0x20 , 0x15,
0x1F, 0x05, 0x20 , 0x10,
0x1C, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x20, 0x15 , 0x20,
0x1C, 0x20, 0x20 , 0x20,
0x26, 0x40, 0x20 , 0x20,
0x2B, 0x20, 0x26 , 0x20,
0x20, 0x20, 0x30 , 0x30,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x40, 0x1C , 0x20,
0x20, 0x20, 0x26 , 0x40,
0x13, 0x60, 0x18 , 0x20,
0x15, 0x40, 0x13 , 0x40,
0x18, 0x80, 0x00
};

乐谱编辑软件百度网盘链接:
链接:https://pan.baidu.com/s/1L3KIg2Jesh22AqyS7yWodQ
提取码:u7ls

51单片机程序设计——电子音乐盒相关推荐

  1. c51单片机时钟c语言程序设计,基于51单片机的电子时钟设计..doc

    -- I -- - - I -- 设计题目: 基于 51 单片机的电子时钟设计 摘要 单片机,是集 CPU ,RAM ,ROM ,定时器,计数器和多种接口于一体的微控制器.自 20 世纪 70 年代问 ...

  2. 51单片机的电子密码锁的设计与仿真

    51单片机的电子密码锁的设计与仿真 看看效果图 简介 (1)CPU使用51单片机. (2)用4x4矩阵键盘作为操作信息输入. (3)用LCM1602液晶显示模块作为信息显示. (4)用蜂鸣器及发光二极 ...

  3. 【制作】基于金沙滩51单片机的电子密码锁程序

    基于金沙滩51单片机的电子密码锁程序 很久之前做的一个课设,在B站发了效果视频,发现忘记分享代码了,现在整理分享一下. 零.设计报告 1.设计要求 这部分是讲的整个系统实现了什么功能. 1.1.密码的 ...

  4. 万年历设计单片机c语言,基于51单片机的电子万年历的设计

    基于51单片机的电子万年历的设计(论文9400字) 功能要求 1. 万年历能用数码管显示阳历年.月.日.星期.[小]时.分.秒并设置指定时间的闹铃. 2. 数字式温度计要求测温范围-50~100°C, ...

  5. 基于51单片机的电子万年历的设计

    (24条消息) 基于51单片机的电子万年历的设计说明书(完整word版本说明书+原理图+代码)资源-CSDN文库 摘 要 电子万年历是单片机系统的一个应用,由硬件和软件相配合使用.硬件由主控器.时钟电 ...

  6. 基于51单片机LCD1602电子时钟实物制作

    之前写了51单片机的LCD1602的程序,现在画了电路图,焊接了电路板,做出了基于51单片机LCD1602电子时钟的实物. 注意事项: 焊接过程中,注意提前布局电路. 对应好端口(避免接线错误),我由 ...

  7. 基于51单片机的电子万年历的设计-源代码

    电子万年历的设计目录 电子万年历的设计 电子万年历的系统整体设计框图 所需要的元件 DS18B20模块 DS18B20的特点 DS18B20内部结构 DS18B20管脚排列 DS1302模块 SPI时 ...

  8. 基于51单片机的电子万年历设计

    基于51单片机的电子万年历 1)LCD1602显示时间.日期.星期.温度 2)按键可调整时间日期星期 3)整点报时 4)DS1302时钟芯片 5)DS18B20温度传感器 6)闹钟功能 7)判断闰年 ...

  9. 基于51单片机的电子时钟设计

    基于51单片机的电子时钟设计 0 功能介绍 1.从DS1302中读取时间显示 2.一共4个按键,按键1按下进入修改时间模式,再按下切换修改的时间变量,这个时候第2和3个按键就是修改时间变量的按键,修改 ...

  10. 51单片机红外电子密码锁【红外对管矩阵键盘数码管LCD1602显示模块】

    系统功能 51单片机红外电子密码锁系统主要由红外线编码电路.红外线解码开锁电路.掉电保护电路.声光提示报警电路.键盘及显示电路等组成,编写相应的程序代码并进行结果测试和仿真演示. 利用红外遥控技术和单 ...

最新文章

  1. LIC-Fusion 2.0:基于滑动窗口法平面特征跟踪的激光雷达惯性相机里程计
  2. AI的下半场怎么走,这朵云知道
  3. 【转】简单介绍几个CDS视图聚合函数
  4. HDFS查看文件的前几行-后几行-行数
  5. 米拓建站系统(MetInfo CMS)文章定时发布软件
  6. mysql5.7安装完成后密码是多少_安装了mysql5.7后,如何进行配置(密码等)初始化...
  7. 通过C#中的在线文件自动更新应用程序
  8. python cnn程序_python cnn训练(针对Fashion MNIST数据集)
  9. javascript 变换变量 数据类型 类型转换 运算符 运算表达式 运算优先级 理解笔记...
  10. 关于 Matlab R2014a下载与安装流程
  11. 【实验】设计一个加密算法(英文、中文)
  12. Java数字转换大写
  13. 【知识点总结】自动控制原理(自控)
  14. 内核block层IO调度器—bfq算法深入探索3
  15. 云终端服务器属于计算机设备吗,云终端不等于云电脑
  16. xp系统如何开启ftp服务器,xp系统怎么开ftp服务器
  17. 怎么理解“不经审视的人生,不值得过!“
  18. python爬取百度首页源代码并存储到HTML文件里
  19. 当OA遇上鸿蒙,打开信创智慧办公新画卷
  20. 如何在小程序内实现界面快速置顶功能?

热门文章

  1. 离散元pfc 岩土工程
  2. 《三国演义》分章节梗概
  3. 学渣上手 LaTeX 完成毕业论文
  4. qt repaint 用法_QT 界面绘制刷新机制
  5. 临时邮箱,20分钟,30分钟,60分钟
  6. CUDA各版本下载地址
  7. 基于SpringBoot超市库存管理系统+文档
  8. surf算法matlab代码,surf算法matlab源码
  9. 三菱触摸屏通讯错误_三菱触摸屏(人机界面)常见问题解析(一)
  10. 在Arcgis中更改图层的坐标系