基于AT89C51单片机简易电子琴Word下载.docx
- 文档编号:21018079
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:22
- 大小:347.43KB
基于AT89C51单片机简易电子琴Word下载.docx
《基于AT89C51单片机简易电子琴Word下载.docx》由会员分享,可在线阅读,更多相关《基于AT89C51单片机简易电子琴Word下载.docx(22页珍藏版)》请在冰豆网上搜索。
1.4基于AT89C51单片机简易电子琴的设计思想
单片机产生音乐的要素一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率,也就是说不能像电子琴那样能奏出多种音色的声音。
因此,单片机奏乐只需弄清楚两个概念,也就是“音调”和“节拍”。
音调表示一个音符唱多高的频率,节拍表示一个音符唱多长的时间。
一首音乐是由许多不同的音符组成的,而每个音符对应着不同的频率,这样我们就可以利用不同的频率的组合,加上与拍数对应的延时,即可构成我们所想要的音乐了。
所以本课程设计的主要内容是用AT89C52单片机为核心控制元件,设计一个电子琴。
以单片机作为主控核心,与键盘、蜂鸣器等模块组成核心主控制模块,在主控模块上设有16个按键和蜂鸣器,用不同的频率和延时的时间来产生音乐的要素“音调”和“节拍”。
1.5设计功能
(1)由4X4组成16个按钮矩阵,设计成16个音,可随意弹奏想要表达的声音。
(2)设计有音乐存储,按键按下后播放。
(3)键盘矩阵识别,即矩阵扫描在数码管上可以显示矩阵键盘按下哪个按键。
二、方案比较与论证
2.1举例方案
方案一:
用VHDL语言编程来实现系统整体基本原理图如下:
利用我们实验室先进的数字电路实验设备,我们可以采用VHDL语言编程来实现。
我们可以通过VDHL语言,对实验原理图的各个部分进行设计,通过编译,可以在计算机上下载此实验原理图,利空电路学习机上的芯片。
方案二:
利用AT89C51单片机为核心控制元件,以单片机作为主控核心,与键盘、蜂鸣器等模块组成核心主控制模块,在主控模块上设有16个按键和蜂鸣器来设计一个电子琴。
方案一显得比较笼统,只是把整个系统分为了若干个模块,而不牵涉到具体的硬件电路。
而方案二,利用单片机4X4组成16个按钮矩阵,设计成16个音对应音乐音符。
每按一个键,单片机检测按下的那个键并查表查找相应的音符,输出到音频处理模块驱动蜂鸣器发出音符。
利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。
所以本次设计采用方案二。
2.2系统组成
本系统只要以51单片机为主控核心,与矩阵键盘、扬声器、LED显示管模块一起组合而成。
具体如下:
2.3流程图
三、电路设计
3.1、蜂鸣器模块
单片机实验板蜂鸣器原理图如下图表1所示:
图表1
蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。
如图一所示,蜂鸣器的正极接到VCC(+5V)电源上面,蜂鸣器的负极接到三极管的发射极E,三极管的基级B经过限流电阻R1后由单片机的P3.6引脚控制,当P3.6输出高电平时,三极管T1截止,没有电流流过线圈,蜂鸣器不发声;
当P3.6输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。
因此,我们可以通过程序控制P3.6脚的电平来使蜂鸣器发出声音和关闭。
用延时程序或者定时器控制接蜂鸣器的端口输出频率在2KHZ左右的矩形波就能让蜂鸣器发声了。
程序中改变单片机P3.6引脚输出波形的频率,就可以调整控制蜂鸣器音调,生各种不同音色、音调的声音。
另外,改变P3.6输出电平的高低电平占空比,则可以控制蜂鸣器的声音大小。
3.2矩阵键盘模块
在单片机组成的各种系统中,本次试验用的是非编码键盘,矩阵键盘。
矩阵键盘:
由单片机I/O口构成的行列式键盘,优点:
扫描速度快,按键数量多缺点:
按键间存在关联,不能级联。
矩阵式结构的键盘识别要复杂一些,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。
这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。
行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。
单片机实验板键盘原理图如下图表2所示:
图表2
键盘原理图的PCB图如图表3所示:
图表3
独立键盘模块
独立键盘:
单片机一个I/O口连接一个按键。
独立键盘的原理图如图表4所示:
图表4
3.3主控模块
最小系统的原理图如图表5所示:
图表5
总的原理图如图表6所示:
图表6
3.4音乐设计“音调”和“节拍”
(1)本设计的控制矩阵键盘使用定时器T0方式1的音调的计算方法如下
矩阵键盘的音调计算:
计数脉冲值与频率的关系式是:
N=fj÷
2÷
fr
式中,N是计数值:
fj是机器频率(晶体振荡器为11.0592MH时,其频率为1MHz);
fr‘是想要产生的频率’。
本设计定时器工作方式1,16个键的频率
音阶对应频率(音调的频率)表如图表7所示:
图表7
(2)节拍的计算方法
本设计使用定时器T0的中断控制播放音乐《一闪一闪亮晶晶》,T0工作方式0,
图表8列出了C音调与频率的对应关系。
1、C音调与频率的对应关系表
C音调与频率的对应关系表
音调
低1(“dao”)
低2
低3
低4
低5
低6
低7
频率
262
294
330
349
392
440
494
1(中音“dao”)
2
3
4
5
6
7
523
587
659
698
784
880
988
高1
高2
高3
高4
高5
高6
高7
1064
1175
1318
1397
1586
1760
1967
图表8
2.定时常数C计算公式
C=
T0工作方式0.最大计数为8192,在已知定是常数为C的条件下,13位计算器的高8位和低5的初值可由以下公式设定
TH0=(8192-C)/32;
TL0=(8192-C)%32;
3.简单乐谱
|1155|665-|4433|221-|5544|332-|5544|332-|1155|665-|4433|221-|
4..节拍控制
本例简谱的节拍为每分钟72拍,则每个节拍需时间
(1000*60ms)/72=833ms
“1“为1拍,需延时833ms
“2”为1/2拍,需延时833/2ms
“3”为1/4,需延时833/4ms
3.5工作原理
矩阵键盘的工作原理:
通过AT89C51单片机为核心控制元件,设计一个能发出电子音调的简易电子琴。
在控制模块上设有16个矩阵键盘按键,通过按下矩阵键盘K01一K7键,可发出DO、RE、M、FA、SO、LA、SI7个低音符的声音;
矩阵键盘K08—K14键,可发出D0、RE、M、FA、SO、LA、SI7个中音符的声音;
K15键是高音符DO的声音,K16键是高音符RE的声音。
当我们随意按下矩阵键盘上的一个按键时,可以发出相应的声音。
本设计有一个功能选择键(选择使用矩阵键盘选择键或者选择自动播放音乐选择键),一个矩阵键盘选择键、一个自动播放音乐选择键,通过按下功能选择键,可以实现按键发音功能和音乐播放功能之间的切换。
在矩阵按键发音的功能下,可以通过音调选择键来选择三个不同的音阶进行发音;
在音乐播放功能下,可以自动播放音乐。
3.6创新部分
当我们选择矩阵键盘选择键的时候,在矩阵按键发音的功能下,可以通过音调选择键来选择三个不同的音阶进行发音,同时在主板的数码管上可以同时显示你在矩阵键盘上按下哪一个键。
例如你按下K01键,同时在数码管显示01这个数字。
3.7LED数码显示管与单片机的连接
led数码管(LEDSegmentDisplays)是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。
led数码管常用段数一般为7段有的另加一个小数点,还有一种是类似于3位“+1”型。
位数有半位,1,2,3,4,5,6,8,10位等等....,led数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。
数码管动态显示介面是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"
a,b,c,d,e,f,g,dp"
的同名端连在一起,另外为每个数码管的公共极COM增加位元选通控制电路,位元选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位元选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位元就显示出字形,没有选通的数码管就不会亮。
透过分时轮流控制各个LED数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中,每位元数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极体的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示资料,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O埠,而且功耗更低。
由此本实验是将P2口通过芯片与数码管连接,以达到点亮数码管的效果。
静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。
当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。
这种方法的优点是占用CPU时间少,显示便于监测和控制。
图表9
3.8源程序
主函数:
#include<
reg52.h>
#include"
music.h"
piano.h"
voidmain(){
InterruptPiano();
while
(1)
{
P1=0xfe;
temp=P1;
temp=temp&
0xf0;
PlaySelect();
}
}
#endif
播放音乐的程序:
//************************************************
#defineMUSIC_GLOBALS#include"
#definedao523#definere587
#definemi659
#definefa698
#definesao784
#definela880
#definexi987
unsignedintcodef[]={dao,dao,sao,sao,
la,la,sao,
fa,fa,mi,mi,
re,re,dao,
sao,sao,fa,fa,
mi,mi,re,
dao,dao,sao,sao,
la,la,sao,
0xff};
unsignedcharcodeJP[]={4,4,4,4,
4,4,8,
4,4,4,4,
4,4,8,
4,4,8,
};
/*-------------------------------------------
延时子程序200ms
-------------------------------------------*/
voidMusicdelay()
{unsignedchari,j;
for(i=0;
i<
250;
i++)
for(j=0;
j<
j++)
;
}
/*----------------------------------------
定时器T0的中断服务子程序,使P3.6引脚输出音频的方波
------------------------------------------------*/
voidTime0(void)interrupt1using1
{sound=!
sound;
TH0=(8192-C)/32;
TL0=(8192-C)%32;
/*---------------------------------
主函数
----------------------------------*/
voidMusicInit()
{
EA=1;
ET0=1;
TMOD=0x00;
while(Music_count==1)
{i=0;
if(key1==0)
{
Music_count=0;
Piano_count=0;
}
while(f[i]!
=0xff&
&
Music_count==1){
if(key1==0)
Music_count=0;
Piano_count=0;
}
C=460830/f[i];
TL0=(8192-C)%32;
TR0=1;
for(j=0;
JP[i];
Musicdelay();
TR0=0;
i++;
#endif矩阵键盘的程序:
#definePIANO_GLOBALS
//变量定义
unsignedinttab[]={1759,1567,1396,1320,
1578,1047,933,832,
785,699,660,587,
524,466,441,392};
ucharcodenum[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/*************************************************
延时子函数
*************************************************/
voiddelay(uintz)
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
/************************************************
中断初始化函数
************************************************/
voidInterruptPiano()
TMOD=0x01;
TH0=0xd8;
TL0=0xf0;
ET0=1;
TR0=0;
}
选择电子琴或者音乐播放函数
voidPlaySelect()
{
if(PianoKey==0)
Piano_count=1;
if(Piano_count==1&
Music_count==0)
Piano();
if(MusicKey==0)
Music_count=1;
if(Music_count==1&
Piano_count==0)
MusicInit();
键盘驱动电子琴函数
voidPiano()
while(temp!
=0xf0)
delay(5);
temp=P1;
temp=temp&
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xee:
a=13;
break;
case0xde:
a=14;
case0xbe:
a=15;
case0x7e:
a=16;
}
{P1=0xfe;
temp=P1;
temp=temp&
TR0=1;
p36=1;
TR0=0;
}
}
P1=0xfd;
while(temp!
{
case0xed:
a=9;
case0xdd:
a=10;
case0xbd:
a=11;
case0x7d:
a=12;
{P1=0xfd;
P1=0xfb;
{
case0xeb:
a=5;
case0xdb:
a=6;
case0xbb:
a=7;
case0x7b:
a=8;
while(temp!
{P1=0xfb;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 AT89C51 单片机 简易 电子琴
![提示](https://static.bdocx.com/images/bang_tan.gif)