音乐盒播放器.ds.
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//中音音 234567
//高音 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}; //--------------------------------------
0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i
0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE,
0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF}; // 频率-半周期数据表 低八位 code unsigned char FREQL[] = { 0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6,
一个音符,它们分别代表: 第一个数字是音符的数值1234567之一,代表多来咪...; 第二个数字是123之一,代表低音、中音、高音; 第三个数字是时间长度,以半拍为单位。
乐曲数据表的结尾是三个0。
乐谱中数字上面带点表示高音,下面带点表示低音。什么 都不带表示中音。 下划线:单个数字是四分音符,两个数字下画一条线是八 分音符了。
率为523Hz的方波信号。
一般情况下,单片机奏乐时,其定时器为工作方式1, 设振荡器频率为f,则定时器的予置初值由下式来确定 : t=(216-X)*(12/f)
一、单键演奏一组音符 2、音调的确定
因此定时器的高低计数器的初值为:
TH =X/ 256 = ( 216– t* f/12) / 256
建好,然后将信号通过电声器件转换为声波,这样单片
机就能发出一段音乐的声音了。
一、单键演奏一组音符
2、音调的确定 音调就是我们常说的音高。它是由频率来确定的!我们 可以查出各个音符所对应的相应的频率,那么现在就需 要我们来用51来发出相应频率的声音! 我们常采用的方法就是通过单片机的定时器定时中断, 将单片机上对应蜂鸣器的 I/O口来回取反,或者说来回
波的周期,观察控制数码的调音效果。 P0端口接LED数码管显示音键名。 电子琴电路原理图如图所示:
三、简易电子琴设计
三、简易电子琴设计
(3)软件设计流程图-电子琴主程序流程图
初始化
是否有键按下
Y
N
键盘扫描,识别按下键的列值 停止定时器,关闭播放
键盘扫描,识别按下键的行值
根据键值和控制码,键音调整
64968,95030,65058,65110};
一、单键演奏一组音符
实例演示: 要求:用一只单键产生一组音符的声音,发声从低音阶
向高音阶进展,可以通过虚拟示波器观察到单片机产生
的方波的周期变化。单片机演奏音乐的电路只需要单片 机和声音播放电路,电路原理图如图所示。
三极管 蜂鸣器
一、单键演奏一组音符
TL = X % 256 = (216–t* f/12) %256
C调各音符频率与计数值T的对照表如图所示:
一、单键演奏一组音符
2、音调的确定 一般我们要为这个音符建立一个表格,有助于单片机通 过查表的方式来获得相应的数据。 uint code tab[]={63628,63835,64021,64103, 64260,64400,64524,64580, 64684,64777,64820,64898,
一、单键演奏一组音符
1、单片机是如何发出音乐声
原理:
声音是通过震动产生的。单片机对某一I/O引脚以一定 的频率循环置1 和清0,这一引脚便产生一定频率的方 波,该方法通过放大后作用于扬声器便产生一定频率 的声音。若改变输出方波的频率,产生的声音也就改
变了。通过控制输出方波的时间长短,声音的长短也
就得到控制,因此,根据乐谱,单片机就可以产生音
6, 2, wk.baidu.com,
哆,高音,4个半拍
1, 3, 2, 5, 2, 4, 哆,高音,1个半拍;嗦,中音,4个
//啦,中音,2个半拍; 半拍 0, 0, 0};
二、演奏一首音乐
单片机演奏音乐的电路只需要单片机和声音播放电路, 电路原理图如图所示。
二、演奏一首音乐
/*演奏“世上只有妈妈好”*/ #include <reg52.h> sbit speaker = P3^0;
启动定时器,生成方波信号播放音频
一、单键演奏一组音符
二、演奏一首音乐
节拍的实现: 在一张乐谱中,我们经常会看到这样的表达式,如1=C (4/4) 、1=G(3/4) …… 等等,这里1=C
(4/4),1=G(3/4) 表示乐谱的曲调,与前面所谈的音调 有很大的关联,4/4、3/4 就是用来表示节拍的。以
3/4 为例加以说明,它表示乐谱中以四分音符为节拍,
单 片 机
中断显示输入数码 声频播放
三、简易电子琴设计
(2)硬件电路 输入键盘设计: 矩阵键盘:4*4=16只按键,P1口接矩阵键盘 采用虚拟终端VIRTUAL TERMINAL模拟PC的作用。 虚拟终端接单片机串口,单片机的发送端接虚拟终端接 收端,单片机的接收端连虚拟终端发送端
P3.7端输出音频信号,并连接虚拟示波器以测试音频方
感兴趣的同学应该去查看乐谱相关的知识。
二、演奏一首音乐
据此就可以写出《送别》前二小节的数据表: code unsigned char sszymmh[] = { 5, 2, 2, 3, 2, 1, 5, 2, 1, 1, 3, 4, 嗦,中音,1
//嗦,中音,2个半拍;
咪,中音,1个半拍;
个半拍;
课后思考:
增加一个按键控制选播多首音乐?
也可以增加一个数码管用于显示正在播放的
是第几首歌曲?
三、简易电子琴设计 (1)任务要求:
采用单片机控制方式,设计制造电子琴,能够通
过串口对键盘进行简单调音控制。电子琴具有16
只音乐输入键盘,可以进行简单的音乐演奏。
LED数码管能显示按下的键盘,实现单片机电子
unsigned char timer0h, timer0l, time; //-------------------------------------//单片机晶振采用11.0592MHz
二、演奏一首音乐
//各种音符频率所对应的、半周期的定时时间初始值。
// 频率-半周期数据表 高八位 code unsigned char FREQH[] = { 0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音1234567
//中音 234567
//高音 1234567
//低音1234567
0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i
0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D,
0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16};
每一小结有三拍。
二、演奏一首音乐
其中1 、2 为一拍,3、4、5为一拍,6为一拍共三拍。 1 、2的时长为四分音符的一半,即为八分音符长,3、
4的时长为八分音符的一半,即为十六分音符长,5的时
长为四分音符的一半,即为八分音符长,6的时长为四 分音符长。
二、演奏一首音乐
乐曲的数据,一般写入数据表,表中每三个数字,说明了
二、演奏一首音乐
/*定时器T0中断函数*/ 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, 停止发音 }
琴和PC之间的通信,能通过PC向单片机发送数据
指令,实现对键盘所对应的高低音调整,并将PC 所发送数据显示出来。各工作小组对键盘调音的 上调和下调指令码分别为0-9和A-J。
三、简易电子琴设计
(2)方案框图 根据任务要求,单片机电子琴主控芯片为8051单片机, 有16只音符输入键盘,可以从PC输入控制数码,输入数 码通过串口传送给单片机,通过控制码能调整音键的音 阶,并能显示从PC输入的数码,用LED数码管显示音键 名。电子琴方案框图如图所示。 PC串行输入数码 矩阵键盘 时钟复位电源 LED显示键盘名
乐。音乐中最关键的两个要素是音调和节拍。
音调表示一个音符唱多高的频率, 节拍表示一个音符唱多长的时间。
一、单键演奏一组音符
1、单片机是如何发出音乐声 一首音乐是由很多音符组合而成的,一个音符代表了一 种频率的乐声,通过不同频率乐声的组合,就可以产生 一首音乐了。这就是电子音乐的基本方法。 单片机可以通过定时器生成不同频率的信号,按照音乐 音符的频率来生成各种频率的信号,并将其按照音乐构
二、演奏一首音乐
/*演奏一个音符*/ void song() { TH0 = timer0h; TL0 = timer0l; TR0 = 1; delay(time); } // 演奏一个音符 //控制音调 //启动T0, 由T0输出方波去发音 //控制时间长度
二、演奏一首音乐
/*演奏一个音符*/ 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(); //发出一个音符 } }
清零,置位,从而让蜂鸣器发出声音,为了让单片机发
出不同频率的声音,我们只需将定时器预置不同的定时 值就可实现。那么怎样确定一个频率所对应的定时器的 定时值呢?
一、单键演奏一组音符
2、音调的确定 例如:中音DO的频率为523Hz,周期为:T=1/f=1912us 单片机上对应蜂鸣器的I/O 口来回取反的时间应即半个 周期为:t=T/2=956us 这个时间t 就是单片机上定时器应有的中断触发时间。 只要将定时器的定时时间设置为956us,就可以产生频