音乐盒播放器.ds.
unsigned char timer0h, timer0l, time; //-------------------------------------//单片机晶振采用11.0592MHz
二、演奏一首音乐
//各种音符频率所对应的、半周期的定时时间初始值。
// 频率-半周期数据表 高八位 code unsigned char FREQH[] = { 0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音1234567
琴和PC之间的通信,能通过PC向单片机发送数据
指令,实现对键盘所对应的高低音调整,并将PC 所发送数据显示出来。各工作小组对键盘调音的 上调和下调指令码分别为0-9和A-J。
三、简易电子琴设计
(2)方案框图 根据任务要求,单片机电子琴主控芯片为8051单片机, 有16只音符输入键盘,可以从PC输入控制数码,输入数 码通过串口传送给单片机,通过控制码能调整音键的音 阶,并能显示从PC输入的数码,用LED数码管显示音键 名。电子琴方案框图如图所示。 PC串行输入数码 矩阵键盘 时钟复位电源 LED显示键盘名
感兴趣的同学应该去查看乐谱相以写出《送别》前二小节的数据表: code unsigned char sszymmh[] = { 5, 2, 2, 3, 2, 1, 5, 2, 1, 1, 3, 4, 嗦,中音,1
//嗦,中音,2个半拍;
咪,中音,1个半拍;
个半拍;
一、单键演奏一组音符
二、演奏一首音乐
节拍的实现: 在一张乐谱中,我们经常会看到这样的表达式,如1=C (4/4) 、1=G(3/4) …… 等等,这里1=C
(4/4),1=G(3/4) 表示乐谱的曲调,与前面所谈的音调 有很大的关联,4/4、3/4 就是用来表示节拍的。以
3/4 为例加以说明,它表示乐谱中以四分音符为节拍,
二、演奏一首音乐
/*演奏一个音符*/ 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(); //发出一个音符 } }
二、演奏一首音乐
/*定时器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, 停止发音 }
每一小结有三拍。
二、演奏一首音乐
其中1 、2 为一拍,3、4、5为一拍,6为一拍共三拍。 1 、2的时长为四分音符的一半,即为八分音符长,3、
4的时长为八分音符的一半,即为十六分音符长,5的时
长为四分音符的一半,即为八分音符长,6的时长为四 分音符长。
二、演奏一首音乐
乐曲的数据,一般写入数据表,表中每三个数字,说明了
波的周期,观察控制数码的调音效果。 P0端口接LED数码管显示音键名。 电子琴电路原理图如图所示:
三、简易电子琴设计
三、简易电子琴设计
(3)软件设计流程图-电子琴主程序流程图
初始化
是否有键按下
Y
N
键盘扫描,识别按下键的列值 停止定时器,关闭播放
键盘扫描,识别按下键的行值
根据键值和控制码,键音调整
//中音音 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}; //--------------------------------------
一、单键演奏一组音符
1、单片机是如何发出音乐声
原理:
声音是通过震动产生的。单片机对某一I/O引脚以一定 的频率循环置1 和清0,这一引脚便产生一定频率的方 波,该方法通过放大后作用于扬声器便产生一定频率 的声音。若改变输出方波的频率,产生的声音也就改
变了。通过控制输出方波的时间长短,声音的长短也
就得到控制,因此,根据乐谱,单片机就可以产生音
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,
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,
建好,然后将信号通过电声器件转换为声波,这样单片
机就能发出一段音乐的声音了。
一、单键演奏一组音符
2、音调的确定 音调就是我们常说的音高。它是由频率来确定的!我们 可以查出各个音符所对应的相应的频率,那么现在就需 要我们来用51来发出相应频率的声音! 我们常采用的方法就是通过单片机的定时器定时中断, 将单片机上对应蜂鸣器的 I/O口来回取反,或者说来回
启动定时器,生成方波信号播放音频
清零,置位,从而让蜂鸣器发出声音,为了让单片机发
出不同频率的声音,我们只需将定时器预置不同的定时 值就可实现。那么怎样确定一个频率所对应的定时器的 定时值呢?
一、单键演奏一组音符
2、音调的确定 例如:中音DO的频率为523Hz,周期为:T=1/f=1912us 单片机上对应蜂鸣器的I/O 口来回取反的时间应即半个 周期为:t=T/2=956us 这个时间t 就是单片机上定时器应有的中断触发时间。 只要将定时器的定时时间设置为956us,就可以产生频
//中音 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};
单 片 机
中断显示输入数码 声频播放
三、简易电子琴设计
(2)硬件电路 输入键盘设计: 矩阵键盘:4*4=16只按键,P1口接矩阵键盘 采用虚拟终端VIRTUAL TERMINAL模拟PC的作用。 虚拟终端接单片机串口,单片机的发送端接虚拟终端接 收端,单片机的接收端连虚拟终端发送端
P3.7端输出音频信号,并连接虚拟示波器以测试音频方
6, 2, 2,
哆,高音,4个半拍
1, 3, 2, 5, 2, 4, 哆,高音,1个半拍;嗦,中音,4个