一、系统设计
8个按键可以弹奏8个音符,蜂鸣器可以播放按键弹奏的音乐,数码管会显示相应的音符,通过无线模块可以将按下的音阶数据上传到上位机端并进行显示,可以按照乐谱进行音乐演奏,在与上位机进行通信时会存在一定的数据传输延迟,因为上位机的显示较慢。
系统内使用的主控制器是STC89C52单片机,STC89C52单片机的发布时间较早,是市面上比较常见的控制器,STC89C52单片机本身的特性和51系列单片机类型,并且能使用MCS51指令系统进行系统控制,STC89C52单片机内集成的功能资源较为丰富,其中有8KB的FLASH能实现程序的快速存储,256KB的8位RAM能实现大量数据的存储。STC89C52单片机内还设置了许多的外设功能,其中主要包括定时器、计数器,以及可以实现数据传输的I/O、中断、串口。STC89C52单片机为了实现不同控制功能和适用不同的控制环境设置了多种工作模式,其中的工作模式包括有睡眠、待机、关机三种,设计者可以根据系统的功耗需求选择合适的工作模式。
二、硬件设计
电子琴电路中主要电路有以单片机为核心的最小系统电路,按键控制电路、蜂鸣器发声电路、数码管显示电路、无线通信电路等。
三、软件设计
电子琴系统的软件实现过程是,先进行初始化,初始化结束后就开始进行I/O状态的检测,根据检测到的I/O口将对应的音阶在数据官上进行显示,将检测到的数据通过WIFI传输到上位机端。
四、keil程序(部分程序)
硬件系统功能稳定实现是离不开一个逻辑严谨的软件程序的,尤其是对于一些功能比较复杂的系统,设计开发一个严谨的、逻辑性强的软件程序是非常重要的,现如今单片机控制程序的开发基本都是使用Keil实现的,而且该软件经过数十年的升级优化,现在无论是从操作舒适度还是功能方面,都是有非常大的优势。控制器的软件程序开发语言支持汇编语言和C语言,通过汇编语言进行软件程序的开发,对设计者的硬件功底要求比较高,因此现在很多的设计者普遍采用相对来说比较高级的C语言进行硬件系统的软件程序开发。但是在KEIL软件上这两种语言是都被支持的,这也是该开发软件深受设计者喜欢的一个重要特点。在KEIL上完成软件程序的开发,在软件调试方面来说对于设计者是非常方便的,Keil内自带了程序编译功能,在设计完程序后可以通过程序编译找到程序中存在语法以及逻辑问题,并且会将错误信息直接显示在下方窗口,大大提升了设计者开发软件程序的效率,然后就是该软件支持线上仿真,通过这个功能可以减少程序烧写的次数,大大提升系统的使用寿命,同时也加快了设计者进行软件程序逻辑功能调试的效率。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit speaker=P3^2;//喇叭接30脚
uchar a,b;
uchar shu[10]=0;
uchar code table[]={ 0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8, 0x80,0x90};
void check_key()
{
P1=0xff;//先赋给P3组口高电平
switch(P1)//按下一个键数码管显示相应的数
{
case 0xfe:P0=0x10;P2=table[0];a=0xfb;b=0xe9;EA=1;shu[0]=1;break;//P0组为发光二极管组 P2数码管
case 0xfd:P0=0x10;P2=table[1];a=0xfc;b=0x5c;EA=1;shu[0]=2;break;//注意:EA不能改为TR0
case 0xfb:P0=0x10;P2=table[2];a=0xfc;b=0xc1;EA=1;shu[0]=3;break;
case 0xf7:P0=0x10;P2=table[3];a=0xfc;b=0xef;EA=1;shu[0]=4;break;
case 0xef:P0=0x10;P2=table[4];a=0xfd;b=0x45;EA=1;shu[0]=5;break;
case 0xdf:P0=0x10;P2=table[5];a=0xfd;b=0x92;EA=1;shu[0]=6;break;
case 0xbf:P0=0x10;P2=table[6];a=0xfd;b=0xd0;EA=1;shu[0]=7;break;
case 0x7f:P0=0x10;P2=table[7];a=0xfd;b=0xee;EA=1;shu[0]=8;break;
default:EA=0;speaker=1;P0=0xff;P2=0xff;
}
}
void delayms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void sendByte(uchar b)
{
ES = 0;
TI=0;
SBUF = b;
while(!TI);
TI=0;
ES = 1;
}
void sendString(uchar *s)
{
while(*s != '\0')
sendByte(*s);
s++;
}
}
void main()
{TMOD=0x01;
TH0=a;
TL0=b;
ET0=1;//打开定时器,但是未允许中断
TR0=1;
while(1)
{
check_key();
}
}
void time0() interrupt 1
{
TH0=a;
TL0=b;
speaker=~speaker;
}
五、实物展示
六、资料链接
链接会跳转到主页 主页下方有资料链接