电子琴设计.docx
- 文档编号:3845426
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:82
- 大小:593.74KB
电子琴设计.docx
《电子琴设计.docx》由会员分享,可在线阅读,更多相关《电子琴设计.docx(82页珍藏版)》请在冰豆网上搜索。
电子琴设计
电子琴设计
队名:
缤纷林叶成员:
梁建彬钟林叶恒
摘要
功能:
本作品是基于单片机控制系统的简易电子琴,有各种友好的菜单界面和显示界面,可实现通过按键控制,发出1、2、3、4、5、6、7、i……等二十一个音符。
该电子琴亦能够自动演奏三首乐曲,且其演奏方式(点播、顺序播放和随机播放)可以通过按键选择(其中点播模式还可以点播之前的录音,可以播放掉电之前保存的录音)。
操作者还可以在电子琴演奏时对电子琴进行音调(按键控制)、音量(电位器)的调节,并能以发光二极管显示播放音量的大小。
同时在设置模式下能调节音阶和拍长,音阶和拍长在掉电后仍然保存。
另外,它可以对手动编奏的乐曲进行录音,在按下放音键时能演奏出来,同时贮存在eeprom里面,掉电不丢失。
还有一键关机功能,一键按下关闭整个电路板的电源。
一、方案的设计和论证
1、电源控制控制模块
方案
(1):
采用继电器来控制电源的关断,其优点是电路设计比较简单,但是由于继电器的体积偏大,如果以后要做出易于携带的产品的话,不是很方便;
方案
(2):
运用晶体管的开关功能设计电源开关控制电路,通过向单片机输入外部中断来使得单片机自动控制电源的关断。
2、主控模块
这模块主要实现的功能有:
接收由键盘输入的信号并输出相应的操作信号;
控制菜单操作显示器
基于以上标示,可考虑采用51系列单片机、AVR单片机,或者ARM等都可以实现,但是从性价比考虑,AVR系列优势比较明显,因此选用之作为主控芯片。
至于菜单显示部分可以采用以下两种方案:
(1)1602液晶:
它能显示16X2个数字或英文字符,信息量较大,用串行通讯可减少I/O口的占用量。
1602的成本中等,是值得考虑的选择。
(2)12864是带中文字库的液晶显示屏,可以显示4X16个汉字,甚至可以显示图案,显示功能较为强大。
使用12864可以提供大量信息,但是其价格比较1602液晶要贵几倍。
考虑到成本因素,决定采用1602液晶来实现该显示功能。
掉电保护电路:
(1)使用外部存储器
不过得加入外部电路,既加大成本又加大功耗。
(2)使用AVR单片机自带的EEPROM
不用增加器件,操作简单。
综上所述,我们采用第
(2)种掉电保护方案。
3、音量调节模块
方案
(1):
采用数字电位器对音量进行调节,这样做的好处是便于数字控制,可以选择的音量大小不多。
方案
(2):
采用可变电阻进行音量调节,这样可实现音量连续可调。
另外,在如何显示音量大小的问题上,我们采用的是以数字芯片TA6777来驱动发光二极管,当音量比较大时,发光二极管亮的个数比较多。
4、功放模块
方案
(1):
采用LM386芯片对对输出的音乐信号进行放大,其优点是电路简单,稳定性强;
方案
(2):
采用TDA2822芯片放大音乐信号,但是TDA2822在单电源供电下,工作不是很稳定。
考虑到稳定性因素,选用方案
(1)。
5、键盘输入模块
方案
(1):
采用矩阵键盘(N×M),每个按键占据行列的一个交点,需要的I/O口数目是N+M,容许的最大键数是N×M。
方案
(2):
新型键盘,用N个I/O口以及一个中断口,可以实现N×N个按键,比较节省I/O资源,故采用之。
二、系统框图
基于AtmelMega16L电子琴系统的硬件总体结构图如图1所示,主要包括中央处理器MCU、单键开关机电路,1602显示模块、功放模块、键盘模块、电平灯频谱显示模块等。
三、各模块的设计与论证
1、中央处理器MCU
中央处理器选用的是ATMega16l,ATmega16是基于增强的AVRRISC结构的低功耗8位CMOS微控制器。
具体的电路连接图如图2所示。
PB0~PB7用于连接键盘输入(INT2用于键盘的中断输入);PD0用于连接单键开关电路的续电;PD2(INT0)用于连接单键开关电路按键的检测;PD5用于音律PWM的输出;PC0~PC7用于连接LCD1602显示输出,其中PC0~PC2用于控制1602的选通、读写控制等的操作,PC3~PC7连接74HC595,实现串行数据转并行数据。
单片机输出频率CTC不同的信号来产生各种音符,将歌曲各个音符的转化成相应的数字信号,存放在单片机程序寄存器中,当播放音乐时,程序从该寄存器里读取数据,然后以CTC信号的模式传给功放电路,实现放音乐的功能。
当要向单片机录入音乐时,通过键盘上的按键,输入不同的音符,接下来单片机可以记录下音符以及其持续的时间,然后存入程序寄存器中,当录音结束,按下“录入确认键”,按下来就可以从菜单里选择播放刚才录入的音乐。
2、单键开关机模块
该电路的工作原理是:
接通K1(总电源开关,外电源接到P0)后,按动轻触开关S2,三极管Q29012导通,VCC输出高电平,单片机接通电源工作后,第一时间给P_OUT一个高电平,三极管Q19013导通,这样,即使按键S2松开了,Q2也依然导通,电路依然接通。
当按键S2再次按下时,单片机检测到P_IN为低电平,这是单片机可以延时一段时间后,将P_OUT置为低电平,Q1截止,Q2也同时截止,电路断开。
3、电平灯频谱显示模块
为了显示的效果更炫,本硬件电路特意增加了一个电平灯频谱显示模块,该模块采用的是一块TP7666芯片,该芯片在老式收音机上非常常见,现在已经很难买到。
该芯片具有双路5点电平显示,而且外围电路原件很少。
4、6×6键盘模块
该电路的工作原理是:
待机时,PORT1~PORT6输出高电平;当某个键按下时,PORT7由高电平变为低电平,由此产生一个中断;MCU启动按键扫描,如按下的是K30时,置PORT1=H,扫描PORT2~6的输入结果为LLLL,没有扫描到所需的结果;继续置PORT2=H,扫描PORT1、PORT3~6的输入结果为HLLL,按键S30就被唯一确定了。
5、LCD1602液晶显示模块
该模块的连接比较简单,但是若直接使用并行数据传送的话要用到11个IO口,这里为了节省IO口资源,使用也一片74HC595串行数据转并行数据芯片,该芯片与单片机连接最多只需要5个IO口,这样连接一片1602只需要8个IO口,节省了3个IO口。
具体的硬件连接图如下图5所示。
电位器RW1可用于调节背光的亮度,RW2可用于调节液晶的对比度。
6、小功率功放模块
这里的功放模块采用了传统的LM386芯片,采用该芯片是因为LM386具有自身功耗低,电压增益可调整,电源电压范围大,外接元件少和总谐波失真小等优点,尤其是在增益为20DB时使用的外围原件极少。
具体的单路连接如下图6所示。
四、软件程序流程图
五、测量与分析
1(do)
2(re)
3(mi)
4(fa)
5(sol)
6(la)
7(si)
降C
131Hz
147Hz
165Hz
174.5Hz
196Hz
220Hz
247Hz
中央C
261.5Hz
293.5Hz
329.5Hz
349Hz
392Hz
440Hz
494Hz
升C
523Hz
587Hz
659Hz
698Hz
784Hz
880Hz
988Hz
输出音调对应的频率表
按C调来说
1=261.5HZ
2=293.5HZ
3=329.5HZ
4=349HZ
5=392HZ
6=440HZ
7=494HZ
低7个音调后
1=131Hz
2=147Hz
3=165Hz
4=174.5Hz
5=196Hz
6=220Hz
7=247Hz
高7个音调后
1=523Hz
2=587Hz
3=659Hz
4=698Hz
5=784Hz
6=880Hz
7=988Hz
六、总结
经过一翻辛苦努力,终于搞定了电子琴了。
这个过程中团队合作让我们收获很多。
三个同学一起做,不可能每个同学对每项内容都了解得很透彻,需要知识互补。
另外,遇到困难的时候不能指望让一个同学独自解决,团队合作不崇尚单打独斗。
七、源程序
主文件go.c:
//主文件,包含主函数
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#definevucharvolatileunsignedchar
#definevuintvolatileunsignedint
#definerecord_max160
//变量定义
vucharkey_int=0,mode_fr=0,counter_en_fr=0,pop_en_fr=0;
vucharrow=0,scrollbar=1,volume,temp,delayMs,tonality,tone;
vucharinttemp;
ucharmusicLength,recordLength;
uintbell_standard_time;
vuintcounter_ms=0;
vucharcounter_record;
vucharsong_4[record_max][2];
//包含头文件
//子函数清单
#include"function_list.h"
//数据
#include"data.h"
//延时
#include"delay.h"
//键盘中断
#include"int2.h"
//液晶
#include"ts1620.h"
//发声部分
#include"bell.h"
//功能函数1
#include"fun.h"
//功能函数2
#include"fun_need_check.h"
voidmain()
{
power_init();//一键关机初始化
while
(1)
{
ts1620_init();//液晶初始化
welcome();//欢迎界面
all_init();//各类变量初始化
int2_init();//键盘中断初始化
mode_fr=0;//极其的关键变量,记录状态
while(key_int!
=keyreset)
{
if(mode_fr==0)menu();//主菜单
if(mode_fr==1)manul();//模式1,手动弹奏初始化
if(mode_fr==1)manul_check();//模式1,手动弹奏
if(mode_fr==20)autoplay();//模式20,自动弹奏主菜单
if(mode_fr==210)demand_menu();//模式210,点播菜单
if(mode_fr==211)demand_play(key_int);//模式211,点播演奏初始化
if(mode_fr==211)demand_play_check(key_int,211);//模式211,点播演奏
if(mode_fr==212)demand_play(keyfun4);//模式212,点播演奏初始化(录音部分)
if(mode_fr==212)demand_play_check(keyfun4,212);//模式212,点播演奏(录音部分)
if(mode_fr==22)order_play();//模式22,顺序弹奏
if(mode_fr==23)outorder_play();//模式23,乱序弹奏
if(mode_fr==31)record();//模式31,录音初始化
if(mode_fr==31)record_check();//模式31,录音
if(mode_fr==32)replay();//模式32,放音
if(mode_fr==50)settings();//模式50,设置菜单
if(mode_fr==51)settings1();//模式51,设置拍长
if(mode_fr==52)settings2();//模式52,设置音阶
}
}
}
以下是function_list.h
//各子程序清单
voiddelay_nop(void);
voiddelay(uint/*_delay_ms*/);
voidint2_init(void);
ucharkey_line(uchar);
ucharkey_search(uchar);
ucharkey_find(void);
voidkey_int2(void);
voidwrite_com(uchar);
voidwrite_data(uchar);
voidclear(void);
voidcursor_return(void);
voidentry_mode_set(uchar,uchar);
voiddisplay_on_off(uchar,uchar,uchar);
voidshift(uchar,uchar);
voidset_function(uchar,uchar,uchar);
voidset_address(uchar,uchar);
voidts1620_init(void);
voidscreen_same(uchar,uchar,uchar);
voidscreen_one(uchar,uchar);
voidscreen_sleep(void);
voidshow_menu(constuchar*,constuchar*);
voidshow_vol(void);
voidshow_screen(constuchar*,uchar,constuchar*,uchar);
voidshow_saving(void);
voidmenu_move(uchar);
voidwelcome(void);
voidall_init(void);
voidmenu(void);
voidmanul(void);
voidmanul_check(void);
voiddelay_check(uint);
voidtonality_c(uchar);
voidbell_init(void);
voidautoplay(void);
voiddemand_menu(void);
voiddemand_play(uchar);
voiddemand_play_check(uchar,uchar);
voidbell_music(uchar,uchar);
voidrecord(void);
voidrecord_check(void);
voidreplay(void);
voidsettings(void);
voidsettings1(void);
voidsettings2(void);
voidorder_play(void);
voidoutorder_play(void);
ucharout_order(void);
voidpower_init(void);
voidpower_off(void);
以下是delay.h
#define_nopdelay_nop()
voiddelay_nop()//微妙级别延时函数
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
voiddelay(uint_delay_ms)//毫秒级别延时函数
{
uint_delay_i,_delay_j;
for(_delay_i=0;_delay_i<_delay_ms;_delay_i++)
for(_delay_j=0;_delay_j<1711;_delay_j++);
}
以下是data.h
//此头文件包含各类数据,data(存放在程序存储区)
#pragmainterrupt_handlerkey_int2:
iv_INT2
#pragmainterrupt_handlerpower_off:
iv_INT0
#defineINTPORT10
#defineINTPORT21
#defineINT_22
#defineINTPORT33
#defineINTPORT44
#defineINTPORT55
#defineINTPORT66
#defineton10x16
#defineton20x26
#defineton30x36
#defineton40x46
#defineton50x56
#defineton60x66
#defineton70x13
#defineton80x15
#defineton90x25
#defineton100x35
#defineton110x45
#defineton120x55
#defineton130x65
#defineton140x23
#defineton150x14
#defineton160x24
#defineton170x34
#defineton180x44
#defineton190x54
#defineton200x64
#defineton210x33
#definekeysleep0x61
#definekeyreturn0x51
#definekeymenu0x52
#definekeyreset0x62
#definekeyvolOn0x11
#definekeyvolDn0x12
#definekeymenuUp0x41
#definekeymenuDn0x42
#definekeyfun10x21
#definekeyfun20x31
#definekeyfun30x22
#definekeyfun40x32
#definekeyreplay0x63
#definekeypause0x53
#definekeyres0x43
#pragmadata:
code
constucharwelcome_0[]="Welcome...";
constucharpower_0[12]="GOODBYE";
constucharpower_1[15]="poweroff:
3s";
constucharwelcome_1[]="madByBinFenLinYe";
constucharmanul_0[14]="ManulModeton";
constucharmanul_1[9]="Tonality:
";
constucharrecord_0[14]="Recordington";
constucharreplay_0[14]="Replayington";
constucharsaving[9]="Saving...";
constucharIc_0[][15]={{"WhichmodedoU"},
{"wanttochoose?
"},
{"1.Manualplay"},
{"2.Autoplay"},
{"3.Recordmode"},
{"4.Setting"}};
constucharIc_20[][15]={{"1.Playmusicon"},
{"demand"},
{"2.Playinorder"},
{"3.Playoutof"},
{"order"}};
constucharIc_210[][16]={{"1.Welcometo"},
{"Beijing"},
{"2.Legend"},
{"3.Myth"},
{"4.PlaybyMyself"}};
constucharIc_50[][16]={{"1.Beatlength"},
{"2.Toneselection"}};
constucharIc_51[][15]={{"1.1200ms/Beat"},
{"2.1100ms/Beat"},
{"3.1000ms/Beat"},
{"4.900ms/Beat"},
{"5.800ms/Beat"},
{"6.700ms/Beat"},
{"7.300ms/Beat"}};
constucharIc_52[][15]={{"1.Ctone"},
{"2.Dtone"},
{"3.Etone"},
{"4.Ftone"},
{"5.Gtone"}};
constucharbjhyn_title[]="WelcomeToBjt";
constuchardemand_title[]="OnPlay";
constucharlegend_title[]="Legendt";
constucharmyth_title[]="Mytht";
constucharplayBm_title[]="PlayByMet";
constucharsongs[][2]={{10,0x84},
{16,0x84},{10,0x84},{9,0x84},{10,0x84},{9,0x84},
{10,0x88},{10,0x86},{9,0x82},{6,0x84},{8,0x84},
{10,0x84},{9,0x8c},{9,0x84},{8,0x84},{6,0x84},
{8,0x84},{9,0x84},{10,0x84},{12,0x84},{9,0x84},
{10,0x84},{13,0x84},{12,0x84},{5,0x84},{9,0x88},
{8,0x88},{9,0x84},{8,0x84},{6,0x84},{8,0x84},
{9,0x84},{10,0x84},{12,0x84},{9,0x84},{10,0x84},
{13,0x84},{12,0x84},{10,0x90},{9,0x84},{10,0x84},
{9,0x84},{8,0x84},{12,0x86},{13,0x82},{10,0x88},
{6,0x84},{10,0x84},{9,0x84},{9,0x84},{8,0x8c},
{0,0x84},{10,0x84},{12,0x84},{15,0x84},{12,0x84},
{13,0x8c},{12,0x84},{13,4},{12,0x84},{10,0x84},
{10,0x84
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子琴 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)