A. 单片机电子琴代码
;电子琴
;P2口外接4*4键盘
ORG 0000H ;主程序起始
LJMP MAIN ;跳到MAIN主程序
ORG 000BH ;T0中断起始
LJMP TT0 ;跳到T0中断
MAIN:MOV TMOD,#01H ;设T0工作在方式1
MOV IE,#82H ;中断使能
SETB TR0 ;启动T0
W1:LCALL KEY ;调用KEY,是否有键盘按下
CLR EA ;中断屏蔽
JB F0,W1 ;没有按则F0=1,否则F0=1
MOV A,22H ;按下则取码指针存址
RL A ;乘2
MOV DPTR,#TABLE ;
MOVC A,@A+DPTR ;至TABLE取码,取T
MOV TH0,A ;取到的高位字节存入TH
MOV 21H,A ;取到的高位字节存入21H
MOV A,22H ;再载入取到的音符码
RL A ;乘2
INC A ;加1
MOVC A,@A+DPTR ;至TABLE1取低位数值
MOV TL0,A ;取到的低位字节存入TL0
MOV 20H,A ;取到的低位字节存入20H
W2:LCALL KEY ;调用KEY,是否有键按下
SETB EA ;中断使能
JB F0,W1 ;有按下否?
JMP W2 ;有则跳到W2
KEY:SETB F0 ;设F0=1
MOV R3,#0F7H;扫描初值P23=0
MOV R1,#00H ;取码指针初值
W3:MOV A,R3 ;载入扫描指针
MOV P2,A ;输出至P2,扫描P23-P20
MOV A,P2 ;读入P2
CLR C ;
CPL C ;令C=1
MOV R5,#04H ;检测(P27-P24)
W4:RLC A ;右移一位(P27-P24)
JNC KEYIN ;检测行C=0,表按下
INC R1 ;没被按下则取码指针加1
DJNZ R5,W4 ;4列检测完毕了?
MOV A,R3 ;载入扫描指针
CLR C ;
CPL C ;令C=1
RRC A ;扫下一行,即下行为0
MOV R3,A ;存回R3扫描指针寄存器
JC W3 ;C=0表扫完
RET ;
KEYIN:MOV 22H,R1 ;取码指针存入22H地址
CLR F0 ;令F0=0
RET
TT0:PUSH ACC ;将A值存入堆栈
PUSH PSW ;将PSW值存入堆栈
MOV TL0,20H ;重新设计计数器
MOV TH0,21H ;
CPL P1.0 ;将P1.0反相
POP PSW ;至堆栈取回PSW值
POP ACC ;至堆栈取回A值
RETI ;返回主程序
TABLE:DW 64021,64103,64260,64400 ;.3
DW 64524,64580,64684,64777 ;.7
DW 64820,64898,64968,65030 ;4
DW 65058,65110,65157,65178 ;1.
B. 用单片机实现8个按键的简单电子琴
简单的电子琴仿真实例,可以参考一下。
C. 单片机电子琴演奏
八键电子琴.hex:
:
:
:
:
:
:
:
:
:
:
:03000B000200B739
:0900B70085098C850A8AB2B73272
:030000000200AB50
:
:00000001FF
八键触摸电子琴.hex:
:
:
:
:
:
:
:
:
:
:
:
:03000B000200C52B
:0900C50085098C850A8AB2B73264
:030000000200B942
:
:00000001FF
老鼠爱大米.hex:
:03000000020014E7
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:00000001FF
图太大,告诉我邮箱,我发你。
D. 单片机做电子琴用蜂鸣器和扬声器有什么区别哪个好
嗡鸣器声音比较单调~有点刺耳……话说本来就是报警什么的……
但是扬声器声音比较小……用运放推比较好~
再者,扬声器发出方波的话听起来和嗡鸣器差不多……如果有DAC的话用运放推一个扬声器不错~否则直接嗡鸣器~
E. 单片机电子琴
每个音调都有对应的频率,这个频率是不变的,我们可以通过设置定时器的初值来达到这个频率。具体初值是多少,得根据你的晶体振荡器频率和分频系数来确定。
F. 单片机电子琴的发声原理
简单点儿用IO口输出不同频率的方波给喇叭就行
G. 单片机电子琴的工作原理
众所周知,声音是周围空气的震动,音调取决于震动的频率,频率越高音调越高。
电子琴按下不同的琴键就会发出不同音调的声音,其实就是产生不同频率的震动。
单片机电子琴说白了就是利用单片机产生不同频率的电压波形,推动扬声器或蜂鸣器来发出不同音调的声音。
假设电子琴有八个音阶,就对应8个不同的频率,频率越高音调就越高。单片机很容易输出方波信号,那么只要让它产生不同频率的方波就可以了,然后用这个方波信号驱动扬声器就可以了。单片机的按键可以模拟琴键,按下不同的按键就对应不同的频率的方波,就能发出不同频率的声音了。
H. 基于51单片机的电子琴需要买什么
单片机,电阻,电容,晶振,三级管,喇叭,按键,线材等还有电源
I. 单片机简易电子琴程序
22. 电子琴
1. 实验任务
(1. 由4X4组成16个按钮矩阵,设计成16个音。
(2. 可随意弹奏想要表达的音乐。
2. 电路原理图
图4.22.1
3. 系统板硬件连线
(1. 把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上;
(2. 把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;
4. 相关程序内容
(1. 4X4行列式键盘识别;
(2. 音乐产生的方法;
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。现在以单片机12MHZ晶振为例,例出高中低音符与单片机计数T0相关的计数值如下表所示
音符 频率(HZ) 简谱码(T值) 音符 频率(HZ) 简谱码(T值)
低1 DO 262 63628 # 4 FA# 740 64860
#1 DO# 277 63731 中 5 SO 784 64898
低2 RE 294 63835 # 5 SO# 831 64934
#2 RE# 311 63928 中 6 LA 880 64968
低 3 M 330 64021 # 6 932 64994
低 4 FA 349 64103 中 7 SI 988 65030
# 4 FA# 370 64185 高 1 DO 1046 65058
低 5 SO 392 64260 # 1 DO# 1109 65085
# 5 SO# 415 64331 高 2 RE 1175 65110
低 6 LA 440 64400 # 2 RE# 1245 65134
# 6 466 64463 高 3 M 1318 65157
低 7 SI 494 64524 高 4 FA 1397 65178
中 1 DO 523 64580 # 4 FA# 1480 65198
# 1 DO# 554 64633 高 5 SO 1568 65217
中 2 RE 587 64684 # 5 SO# 1661 65235
# 2 RE# 622 64732 高 6 LA 1760 65252
中 3 M 659 64777 # 6 1865 65268
中 4 FA 698 64820 高 7 SI 1967 65283
下面我们要为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据
低音0-19之间,中音在20-39之间,高音在40-59之间
TABLE: DW 0,63628,63835,64021,64103,64260,64400,64524,0,0
DW 0,63731,63928,0,64185,64331,64463,0,0,0
DW 0,64580,64684,64777,64820,64898,64968,65030,0,0
DW 0,64633,64732,0,64860,64934,64994,0,0,0
DW 0,65058,65110,65157,65178,65217,65252,65283,0,0
DW 0,65085,65134,0,65198,65235,65268,0,0,0
DW 0
2、音乐的音拍,一个节拍为单位(C调)
曲调值 DELAY 曲调值 DELAY
调4/4 125ms 调4/4 62ms
调3/4 187ms 调3/4 94ms
调2/4 250ms 调2/4 125ms
对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。
下面就用AT89S51单片机产生一首“生日快乐”歌曲来说明单片机如何产生的。
在这个程序中用到了两个定时/计数器来完成的。其中T0用来产生音符频率,T1用来产生音拍。
5. 程序框图
贴不了.
7. C语言源程序
#include <AT89X51.H>
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
unsigned char temp;
unsigned char key;
unsigned char i,j;
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 main(void)
{
TMOD=0x01;
ET0=1;
EA=1;
while(1)
{
P3=0xff;
P3_4=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
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=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
TR0=0;
}
}
P3=0xff;
P3_5=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
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=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
TR0=0;
}
}
P3=0xff;
P3_6=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
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=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
TR0=0;
}
}
P3=0xff;
P3_7=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
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=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
TR0=0;
}
}
}
}
void t0(void) interrupt 1 using 0
{
TH0=STH0;
TL0=STL0;
P1_0=~P1_0;
}
根据自己的情况稍微改改就好了