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;
}
根據自己的情況稍微改改就好了