尝试使命
(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. 措施框图

图4.22.2
6. 汇编源措施 keybuf equ 30h sth0 equ 31h stl0 equ 32h temp equ 33h org 00h ljmp start org 0bh ljmp int_t0 start: mov tmod,#01h setb et0 setb ea wait: mov p3,#0ffh clr p3.4 mov a,p3 anl a,#0fh xrl a,#0fh jz nokey1 lcall dely10ms mov a,p3 anl a,#0fh xrl a,#0fh jz nokey1 mov a,p3 anl a,#0fh cjne a,#0eh,nk1 mov keybuf,#0 ljmp dk1 nk1: cjne a,#0dh,nk2 mov keybuf,#1 ljmp dk1 nk2: cjne a,#0bh,nk3 mov keybuf,#2 ljmp dk1 nk3: cjne a,#07h,nk4 mov keybuf,#3 ljmp dk1 nk4: nop dk1: mov a,keybuf mov dptr,#table movc a,@a+dptr mov p0,a mov a,keybuf mov b,#2 mul ab mov temp,a mov dptr,#table1 movc a,@a+dptr mov sth0,a mov th0,a inc temp mov a,temp movc a,@a+dptr mov stl0,a mov tl0,a setb tr0
dk1a: mov a,p3 anl a,#0fh xrl a,#0fh jnz dk1a clr tr0 nokey1: mov p3,#0ffh clr p3.5 mov a,p3 anl a,#0fh xrl a,#0fh jz nokey2 lcall dely10ms mov a,p3 anl a,#0fh xrl a,#0fh jz nokey2 mov a,p3 anl a,#0fh cjne a,#0eh,nk5 mov keybuf,#4 ljmp dk2 nk5: cjne a,#0dh,nk6 mov keybuf,#5 ljmp dk2 nk6: cjne a,#0bh,nk7 mov keybuf,#6 ljmp dk2 nk7: cjne a,#07h,nk8 mov keybuf,#7 ljmp dk2 nk8: nop dk2: mov a,keybuf mov dptr,#table movc a,@a+dptr mov p0,a mov a,keybuf mov b,#2 mul ab mov temp,a mov dptr,#table1 movc a,@a+dptr mov sth0,a mov th0,a inc temp mov a,temp movc a,@a+dptr mov stl0,a mov tl0,a setb tr0
dk2a: mov a,p3 anl a,#0fh xrl a,#0fh jnz dk2a clr tr0 nokey2: mov p3,#0ffh clr p3.6 mov a,p3 anl a,#0fh xrl a,#0fh jz nokey3 lcall dely10ms mov a,p3 anl a,#0fh xrl a,#0fh jz nokey3 mov a,p3 anl a,#0fh cjne a,#0eh,nk9 mov keybuf,#8 ljmp dk3 nk9: cjne a,#0dh,nk10 mov keybuf,#9 ljmp dk3 nk10: cjne a,#0bh,nk11 mov keybuf,#10 ljmp dk3 nk11: cjne a,#07h,nk12 mov keybuf,#11 ljmp dk3 nk12: nop dk3: mov a,keybuf mov dptr,#table movc a,@a+dptr mov p0,a mov a,keybuf mov b,#2 mul ab mov temp,a mov dptr,#table1 movc a,@a+dptr mov sth0,a mov th0,a inc temp mov a,temp movc a,@a+dptr mov stl0,a mov tl0,a setb tr0
dk3a: mov a,p3 anl a,#0fh xrl a,#0fh jnz dk3a clr tr0 nokey3: mov p3,#0ffh clr p3.7 mov a,p3 anl a,#0fh xrl a,#0fh jz nokey4 lcall dely10ms mov a,p3 anl a,#0fh xrl a,#0fh jz nokey4 mov a,p3 anl a,#0fh cjne a,#0eh,nk13 mov keybuf,#12 ljmp dk4 nk13: cjne a,#0dh,nk14 mov keybuf,#13 ljmp dk4 nk14: cjne a,#0bh,nk15 mov keybuf,#14 ljmp dk4 nk15: cjne a,#07h,nk16 mov keybuf,#15 ljmp dk4 nk16: nop dk4: mov a,keybuf mov dptr,#table movc a,@a+dptr mov p0,a mov a,keybuf mov b,#2 mul ab mov temp,a mov dptr,#table1 movc a,@a+dptr mov sth0,a mov th0,a inc temp mov a,temp movc a,@a+dptr mov stl0,a mov tl0,a setb tr0
dk4a: mov a,p3 anl a,#0fh xrl a,#0fh jnz dk4a clr tr0 nokey4: ljmp wait dely10ms: mov r6,#10 d1: mov r7,#248 djnz r7,$ djnz r6,d1 ret int_t0: mov th0,sth0 mov tl0,stl0 cpl p1.0 reti table: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h db 7fh,6fh,77h,7ch,39h,5eh,79h,71h
table1: dw 64021,64103,64260,64400 dw 64524,64580,64684,64777 dw 64820,64898,64968,65030 dw 65058,65110,65157,65178 end 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; }
(责任编辑:admin) |