基于C51单片机电子琴的设计与实现Word文件下载.docx
《基于C51单片机电子琴的设计与实现Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于C51单片机电子琴的设计与实现Word文件下载.docx(9页珍藏版)》请在冰豆网上搜索。
通过软硬件设计,模式转换按键触发外部中断,中断使程序跳转,实现模式转换,启动电子琴。
然后通过查询电子琴所按下的按键,读取电子琴输入状态,跳转到对应的程序人口,实现自编歌曲。
当需要取消电子琴编曲功能时,再次按下模式转换按键引起外部中断.即可退出电子琴功能而返回到原来音乐播放处。
2.方案论证
2.1单片机
方案一:
AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4k
bytes的可反复擦写的只读程序存储器(PEROM)和128
bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89C51单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。
方案二:
采用凌阳公司的SPCE061A单片机作为控制器的方案。
该单片机I/O资源丰富,并集成了语音功能。
它整合了多个常用的功能模块,让我们在进行系统开发的时候不用外加过多的硬件就可方便的
完成一个系统的设计,这就是人们常说的
SoC(System
on
chip)技术。
耗电少,可以满足很多手提设备、掌上设备低能耗的需求,低能耗也是电子技术一直在追求的
一个目标。
但其价格较高。
方案三:
TI公司的MSP430系列是一个特别强调超低功耗的单片机品种很适合应用于采用电池供电的长时间工作场合在这个系列中有很多个型号它们是由一些基本功能模块按不同的应用目标组合而成MSP430系列的CPU采用16位精简指令系统,集成有16位寄存器和常数发生器
发挥了最高的代码效率它采用数字控制振荡器DCO使得从低功耗模式到唤醒模式的转换时间小于6
µ
s.
其中MSP430x41x
系列微控制器设计有一个16位定时器,一个比较器,96段LCD驱动器和48个通用I/O引脚。
根据这次实训的要求,方案三单片机原理复杂,掌握难度大,方案二,价格较高,方案一已经能够满足我们的需要,且价格低廉,经济实用,故采用方案一。
2.2发声器
采用中频扬声器。
一般来说,只要频率响应曲线平坦,有效频响范围大于它在系统中担负的放声频带的宽度,阻抗与灵敏度和低频单元一致即可。
有时中音的功率容量不够,也可选择灵敏度较高,而阻抗高于低音单元的中音,从而减少中音单元的实际输入功率。
中音单元一般有锥盆和球顶两种。
只不过它的尺寸和承受功率都比高音单元大而适合于播放中音频而已。
采用蜂鸣器。
它的优点如下:
1.便宜;
2.声音频率可控,可以做出“多来米发索拉西”的效果;
3.在一些特例中,可以和LED复用一个控制口。
4.程序控制方便。
我们采用方案二,操作简单,价格合适。
3.理论分析与计算:
系统初始化后,进入按键扫描函数。
当检测到按键被按下时,判断是1到7按键还是8按键,若是1到7按键被按下则启动定时器T1,按照音阶所对应的周期初始值数组表中的初值,输出方波信号;
当判断是第八个按键被按下时,直接调用挥着翅膀的女孩歌曲的音调和节拍数组,启用中断循环输出。
各个音阶的频率以及对应半周期如下图所示:
通过Time0的溢出中断实现单频产生。
Time0的溢出中断发生后输出引脚的电压反向,然后定时器重新装入初值。
所以编程时要确定Time0的工作模式和计数初值。
这里采用工作模式1,定时器的初值设定通过软件重复实现。
而且定时器的初值则依据各音频频率设置。
例如:
中音Do音频是523Hz,其周期T=l/523=1912μs,其半周期为1912/2=956μs。
本设计的计时时钟周期是lμs,因此设置Time0的计数器每计956次则中断一次,从而实现Do的音频,然后通过中断触发实现引脚电压的循环取反得到相应音频输出。
4.硬件电路与程序设计
4.1电路图:
我们按键部分用AT89C51的P0口,而该芯片的P0需接上拉电阻,一共需要八个,因此我们用9引脚的排阻代替,排阻多出来的一个引脚接VCC。
4.2程序框图
经过以上分析论证,最终我们得到如下框图。
5.软件程序
#include<
reg52.h>
stdio.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitbuz=P3^1;
ucharkeycode;
uchari,j;
uinttoneh[8]={0xfc43,0xfcab,0xfd09,0xfd33,0xfd81,0xfdc7,0xfe05,0xfe21};
ucharkeymode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsignedcharcodeMusic_hzcb[]={
0x17,0x02,0x17,0x03,0x18,0x03,0x19,0x02,0x15,0x03,0x16,0x03,0x17,0x03,0x17,0x03,0x17,0x03,0x18,0x03,0x19,0x02,0x16,0x03,0x17,0x03,0x18,0x02,0x18,0x03,0x17,0x03,0x15,0x02,0x18,0x03,0x17,0x03,0x18,0x02,0x10,0x03,0x15,0x03,0x16,0x02,0x15,0x03,0x16,0x03,0x17,0x02,0x17,0x03,0x18,0x03,0x19,0x02,0x1A,0x03,0x1B,0x03,0x1F,0x03,0x1F,0x03,0x17,0x03,0x18,0x03,0x19,0x02,0x16,0x03,0x17,0x03,0x18,0x03,0x17,0x03,0x18,0x03,0x1F,0x03,0x1F,0x02,0x16,0x03,0x17,0x03,0x18,0x03,0x17,0x03,0x18,0x03,0x20,0x03,0x20,0x02,0x1F,0x03,0x1B,0x03,0x1F,0x66,0x20,0x03,0x21,0x03,0x20,0x03,0x1F,0x03,0x1B,0x03,0x1F,0x66,0x1F,0x03,
0x1B,0x03,0x19,0x03,0x19,0x03,0x15,0x03,0x1A,0x66,0x1A,0x03,0x19,0x03,0x15,0x03,0x15,0x03,0x17,0x03,0x16,0x66,0x17,0x04,0x18,0x04,0x18,0x03,0x19,0x03,0x1F,0x03,0x1B,0x03,0x1F,0x66,0x20,0x03,0x21,0x03,0x20,0x03,0x1F,0x03,0x1B,0x03,0x1F,0x66,0x1F,0x03,0x1B,0x03,0x19,0x03,0x19,0x03,0x15,0x03,0x1A,0x66,0x1A,0x03,0x19,0x03,0x19,0x03,0x1F,0x03,0x1B,0x03,0x1F,0x00,0x1A,0x03,0x1A,0x03,0x1A,0x03,0x1B,0x03,0x1B,0x03,0x1A,0x03,0x19,0x03,0x19,0x02,0x17,0x03,0x15,0x17,0x15,0x03,0x16,0x03,0x17,0x03,0x18,0x03,0x17,0x04,0x18,0x0E,0x18,0x03,0x17,0x04,0x18,0x0E,0x18,0x66,0x17,0x03,0x18,0x03,0x17,0x03,0x18,0x03,0x20,0x03,0x20,0x02,0x1F,0x03,0x1B,0x03,0x1F,0x66,0x20,0x03,0x21,0x03,0x20,0x03,0x1F,0x03,0x1B,0x03,0x1F,0x66,0x1F,0x04,0x1B,0x0E,0x1B,0x03,0x19,0x03,0x19,0x03,0x15,0x03,0x1A,0x66,0x1A,0x03,0x19,0x03,0x15,0x03,0x15,0x03,0x17,0x03,0x16,0x66,0x17,0x04,0x18,0x04,0x18,0x03,0x19,0x03,0x1F,0x03,0x1B,0x03,0x1F,0x66,0x20,0x03,0x21,0x03,0x20,0x03,0x1F,0x03,0x1B,0x03,0x1F,0x66,0x1F,0x03,0x1B,0x03,0x19,0x03,0x19,0x03,0x15,0x03,0x1A,0x66,0x1A,0x03,0x19,0x03,0x19,0x03,0x1F,0x03,0x1B,0x03,0x1F,0x00,0x18,0x02,
0x18,0x03,0x1A,0x03,0x19,0x0D,0x15,0x03,0x15,0x02,0x18,0x66,0x16,0x02,0x17,0x02,0x15,0x00,0xff,0xff};
unsignedcharcodeMusic_Code[]={
0xf8,0x8b,0xf9,0x5b,0xfa,0x14,0xfa,0x66,//11111000,10001011
0xfb,0x03,0xfb,0x8f,0xfc,0x0b,0xfd,0xee};
unsignedcharconstyinfu1[3][14]={
{0xf8,0x8b,0xf9,0x5b,0xfa,0x14,0xfa,0x66,0xfb,0x03,0xfb,0x8f,0xfc,0x0b}
{0xfc,0x43,0xfc,0xab,0xfd,0x08,0xfd,0x33,0xfd,0x81,0xfd,0xc7,0xfe,0x05}
{0xfb,0x21,0xfe,0x55,0xfe,0x84,0xfe,0x99,0xfe,0xc0,0xfe,0xe3,0xff,0x02}};
//11111000,10001011
unsignedcharconstlength[]={1,2,4,8,16,32,64};
unsignedcharsth,stl;
voiddelay_ms(unsignedintk)
{//12M
unsignedinti0;
unsignedchari,j;
for(i0=0;
i0<
k;
i0++)
for(i=5;
i>
0;
i--)
for(j=97;
j>
j--);
}
voidSys_Init()
{
TMOD=0x10;
EA=1;
ET1=1;
P1=0xff;
ucharGet_Key()
uchari,temp;
P1=0xff;
temp=P1;
for(i=0;
i<
8;
i++)
{if(temp==keymode[i])
returni;
return8;
voidPlay(ucharkey)
{ucharj;
if(key==7)
{
TR1=1;
for(j=0;
Music_hzcb[j]!
=0xff;
j++)
keycode=Music_hzcb[j];
delay_ms(10);
sth=yinfu1[(Music_hzcb[j]%100)/10-1][((Music_hzcb[j]%10)-1)*2];
stl=yinfu1[(Music_hzcb[j]%100)/10-1][((Music_hzcb[j]%10)-1)*2+1];
j++;
TR0=1;
delay_ms(4*500/length[Music_hzcb[j]%10]);
TR0=0;
}
for(;
;
)
{
while(P3==0x7f);
delay_ms(10);
if(P3==0x7f)continue;
elsebreak;
}
else
keycode=key;
}
}
voidtimer1(void)interrupt3using1
buz=~buz;
TH1=toneh[keycode]/256;
TL1=toneh[keycode]%256;
voidmain()
Sys_Init();
do
{keycode=Get_Key();
Play(keycode);
while
(1);
6.总结与展望
通过这次毕业设计,我学到了不少课本上没有的知识,也锻炼了自己的动手能力,将以前学过的零散的知识串到一起。
首先在设计刚开始的调研阶段,我学会了怎么通过各种方式查询相关的资料。
通过对这些资料的学习,我大致了解了单片机的发展现状以及未来的发展趋势,认识到目前单片机方面的各种各样的发展,和它们之间的竞争。
了解了单片机方面的先进技术,这些都为我的未来的学习指明了方向。
我们实训设计主要涉及硬件和软件两方面的内容,通过这些我的硬件和软件开发能力都获得了提高。
首先硬件方面,基本了解了电子产品的开发流程和所要做的工作。
基本掌握了Protel99SE原理图的方法,并设计了一个单片机最小系统。
通过开发板的设计和硬件搭建的过程,使我对51系单片机的接口有了更深层次的理解,熟悉了一些单片机常用的外围电路引脚和连接方法。
附录1:
附录2: