单片机电子琴模拟系统
实验一:
电子琴模拟系统即电子琴模拟器当选择不同的按键时,扬声器发出不同音阶的声音,仪器的最基本组成部分应包括:扬声器、模数转换电路、单片机控制电路。 设计一个用蜂鸣器模拟电子琴演奏音乐的程序。产生e调8个音阶的振荡频率,它分别由1、2、3、4、5、6、7、0号数字键控制。
实物图连线如图所示:
汇编程序如下:
;电子琴 -----------连续型 查询式键盘
;P3.2(INT0) 接扬声器
;P1 键盘读入口 查询式
Pulse equ 10h ;脉冲
PulseCNT equ 50h ;脉冲计数
ToneHigh equ 40h ;高音调
ToneLow equ 41h ;低音调
Tone equ 42h ;音调
KeyBuf equ 54h
Speaker BIT P2.0
ORG 0000H
ljmp Start
org 000bh
LJMP Timer0Int
ORG 0030H
Timer0Int: ;定时中断
push PSW
clr TR0
mov TH0, ToneHigh
mov TL0, ToneLow
setb TR0
mov C, Pulse
MOV Speaker,C
CPL Pulse
pop PSW
reti
ToneTable:
DW 64578,64686,64778,64821
DW 64898,64968,65029
TestKey:
MOV P1, #0FFH
MOV A, P1
CPL A ; 读入键状态
ret
KeyTable:DB 0FEH,0FDH,0FBH,0F7H
DB 0EFH,0DFH,0BFH,07FH ; 键码定义
GETKEY:
MOV R6,#10
ACALL DELAY
MOV A,P1
CJNE A,#0FFH,K01 ;确有键按下
LJMP MLOOP
K01: MOV R3,#8 ;8个键
MOV R2,#0 ;键码
MOV B,A ;暂存键值
MOV DPTR,#KeyTable
K02: MOV A,R2
MOVC A,@A+DPTR ;从键值表中取键值
CJNE A,B,K04 ;键值比较
MOV A,R2 ;得键码
INC A
RET
K04: INC R2 ;不相等,到继续访问键值表
DJNZ R3,K02
MOV A,#0FFH ;键值不在键值中,即多键同时按下
LJMP MLOOP
Delay: ; 延时子程序
mov r7, #0
DelayLoop:
djnz r7, DelayLoop
djnz r6, Delay
ret
;#########################
Start:
mov sp, #70h
mov TMOD, #01 ; Timer
mov IE, #82h ; EA=1, IT0 = 1
mov Tone,#0
MLoop:
call TestKey
jz MLoop
call GetKey
mov b, a
jz MLoop ; = 0, < 1
anl a, #8
jnz MLoop ; > 8
dec b
mov a, b
rl a ; a = a*2
mov b, a
mov dptr, #ToneTable
movc a, @a+dptr
mov ToneHigh, a
mov TH0, a
mov a, b
inc a
movc a, @a+dptr
mov ToneLow, a
mov TL0, a
SETB TR0
MOV P1,#0FFH
WAIT:
MOV A,P1
CJNE A,#0FFH, WAIT
MOV R6,#10
ACALL DELAY
CLR TR0
LJMP MLOOP
END
实验二
把VOICE接到P2.2,能弹奏一首简单的儿歌《两只老虎》,实物图连接如图所示:
C语言代码如下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA1=P0^2;
sbit SCL1=P0^1;
sbit SCL2=P0^0;
sbit W1=P0^3;
sbit W2=P0^4;
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit k6=P1^5;
sbit k7=P1^6;
sbit D1=P2^6;
sbit D2=P2^7;
sbit k8=P3^2;
sbit k9=P3^3;
sbit k10=P3^4;
sbit k11=P3^5;
sbit beep=P2^2;
uchar code table1[]={
0x3F,
0x06,
0x5B,
0x4F,
0x66,
0x6D,
0x7D,
0x07,
0x7F,
0x6F,
0x37,//中音
0x38,//低音
0x76,//高音
0x79
};
uchar code table2[]={
0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
};
uchar code table3[]={
0x8E,0xED,0x44,0x6B,0xB4,0xF4,0x2D,
0x21,0xDB,0x87,0xD7,0x68,0xE8,0x5B,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};
uchar code table4[]={
1,2,3,1,
1,2,3,1,
3,4,5,
3,4,5,
5,6,5,4,3,1,
5,6,5,4,3,1,
1,12,1,
1,12,1
};
uchar code table5[]={
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,6,
4,4,6
};
uchar i;
uchar key,aa=0;
uchar bb,cc;
bit flag=0;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=340;y>0;y--);
}
void in(uchar Data)
{
uchar i;
for(i=0;i<8;i++)
{
Data<<=1;
SCL1=CY;
SDA1=1;
_nop_();
_nop_();
SDA1=0;
}
}
void out()
{
SCL2=0;
_nop_();
SCL2=1;
_nop_();
SCL2=0;
}
void init()
{
beep=0;
D1=1;
D2=0;
EA=1;
TCON=0x01;
EX0=1;
ET0=1;
ET1=1;
TMOD=0x11;
}
void display1()
{
in(table1[aa]);
out();
W1=0;;
delay(1);
W1=1;
in(table1[cc+1]);
out();
W2=0;
delay(1);
W2=1;
}
void yinjie()
{
if(k10==0)
{
delay(5);
if(k10==0)
{
aa=10;
bb=0;
}
}
if(k9==0)
{
delay(5);
if(k9==0)
{
aa=11;
bb=1;
}
}
if(k11==0)
{
delay(5);
if(k11==0)
{
aa=12;
bb=2;
}
}
if(aa==0)
{
aa=13;
}
}
void display_music()
{
TH0=table2[table4[i]-1];
TL0=table3[table4[i]-1];
while(flag==0)
{
if(i<32)
{
TR0=1;
delay(57*table5[i]);
i++;
}
if(i==32) i=0;
}
}
void display_play()
{
TR0=0;
TR1=0;
yinjie();
in(table1[aa]);
out();
W1=0;;
delay(1);
W1=1;
if(aa!=13&&flag==1)
{
if(k1==0)
{
TH1=table2[7*bb+cc];
TL1=table3[7*bb+cc];
TR1=1;
while(k1==0)
{
cc=0;
display1();
}
}
if(k2==0)
{
TH1=table2[7*bb+cc];
TL1=table3[7*bb+cc];
TR1=1;
while(k2==0)
{
cc=1;
display1();
}
}
if(k3==0)
{
TH1=table2[7*bb+cc];
TL1=table3[7*bb+cc];
TR1=1;
while(k3==0)
{
cc=2;
display1();
}
}
if(k4==0)
{
TH1=table2[7*bb+cc];
TL1=table3[7*bb+cc];
TR1=1;
while(k4==0)
{
cc=3;
display1();
}
}
if(k5==0)
{
TH1=table2[7*bb+cc];
TL1=table3[7*bb+cc];
TR1=1;
while(k5==0)
{
cc=4;
display1();
}
}
if(k6==0)
{
TH1=table2[7*bb+cc];
TL1=table3[7*bb+cc];
TR1=1;
while(k6==0)
{
cc=5;
display1();
}
}
if(k7==0)
{
TH1=table2[7*bb+cc];
TL1=table3[7*bb+cc];
TR1=1;
while(k7==0)
{
cc=6;
display1();
}
}
}
}
void main()
{
init();
while(1)
{
if(flag==0) display_music();
else display_play();
}
}
void wb0() interrupt 0
{
if(k8==0)
{
delay(5);
while(k8==0);
flag=~flag;
D1=~D1;
D2=~D2;
}
}
void t0() interrupt 1
{
TR0=0;
TH0=table2[table4[i]-1];
TL0=table3[table4[i]-1];
beep=~beep;
TR0=1;
}
void t1() interrupt 3
{
TR1=0;
TH1=table2[7*bb+cc];
TL1=table3[7*bb+cc];
beep=~beep;
TR1=1;
}
实验三
连接44矩阵式键盘,实物图连接如所示,可以使用44矩阵键盘自己演奏音乐
可以实现自动播放音乐,可以播放《两只蝴蝶》《生日快乐》《爱情买卖》。需要源代码第147行进行修改,把m=music1则播放《两只蝴蝶》;改成m=music2则播放《生日快乐》;改成m=music3则播放《爱情买卖》。源代码如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit beep = P3^2;
sbit K1=P2^7;
uchar flag_en = 0;
uchar flag_i = 0;
uint TT=0;
sbit LED=P3^7;
uchar num=0;
uchar code smg_du[]={0x28,0xee,0x34,0xa4,0xe2,0xa1,0x21,0xec,0x20,0xa0,
0x60,0x23,0x39,0x26,0x31,0x71,0xbf};
uchar m,n;
uchar code T[49][2]={{0,0},
{0xF8,0x8B},{0xF8,0xF2},{0xF9,0x5B},{0xF9,0xB7},{0xFA,0x14},{0xFA,0x66},{0xFA,0xB9},{0xFB,0x03},
{0xFB,0x4A},{0xFB,0x8F},{0xFB,0xCF},{0xFC,0x0B},{0xFC,0x43},{0xFC,0x78},{0xFC,0xAB},{0xFC,0xDB},
{0xFD,0x08},{0xFD,0x33},{0xFD,0x5B},{0xFD,0x81},{0xFD,0xA5},{0xFD,0xC7},{0xFD,0xE7},{0xFE,0x05},
{0xFE,0x21},{0xFE,0x3C},{0xFE,0x55},{0xFE,0x6D},{0xFE,0x84},{0xFE,0x99},{0xFE,0xAD},{0xFE,0xC0},
{0xFE,0x02},{0xFE,0xE3},{0xFE,0xF3},{0xFF,0x02},{0xFF,0x10},{0xFF,0x1D},{0xFF,0x2A},{0xFF,0x36},
{0xFF,0x42},{0xFF,0x4C},{0xFF,0x56},{0xFF,0x60},{0xFF,0x69},{0xFF,0x71},{0xFF,0x79},{0xFF,0x81}
};
uchar code music1[][2]={{0,4},
{23,4},{21,4},{23,16},{23,4},{21,4},{23,4},{21,4},{19,16},{16,4},
{19,4},{21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{19,4},{14,24},
{23,4},{21,4},{23,16},{23,4},{21,4},{23,4},{21,4},{19,24},{16,4},
{19,4},{21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{19,4},{21,24},
{23,4},{21,4},{23,16},{23,4},{21,4},{23,4},{21,4},{19,16},{16,4},
{19,4},{21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{19,4},{14,24},
{23,4},{26,4},{26,16},{26,4},{28,4},{26,4},{23,24},{21,4},{23,4},
{21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{16,2},{19,2},{19,24},
{0,20}, {26,4},{26,4},{28,4},{31,4},{30,4},{30,4},{28,4},{23,4},{21,4},{21,4},{23,16},{0,4},
{23,4},{23,4},{26,4},{28,8},{28,12},{16,4},{23,4},{21,4}, {21,24},{23,4},{26,4},{26,4},{23,4},{26,8},{0,4},
{31,8},{30,4},{28,4},{30,4},{23,8},{0,4},{28,4},{28,4},{30,4},{28,4},{26,4},{23,4},{21,8},{23,4},{21,4},{23,4},
{26,16}, {0xFF,0xFF}};
uchar code music2[][2]={{0,4},
{17,6},{17,2},{19,8},{17,8},{22,8},{21,16},
{17,6},{17,2},{19,8},{17,8},{24,8},{22,16},
{17,6},{17,2},{29,8},{26,8},{22,8},{21,8},{19,8},
{27,6},{27,2},{26,8},{22,8},{24,8},{22,16}, {0xFF,0xFF}};
uchar code music3[][2]={{0,4},
{22,4},{22,4},{17,4},{15,4},{15,4},{17,12}, {15,4},
{15,2},{17,2},{15,4},{13,4},{13,4},{15,12},{0,4}, {20,4},{20,4},
{20,4},{17,4},{20,4},{20,4},{20,4},{17,4}, {22,4},{17,4},{17,4},{15,4},
{15,4},{17,12}, {22,4},{22,4},{17,4},{15,4},{15,4},{17,12}, {15,4},{15,2},
{17,2},{15,4},{13,4},{13,4},{15,12}, {20,4},{20,4},{20,2},{17,2},{17,4},{20,4},{20,4},{20,2},
{17,2},{17,2},{17,2}, {24,4},{20,4},{20,2},{17,2},{17,4},{20,4},{22,12}, {17,4},{22,4},{25,4},
{25,4},{17,4},{22,4},{25,8}, {24,4},{22,2},{24,2},{22,4},{20,4},{15,4},{17,12}, {15,4},{15,4},
{15,4},{10,4},{15,4},{17,4},{20,8}, {17,4},{24,4},{24,4},{20,4},{15,4},{17,12}, {17,4},{22,4},{25,4},
{25,4},{17,4},{22,4},{25,8}, {29,4},{27,2},{29,2},{27,4},{25,4},{25,4},{27,12}, {29,4},{29,2},{27,4},
{25,4},{27,6},{27,2},{25,4},{24,4}, {20,4},{20,2},{17,2},{20,4},{20,2},{22,2},{22,16}, {0xFF,0xFF}};
void delay(uchar p)
{ uchar i,j;
for(;p>0;p--)
for(i=181;i>0;i--)
for(j=181;j>0;j--);
} void pause()
{ uchar i,j;
for(i=150;i>0;i--)
for(j=150;j>0;j--); }
void delay_1ms(uint q)
{ uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
uchar key_can;
void key()
{ static uchar key_new = 0, key_l;
key_can = 20;
P2 = 0x0f;
if((P2 & 0x0f) != 0x0f)
{ delay_1ms(1);
if(((P2 & 0x0f) != 0x0f) && (key_new == 1))
{
key_new = 0; key_l = (P2 | 0xf0);
P2 = key_l;
switch(P2)
{
case 0xee: key_can = 0; m = 8; TT=0; flag_en=0;TR0 = 1; break;
case 0xde: key_can = 1; m = 9; TT=0;flag_en=0;TR0 = 1; break;
case 0xbe: key_can = 2; m = 10;TT=0;flag_en=0; TR0 = 1; break;
case 0x7e: key_can = 3; m = 11;TT=0;flag_en=0; TR0 = 1; break;
case 0xed: key_can = 4; m = 12;TT=0;flag_en=0; TR0 = 1; break;
case 0xdd: key_can = 5; m = 13;TT=0;flag_en=0; TR0 = 1; break;
case 0xbd: key_can = 6; m = 14;TT=0;flag_en=0; TR0 = 1; break;
case 0x7d: key_can = 7; m = 15;TT=0;flag_en=0; TR0 = 1; break;
case 0xeb: key_can = 8; m = 16;TT=0;flag_en=0; TR0 = 1; break;
case 0xdb: key_can = 9; m = 17;TT=0;flag_en=0; TR0 = 1; break;
case 0xbb: key_can = 10; m = 18;TT=0;flag_en=0; TR0 = 1; break;
case 0x7b: key_can = 11; m = 19;TT=0;flag_en=0; TR0 = 1; break;
case 0xe7: key_can = 12; m = 20;TT=0;flag_en=0; TR0 = 1; break;
case 0xd7: key_can = 13; m = 21;TT=0;flag_en=0; TR0 = 1; break;
case 0xb7: key_can = 14; m = 22;TT=0;flag_en=0; TR0 = 1; break;
case 0x77: key_can = 15; m = 23;TT=0;flag_en=0; TR0 = 1; break;
}
P1 = smg_du[key_can];
while(P2 != 0x0f)
P2 = 0x0f;
TR0 = 0;
}
}
else
{ P1 = 0xdf;
key_new = 1;
}
K1=1 ;
if(K1==0)
{
delay_1ms(10);
if(K1==0)
{
num=8;
flag_en ++;
flag_i = 0;
if(flag_en > 3)
{
flag_en = 0;
TR0 = 0; }
while(!K1)
{
}
}
}
}
void main()
{
P0 = P1 = P2 = P3 = 0xff;
TMOD=0x11;
EA=1;
PT1=1;
ET0=1;
TR1=1;
ET1=1;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
while(1)
{
P1 = 0xdf;
key();
if(flag_en == 1)
{ m=music1[flag_i][0];n=music1[flag_i][1];
P1 = smg_du[m % 16];
if(m==0x00)
{
TR0=0;
beep = 1;
delay(n);
flag_i++; }
else if(m==0xFF)
{
TR0=0;beep = 1;
delay(30);
flag_i=0;
flag_en = 0;
}
else if(m==music1[flag_i+1][0])
{ TR0=1;
delay(n);TR0=0;beep = 1;pause();flag_i++; }
else {TR0=1;delay(n);flag_i++;} }
else beep = 1 ;
if(flag_en == 2)
{ m=music2[flag_i][0];n=music2[flag_i][1];
P1 = smg_du[m % 16];
if(m==0x00)
{
TR0=0;
beep = 1;
delay(n);
flag_i++; }
else if(m==0xFF)
{ TR0=0;beep = 1;delay(30);flag_i=0;flag_en = 0;}
else if(m==music2[flag_i+1][0])
{TR0=1;delay(n);TR0=0;beep = 1;pause();flag_i++; }
else {TR0=1;delay(n);flag_i++;} }
else { beep = 1 ; }
if(flag_en == 3)
{ m=music3[flag_i][0];n=music3[flag_i][1];
P1 = smg_du[m % 16];
if(m==0x00)
{
TR0=0;
beep = 1;
delay(n);
flag_i++; }
else if(m==0xFF)
{ TR0=0;beep = 1;delay(30);flag_i=0;flag_en = 0;}
else if(m==music3[flag_i+1][0])
{TR0=1;delay(n);TR0=0;beep = 1;pause();flag_i++; }
else {TR0=1;delay(n);flag_i++;} }
else { beep = 1 ; } } }
void T0_int() interrupt 1
{ beep=!beep;
TH0=T[m][0];
TL0=T[m][1]; }
void T1_int() interrupt 3
{ TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(flag_en==0)
{ TT++;
LED=!LED;
if(TT>=100)
{ TT=0;
flag_en++;
} } }
实验台型号如下图所示:
大家也可以从源代码中更换简谱,来演奏别的的音乐。这里就不过多解释了。学艺不精,还请各位大佬多多批评指正,提出把宝贵的意见,不胜感激!!!
感兴趣的可以加我qq:779551378
wx:15668141627
最后希望对大家有帮助 !!1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)