基于AT89C51单片机简易电子琴.docx
- 文档编号:14395810
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:25
- 大小:347.40KB
基于AT89C51单片机简易电子琴.docx
《基于AT89C51单片机简易电子琴.docx》由会员分享,可在线阅读,更多相关《基于AT89C51单片机简易电子琴.docx(25页珍藏版)》请在冰点文库上搜索。
基于AT89C51单片机简易电子琴
基于AT89C51单片机简易电子琴的设计
小组分工:
***负责:
资料收集与整理,DXP2004电路板的绘制,
数码管显示
***负责:
矩阵键盘上实现7种不同的音调
***负责:
音乐播放实现
一、概述
1.1课程设计的题目:
基于AT89C51单片机简易电子琴
摘要:
如今随着社会的发展进步,音乐逐渐成为我们生活中很重要的一部分,生活中的我们都会欣赏世界名曲,作为对精神的洗礼。
本论文设计一个基于AT89C51单片机的简易电子琴。
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。
它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。
本系统是以51系列单片机AT89C51为主控制器,附有矩阵键盘、LED显示管、扬声器组成。
系统完成显示输入信息、播放相应音符等基本功能。
本设计的系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。
关键词:
AT89C51;矩阵键盘;LED显示管;扬声器
1.2设计任务
1)查阅相关电子琴的资料,了解熟悉单片机控制单音喇叭发声原理。
2)利用键盘的16键,能够发出1,2,3,4,5,6,7等7个音符,具有一般演奏功能,要求按下键发声,松开则延时一段时间停止,中间再按别的键,则发出另一个音调的。
3)存储有一首歌的音乐,设置按键按下具有自动播放已存曲目功能。
1.3引言
单片微型计算机是大规模集成电路技术发展的产物,属第四代电子计算机,它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。
AT89C51是美国ATMEL公司生产的低功耗,高性能CMOS8位单片机,片内含4k字节的可系统编程的Flash只读程序存器,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准8051指令系统及引脚。
由于将多功能8位CPU和闪烁存器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C51是它的一种精简版本。
AT89C51单片机为很多嵌入式制系统提供了一种灵活性高且价廉的方案,可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。
单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。
电子琴已为人们所熟知,它可以演奏出非常动听的乐曲,它在现代音乐扮演着重要的角色。
它是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。
在许多专用的电子琴电路中,都采用了特殊的集成电路来完成电子电路的设计,利用专用电路产生的声音信号驱动扬声器发音,通过演奏者不同的操作,弹奏出美妙的乐曲。
但是,以单片机作为主控核心,与键盘、蜂鸣器等模块组成核心主控制模块就可以达到设计一个简易电子琴的目的。
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
#include"music.h"
#include"piano.h"
voidmain(){
InterruptPiano();
while
(1)
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
PlaySelect();
}
}
#endif
播放音乐的程序:
//************************************************
#defineMUSIC_GLOBALS#include"music.h"
#include"piano.h"
//************************************************
#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,
sao,sao,fa,fa,
mi,mi,re,
dao,dao,sao,sao,
la,la,sao,
fa,fa,mi,mi,
re,re,dao,
0xff};
unsignedcharcodeJP[]={4,4,4,4,
4,4,8,
4,4,4,4,
4,4,8,
4,4,4,4,
4,4,8,
4,4,4,4,
4,4,8,
4,4,4,4,
4,4,8,
4,4,4,4,
4,4,8,
};
/*-------------------------------------------
延时子程序200ms
-------------------------------------------*/
voidMusicdelay()
{unsignedchari,j;
for(i=0;i<250;i++)
for(j=0;j<250;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];
TH0=(8192-C)/32;
TL0=(8192-C)%32;
TR0=1;
for(j=0;j Musicdelay(); TR0=0; i++; } } } #endif矩阵键盘的程序: //************************************************ //************************************************ #definePIANO_GLOBALS #include"piano.h" #include"music.h" //************************************************ //变量定义 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>0;y--); } /************************************************ 中断初始化函数 ************************************************/ voidInterruptPiano() { TMOD=0x01; TH0=0xd8; TL0=0xf0; EA=1; 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(); if(key1==0) { Music_count=0; Piano_count=0; } } /************************************************* 键盘驱动电子琴函数 *************************************************/ voidPiano() { while(temp! =0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp! =0xf0) { temp=P1; switch(temp) { case0xee: a=13; break; case0xde: a=14; break; case0xbe: a=15; break; case0x7e: a=16; break; } while(temp! =0xf0) {P1=0xfe; temp=P1; temp=temp&0xf0; TR0=1; } p36=1; TR0=0; } } P1=0xfd; temp=P1; temp=temp&0xf0; while(temp! =0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp! =0xf0) { temp=P1; switch(temp) { case0xed: a=9; break; case0xdd: a=10; break; case0xbd: a=11; break; case0x7d: a=12; break; } while(temp! =0xf0) {P1=0xfd; temp=P1; temp=temp&0xf0; TR0=1; } p36=1; TR0=0; } } P1=0xfb; temp=P1; temp=temp&0xf0; while(temp! =0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp! =0xf0) { temp=P1; switch(temp) { case0xeb: a=5; break; case0xdb: a=6; break; case0xbb: a=7; break; case0x7b: a=8; break; } while(temp! =0xf0) {P1=0xfb; temp=P1; temp=temp&0xf0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 AT89C51 单片机 简易 电子琴
文档标签
- 基于AT89C51单片机数字
- 基于AT89C51单片机双机
- 基于AT89C51单片机火灾
- 基于AT89C51单片机LED
- 完整基于单片机简易
- 基于单片机简易电子琴
- 基于单片机AT89C51数字
- 基于AT24C02简易电子
- 基于单片机简易声光
- 基于AT89C51单片机倒车
- 基于单片机微型电子琴
- 基于STC89C52单片机简易
- 基于AT89C51单片机水位
- 基于AT89C51单片机智能
- AT89C51单片机简介
- 基于at89c51单片机数字
- 基于AT89C51单片机多点
- 基于AT89C51单片机测温
- 基于单片机数字温度计
- 基于单片机数字温度计
- 基于单片机数字温度计
- 基于单片机数字温度计
- AT89C51基于单片机温度
- 基于单片机数字温度
- 基于单片机数字温度计