PLC电子琴设计.docx
- 文档编号:3903679
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:18
- 大小:147.62KB
PLC电子琴设计.docx
《PLC电子琴设计.docx》由会员分享,可在线阅读,更多相关《PLC电子琴设计.docx(18页珍藏版)》请在冰豆网上搜索。
PLC电子琴设计
摘要
设计的主要内容是用AT89S52单片机为核心控制元件,通过脉冲触发产生出电子音调,设计一个简易的电子琴。
以单片机作为主控核心,与键盘、蜂鸣器等模块组成控制模块。
该系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用与参考价值。
关键词:
AT89S52;单片机;脉冲触发;电子琴设计
目录
1概述2
1.1功能简介2
1.2功能的实现2
1.3音乐产生原理3
2系统总体方案及硬件设计4
2.1总体方案4
2.2硬件部分4
2.2.1矩阵键盘部分4
2.2.2扬声器接口电路部分5
3软件设计6
4Proteus软件仿真8
5课程设计体会9
参考文献10
附录1源程序代码10
附录2系统原理图18
1概述
1.1功能简介
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。
它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。
本简易电子琴的设计可实现的功能如下:
程序中预存了一首音乐《月亮代表我的心》,通过一个独立键盘可以实现对该音乐的播放和停止操作的控制。
4*4矩阵键盘的16个按键分别对应着16个不同的音符,分为高、低两个八度,当按下某一按键,会发出相应的音调。
按下按键时,扬声器会发出声音,松开按键后,扬声器停止发声,按键的时间越长,发声时间越久。
连续按下不同的按键,可以实现乐曲的演奏。
1.2功能的实现
功能的实现部分分为软件和硬件两部分来简介。
1.3音乐产生原理
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,只需将一首歌的音阶和频率相对应即可。
若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以2,即为半周期的时间。
利用定时器计时半周期时间,每当计时终止后就将P1.0反相,然后重复计时再反相。
就可在P1.0引脚上得到此频率的脉冲。
利用AT89S52的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶,例如,频率为523Hz,其周期T=1/523=1912μs,因此只要令计数器计时956μs/1μs=956,每计数956次时将I/O反相,就可得到中音DO(523Hz)。
计数脉冲值与频率的关系式(如式2-1所示)是:
N=fi÷2÷fr2-1
式中,N是计数值;fi是机器频率(晶体振荡器为12MHz时,其频率为1MHz);fr是想要产生的频率。
其计数初值T的求法如下:
T=65536-N=65536-fi÷2÷fr2-2
例如:
设K=65536,fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的计数值。
T=65536-N=65536-fi÷2÷fr=65536-1000000÷2÷fr=65536-500000/fr
低音DO的T=65536-500000/262=63627
中音DO的T=65536-500000/523=64580
高音DO的T=65536-500000/1046=65059
我们要为这个音符建立一个表格,单片机通过查表的方式来获得相应的数据,音符表见附录一。
音乐的音拍,一个节拍为单位(C调)(如表2-1所示)
表2-1曲调值表
曲调值
DELAY
曲调值
DELAY
调4/4
125ms
调4/4
62ms
调3/4
187ms
调3/4
94ms
调2/4
250ms
调2/4
125ms
对于不同的曲调我们也可以用单片机的定时/计数器来完成。
程序流程图如图2.5。
2系统总体方案及硬件设计
2.1总体方案
本设计采用4*4键盘控制通过程序产生高八度和低八度音律,要考虑到软件和硬件的匹配以及硬件电路焊接时的排版问题,否则建会带来不必要的焊接麻烦,在编程序时要注意仿真与实际电路中可能的不符,
2.2硬件部分
本设计硬件电路共由以下几部分构成:
矩阵键盘部分;扬声器部分;AT89S52主控电路部分;独立按键部分。
2.2.1矩阵键盘部分
设计中采用AT89S51的并行口P3接4×4矩阵键盘,以P3.0-P3.3作输入线,以P3.4-P3.7作输出线。
每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。
矩阵的行线和列线分别通过两并行接口和CPU通信。
每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。
键盘处理程序的任务是:
确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。
两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能,在本程序中,当程序检测到有键按下时,将查表使按键值与预存数据表中数据对应,并调用发声程序。
图2.1矩阵键盘的连接
2.2.2扬声器接口电路部分
仿真中的扬声器一段接CPU的P2^4口,另一端接高电平。
当P2^4口有电平变化时,扬声器被驱动发声。
而在实物制作中,这样是难以实现功能的,需要增加模拟电路以除去多余的干扰信号。
也可选用集成芯片LM386作为扬声器的驱动芯片。
若使用LM386驱动扬声器,通过相应的模拟电路的设计,还可以实现音量的调节。
不过,在平时做实物时,我们一般用一个三极管作为放大器,这次我采用的是8050
图2.2扬声器接口电路
3软件设计
本设计使用Protues仿真软件进行仿真,在程序设计部分,包括键盘扫描程序,音乐发声程序。
程序见附录1。
4*4矩阵键盘是由CPU控制I/O口来实现扫描的。
具体程序见附录二主程序键盘扫描部分。
键盘扫描程序流程图如图2.4。
程序首先给P3口赋值,然后读取P3的状态,将读取的状态值同所赋值相比较,如果二者不相同,则说明有键按下,子程序将按键值返回主程序;否则,说明没有键按下,程序继续进行下一次扫描。
本系统的软件流程图如下
图2.3系统主程序流程
键盘扫描程序流程图
图2.4键盘扫描程序流程图
音乐发声程序
图2.5音乐发声程序流程图
4Proteus软件仿真
仿真电路图
5课程设计体会
将程序烧入芯片,调试成功后,可任意弹奏自己想要的旋律。
本设计通过制作电子琴,将几个模块很好的融合,对使用单片机设计简易电子琴进行了分析,并了解了基于单片机电子琴统硬件组成。
利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。
说明一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,于是我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可,然后我们利用功放电路来将音乐声音放大。
遇到的问题:
在刚刚焊接好后,程序烧入芯片后,发现并不发声,经检查才发现是对键盘没看清楚,将键盘接乱了,另外,在硬件电路修改好后,发现每次按键时会引起蜂鸣器一直响,再按键时有可能会消失,经检查后知道是再每按键件程序后蜂鸣器对应参值没有直接置零。
总之,这是一次动手能力的锻炼,也是一次单片机知识的再回顾,还是对自己细心以及耐心能力的考察。
参考文献
[1]贾立新、王涌.电子系统设计与实践[M],清华大学出版社,2008年2月版;[2]陶春鸣、陈享成、瓮嘉民.单片机使用技术[M],人民邮电出版社,2008年4月版;[3]余发山.单片机原理及应用技术[M],中国矿业大学出版社,2003年12月版;[4]李光飞.单片机课程设计实例指导[M],航空航天大学出版社,2004年9月版;[5]余永权.ATMEL89系列单片机[M],北京航空航天大学出版社,2002年4月版;[6]胡宴如,耿苏燕.模拟电子技术[M],高等教育出版社,2007年12月版;[7]赵润林,张迎辉.单片机原理与应用教程[M],北京大学出版社,2007年1月版;[8]马淑华、王凤文.单片机原理与接口技术[M],北京邮电大学出版社,2005年10月版;[9]李建忠.单片机原理及应用[M],西安电子科技大学出版社,2002年5月版;[10]杨子文.单片机原理及应用[M],西安电子科技大学出版社,2006年4月版
附录1源程序代码
#include
#defineucharunsignedchar
#defineuintunsignedint
uintkey,i,j,time,m,k;
uchartemp;
ucharSTH0,STL0,STH1,STL1;
sbitsw=P2^7;
sbitspeaker=P2^4;
sbitP37=P3^7;
sbitP36=P3^6;
sbitP35=P3^5;
sbitP34=P3^4;
//月亮代表我的心数据表
codeunsignedcharsszymmh[]={0,2,1,5,1,1,1,2,3,3,2,1,5,2,3,1,2,1,7,1,3,
3,2,1,5,2,2,0,2,1,5,2,1,6,2,1,7,2,2,1,3,3,
6,2,1,6,2,1,5,2,1,5,2,5,3,2,1,2,2,1,1,2,3,
1,2,1,1,2,2,3,2,1,2,2,1,1,2,3,1,2,1,1,2,2,
2,2,1,3,2,1,2,2,2,1,2,1,6,1,2,2,2,1,3,2,1,2,2,5,
};
//音阶频率表高八位
codeunsignedcharFREQH[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,//1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
};
//音阶频率表低八位
codeunsignedcharFREQL[]={
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,//1,2,3,4,5,6,7,8,i
0xEE,0x44,0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};
unsignedintcodetab[]={64103,64260,64400,64524,64580,64684,64777,
64820,64898,64968,65030,65058,65110,65157,65178,65217};
voidkey_music()
{
unsignedchartmp;
P3=0xff;
P34=0;
temp=P3;
temp=temp&0x0f;
tmp=temp;
if(temp!
=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp&0x0f;
//(temp!
=0x0f)
if(temp==tmp)
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{
case0x0e:
key=0;
break;
case0x0d:
key=1;
break;
case0x0b:
key=2;
break;
case0x07:
key=3;
break;
}
//speaker=~speaker;
STH1=tab[key]/256;
STL1=tab[key]%256;
temp=P3;
temp=temp&0x0f;
while(temp!
=0x0f)
{TR0=1;
temp=P3;
temp=temp&0x0f;
}
TR0=0;
speaker=0;
}
}
P3=0xff;
P35=0;
temp=P3;
temp=temp&0x0f;
tmp=temp;
if(temp!
=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp&0x0f;
//(temp!
=0x0f)
if(temp==tmp)
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{
case0x0e:
key=4;
break;
case0x0d:
key=5;
break;
case0x0b:
key=6;
break;
case0x07:
key=7;
break;
}
//speaker=~speaker;
STH1=tab[key]/256;
STL1=tab[key]%256;
temp=P3;
temp=temp&0x0f;
while(temp!
=0x0f)
{TR0=1;
temp=P3;
temp=temp&0x0f;
}
TR0=0;
speaker=0;
}
}
P3=0xff;
P36=0;
temp=P3;
temp=temp&0x0f;
tmp=temp;
if(temp!
=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp&0x0f;
//(temp!
=0x0f)
if(temp==tmp)
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{
case0x0e:
key=8;
break;
case0x0d:
key=9;
break;
case0x0b:
key=10;
break;
case0x07:
key=11;
break;
}
//speaker=~speaker;
STH1=tab[key]/256;
STL1=tab[key]%256;
temp=P3;
temp=temp&0x0f;
while(temp!
=0x0f)
{
TR0=1;
temp=P3;
temp=temp&0x0f;
}
TR0=0;
speaker=0;
}
}
P3=0xff;
P37=0;
temp=P3;
temp=temp&0x0f;
tmp=temp;
if(temp!
=0x0f)
{
for(i=50;i>0;i--)
for(j=100;j>0;j--);
temp=P3;
temp=temp&0x0f;
//(temp!
=0x0f)
if(temp==tmp)
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{
case0x0e:
key=12;
break;
case0x0d:
key=13;
break;
case0x0b:
key=14;
break;
case0x07:
key=15;
break;
}
//speaker=~speaker;
STH1=tab[key]/256;
STL1=tab[key]%256;
temp=P3;
temp=temp&0x0f;
while(temp!
=0x0f)
{TR0=1;
temp=P3;
temp=temp&0x0f;
}
TR0=0;
speaker=0;
}
}
}
voidtimer0(void)interrupt1using0
{
if(sw==1)
{
TH0=STH1;
TL0=STL1;
}
else
{
TH0=STH0;
TL0=STL0;
}
speaker=~speaker;
}
voiddelay(unsignedchart)
{
unsignedchart1;
unsignedlongt2;
for(t1=0;t1 { for(t2=0;t2<8000;t2++) { ; } } TR0=0; } voidsong() { TH0=STH0; TL0=STL0; TR0=1; delay(time); } voidmusic(void) { unsignedintcnt; m=0; time=1; sw=1; cnt=sizeof(sszymmh)/sizeof(char); while(time&&sw==0) { if(sw) {i=0;continue;} else { k=sszymmh[m]+7*sszymmh[m+1]-1; STH0=FREQH[k]; STL0=FREQL[k]; time=sszymmh[m+2]; song();m=m+3; if(m>cnt)break; } } speaker=0; } voidmain() { TMOD=0x01; ET0=1; TF0=1; EA=1; while (1) { if(sw==1) key_music(); elsemusic(); } } 附录2系统原理图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PLC 电子琴 设计