摘要介绍了一种利用定时中断为单片机编写高音准的音乐程序的方法,并给出实例程序清单。电子园51单片机学习网w9m:VmY:xh7mr
关键词单片机,中断,编程,音乐,音级,音程电子园51单片机学习网Q7Oc~A.z
采用适当的误差补偿,利用单片机定时中断的方法能在宽音域范围产生准确稳定的音频信号。本文以MCS-51单片机为例介绍单片机的音乐程序的编写,给出的程序,只须修改乐曲内容就可得到读者自己的程序。
8W|jBFGx]-x01音乐的基本知识电子园51单片机学习网4O6[`r#bG&S6w+V0`
在音乐中使用的各个固定频率的音叫音级[1]。常用符号C、D、E、F、G、A、B、c、d、e、……a1、b1、c2、d2……表示,它们对应于钢琴上的白键。两音之间音高的距离叫音程。在上述音级中,E与F、B与C之间音高的距离仅为其它相邻音级之间距离的一半,称它们之间的音程为半音音程,而称其它相邻各音之间的距离为全音音程。在这些全音音程之间又加入新的半音音级,用符号﹟C、﹟D、﹟F、﹟G、﹟A、﹟c、﹟d、﹟f、……表示,对应于钢琴上的黑键。电子园51单片机学习网8}+Xl_ n
国际上目前采用以a1=440Hz作为标准国际音高,由此推算出各音级的频率见表1。
KWva-Q Oj\T${0音持续时间的长短即时值,一般用拍数表示。休止符表示暂停发音。电子园51单片机学习网 ChUq K+T
2编程思路
8P#})v^vx\0要产生音频信号,只要算出某一音频的周期(频率的倒数),将此周期除以2即为半周期的时间,利用定时器计时此半周期时间,计时到后取反输出,重复此过程即得到此频率的声音信号。此信号从P1.7脚输出。
,O/V1qfR0p0定时器T0工作在定时方式1,改变TH0及TL0,产生不同的音频频率。必须考虑到中断响应时间的影响,尤其在高音部分,若忽略中断响应时间,会使音频频率比标准值低几十Hz,相当于1/4音程,很容易听出来,对低音部分影响不大。一般中断响应时间为3~6个机器周期,经过反复试验取5个机器周期作为校正最为恰当,表1中所给的定时初值就是考虑中断响应后的定时常数。另外,为避免T1中断可能引起杂音,应将定时器T0中断设为高优先级。这样编写出来的程序播放的音与标准音叉进行差频校音,非常准确和谐。本例中单片机晶振频率为6MHz。
*H;DH8{-f0每个音符使用两个字节。低位字节(偶地址)代表音级,00H表示不发音(休止符),01H~30H依次表示的音级为c、﹟c、d、﹟d、e、f、……a3、﹟a3、b3,详见表1。高位字节(奇地址)代表音符的时值(拍数),00H~0FH依次表示拍数为1/8拍(0.10s)~8拍(6.40s),见表2。乐曲的结束标志是两个字节:00H,0FH。电子园51单片机学习网z9CM6f}4j%G
定时器T1工作在定时方式1,定时时间为0.10s左右,作为音符节拍的最小时间单位,即1/8拍,该时间要求不必很准确,该时间越短,音乐播放节奏就越快。时间取0.10s时,定时常数取为3CB0H。即TH1=3CH,TL1=0B0H。其它的音符节拍都是1/8拍的整数倍,借助软件计数,允许中断的次数就是倍数。例如,要得到1拍的延时,只要中断8次即可。电子园51单片机学习网 I9}4E#Z0n_e0eV&j i
要编写的乐谱按要求以音符字节数据表的形式存放在程序中,改变乐曲就是通过改变该数据表的内容来实现的。
diOu4Z9s|)@k|O0主程序的任务是按顺序读取数据表中的字节,根据情况调用音级子程序和音长子程序,启动定时器T0;根据定时器T1应中断的次数,启动定时器T1。数据表读完后,根据所设置的循环演奏次数决定是否结束程序。音级子程序的任务是取出字节中的音级部分,分析TH0和TL0中应送入何值,送给寄存器R3、R2。音长子程序的任务是取出字节中的音长部分,分析确定定时器T1应中断的次数,次数送寄存器R4中,同时启动定时器T1,直到完成所需拍数。电子园51单片机学习网Iyqx!\"wHG
定时器T0的中断服务程序任务是取反P1.7输出产生方波,重新为TH0,TL0送初值。电子园51单片机学习网t$a-w"z.P/Hb.E
定时器T1的中断服务程序任务是:判断节拍数完成否,关闭定时器T0、T1中断。
.h k5m.j@/_V0当乐曲较长时(超过254个字节),数据表指针溢出,应及时修改基址寄存器DPTR内容,即数据表的表头指针。电子园51单片机学习网|wE)x.rM
例如,C=1时音节: 用音符(包含音级和音长)字节表示就为:11H,02H,14H,01H,16H,01H,19H,02H,16H,02H,16H,08H,16H,0AH,00H,04H。其中11H,02H中的11H表示音3(mi),02H表示节拍为半拍,即。其余类推。电子园51单片机学习网.}8CD3Kd,}%G+rP
3播放方法:
m {6q*v&uP*{0P1.7输出的音频信号不能直接驱动普通喇叭,可驱动高阻抗耳机发声或者有源音箱发音。也可自制音频放大电路驱动喇叭发音。电子园51单片机学习网E)HpW s2Lmlo
\i$tGpw7I0
表1各音的频率、定时初值、字节字符
oim7}0A;r0表2拍数对应的字节字符电子园51单片机学习网$? DY#K%l-mU
'H-q1R,mpGA0 | 1/8 9a${3G$}.F Z~0 | 1/4电子园51单片机学习网9[(GiDR eB]pge | 1/2电子园51单片机学习网R1q dka!R%Aw | 3/4电子园51单片机学习网'Z/H r?yT#| | 1 ,c3{z*od n0 | 5/4电子园51单片机学习网3Xoh$[~?pM7j | 3/2电子园51单片机学习网9k;UX*TU | 7/4 N`O,|!a*U9S E0 |
字符电子园51单片机学习网,S2ag5}XO)D okI q%T$w ] | 00H电子园51单片机学习网E:\ W'QY!k a(r | 01H Mv5]0a#?3M-OP0 | 02H %YQ)l(hm}7Tq0 | 03H电子园51单片机学习网9P6d)rLqC&gV9eD | 04H %W,`*_)QV,km0 | 05H j? Y2Q `3z.q0 | 06H #~z`N4h M3\U5sJ0 | 07H 0B G`+V-MO Td,{T0 |
电子园51单片机学习网o `C!e4XL:r | 电子园51单片机学习网bf~"J1Ut L6K/b)Ae | 电子园51单片机学习网sl/h}0{8q | 电子园51单片机学习网(enH)a.U"ZC | 电子园51单片机学习网JJ-?-dL | o Q4e^%om {Bv/l0 | /\ } @iJ"u0 | l Py"_vK0 | 电子园51单片机学习网"xU mB"X C3k q`4Vj"| |
拍数电子园51单片机学习网1E&u!`$E1~,R P_!Tk*Q(u | 2电子园51单片机学习网 U1nw]^6g8K*R | 5/2电子园51单片机学习网3b2pvF?oZ | 3电子园51单片机学习网B%r-Y*_"K n4w5UaA | 7/2电子园51单片机学习网'M"JsrJ Z*]f | 4 0P`/X/E o6T'P;MW0 | 5电子园51单片机学习网0^0T vZ3|ZH | 6 l+Gz1o#[ZUK0 | 8 0W3^@.]&`9vX0 |
字符 S'xq"[K3X6rp0 | 08H电子园51单片机学习网HV`/nf | 09H电子园51单片机学习网3Y nQ5Z9w+p9V | 0AH l4NR0mxvR;` X/g0 | 0BH电子园51单片机学习网9JS IUa5t | 0CH电子园51单片机学习网8H:_;Ud[| I8lf2D | 0DH电子园51单片机学习网!Ts/VI"j S` | 0EH电子园51单片机学习网\$`8ws9i | 0FH D4{L/Gu0 |
电子园51单片机学习网8w"Y`[j4\:k
9x~ d'Up9Mw`,z0
电子园51单片机学习网'_M ^0SR)G x
4程序清单实例。下面以《一路平安》为例,给出程序清单。本程序使用的寄存器有R1至R7,40H,41H,42H单元。标号TAB1处为T0的定时常数数据表。电子园51单片机学习网 `wJM$[7qm5?{$M
ORG0000H
6vVAI7j,O D0AJMP MAIN电子园51单片机学习网\)a$gh1HO`&M
ORG000BH
F$A d}6I/v0MOV TL0,R2
R5e'PF,LQf}0MOV TH0,R3
EI*N]c0CPL P1.7
5W i0o-I%h6f'yxY0RETI电子园51单片机学习网#iP["HO f;V&Mx
ORG001BH电子园51单片机学习网$JQ2c;s b6szX:p/t
DJNZ R4,GOON;中断次数不够,继续。电子园51单片机学习网 Yo7U+u4A1j+R|@
MOV IE,#80H ;持续时间到,该音符停止。
&Y3M'k4G xi2Y{0SJMP RE01
jSwc r?:KJ0GOON: MOV TL1,40H
1w,[/Q [)M6j4|4{9K0MOV TH1,41H
)I[9v)j1fk/F:Ijz0RE01: RETI电子园51单片机学习网CN*lq*]5H pL
ORG0100H
k(q#wyA,d A0MAIN: MOV R5,#02H ;乐曲循环演奏次数电子园51单片机学习网X8M;TJ"w H b"G
LOOP: MOV TMOD,#11H
iz+x{h |~0MOV IP,#02H
#['nC2x9\*Z0]} TA7Y0MOV 41H,#4CH; T1初值放在41H,40H单元电子园51单片机学习网 ^iM5s``?#dv
MOV 40H,#0B0H ;值越大,演奏越快电子园51单片机学习网w"G9um vce1U8`;|(s
SETB EA
(` [5^o(?"O$u0CLR A电子园51单片机学习网j$UVMc;o g
MOV R1,A ;R1作为音符指针
)O$b a$y0A[2{ Rr0MOV DPTR,#0300H;乐曲数据表的表头电子园51单片机学习网{BI#{E;V
L1: MOVC A,@A+DPTR
+{4Z7Yx8q1fa&D0INC R1 ;指向音符的拍数字节电子园51单片机学习网-VVO Y.@~
MOV R6,A ;音级字节暂存入R6
+R+GpE Q)vi0JZ L3电子园51单片机学习网gu'J.tHMjm"M*U
ACALL TONE电子园51单片机学习网 Y\YP0jX
MOV TH0,R3
&?$\k.Ry6UN0MOV TL0,R2电子园51单片机学习网L$L"T,e\g}t
SETB TR0电子园51单片机学习网(z'N'^:n4\:@0~
SETB ET0
4w? YV1sb#iN[F0MOV A,R1电子园51单片机学习网mE6\ z O%I:cj
MOVC A,@A+DPTR
@ ^|H`1oE ?Z0INC R1
I D5Z)]/d'uqq.ES0CJNE R1,#00H,L2
r)u%Y"`D(Zj0MOV DPTR,#0400H;表指针溢出,更改表头电子园51单片机学习网~R$?fpe$j
L2: ACALL LONG ;
]0`b&P!T i0~0MOV A,R1
3dy Nbg2f0AJMP L1 ;电子园51单片机学习网^}%n%}`(w
L3: MOV A,R1
3ih TL~m ^Ust$mU(Z0MOVC A,@A+DPTR电子园51单片机学习网.cb p1hN-e:N.ub:L-I
MOV R7,A
-jr7]`;pVgk0INC R1
0re6V)bx I0CJNE R1,#00H,L4电子园51单片机学习网z-A~.]_7M:t` h
MOV DPTR,#0400H
8?Hx.{)D4G-?0L4: ACALL LONG ;电子园51单片机学习网;T7X,{w|X%E
MOV A,R1
9b ^ pG6RyXp0CJNE R7,#0FH,L1电子园51单片机学习网SYO|0]#x4_
END0: MOV IE,#00H
@)Qa {X0H4v'd0MOV TCON,#00H
N@n/c C.p0MOV TMOD,#00H电子园51单片机学习网?2\,bLe8A;Q+r
DJNZ R5,LOOP电子园51单片机学习网,Bz/I&_0I d w(gO V
AJMP $电子园51单片机学习网m[eQ]b
ORG0160H
WEH2^m5rCn0Y%K0TONE: MOV A,R6 ;取出音级字节
V bsRz&I2e;W/L2D0RL A ;乘2,定时常数为双字节电子园51单片机学习网 h t5g/UOkJ.kn
MOV 42H,A ;暂存入42H单元
]}\l'mm%M#N0ADD A,#05H ;距离数表有7个字节,使查表正确电子园51单片机学习网O0LEbf8P
MOVC A,@A+PC;取出TH0电子园51单片机学习网.`Uop`(YN5@
MOV R3,A
V?^C)e^ v,xzI(eF0MOV A,42H
b(ad[A#Q0INC A
n3@(Z*D"n0MOVC A,@A+PC;取出TL0
"VjmSIZjqfI*`0MOV R2,A ;
w4j%O"Or&t0RET
!N*] D7I1H0TAB1: DB 0F8H,8EH,0F8H,0F9H,0F9H,5EH
,["UP:u{RZ0DB 0F9H,0BEH,0FAH,18H,0FAH,6DH
}:uEPUw0DB 0FAH,0BEH,0FBH,09H,0FBH,51H
Zv6K*}w9uy0DB 0FBH,95H,0FBH,0D4H,0FCH,11H
;[.WXJgN0DB 0FCH,49H,0FCH,7FH,0FCH,0B2H
!P DJyC#e |"W0DB 0FCH,0E1H,0FDH,0FH,0FDH,39H
a0P2dY'e4z1J0DB 0FDH,61H,0FDH,87H,0FDH,0ABH
9i,Yg0Rm3ig&l0DB 0FDH,0CDH,0FDH,0EDH,0FEH,0BH
kNr1z _0DB 0FEH,27H,0FEH,42H,0FEH,5BH
bx@Xr5T[3i0DB 0FEH,73H,0FEH,8AH,0FEH,9FH
"Rq q oi"x;U0DB 0FEH,0B3H,0FEH,0C6H,0FEH,0D8H
FEIL6?;i"Z0DB 0FEH,0E9H,0FEH,0F9H,0FFH,08H电子园51单片机学习网(iHJm|3t)JuF8o
DB 0FFH,16H,0FFH,24H,0FFH,30H
,b^1O2vX RVN.y0DB 0FFH,3CH,0FFH,47H,0FFH,52H电子园51单片机学习网 QFj0]8P(kf,vS3I A
DB 0FFH,5CH,0FFH,66H,0FFH,6FH
{p~ R![s0DB 0FFH,77H,0FFH,7FH,0FFH,86H电子园51单片机学习网/p.[4g"xppF#O6k g
ORG0200H ;音长子程序
.bO B ?$\3|I0LONG: ADD A,#0FH ;使查表正确
e%j8X\+Am.g0MOVC A,@A+PC;取出定时器T1应中断的次数
N\3\9r.P}(?b0MOV R4,A ;T1应中断的次数存入R4中
-Q"h/[4EVk8P0MOV TH1,41H电子园51单片机学习网*H/ej#F A
MOV TL1,40H电子园51单片机学习网7H#i%Vt'q ^P;p
SETB TR1电子园51单片机学习网.|'_5D lO
SETB ET1电子园51单片机学习网A%d,Q0t5e3z
CJNE R4,#00H,$
bc@S7CK0RET ;音长子程序结束
y_D#UhUu-u8J0TAB2: DB 01,02,04,06 ;应中断的次数
c0N&F(P.B1K)[4V0DB 08,10,12,14电子园51单片机学习网2s w^f W"b
DB 16,20,24,28电子园51单片机学习网Az2h`ZY.gD
DB 32,40,48,64
e-qx]EGI0ORG0300H ;乐曲字节数据表电子园51单片机学习网qN*u*P0TxYwR
TAB: DB 00H,04H,00H,04H,08H,04H,0DH,08H,0DH,04H电子园51单片机学习网'h egK\"h
DB 0DH,08H,11H,04H,0FH,08H,0DH,04H
5K5Uih7Rg0DB 0FH,08H,11H,02H,0FH,02H,0DH,08H,0DH,04H电子园51单片机学习网|7?t @&qq+v
DB 11H,08H,14H,04H,16H,0DH,16H,04H电子园51单片机学习网}^r QFRWca
DB 14H,08H,11H,04H,11H,08H,0DH,04H电子园51单片机学习网2]|(q[C^W)J
DB 0FH,08H,0DH,04H,0FH,08H,11H,02H,0FH,02H
}K3u(OIC5Li0DB 0DH,08H,0AH,04H,0AH,08H,08H,04H电子园51单片机学习网 _*t'v"Q"k%yw
DB 0DH,0CH,00H,04H,16H,04H,14H,08H,11H,04H
l-Z|3^V3[si.y0DB 11H,08H,0DH,04H,0FH,08H,0DH,04H
o eY_w?+Q$nAy ih0DB 0FH,08H,16H,04H,14H,08H,11H,04H电子园51单片机学习网*wm.[/^,Ge6B
DB 11H,08H,14H,04H,16H,0DH,19H,04H
aE Le&m0DB 14H,08H,11H,04H,11H,08H,0DH,04H电子园51单片机学习网+ruf/q7Ym ]U
DB 0FH,08H,0DH,04H,0FH,08H,11H,02H,0FH,02H电子园51单片机学习网'j1Tf]~'R"F
DB 0DH,08H,0AH,04H,0AH,08H,08H,04H电子园51单片机学习网#cJ!g%Q:jyU
DB 0DH,0CH,00H,04H,00H,04H
bG`jma7P j*hn0DB 00H,0FH ;结束标记
"f+W EXa f0END
;ji{|!lO B``:@En0参考文献:电子园51单片机学习网/OXx1P6k&E
[1]朱福渠,周瑾.电子乐器及其电路原理[M].北京:科学普及出版社,1987.6-12
,{(o"B$n+Tm0[2]周航慈.单片机应用程序设计技术(修订版)[M].北京:北京:北京航空航天大学出版社,2002.47电子园51单片机学习网"jd Z5sNl
文章评论(0条评论)
登录后参与讨论