单片机音乐盒翻译小程序

发布者:DelightfulWish最新更新时间:2020-08-03 来源: 51hei关键字:单片机  音乐盒  翻译小程序 手机看文章 扫描二维码
随时随地手机看文章

首先打开MusicEncode软件,然后找来你制作歌曲的简谱
例如:
  长 亭 外,   古 道 边,
| 5 35 1 - | 6 16 5 - |
(注意:乐谱中的1是高音,上边是带点的;还有些音符,应该有下划线,在这里都无法标出。感兴趣的网友应该去查看正规的乐谱。)
将其输入后即可得到:
unsigned char code Music_Code[]={5, 2, 2,  3, 2, 1,  5, 2, 1, 1, 3, 4,  6, 2, 2,  1, 3, 1,  6, 2, 1, 5, 2, 4, 0, 0, 0 };
将其替换掉任何一首歌中的数据表即可作出不同的歌曲,但是要注意函数的名字,要与程序中原来的一样


以上是使用软件制作的音乐,手工转换方法如下
单片机演奏一个音符,是通过引脚,周期性的输出一个特定频率的方波
这就需要单片机,在半个周期内输出低电平、另外半个周期输出高电平,周而复始。
半个周期的时间是多长呢?众所周知,周期为频率的倒数,可以通过音符的频率计算出半周期。
演奏时,要根据音符频率的不同,把对应的、半个周期的定时时间初始值,送入定时器,再由定时器按时输出高低电平。

下面是个网上广泛流传的单片机音乐演奏程序,它可以循环的播放“世上只有妈妈好”这首乐曲。很多人都关心如何修改这个乐曲的内容,但是不知如何入手。
做而论道对这个程序,给出说明,希望对大家有所帮助,以后大家自己就能够编写进去新的乐曲。

在这个程序中,有两个数据表,其中存放了事先算好的、各种音符频率所对应的、半周期的定时时间初始值。
有了这些数据,单片机就可以演奏从低音、中音、高音和超高音,四个八度共28个音符。

演奏乐曲时,就根据音符的不同数值,从半周期数据表中找到定时时间初始值,送入定时器即可控制发音的音调。
比如把表中的0xF2和0x42送到定时器,定时器按照这个初始值来产生中断,输出的方波,人们听起来,这就是低音1。

乐曲的数据,也要写个数据表,程序中以 code unsigned char sszymmh[] 命名。
这个表中每三个数字,说明了一个音符,它们分别代表:
第一个数字是音符的数值1234567之一,代表多来咪发...;
第二个数字是0123之一,代表低音、中音、高音、超高音;
第三个数字是时间长度,以半拍为单位。
乐曲数据表的结尾是三个0。

程序如下:

#include
sbit   speaker = P1^7;
unsigned char timer0h, timer0l, time;
//--------------------------------------
//单片机晶振采用11.0592MHz
// 频率-半周期数据表 高八位     本软件共保存了四个八度的28个频率数据
code unsigned char FREQH[] = {
    0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8,    //低音1234567
    0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i
    0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE,            //高音 234567
    0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF};   //超高音 1234567

// 频率-半周期数据表 低八位
code unsigned char FREQL[] = {
    0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6,    //低音1234567
    0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i
    0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D,             //高音 234567
    0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16};   //超高音 1234567
//--------------------------------------
//世上只有妈妈好数据表           要想演奏不同的乐曲, 只需要修改这个数据表
code unsigned char sszymmh[] = {
6, 2, 3,  5, 2, 1,  3, 2, 2,  5, 2, 2,  1, 3, 2,  6, 2, 1,  5, 2, 1,
//一个音符有三个数字。前为第几个音、中为第几个八度、后为时长(以半拍为单位)。
//6, 2, 3 分别代表:6, 中音, 3个半拍;
//5, 2, 1 分别代表:5, 中音, 1个半拍;
//3, 2, 2 分别代表:3, 中音, 2个半拍;
//5, 2, 2 分别代表:5, 中音, 2个半拍;
//1, 3, 2 分别代表:1, 高音, 2个半拍;
//
6, 2, 4, 3, 2, 2, 5, 2, 1, 6, 2, 1, 5, 2, 2, 3, 2, 2, 1, 2, 1,
6, 1, 1, 5, 2, 1, 3, 2, 1, 2, 2, 4, 2, 2, 3, 3, 2, 1, 5, 2, 2,
5, 2, 1, 6, 2, 1, 3, 2, 2, 2, 2, 2, 1, 2, 4, 5, 2, 3, 3, 2, 1,
2, 2, 1, 1, 2, 1, 6, 1, 1, 1, 2, 1, 5, 1, 6, 0, 0, 0};
//--------------------------------------

void t0int() interrupt 1         //T0中断程序,控制发音的音调
{
    TR0 = 0;                     //先关闭T0
    speaker = !speaker;          //输出方波, 发音
    TH0 = timer0h;               //下次的中断时间, 这个时间, 控制音调高低
    TL0 = timer0l;
    TR0 = 1;                     //启动T0
}
//--------------------------------------
void delay(unsigned char t)     //延时程序,控制发音的时间长度
{
    unsigned char t1;
    unsigned long t2;
    for(t1 = 0; t1 < t; t1++)    //双重循环, 共延时t个半拍
      for(t2 = 0; t2 < 8000; t2++); //延时期间, 可进入T0中断去发音
    TR0 = 0;                        //关闭T0, 停止发音
}
//--------------------------------------
void song()                      //演奏一个音符
{
    TH0 = timer0h;               //控制音调
    TL0 = timer0l;
    TR0 = 1;                     //启动T0, 由T0输出方波去发音
    delay(time);                 //控制时间长度
}
//--------------------------------------
void main(void)
{
    unsigned char k, i;
    TMOD = 1;                    //置T0定时工作方式1
    ET0 = 1;                     //开T0中断
    EA = 1;                      //开CPU中断
    while(1) {
      i = 0;
      time = 1;
      while(time) {
        k = sszymmh[ i] + 7 * sszymmh[i + 1] - 1;
                      //第i个是音符, 第i+1个是第几个八度
        timer0h = FREQH[k];      //从数据表中读出频率数值
        timer0l = FREQL[k];      //实际上, 是定时的时间长度
        time = sszymmh[i + 2];   //读出时间长度数值
        i += 3;
        song();                  //发出一个音符
}   } }
//======================================
应网友要求,下面再详细写一下乐谱和数据的转换关系。
以李叔同大师的《送别》的前二小节来说明转换的方法。

这部分的歌词是:“长 亭 外,   古 道 边,”;
这部分的乐谱是:| 5 35 1 - | 6 16 5 - |。
(注意:乐谱中的1是高音,上边是带点的;还有些音符,应该有下划线,在这里都无法标出。感兴趣的网友应该去查看正规的乐谱。)

那么,据此就可以写出《送别》前二小节的数据表:
//--------------------------------------
code unsigned char sszymmh[] = {
5, 2, 2,          3, 2, 1,          5, 2, 1,          1, 3, 4,
//嗦,中音,2个半拍; 咪,中音,1个半拍; 嗦,中音,1个半拍; 哆,高音,4个半拍
6, 2, 2,          1, 3, 1,          6, 2, 1,          5, 2, 4,
//啦,中音,2个半拍; 哆,高音,1个半拍; 啦,中音,1个半拍; 嗦,中音,4个半拍
0, 0, 0};
//结束标记
//--------------------------------------

记住:三个数字一组,代表一个音符。
第一个数字是1234567之一,代表音符哆来咪发...;
第二个数字是0123之一,代表低音、中音、高音、超高音;
第三个数字是半拍的个数,代表时间长度。
当三个数字都是0,就代表乐曲数据表的结尾。

用这个数据表,替换掉程序中《世上只有妈妈好》的数据表,本程序就可以播放《送别》的前两小节。

关键字:单片机  音乐盒  翻译小程序 引用地址:单片机音乐盒翻译小程序

上一篇:用无字库12864改的大屏万年历
下一篇:L298n同步控制两个直流电机转速

推荐阅读最新更新时间:2024-10-17 18:29

单片机音乐盒翻译小程序
首先打开MusicEncode软件,然后找来你制作歌曲的简谱 例如: 长 亭 外, 古 道 边, | 5 35 1 - | 6 16 5 - | (注意:乐谱中的1是高音,上边是带点的;还有些音符,应该有下划线,在这里都无法标出。感兴趣的网友应该去查看正规的乐谱。) 将其输入后即可得到: unsigned char code Music_Code ={5, 2, 2, 3, 2, 1, 5, 2, 1, 1, 3, 4, 6, 2, 2, 1, 3, 1, 6, 2, 1, 5, 2, 4, 0, 0, 0 }; 将其替换掉任何一首歌中的数据表即可作出不同的歌曲,但是要注意函数的名字,要与程序中原来的一样 以上是使用软件制作
[单片机]
基于AT89C51单片机的LCD160音乐盒设计
一.系统概述 系统使用的模块有AT89C51单片机+LCD1602+按键+蜂鸣器。 系统内使用AT89C51单片机作为主控,使用LCD1602显示屏显示音乐信息,通过按键就能控制音乐盒的歌曲切换以及歌曲的开始和暂停,系统在运行后需要点击开机键才能开始工作。当点击播放键后以蜂鸣器为主体的播放装置就会开始播放歌曲。 二.仿真概述 1.通过LCD1602显示屏显示歌曲信息,其中包括歌曲序号和歌曲时间。 2.通过左侧的按键控制歌曲,其中包括上一首、下一首、播放暂停、开关机。 3.通过播放装置播放相应的歌曲。 三.程序设计 使用Keil 51进行程序设计,打开Proteus时程序是默认烧录的状态,如果没有烧录点击AT89
[单片机]
基于AT89C51<font color='red'>单片机</font>的LCD160<font color='red'>音乐盒</font>设计
单片机设计 电子琴音乐盒(AT89C51)
一、电路设计 此电路由AT89C51最小系统、按键模块、数码管显示和蜂鸣器组成。 实现功能:七个按键代表Do La Mi So Re La Si 最后一个按键代表切换音乐。 二、运行结果 三、部分代码 #include reg52.h #define uchar unsigned char #define uint unsigned int //#include main.h sbit BeepIO = P0^7; //定义音频输出管脚 sbit KEY1 = P1^0; //按键1 do sbit KEY2 = P1^1; //按键2 re sbit KEY3 = P1^2; //按键3 mi sbit KEY
[单片机]
<font color='red'>单片机</font>设计 电子琴<font color='red'>音乐盒</font>(AT89C51)
基于51单片机音乐盒设计
一.硬件方案 本设计以51单片机原理和控制理论设计音乐演奏控制器的硬件电路,并利用C语言进行程序设计。通过控制单片机内部的定时器来产生不同频率的方波,驱动蜂鸣器发出不同音调的音乐,再利用延迟来控制发音时间的长短。把乐谱转化成相应的定时常数就可以从发音设备中演奏出悦耳动听的音乐。 主要由51单片机+最小系统+LM386功放电路+喇叭+LED指示灯模块+按键模块;如图: 二.设计功能 (1)采用外部加功放电路,LM386芯片驱动喇叭,构成音乐演奏器的硬件电路; (2)内置8首歌曲; (3)四个按键功能:单独的是复位按键,上一曲、开始/暂停、下一曲; 三.设计原理图 (1)原理图主要采用AD软件进行设计,如图: (2)P
[单片机]
基于51<font color='red'>单片机</font>的<font color='red'>音乐盒</font>设计
自己做的单片机音乐盒,外加LED做数码管显示数字
单片机源程序如下: #include reg52.h #define uint unsigned int #define uchar unsigned char sbit speaker=P1^4;//喇叭接30脚 sbit key1=P1^0;//流水灯按键(暂时) sbit key2=P1^1;//播放音乐按键(暂定) uchar a,b,num1,s1num,n1,n2; uchar qushu=0; char num;//定义num为可以负数 uchar code yinfu ={0xfb,0xe9, //Do 0xfc,0x5c, //Re 0xfc,0xc1,
[单片机]
自己做的<font color='red'>单片机</font><font color='red'>音乐盒</font>,外加LED做数码管显示数字
51单片机音乐盒 仿真+程序
电路介绍: 1.此项目采用51单片机实现音乐盒的功能,同时电路中采用模拟示波器,可以实时查看波形的变动。 2.通过一个可调电阻实现音频信号的音量大小 3.基于8欧姆/1w的喇叭作为音频输出部件 proteus仿真原理图: 源代码: #include reg52.h #include intrins.h #define uchar unsigned char #define uint unsigned int sbit SPK = P2^7; uchar tone_h; //高音 uchar tone_l; //低音 uint note = 1; //音符 uchar
[单片机]
51<font color='red'>单片机</font><font color='red'>音乐盒</font> 仿真+程序
51单片机音乐盒的仿真课程设计(8首歌)
仿真成功 初始化显示P.521061P. 显示歌曲编号。 8首歌的音乐盒课程设计。 一个很简单的程序 分享一下 仿真原理图如下 单片机源程序如下: ////////////////////////////////////////////// //51单片机音乐播放器程序 // //共三个按键:上一曲、下一曲、播放暂停 // //播放完一首歌曲无按键按下时顺序播放下一曲 // ////////////////////////////////////////////// #include REG51.H //#define sound_amount 5 //歌曲的数量
[单片机]
51<font color='red'>单片机</font><font color='red'>音乐盒</font>的仿真课程设计(8首歌)
51单片机做的音乐盒,带八段数码管显示程序+Proteus仿真
#include reg52.h #define uchar unsigned char #define uint unsigned int sbit key1=P3^2;//按key1可以暂停播放 sbit key2=P3^3;//按key2可切换歌曲 sbit fm=P3^7;//蜂鸣器连续的IO口 uchar code shuzi0=0x3f; uchar code shuzi1=0x06;//数字1 uchar code shuzi2=0x5b;//数字2 uchar code shuzi3=0x4f; uchar code shuzi4=0x66; uchar code shuzi5=0x6d; uchar code
[单片机]
51<font color='red'>单片机</font>做的<font color='red'>音乐盒</font>,带八段数码管显示程序+Proteus仿真
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved