简易电子琴.docx
《简易电子琴.docx》由会员分享,可在线阅读,更多相关《简易电子琴.docx(19页珍藏版)》请在冰豆网上搜索。
简易电子琴
1.设计原理1
1.1AT89S51单片机功能特性1
1.2复位控制电路原理2
2.设计目的2
3.设计要求3
4.设计任务和容3
4.1设计任务3
4.2设计容3
5.系统框图和原理分析4
5.1系统框图5
5.2原理分析5
6.程序流程图6
7.关键代码分析8
8.设计总结11
9.参考文献11
附录1.2
附录1电路图12
附录2PCB图13
附录3源程序(汇编或C语言)13
1.设计原理
1.1AT89S51单片机功能特性
AT89S51单片机是一种低功耗、高性能COMS位控制器,具有8K可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,适宜于常规编程。
AT89S52具有以
下标准功能:
8k字节Flash,256字节RAM32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片晶振及时钟电路。
另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU亭止工作,允许RAM定时器/计数器、串口、中断继续工。
AT89S52引脚分布图如图1所示:
图1AT89S51引脚分布图
AT89S51主要性能:
★与MCS-51单片机产品兼容;
★8K字节在系统可编程Flash存储器;
★1000次擦写周期;
★全静态操作:
0Hz〜33Hz;
★三级加密程序存储器;
★32个可编程I/O口线;
★三个16位定时器/计数器;
★八个中断源;
★全双工UART串行通道。
复位是单片机的初始化操作,单片机在上电启动运行时,都需要先复位。
其作用是
使单片机和其他部件都处于一个确定的初始化状态,并从这个工作状态开始工作。
但是
单片机自身不能自动进行复位,必须使用外部复位电路来实现单片机的复位。
单片机的
外部复位电路有上电自动复位电路和按键手动复位电路两种。
复位端与VCC电源接通,
12
电容迅速放电,使REST引脚为高电平;当复位键弹起后,VCC电源通过10K欧姆电阻对
22uf电容重新充电,REST引I脚端出现复位正脉冲。
其持续时间取决于RC电路时间常数。
复位控制电路图如图2所示:
VCC
■.
A
■SW-PB
*C1
—22uf
1R1
REST
200
]R3
10K
图2复位控制电路图
C4
r
□2.0592M
X2
30p
图3时钟控制电路图
2.设计目的
(1)能够对电子电路、电子器件、印刷版电路板等方面的知识有进一步的认识独立进行检测与调查。
(2)熟悉80S51单片机的部结构和功能,合理使用其部寄存器,能够完成相关软
件的编程设计工作
3)为实现预期功能,能够对系统进行快速调试,并能够对出现的故障进行分析,
及时修改相关软硬件。
(4)对软件编程、排错调试、相关设备的使用技能等方面得到较全面的锻炼和提
3.设计要求
利用所给的键盘0~9数字键,按下1~7键中对应键,能发出高音、中音、低音的1、2、3、4、5、6、7个音符,按键的长短代表节拍,这样方便实现自编曲子或旋律。
4.设计任务和容
4.1设计任务
根据所选题目设计(简易音乐盒设计),利用所给的键盘0~9数字键,单片机能发出高音、中音、低音的1、2、3、4、5、6、7个音符,按键的长短代表节拍,样方便实现自编曲子或旋律。
4.2设计容
(1)计算值查找音符的频率,计算出T0记时计算的脉冲个数如下表1。
(2)编写程序
利用KeiluVision4编写程序。
程序代码见附录。
(3)硬件调试利用学校实验室的开发板调试,分析找出问题,并加以改正。
表1音调表
音律
频率Hz
计数值H
Do
低音
262
F921
中音
523
FC7B
—>_K—口'/•
高曰
2045
FE48
Re
低音
295
F9DF
中音
587
FCEF
—>_K—口'/•
高曰
1175
FE78
Mi
低音
330
FA8C
中音
659
FD45
—>_K—口'/•
高曰
1318
FEA2
Fa
低音
349
FAD8
中音
698
FD6C
—>_K—口'/•
高曰
1397
FEB6
So
低音
392
FB69
中音
784
FDB4
—>_K—口'/•
高曰
1568
FED8
La
低音
440
FBE9
中音
880
FDF4
—>_K—口'/•
高曰
1760
FEFA
Xi
低音
494
FC5C
中音
988
FE34
—>_K—口'/•
高曰
1967
FF16
5•系统框图和原理分析
5.1系统框图
简易电子琴由蜂鸣器、电源电路、键盘电路、复位电路组成,通过键盘按键的不同选择不同的音调。
图4框架图
5.2原理分析
一首曲谱,是有不同的节拍的音调组成,节拍就是该音调的延长时间,如图图1所
示,t为音调,T为节拍。
可以用一个定时器产生音调,另一个定时器控制节拍,将一首歌的曲谱和音调的计算表,按表的顺序控制连个定时器,即可演奏歌曲。
t
图5音调和节拍
6•程序流程图
系统本流程图来实现控制。
系统主要是一按键为核心,通过按键选择高音、中音、
低音,在通过按键来选择音调,AT89S51检测到有按键按下,就相应的值给TO,通过TO来控制蜂鸣器发声。
主函数流程图如图6。
图6主函数流程图
7.关键代码分析
扫描键盘函数分析:
voidKey_Scan()
{
ucharw1,w2;
P1=0x0f;w1=P1&0x0f;
if(w1!
=0x0f)
{
Delay
(1);
TR0=1;
TR1=1;
P1=0xf0;w2=P1&0xf0;
g_ucKey=(w1|w2);
switch(g_ucKey)
case0xeb:
g_ucChoise=0;
TR0=0;
TR1=0;
BUZZ=1;
break;//选择高音默认为高音
case0xed:
g_ucChoise=7;
TR0=0;
TR1=0;
BUZZ=1;
break;〃选择中音
case0xee:
g_ucChoise=14;
TR0=0;
TR1=0;
BUZZ=1;
break;//选择低音
case0x77:
case0x7b:
case0x7d:
case0x7e:
case0xb7:
case0xbb:
case0xbd:
g_ucM=0+g_ucChoise;
TH0=g_ucMusic[g_ucM]/256;TL0=g_ucMusic[g_ucM]%256;break;
g_ucM=1+g_ucChoise;
TH0=g_ucMusic[g_ucM]/256;TL0=g_ucMusic[g_ucM]%256;break;
g_ucM=2+g_ucChoise;
TH0=g_ucMusic[g_ucM]/256;TL0=g_ucMusic[g_ucM]%256;break;
g_ucM=3+g_ucChoise;
TH0=g_ucMusic[g_ucM]/256;TL0=g_ucMusic[g_ucM]%256;break;
g_ucM=4+g_ucChoise;
TH0=g_ucMusic[g_ucM]/256;TL0=g_ucMusic[g_ucM]%256;break;
g_ucM=5+g_ucChoise;
TH0=g_ucMusic[g_ucM]/256;TL0=g_ucMusic[g_ucM]%256;break;
g_ucM=6+g_ucChoise;
TH0=g_ucMusic[g_ucM]/256;TL0=g_ucMusic[g_ucM]%256;break;
//Do
//Re
///Mi
//Fa
//So
//La
//Xi
default:
TR0=0;BUZZ=1;break;
}else
g_ucKey=0xff;
}
分析:
扫描键盘是否配按下,有按键按下,启动定时器1、2;判断是那个按键按下,如是S1、S2、S3按下,这调相应的音符音调(分别是高、中、低),如果是S10~S16按下,这选择相应的音符(依次为Do、Re、Mi、Fa、So、La、Xi),通过蜂鸣器发出相应的声音。
8.设计总结
通过本次实训,我了解到了,单片机工作过程,对单片机又有了很深刻的认识,对于以前来说,眼高手低,不愿意去记那些很简单的东西,在这次实训中,吃了大亏。
特别是算音符的频率的时候,走了很多的弯路。
在画原理图和PCB电路板的时候,对AltiumDesigner的不熟悉也让我用了很久的时间,特别是在找元件的时候,几乎是每个库找。
通过这次实训,给我的收获还是挺大的。
了解到了电子琴的弹奏工作原理。
让我的思维有了很大的扩散,现在想起来,以前真的是井底之蛙。
通过这次实训,特别是画原理图,对PCB板元件的布局,有了很深刻的认识,要想把PCB板布置的美观、使用那还得需多加练习。
而且在对元件的了解程度上有了更深刻的认识。
在完成任务的途中,出现了很多的错,冷静下来,每个问题的找原因,分析每个问题的关键所在,找出解决方法。
在这个过程中收获很大,特别是对研发产品的流程有了初步的了解。
9.参考文献
[1]群芳.单片微型计算机与接口技术(第四版).电子工业.2012.1
[2]富.C及C++程序设计(第三版).人民邮电.2011.5
[3]史久贵.基于AltiumDesigner的原理图与PCB设计.机械工业.2010.1
[4]维成.单片机原理与应用及C51程序设计[M].:
清华大学,20054100-112
[5]朱月秀.单片机原理与应用[M].:
科学,2007.8.40-50
⑹康光华.电子技术基础[M]高等教育,2006.1.486-500
[7]牛昱光.单片机原理与接口技术[M].:
电子工业,2009.12.160-173
[8]徐玮.C51单片机高效入门[M].:
机械工业,2010.5.124-133
[9]戴仙金.51单片机及其C语言程序开发实例[M].:
清华大学,20082189-193
附录
附录1电路图
xirvfi缶!
m
知.Qm^iChvU仲&*!
■!
!
■■•
寺]页藝
■ZlK^bsii
附录2PCB图
图8PCB图
附录3源程序(汇编或C语言)
***********************************************************************************
简易电子琴设计
功能要求:
禾U用所给的键盘0~9数字键,按下1~7键中对应键,单片机能发出高音、中音、
低音的1、2、3、4、5、6、7个音符,按键的长短代表节拍,这样方便实现自编曲子或旋律。
设计者:
Tdl完成日期:
QQ:
617457236:
tdljuntuan163.
*************************************************************************************/
#include"regx52.h"
#defineBUZZP2_2
typedefunsignedcharuchar;typedefunsignedintuint;
高音音符
//中音音符//低音音符
ucharg_ucKey;
uintg_ucMusic[]={0xfe48,0xfe78,0xfea2,0xfeb6,0xfed8,0xfefa,0xff16,//
0xfc7b,0xfcef,0xfd45,0xfd6c,0xfdb4,0xfdf4,0xfe34,0xf921,0xf90f,0xfa8c,0xfad8,0xfb69,0xfbe9,0xfc5c};
ucharg_ucM;//选择音符,赋值给TH0、TL0
ucharg_ucChoise=0;//中、低、高音符选择变量
ucharg_ucT=0;ucharg_ucA=0;
//
//
voidDelay(ucharm)
{
uchari;
while(m--)
for(i=0;i<120;i++)
}
//
voidKey_Scan()
{
ucharw1,w2;
P1=0x0f;
w1=P1&0x0f;
if(w1!
=0x0f)
{
Delay
(1);
TR0=1;
TR1=1;
P1=0xf0;
w2=P1&0xf0;
g_ucKey=(w1|w2);
switch(g_ucKey){
g_ucChoise=0;
TR0=0;
case0xeb:
TR1=0;
BUZZ=1;
break;//选择高音默认为高音
case0xed:
g_ucChoise=7;
TR0=0;
TR1=0;
BUZZ=1;
break;//选择中音
case0xee:
g_ucChoise=14;
TR0=0;
TR1=0;
BUZZ=1;
break;//选择低音
case0x77:
g_ucM=0+g_ucChoise;
case0x7b:
TH0=g_ucMusic[g_ucM]/256;TL0=g_ucMusic[g_ucM]%256;break;
g_ucM=1+g_ucChoise;
TH0=g_ucMusic[g_ucM]/256;
TL0=g_ucMusic[g_ucM]%256;break;
//Re
//Do
case0x7d:
g_ucM=2+g_ucChoise;
///Mi
TH0=g_ucMusic[g_ucM]/256;
TL0=g_ucMusic[g_ucM]%256;
break;
TH0=g_ucMusic[g_ucM]/256;
TL0=g_ucMusic[g_ucM]%256;break;
case0xb7:
g_ucM=4+g_ucChoise;
//So
TH0=g_ucMusic[g_ucM]/256;
TL0=g_ucMusic[g_ucM]%256;break;
g_ucM=5+g_ucChoise;
TH0=g_ucMusic[g_ucM]/256;
TL0=g_ucMusic[g_ucM]%256;break;
case0xbd:
g_ucM=6+g_ucChoise;
//Xi
TH0=g_ucMusic[g_ucM]/256;
TL0=g_ucMusic[g_ucM]%256;
break;
default:
TR0=0;BUZZ=1;break;
}else
g_ucKey=0xff;
}
//
voidmain()
{
TMOD=0x11;
EA=1;
ET0=1;
ET1=1;
IP=0x04;
TH1=0x40cc/256;
TL1=0x40cc%256;
while
(1)
{
Key_Scan();
}
}
//
//T0中断服务函数,控制蜂鸣器产生音符
voidINIT0()interrupt1using0
{
BUZZ=~BUZZ;
TH0=g_ucMusic[g_ucM]/256;
TL0=g_ucMusic[g_ucM]%256;
if(g_ucA==1)
{
BUZZ=1;
g_ucA=0;
}
}
//
voidINIT1()interrupt3using1
{
TH1=0x40cc/256;
TL1=0x40cc%256;
g_ucT++;
if(g_ucT>=7)
{
TR0=0;
TR1=0;
g_ucT=0;
BUZZ=1;g_ucA=1;