|
实现效果
目录
简易电子琴设计报告
1.设计目的、作用
1、掌握52单片机最小系统的设计;
2、掌握按键电路设计;
3、掌握C52的编程方式
2.设计要求
1. 通过单片机编程控制,对按下的按键进行识别,然后控制喇叭发声。电子琴模式下1-7七个按键可弹出“哆、来、咪、发、梭、拉、西”。
2. 当喇叭发声时,用一个数码管反应音符。
附加要求如下:
1. 当音乐切换按键时,可切换播放某首曲子。
3.设计的具体实现
3.1设计原理
本次设计提出了用AT89C52单片机为核心控制元件,设计一个简易的电子琴. 本方案以AT89C52单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块在主控模块上设有8个按键和1个扬声器.根据使用者的操作随意弹奏想要表达的音乐。一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号。
3.2系统设计
播放模块是喇叭构成。它几乎不存在噪声,音响效果较好。而且由于所需驱动功率较小,且价格低廉,所以,被广泛应用。
电子琴设有8个按键,其中7个作为音符输入,另外1个作为歌曲按键,实现用户播放歌曲。7个按键分别代表7个音符,包括中音段的全部音符。用户可通过7个按键实现自己弹奏音乐,并通过song按键播放预设歌曲。
3.3系统实现
为使该模块化电子琴控制系统具有更加方便和灵活性,我们对系统的硬件做了精心设计。硬件电路包括中心控制模块、播放模块、按键控制模块三大模块。
3.3.1 中心控制模块的硬件设计
本次设计中中心控制模块是采用AT89C52单片机来控制整个系统。其中P3.7口作为输出口,连接蜂鸣器驱动电路,而P1口连接按键控制电路, 从而实现播放音乐的功能,P0口显示按下的音阶。
3.3.2 播放模块的硬件设计
如下图3-2所示,播放模块其实就是喇叭,它接到P3.7口上当有按键按下时,它就会发出声音…
图 3-2 播放模块硬件连接图
3.3.3 按键控制模块的硬件设计
在P1口连有8个按键一端接地.在仿真时,只要有一个键被按下,并被单片机扫描到,则会使播放器发出声音.
图3-3 按键模块硬件连接图
3.3.4 数码管显示模块的硬件设计
在P0口连接数码管,数码管接电源,检测单片机P1处按键按下,显示按下的键值。如图3-4
图 3-4 数码管连接
3.4软件设计
软件是该电子琴控制系统的重要组成部分,在系统的软件设计中我们也才用了模块化设计,将系统的各部分功能编写成子模块的形式,这样增强了系统软件的可读性和可移植性。
3.4.1 下位机软件流程
本系统中下位机(单片机AT89C52)的主要功能就是实现音乐播放功能。其主程序流程如图4-1所示。
图4-1 软件程序流程图
3.4.2上位机软件
本系统的上位机软件主要是编辑电子琴播放状态的内容,在设计中采用c语言编写了电子琴控制系统控制和播放内容的程序。
4.总结
经过两周的忙碌,我的电子琴终于仿真成功.虽然失败了几次,但经过老师对硬件连接图的纠正,自己又调整.了程序最后终于方仿真成功.心情很激动,一方面:觉得很有成就感;另一方面:收获很大,:不但锻炼了编程的能力,而且通过编程对硬件的整个流程了解了。在仿真过程中,我犯了两个低级错误:一个是用了没有模型的元件,另一个是喇叭可以不用驱动就能发出声音。经老师提醒,我改正了连接图。结果成功了。用单片机控制播放模块和按键控制模块制作出的电子琴,结构简单,可靠性高,并且价格低廉,具有实用的价值。
参考文献
附录
附录1
元器件明细表
名称 | 规格 | 数量 | 名称 | 规格 | 数量 | 名称 | 数量 | ||
电阻 | 82Ω | 1 | 电容 | 30p | 2 | 9014 | 1 | ||
电阻 | 1k | 2 | 电容 | 10uf | 3 | 4p排针 | 1 | ||
电阻 | 100k | 1 | LED | 1 | 自锁开关 | 1 | |||
电源头 | 1 | 按键 | 8 | STC89C52 | 1 | ||||
电源线 | 1 | 喇叭 | 1 | 芯片座 | 1 | ||||
PCB板 | 1 | 线 | 2p | 1 | 12MHz晶振 | 1 | |||
程序清单
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit speaker=P3^7;
void delayms(uchar t);//声明延时函数
//输入基础音符
uint mu[]={65058,65110,65157,65178,65217,65252,65283
};//64580,64684,64777,64820,64898,64968,65030//中音
//数码管
uchar num[]={
0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x90
};
uint n,m,o;
//
uchar p[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,
0x7f};
//输入歌曲
code uint s[33]={64580,64684,64777,64580,
64580,64684,64777,64580,
64777,64820,64898,
64777,64820,64898,
64898,64968,64968,64820,64777,64580,
64898,64968,64968,64820,64777,64580,
64580,64898,64580,
64580,64898,64580
};
//输入节拍
code uchar q[]={
4,4,4,4, 4,4,4,4, 4,4,8, 4,4,8, 2,1,2,1,4,4, 2,1,2,1,4,4 ,4,4,8, 4,4,8
};
void main(){
TMOD |=0x01;//计时器1
IE=0x82;
TR0=0;
while(1){
for(n=0;n<9;n++){
if (P1==p[n]){
switch(n+1){
case 1:TR0=1;m=0;P0=num[0];break;
case 2:TR0=1;m=1;P0=num[1];break;
case 3:TR0=1;m=2;P0=num[2];break;
case 4:TR0=1;m=3;P0=num[3];break;
case 5:TR0=1;m=4;P0=num[4];break;
case 6:TR0=1;m=5;P0=num[5];break;
case 7:TR0=1;m=6;P0=num[6];break;
case 8:TR0=1;m=7;P0=num[7];for(o=0;o<50;o++){
delayms(q[o]);};TR0=0;break;
default:TR0=0;break;
}
}
else TR0=0;
}
}
}
void T0Sev(void) interrupt 1{
if(m<7){
TH0=mu[m]/256;
TL0=mu[m]%256;//处理频率
speaker=~speaker;//扬声器接反
}
else{
TH0=s[o]/256;
TL0=s[o]%256;
speaker=~speaker;//扬声器接反
}
}
//定义延时函数
void delayms(uchar t){
uint i,k;
for(k=0;k<t;k++){
for(i=0;i<20000;i++){;}
}
}