单片机大作业 电子琴.docx
- 文档编号:4386887
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:31
- 大小:152.81KB
单片机大作业 电子琴.docx
《单片机大作业 电子琴.docx》由会员分享,可在线阅读,更多相关《单片机大作业 电子琴.docx(31页珍藏版)》请在冰点文库上搜索。
单片机大作业电子琴
《单片机原理及应用》结课大作业
《电子琴模拟》
说明书
学生姓名薛仁杰
学号5011212510
所属学院信息工程学院
专业计算机科学与技术
班级17-6班
信息工程学院
目录
摘要............................................................................................................................I
一丶项目概述和要求1
1.1项目开发背景1
1.2项目目的1
1.3设计要求2
二丶系统硬件设计2
2.1电子琴原理2
2.2系统结构3
2.3硬件部分总体方案3
2.4元件清单4
三丶软件设计7
3.1单片机实现音乐7
3.2软件框图及部分代码8
3.3程序设计说明15
四丶系统调试与测试结果分析16
4.1使用的仪器仪表16
4.2系统调试16
4.3测试结果16
五丶源程序16
六丶总结21
七丶参考文献21
摘要
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。
它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。
本文的主要内容是用AT89S51单片机为核心控制元件,设计一个电子琴。
以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键和扬声器。
本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。
关键词:
AT80c51,单片机音色,节拍器,自动放音
一丶项目概述和要求
1.1项目开发背景
随着电子科技的飞速发展,电子技术正在逐渐改善着人们的学习、生活、工作,因此开发本系统希望能够给人们多带来一点生活上的乐趣。
基于当前市场上的玩具市场需求量大,其中电子琴就是一个很好的应用方面。
单片机技术使我们可以利用软硬件实现电子琴的功能,从而实现电子琴的微型化,可以用作玩具琴、音乐转盘以及音乐童车等等。
并且可以进行一定的功能扩展。
鉴于传统电子琴可以用键盘上的“1”到“A”键演奏从低So到高DO等11个音,从而可以用来弹奏喜欢的乐曲。
该设计将十一个琴键改成16个,使电子琴的功能更加完美。
不但可以实现对乐曲的演奏,同时还具有存储音乐、播放歌曲以及显示按键的功能。
使该设计功能更加完善。
1.2项目目的
利用AT80C51单片机自带资源,设计一款能实现弹奏和带存储功能的电子琴。
(1)能够对电子电路、电子元器件、印制电路板等方面的知识有进一步的认识,独立对其进行测试与检查。
(2)熟悉8051单片机的内部结构和功能,合理使用其内部寄存器,能够完成相关软件编程设计工作。
(3)为实现预期功能,能够对系统进行快速的调试,并能够对出现的功能故障进行分析,及时修改相关软硬件。
(4)对软件编程、排错调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高。
1.3设计要求
①设计出15个音符,随意弹奏,按“0”键为音乐休止符,不发声,用它时间的长短表示休止时间的长短。
②用功能键转换成歌曲演奏,可播放预存的音乐。
③可存储现场弹奏的音乐。
[扩充功能]:
④采用LCD显示信息,开机时有欢迎提示符,播放时显示歌曲序号(或名称)。
⑤显示乐曲播放时间或剩余时间。
二丶系统硬件设计
2.1电子琴原理
在介绍总体方案之前,先简单介绍一下电子琴的发生原理以及如何改变音色的基本原理:
声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单片机某个口线不断输出“高”“低”电平,则在该口线上就能产生一定频率的方波,将该方波接上喇叭就能发出一定频率的声音,若再利用程序控制“高”“低”电平的持续时间,就能改变输出波形的频率从而改变音调。
乐曲中,每一音符对应着确定的频率,下表给出各音符频率。
如果单片机某个口线输出“高”“低”电平的频率和某个音符的频率一样,那么将此口线接上喇叭就可以发出此音符的声音[1]。
本系统就是根据此原理设计,对于单片机来说要产生一定频率的方波大致是先将某口线输出高电平然后延时一段时间再输出低电平,如此循环的输出就会产生一定频率的方波,通过改变延时的时间就可以改变输出方波的频率。
单片机内部有两个位的定时计数器T1和T0,单片机的定时计数器实际上是个计数装置它既可以对单片机的内部晶振驱动时钟计数也可以对外部输入的脉冲计数,对内部晶振计数时称为定时器,对外部时钟计数时称为计数器。
当对单片机的内部晶振驱动时钟计数时,每个机器周期定时计数器的计数值就加,当计数值达到计数最大值时计数完毕并通知单片机的尸比对外部输入的时钟信号计数时,外部时钟的每个时钟上升沿定时计数器的计数值就加,当计数值达到计数最大值时计数完毕并通知单片机。
因此,如果知道单片机的机器周期或者外部输入时钟信号的周期单片机就可以根据定时器的计数值计算出定时的时间。
用此方法定时十分准确,想得到多大的延时时间就可以给定时器赋一定的计数初值,定时器从预先设置的计数初值开始不断增当增加到计数最大值时计数完毕,调整计数初值的大小就可以调整定时器定时的时间,从而达到准确的延时。
2.2系统结构
本系统主要由四部分组成:
(1)键盘:
控制系统和演奏音乐
(2)扬声器:
发声
(3)LED:
显示欢迎界面,显示操作,显示演奏音乐歌词(后期开发计划)
(4)AT80C51:
系统控制中心
系统结构图如图2-1所示。
图2-1系统结构图
2.3硬件部分总体方案
51单片机P0口通过8155扩展,连接4*8的矩阵键盘,作为琴键键盘和相应的功能控制键;并P2口一起,与EPROM连接;P0口则接通不通音色的滤波电路,通过程序控制P0口,选通不通的琴声音色滤波电路,使电子琴发出不同音色的声音。
硬件电路包括中心控制模块、播放模块、按键控制模块三大模块。
其电路图如图2-2所示:
图2-2 电子琴电路图
2.4元件清单
1)AT80C51
AT80C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
AT80C51是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT80C51是一种高效微控制器,AT80C51是它的一种精简版本[2]。
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
本次设计中中心控制模块是采用AT80C51单片机来控制整个系统。
其中P1口作为输入口,连接蜂鸣器驱动电路,而P2口连接按键控制电路,从而实现播放音乐的功能。
2)LCD1602
LCD1062在本次中主要用于显示,有如下特点:
显示质量高:
由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。
因此,液晶显示器画质高且不会闪烁。
数字式接口:
液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。
体积小、重量轻:
液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。
功耗低:
相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多[3]。
其硬件原理图如图2-3所示。
图2-3LCD1062硬件原理图
3)4X4行列式键盘识别及显示键盘接口必须具有去抖动、防串键、按键识别和
键码产生4个基本功能。
(1)去抖动:
每个按键在按下或松开时,都会产生短时间的抖动。
抖动的持续时间与键的质量相关,一般为5~20mm。
所谓抖动是指在识别被按键是必须避开抖动状态,只有处在稳定接通或稳定断开状态才能保证识别正确无误。
去抖问题可通过软件延时或硬件电路解决。
(2)防串键:
防串键是为了解决多个键同时按下或者前一按键没有释放又有新的按键按下时产生的问题。
常用的方法有双键锁定和N键轮回两种方法。
双键锁定,是当有两个或两个以上的按键按下时,只把最后释放的键当作有效键并产生相应的键码。
N键轮回,是当检测到有多个键被按下时,能根据发现它们的顺序依次产生相应键的键码。
(3)被按键识别:
如何识别被按键是接口解决的主要问题,一般可通过软硬结合的方法完成。
常用的方法有行扫描法和线反转法两种。
行扫描法的基本思想是,由程序对键盘逐行扫描,通过检测到的列输出状态来确定闭合键,为此,需要设置入口、输出口一个,该方法在微机系统中被广泛使用。
线反转法的基本思想是通过行列颠倒两次扫描来识别闭合键,为此需要提供两个可编程的双向输入/输出端口。
(4)键码产生:
为了从键的行列坐标编码得到反映键功能的键码,一般在内存区中建立一个键盘编码表,通过查表获得被按键的键码[4]。
用AT80c51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F”序号。
4)speaker蜂鸣器
5)三极管
三丶软件设计
本软件设计关键是要实现一种由单片机控制的简单音乐发生器,它由16个音节组成的的键盘,用户可以根据乐谱在键盘上进行演奏,音乐发生器会根据用户的弹奏,通过扬声器将音乐播放出来。
3.1单片机实现音乐
一首音乐是由许多不同的音符组成的,而每个音符对应着不同的频率,这样就可以利用不同频率的组合,加以与拍数对应的延时,构成音乐。
(1)节拍设计
除了音符以外,节拍也是音乐的关键组成部分。
节拍实际上就是音持续时间的长短,在单片机系统中可以用延时来实现,如果1/4拍的延时是0.4秒,则1拍的延时是1.6秒,只要知道1/4拍的延时时间,其余的节拍延时时间就是它的陪数。
如果单片机要自己播放音乐,那么必须在程序设计中考虑到节拍的设置,由于本例实现的音乐发生器是由用户通过键盘输入弹奏乐曲的,所以节拍由用户掌握,不由程序控制。
对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。
音乐的音拍,一个节拍为单位(C调)具体如表3-1:
表3-1音乐节拍表
曲调值
DELAY
曲调值
DELAY
调4/4
125ms
调4/4
62ms
调3/4
187ms
调3/4
94ms
调2/4
250ms
调2/4
125ms
(2)音频脉冲实现
了解音乐的一些基本知识后可知,产生不同频率的音频脉冲即能产生音乐,对于单片机而言,产生不同频率有脉冲非常方便,可以利用它的定时/计数器来产生这样的方波频率信号,因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。
在本实验中,单片机工作于12MHZ时钟频率,使用其定时/计数器T0,工作模式为1,改变计数值TH0和TL0可以产生不同频率的脉冲信号,在此情况下,C调的各音符频率与计数值T的对照如表3-2:
表3-2音符频率与计数值T的对照表
音符
频率(HZ)
计数值(T值)
音符
频率(HZ)
计数值(T值)
低1DO
262
63628
#4FA#
740
64860
#1DO#
277
63737
中5SO
784
64898
低2RE
294
63835
#5SO#
831
94934
#2RE#
311
63928
中6LA
880
64968
低3MI
330
64021
#6LA#
932
64994
低4FA
349
64103
中7SI
968
65030
#4FA#
370
64185
低1DO
1046
65058
低SO
392
64260
#1DO#
1109
65085
#5SO#
415
64331
高2RE
1175
65110
低6LA
440
64400
#2RE#
1245
65134
#6LA#
466
64463
高3MI
1318
65157
低7SI
494
64524
高4FA
1397
65178
中1DO
523
64580
#4FA#
1490
65198
#1DO#
554
64633
高5SO
1568
65217
中2RE
587
64633
#5SO#
1661
65235
#2RE#
622
64884
高6LA
1760
65252
中3MI
659
64732
#6LA#
1865
65268
中4FA
698
64820
高7SI
1967
65283
T的值决定了TH0和TL0的值,其关系为:
TH0=T/256,TL0=T%256
3.2软件框图及部分代码
(1)总程序简易流程图如图3-1:
图3-1总程序简易流程图
(2)显示流程图如图3-2:
图3-2显示流程图
C语言源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};
unsignedchardiscount;
voiddelay02s(void)
{
unsignedchari,j,k;
for(i=20;i>0;i--)
for(j=20;j>0;j--)
for(k=248;k>0;k--);
}
voidmain(void)
{
while
(1)
{
for(discount=0;dispcount<10;dispcount++)
{
P0=table[discount];
delay02s();
}}}
(3)键盘识别程序框图如图3-3所示:
图3-3键盘识别程序框图
语言源程序
#include
unsignedcharcodetable[]=table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsignedchartemp;
unsignedcharkey;
unsignedchari,j;
voidmain(void){
while
(1)
{P3=0xff;
P3_4=0;
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{
case0x0e:
key=7;
break;
case0x0d:
key=8;
break;
case0x0b:
key=9;
break;
case0x07:
key=10;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
temp=temp&0x0f;
while(temp!
=0x0f)
{
temp=P3;
temp=temp&0x0f;
}
}
}
P3=0xff;
P3_5=0;
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp&0x0f;
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{
case0x0e:
key=4;
break;
case0x0d:
key=5;
break;
case0x0b:
key=6;
break;
case0x07:
key=11;
break;}
temp=P3;
P1_0=~P1_0;
P0=table[key];
temp=temp&0x0f;
while(temp!
=0x0f)
{temp=P3;
temp=temp&0x0f;
}
}
}
P3=0xff;
P3_6=0;
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)
{for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)
{temp=P3;
temp=temp&0x0f;
switch(temp)
{
case0x0e:
key=1;
break;
case0x0d:
key=2;
break;
case0x0b:
key=3;
break;
case0x07:
key=12;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
temp=temp&0x0f;
while(temp!
=0x0f)
{
temp=P3;
temp=temp&0x0f;
}
}
}
P3=0xff;
P3_7=0;
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{case0x0e:
key=0;
break;
case0x0d:
key=13;
break;
case0x0b:
key=14;
break;
case0x07:
key=15;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
temp=temp&0x0f;
while(temp!
=0x0f)
{
temp=P3;
temp=temp&0x0f;}
(4)音乐发声程序框图如图3-4所示:
图3-4音乐发声程序框图
3.3程序设计说明
(1)对声音的控制
①对音调的控制:
根据不同的按键,对定时器T1送入不同的初值,调节T1的溢出时间,这样就可以输出不同音调频率的方波。
不同音调下各个音阶的定时器
②对音长的控制:
先向定时器T0送入一个固定初值,控制中断循环的次数,从而得到成倍数关系的时间间隔。
按一拍0.64S计算,取1/16拍为最小间隔,即0.04S,为此设定T0的初值为63C0。
③乐谱的编码规则:
对于每个音符,定义用8位二进制数表示。
其中,最高位为1的字符为结束符,当读到最高位为1时,停止播放;低3位存储音阶码,即音阶表的列数,可为000B~111B(1~7和休止符),休止符表示停顿,不发音,只有时间长短属性;第3位和第4位存储音高码,即音阶表的行数,可为00B~10B;第5位和第6位存储音长码,即中断次数,可为00B~10B。
(2)对演奏的控制
在手动演奏时,规定先按音调键,后按音阶键。
每次音阶键按下时,调用键盘扫描子程序,获得键值,查询音阶表,获取定时器T1的计时初值,向喇叭输入相应频率的驱动脉冲,发出相应的声音,若按键没有松开,则一直发声;若按键松开,则停止发声。
在自动演奏时,通过选曲键来确定要播放的音乐,根据键值查询曲目表获取所点歌曲的首地址,依次读取歌曲的代码,获得音阶、音调和音长信息,播放相应的音乐。
当读到结束符时,停止播放音乐。
四丶系统调试与测试结果分析
4.1使用的仪器仪表
单片机仿真器 KEILC
蜂鸣器LS1
4.2系统调试
根据系统设计方案,本系统的调试共分为三大部分:
硬件调试,软件调试和软硬件联调。
由于在系统设计中采用模块设计法,所以方便对各电路模块功能进行逐级测试:
中心控制模块的调试,音乐播放模块的调试,按键控制模块的调试等,最后将各模块组合后进行整体测试。
(1)对各个模块的功能进行调试,主要调试各模块能否实现指定的功能。
(2)软件调试采用单片机仿真器KEILC及微机,将编好的程序进行调试,
主要是检查语法错误。
(3)将调试好的硬件和软件进行联调,主要调试系统的实现功能。
4.3测试结果
此次系统设计结果较好,分别发出8种高低不同的声音,如果送入音乐程序,则会播放歌曲。
五丶源程序
程序为:
#include
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsignedchartemp;
unsignedcharkey;
unsignedchari,j;
unsignedcharSTH0;
unsignedcharSTL0;
unsignedintcodetab[]={64021,64103,64260,64400,64524,64580,64684,64777,
64820,64898,64968,65030,65058,65110,65157,65178};
voidmain(void)
{
TMOD=0x01;
ET0=1;
EA=1;
while
(1)
{
P3=0xff;
P3_4=0;
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机大作业 电子琴 单片机 作业