/
程序名称:音乐演奏器
简要说明:P10口输出各音调的频率方波
编 写: MMC
更新时间:09\05
/
#include<AT89X52h>
#define SPK P0_0 //定义方波输出口
#define LED P1_1
#define shumaguan P0 //定义数码管段码输出
unsigned int tone1,tone2;
/标准音符表/
//用于使定时器初值变化以产生相应频率的定时
unsigned char code yinfu[]={
0xfb,0xe9, //Do
0xfc,0x5c, //Re
0xfc,0xc1, //Mi
0xfc,0xef, //Fa
0xfd,0x45, //So
0xfd,0x92, //La
0xfd,0xd0, //Si
0xfd,0xee, //Do#
0xfa,0x14, //So低
0xfa,0xb9, //La低
0xfb,0x4d, //Si低
0x00,0x00 //音符之间的间隔,只要间隔时间小于65ms时,
//喇叭不会发出声音,用作拍子之间的短暂停顿
};
/军港之夜音调表/
unsigned char code shengri_tone[]={9,3,3,1,2,3,2,3,3,10,9,1,2,1,3,5,5,3,6,5,3,
3,3,2,1,2,3,2,3,11,9,10,11,10,1,11,3,3,11,10,11,10,11,3,3,11,
11,10,11,10,2,10,1,11,10,9,10,9,3,5,5,3,6,5,6,5,3,5,3,1,3,3,3,5,
3,5,5,3,3,2,3,2,11,10,11,10,9,3,3,5,5,3,6,5,6,5,3,5,3,1,3,
3,5,3,5,5,3,3,3,2,3,2,11,10,11,10,9,1 //0代表不发声,即停顿;数字即为音调
};
/军港之夜节拍表/
unsigned char code shengri_beat[]={24,24,24,24,12,12,48,24,48,24,24,12,12,86,24,24,24,24,24,48,24,
48,12,12,24,12,12,86,48,24,24,12,12,48,24,24,24,24,24,12,12,72,24,24,24,24,
24,12,12,48,24,12,12,24,24,12,12,86,24,24,24,24,24,12,12,48,12,24,12,24,12,12,12,48,
24,24,24,24,24,12,12,48,24,12,12,24,24,86,24,24,24,24,24,12,12,48,12,24,12,24,24,
24,72,24,24,24,12,12,24,12,12,48,24,12,12,24,24,86 //节拍,即tone表各音调的延时
};
/自动演示音调表/
unsigned char code yanshi_tone[]={ 1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,
8,0,7,0,6,0,5,0,4,0,3,0,2,0,1,0
};
/自动演示节拍表/
unsigned char code yanshi_beat[]={ 48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,2,
48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,2
};
/15ms延时子程序,用于节拍/
void delay(void)
{
unsigned char n=15;
while(n--)
{
unsigned char i;
for(i=0;i<125;i++);
}
}
/定时器0初始化/
void initTimer(void)
{
TMOD=0x01; //定时器0,工作方式1;定时器1,工作方式1
TH0=tone1;
TL0=tone2;
}
/定时器0中断服务程序/
void timer0(void) interrupt 1
{
TH0=tone1;
TL0=tone2;
SPK=~SPK; //取反,以产生方波
}
/演奏子程序1/
void play1(void)
{
unsigned char m=0;
unsigned char s;
unsigned char a=1;
while(1)
{
EA=0;
LED=0;
a=shengri_tone[m]; //取音符
s=shengri_beat[m]; //取节拍
tone1=yinfu[2a-2];
tone2=yinfu[2a-1];
EA=1;
while(s--)
{
delay();
}
LED=1;
m++;
if(m>=119) return; //数值是shengri相关表中的元素数量
}
}
/演奏子程序2/
void play2(void)
{
unsigned char m=0;
unsigned char s;
unsigned char a=1;
while(1)
{
EA=0;
LED=0;
a=yanshi_tone[m];
s=yanshi_beat[m];
tone1=yinfu[2a-2];
tone2=yinfu[2a-1];
EA=1;
while(s--)
{
delay();
}
LED=1;
m++;
if(m>=32) return;
}
}
/按键检测/
void check_key(void)
{
P2=0xff;
P3=0xff; //设置为输入状态
switch(P2) //检测按键,输出数码管、载入定时器初值、允许中断
{
case 0xfe:shumaguan=0xF9;tone1=0xfb;tone2=0x90;EA=1;break;
case 0xfd:shumaguan=0xA4;tone1=0xfc;tone2=0xc;EA=1;break;
case 0xfb:shumaguan=0xB0;tone1=0xfc;tone2=0x7b;EA=1;break;
case 0xf7:shumaguan=0x99;tone1=0xfc;tone2=0xad;EA=1;break;
case 0xef:shumaguan=0x92;tone1=0xfd;tone2=0xa;EA=1;break;
case 0xdf:shumaguan=0x82;tone1=0xfd;tone2=0x5d;EA=1;break;
case 0xbf:shumaguan=0xF8;tone1=0xfd;tone2=0xa7;EA=1;break;
case 0x7f:play1();break;
default: EA=0;SPK=0;shumaguan=0xff;//如果没有键按下则关闭中断和数码管
}
switch(P3)
{
case 0xfe:shumaguan=0x79;tone1=0xfd;tone2=0xc8;EA=1;break;
case 0xfd:shumaguan=0x24;tone1=0xfe;tone2=0x6;EA=1;break;
case 0xfb:shumaguan=0x30;tone1=0xfe;tone2=0x3e;EA=1;break;
case 0xf7:shumaguan=0x19;tone1=0xfe;tone2=0x57;EA=1;break;
case 0xef:shumaguan=0x12;tone1=0xfe;tone2=0x85;EA=1;break;
case 0xdf:shumaguan=0x02;tone1=0xfe;tone2=0xaf;EA=1;break;
case 0xbf:shumaguan=0x78;tone1=0xfe;tone2=0xd4;EA=1;break;
case 0x7f:play2();break;
default: EA=0;SPK=0;shumaguan=0xff;//如果没有键按下则关闭中断和数码管
}
}
/主程序/
void main(void)
{
initTimer();
// shumaguan=0xff;
TR0=1;
ET0=1;
SPK=0;
while(1)
{
check_key();
}
}
/END/
这个不仅有你说的功能,还集有了一首《军港之夜》的歌在里面
#include <AT89X51H> //电子琴的程序
#define keyport P1 //矩阵键盘接口
#define speaker P3_7//蜂鸣器
#define segdisplay P0 //数码管显示
unsigned char code table[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,
0x10 ,0x08 ,0x03,0x46,0x21,0x06 ,0x0e //共阳极数码管0到9编码带小数点
};
sbit seg=P1^0; //数码管显示开关,注意下载程序时候不要连接P1口
unsigned char temp;
unsigned char key; //按键的键值0到15
unsigned char STH0;
unsigned char STL0;
unsigned int code tab[]={64021,64103,64260,64400,
64524,64580,64684,64777,
64820,64898,64968,65030,
65058,65110,65157,65178
};
void delay()
{ unsigned char i,j;
for(i=50;i>0;i--)
for(j=200;j>0;j--);
}
void main(void)
{
TMOD=0x01;
ET0=1;
EA=1;
seg=0;
while(1)
{
keyport=0xff;
keyport=0xef; //P24给低电平
temp=keyport;
temp=temp & 0x0f;
if (temp!=0x0f)
{
delay();
temp=keyport;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=keyport;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=0;
break;
case 0x0d:
key=1;
break;
case 0x0b:
key=2;
break;
case 0x07:
key=3;
break;
}
temp=keyport;
speaker=~speaker;
segdisplay =table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=keyport;
temp=temp & 0x0f;
}
TR0=0;
}
}
keyport=0xff;
keyport=0xdf; //P25低电平
temp=keyport;
temp=temp & 0x0f;
if (temp!=0x0f)
{
delay();
temp=keyport;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=keyport;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=4;
break;
case 0x0d:
key=5;
break;
case 0x0b:
key=6;
break;
case 0x07:
key=7;
break;
}
temp=keyport;
speaker=~speaker;
segdisplay =table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=keyport;
temp=temp & 0x0f;
}
TR0=0;
}
}
keyport=0xff;
keyport=0xbf; //P26给低电平
temp=keyport;
temp=temp & 0x0f;
if (temp!=0x0f)
{
delay();
temp=keyport;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=keyport;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=8;
break;
case 0x0d:
key=9;
break;
case 0x0b:
key=10;
break;
case 0x07:
key=11;
break;
}
temp=keyport;
speaker=~speaker;
segdisplay =table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=keyport;
temp=temp & 0x0f;
}
TR0=0;
}
}
keyport=0xff;
keyport=0x7f; //P27给低电平
temp=keyport;
temp=temp & 0x0f;
if (temp!=0x0f)
{
delay();
temp=keyport;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=keyport;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=12;
break;
case 0x0d:
key=13;
break;
case 0x0b:
key=14;
break;
case 0x07:
key=15;
break;
}
temp=keyport;
speaker=~speaker;
segdisplay =table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=keyport;
temp=temp & 0x0f;
}
TR0=0;
}
}
}
}
void t0(void) interrupt 1 using 0
{
TH0=STH0;
TL0=STL0;
speaker=~speaker;
}
这个是程序我已经测试成功的 希望对你有帮助 我是接了个数码管显示了一下 其实你也可以不接
例如:
C大调音阶,在一个八度范围练习,右手上行可用3-5指法,即12312345指,下行则用5-3指法,即54321321指。左手上行可用5-3指法,即54321321指。而下行则可用3-5指法,即12312345指。
如果C大调音阶练习超过一个八度,则右手上行可用3-4指法,即12312341231234指(对于上行最后一个音需要用5指),下行则用4-3指法,即43213214321321指(对于下行第一个音需要用5指)。
同样左手上行仍可用4-3指法,即43213214321指(对于上行第一个音需要用5指)。左手下行则可用3-4指法,即12312341231234指(对于下行最后一个音需要用5指)。
这几种指法不但对C大调音阶d奏比较方便,而且对D大调,E大调,G大调,A大调,B大调的音阶d奏都比较方便。但对F大调则需要变化为上行用4-3指法,即12341231234123指。下行用3-4指法,43213214321321指。
电子琴多指和弦指法表还有乐谱的指法完全是靠练多了以后,根据自己的自身条件,以及乐曲的要求(例如:速度,轻重,缓急)揣摩的。在电子琴的训练中,共包含五个方面的练习,即:指法的基本功练习、练习曲练习、表演曲目练习、即兴演奏练习、试奏练习。
最基础的训练就是指法的基本功练习。所谓指法练习就是指:把键盘上的各音高,通过规范的指法,合理地组织在音阶、和弦、琵音等练习条目中的d奏训练。这是其它各类练习的基础,这样的训练越是扎实、全面,就能为日后学习其他音乐作品打下良好的基础,就越有能力在技巧上驾驭各类不同风格的音乐作品,在舞台演奏或即兴演奏时充满自信。
扩展资料:
电子琴61键指法
1、手指自然弯曲,同手掌一起构成一个半圆型,呈空握球状。
2、掌关节(通常叫第三关节)及所有手指关节都应凸起,应避免和纠正最易出现的手指第一关节和第三关节(指掌关节)塌陷呈凹状。
3、手指应自然分开,原则上刚好一个指头对准一个琴键。
4、整只手(从整个前臂到手)应以水平位置正摆在琴健上,并应使手指摆正,与琴键排列平行,大指应放在琴键上面。
5、手指触键的基本位置应取在白键与黑键距离的约二分之一处。当触按黑键时,整只手应向黑键位置前挪,黑键应d在键前端位置,
6、要求指尖落在琴键上,不能用指肚;手腕不要摇晃,除非是练“落滚”;手不能趴在琴上。
功能分类
家用的电子琴属中低端的“编曲键盘”。中高端的编曲键盘在现代的流行乐队里起着重要作用。而侧重于音乐制作的电子琴类成员叫做“电子合成器”。对于好的编曲键盘和电子合成器来说,人们可以自己编辑修改音色和节奏风格,甚至可以传到电脑里通过网络和别人分享这些音色节奏。而运用了电子技术做成的手感像钢琴那样的乐器叫“电子钢琴”或“数码钢琴”。
电子琴初学者使用的电子琴一般为61键,各琴行中这种电子琴占多数。此外还有76键,88键不等的普及型或业余型电子琴。这类琴在国内各个少儿电子琴比赛中很常见。入门常用的琴就是美得理的a800/雅马哈KB290,稍微好一些的会推荐使用PSR-S650/KORGPa600/美得理A1000,再好一些的推荐PSR-S750和Tyros、KORG的Pa3X这些。
电子琴的更新换代很快,因为电子琴同样属于数码产品,也需要应用数据。Tyros1不支持Tyros4的音色文件和伴奏文件,虽然可以依靠格式转换,但是依然不会出很好的效果。所以说电子琴买新不买旧。买琴需量力而行。
而电子琴教材以使用中国音乐家协会第四套教材为数较多。(业余,共十级)此外各省艺术学院也有自己的等级考试,级别数各有所出入。在新编的第四套教材中,加入了许多新曲目,难度也稍有放低。
考级分类
现在我国的电子琴业余考级“全国版”以10级为最高级别,“上海版”也以10级为最高级别,中央音乐学院校外考级以9级为最高级别。无论哪一种,大致的程序都是以1、2、3为初级,4、5、6、7为中级,8、9、10为高级。
一般来说,程序不同,考试对学生的要求也是不同的。例如:同样是d错音,对于初级者会宽容些,只要不是把全曲d得面目全非,主要的节奏点都能把握住,错音不多,一般是可以通过的,但是,若在高级别的考试中,有连续片段的错音,就肯定不会通过。
初级
(包括1、2、3级)同学,在考试时要注意以下方面:
1、正确的手型;2、准确的读谱(包括调号、临时记号以及左手的和弦);3不要造成旋律与伴奏的错位,即每个小节的重音点不一致。做到以上3点,取得合格是不成问题的。反之,乐曲、练习曲被演奏得面目全非,那就没有达到最基本的合格线,就会被评为不合格了。当然,如果各项都完成得不错,学生演奏乐曲时的各个乐句,轻响表现力都非常好,则可以取得优秀成绩。
中级
(包括4、5、6、7级)同学,在考试时要注意以下方面:
1、基本技术要过硬。这包括音阶训练、练习曲的技巧。对学生的要求是在d奏上没有技术上的负担,例如:手指僵硬,跑动不流畅,这取决于初级时学生基本功练习的好坏,若在初级阶段手型未掌握好,在中级阶段就会暴露出手型的缺陷。
因此,我们特别建议学生在初级阶段时要打好扎实的基础。学生的手指都站不稳,就做不到手指跳动。在中级的技巧训练上,对速度是有一定要求的,不能用比曲谱所标速度还慢的速度来演奏。若学生的演奏无错音,但速度演奏过慢,也会被考官视为程度未达到中级别,也不会达到合格的。
2、错音问题。在中级阶段,学生演奏时若有少量的错音,而且没有原则性的错误(例如调性等)是可以勉强合格的。
高级
(包括8、9、10级)同学,在考试时要注意以下几个方面:
1、演奏方法。高级别的学生,在演奏方法上应该是完全没有问题了。包括手指的跑动、音的流畅、跑动的速度,都应该达到乐谱上的标准,如果学生未用正确的演奏方法,导致演奏速度不能达标,则不会获得通过。
2、错音问题。在高级阶段,不能允许再有部分错音,只能允许有两个错音和一个错误的节奏。不能出现读谱的错误,而只能允许演奏过程中出现一刹那间的小失误(如刮音、碰音等小问题)。
3、乐曲的表现力。在高级别的考试中,音乐表现力应该被列为首位。特别在电子琴考级中,高级别考的往往是一些大型的乐曲,各个乐段之间的衔接是很重要的,学生不能因为换开关而影响了音乐的完整性。另外,音色的选择、节奏的选择也非常重要,如果一首乐曲选定了用摇摆节奏(SWING)风格的旋律,音色都要适合这个节奏的风格。若选用不准确,就达不到合格的标准了。反之,如果考生的音乐表现力非常好,d奏时出现些小错,还是可以被评为优秀的。
在考试中,学生一定要准确衡量自己的水平,选择正确的、适合自己的级别应考,不要盲目地一年跳考几个级别,这样对孩子是没有好处的。试想一下,你的孩子在小学阶段已突破了10级大关,上了中学就无事可做,不再练琴,加上基本功不牢,很快他就会全忘了。这本身也就失去了参加考级的意义。
考生要准确辨析自己的水平,你报高了一个级别,勉强合格,我建议你巩固一下,再考,给自己留一个余地。所以我们要了解考级,以平常心态去参加考级,测量出自己的音乐水平,这才是我们的目的所在。
参考资料:
HappyEO电子琴是一个用电脑的声卡和键盘来模拟电子琴的程序。它拥有很多高档电子琴才有的功能。作者希望:如果你是位音乐初学者,它会是你的良师益友;如果你已经有一定的音乐基础,你会从中充分感受到音乐的乐趣;如果你想涉猎电脑音乐,它会是你忠实的领路人……
主要功能特点:
1
128种音色,11种效果,包括各种双音色、d拨乐器模拟。
2
支持混响、合唱、颤音。
3
支持键盘分离,双手演奏。
4
支持自动伴奏、节奏填充、节奏同步。
5
可以读取、保存、播放MIDI文件。
6
可以外接MIDI键盘或带MIDI接口的电子琴。
7
支持多音轨录音。
8
支持卡拉OK演奏。
9
支持鼓模式,将你的电脑变成架子鼓。
10
可以自行定义键盘的音符布局。
11
可以动态切换皮肤。支持透明度的设定。
下载:
>
解析MIDI电子琴的设计用单片机是如何实现的
摘要:用单片机控制通用MIDI音源模块制作制作出的电子琴,结构简单,可靠性高,并且价格低廉,具有实用的价值。这种电子琴能够支持单音和复音d奏,如果与高品质的音源芯片连接,音质更可与高档电子琴相媲美。我们在实验过程中,也曾采用手机中通用的音乐芯片构成音源模块,效果不错,价格更低廉,如韩国产的QS6400 等,这些芯片的驱动要复杂一些,需要对芯片进行初始化设置,详细内容可参看国防工业出版社出版的《MIDI原理与开发应用》一书中的相关章节。
关键字:电子琴,单片机,音源板,MD2064
1、电子琴的硬件设计方案
本电子琴包含48个按键键盘,即具有4个8度的音域,单片机AT89C51通过对所d按键的识别,产生相应的MIDI消息。它支持单音d奏和最多16个复音d奏。电子琴结构示意图和电路原理图分别如图1和图2所示。AT89C51作为主控芯片,它使得键盘矩阵模块、通道和音色选择以及串口发送等各功能模块协调工作。48按键行列式键盘矩阵构成MIDI电子琴的键盘扫描输入端,由于89C51的P0口内部没有上拉电阻,故这里采用电阻R14——R21将列线拉至高电平,与六条行线组合完成48个琴键的扫描识别,在图1中,单片机与键盘矩阵间的双箭头线表示单片机在扫描键盘矩阵时,P0口和P2口分别作为输入/输出口使用。人机接口电路则利用了单片机P1口的大部分口线,并通过或门向INT0发出中断请求,该部分电路主要完成MIDI电子琴的通道设置和音色选择等人机交互功能。键盘的d奏信息以及通道、音色信息经CPU处理后,由串口将标准的MIDI数据发送给MIDI音源及放大器,推动扬声器发声。
图1:MIDI电子琴结构示意图
图2:MIDI电子琴电路图
音源模块采用MD2064 套板,如图3所示。它是一种模块化的MIDI音源产品,由得理电子公司开发,具有标准MIDI接口,该板能接受标准GM MIDI命令进行音乐播放,自带3D, REVERB, CHORUS等效果处理。由于该套板的MIDI 接口采用了光耦合器,电流驱动,故设计了由Q1、Q2等器件组成的驱动电路,使单片机串口数据得以正常传输。在模块的耳机输出端取得信号后,经小功率放大即可推动扬声器发声。
2、电子琴的软件设计特点
该电子琴软件采用模块化设计方法,程序也较简单。软件中各功能模块都由相应的子程序完成,主要包含通道选择模块,音色选择模块,48按键键盘扫描模块,串口发送模块等,其中为了及时完成用户命令,音色选择模块采用了中断服务子程序,可以在演奏中快速响应使用者的请求。
主程序在完成串口初始化、相关变量的初始化以及设置通道后,即进入键盘扫描、发送音符消息流程,为了使按键识别准确可靠,还设置了两个缓冲区BUFF1和BUFF2保存键盘扫描值。主程序流程图如图3。
图3:MIDI电子琴程序的流程图
以下是部分功能模块的程序设计介绍。
21 音色选择模块的设计
该模块的功能是使MIDI电子琴能按要求快速改变音色,所以采用了中断服务子程序。当某个音色选择按键压下时,通过或门向单片机的INT0发出中断请求,CPU响应后进入该中断服务子程序。MIDI技术规范规定,标准MIDI含有128种音色,它们的编号范围是0~127,为了能够快速找到所需音色,硬件中设置3个按键,其中2个用于音色编号的单步增加和减小,每次增加或减小1个音色编号,另外一个键用于音色快进,当快进键有效时,每次增加8个音色编号,选择增加8个音色的原因是:标准MIDI的128种音色是按每8个音色一组编排的,共包含16个乐器组。电子琴开机时默认的音色编号是0,即大钢琴音色。
单片机的P12口线连接着音色增加按键,P13则连接音色减小按键,P14连接音色快进键。低电平时按键有效,这三个按键通过与门连接外部中断INT0,以便实时响应音色设置。该外部中断0的中断服务子程序流程图见图4,(图中省去了按键延时去抖动部分):
图4:音色改变子程序流程图
在该子程序中,变量TAMBER中存放当前音色,其值可在0~127间循环,当TAMBER是最大值127时,加1后又变为0;而当TAMBER为0时,减1则变为127;在边界范围加8取模后,刚好为其对应的音色值。
22 串口发送模块
串口发送模块主要用于发送产生的MIDI消息,串口采用的模式1,发送的波特率是3125KBPS。串口通过驱动电路连接MIDI音源,发送MIDI消息。通道号存放在变量CHANNEL中,通过与90H相与,所得值就是当前所设置的通道号。
23 键盘扫描模块
本电子琴提供了48个MIDI按键,即4个8度音的音域范围,当按下单个键时,产生一条MIDI消息,当按下多个键值时产生对应键值的多条MIDI音符开消息,当某个键值被释放时,发送对应的音符关消息。这些MIDI消息通过串口发送给MIDI音源,产生MIDI音乐。音乐的时值由按键的时间长度控制,当按键被释放,实时产生MIDI消息,关闭被释放的键值音。
由P0口和P2口的P20~P25构成行列式键盘,也可继续扩展键盘,例如改为常用的49键或64键。因为支持复音按键,键盘扫描程序必须扫描到行列式键盘的每个键值,扫描所得的键值存放在缓冲区BUFF1或BUFF2中。键盘扫描程序获得的键盘编号范围是0~47,还需将这个键盘编号值转换为MIDI设备能够识别的钢琴键盘编号,这个功能由一个子程序来完成,限于篇幅本文不再详述。键盘扫描子程序流程如图5。
图5:键盘扫描子程序
有图,Q我
1352282
设计任务及要求
1 以8255接八个开关K1~K8,做电子琴按键输入。
2 以8253控制扬声器,拨动不同的开关,发出相应的音阶。
要求: K1—静音
K2—发si的音493Hz
K3—发la的音440Hz
K4—发sol的音392Hz
K5—发fa的音349Hz
K6—发mi的音329Hz
K7—发re的音293Hz
K8—发do的音261Hz
二 方案比较和认证
通过8255和8253来实现电子琴模拟,主要可以分成两部分,分别为输入部分和发音部分。输入部分主要是由8255和8个常开型开关来完成。常开型开关如右图。8个常开型开关K1~K8与8255的A口PA0~PA7相接,不触动开关时,为高电平输入,当按下开关时,就接地,为低电平输入。例如当K1键按下时,从8255中A口输入的数为11111110B,十六进制为0FEH。每一个开关按下时,都对应一个ASCII码,如下表所示:
开 关 K1 K2 K3 K4 K5 K6 K7 K8
对应数据 0FEH 0FDH 0FBH 0F7H 0EFH 0DFH 0BFH 7FH
对应频率 静音 493 Hz 440 Hz 392 Hz 349 Hz 329 Hz 293 Hz 261 Hz
输入部分的硬件实现比较简单,所以说主要还是在发音部分。在设计中驱动扬声器地声的主要有两种方式,分别是以位触发和定时器控制。下面就这两种不同的方式确定两个不同的设计方案。
方案1:
发声采用位触发方式。电路原理图如下所示。程序直接控制PPI(8255可编程序外围接口芯片)的输出控制寄存器(I/O端口为61H)的第一位,使该位按所需的频率进行1和0的交替变化,从而产生一串脉冲控制波形,这些脉冲经过放大后驱动扬声器发出声音。
可以利用软件延时来控制所产生的脉冲波形的长度和脉宽,就可以实现产生不同频率和不同音长的声音。软件实现的程序如下:
IN AL,61H
MOV AH,AL
AND AL,0FCH ;关断定时器通道2的门控
SOUND:XOR AL,2 ;触发61H端口第1位
OUT 61H,AL
MOV CX,DX ;(DX)=控制脉冲的计数值
WAIT: LOOP WAIT ;延时循环
DEC BX ;(BX)=脉冲持续的时间
JNZ SOUND
MOV AL,AH
OUT 61H,AL ;恢复61H端口
以上就是关于单片机电子琴代码全部的内容,包括:单片机电子琴代码、求 可以播放音乐的4*4单片机电子琴的程序 ,最好是C语言的,用P37接喇叭,p1口和44矩阵键盘连接,、61键电子琴左右手指法入门等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)