|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
利用单片机(或单板机)奏乐大概是无线电爱好者感兴趣的问题之一。本文从单片机的基本发间实验出发,谈谈音乐程序的设计原理,并给出具体实例,以供参考。# C! d5 d8 E3 ?* W1 E2 A
单片机的基本发音实验
, r6 `; ]$ W3 I! E+ ?0 o- D我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单处机某个口线的“高”电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调。
% r. m5 X2 o6 W. D) ^. E7 h# W例如,要产生200HZ的音频信号,按图1接入喇叭(若属临时实验,也可将喇叭直接接在P1口线上),实验程序为:
# f8 [' i' e! L, a: P U9 t4 I: q其中子程序DEL为延时子程序,当R3为1时,延时时间约为20us,R3中存放延时常数,对200HZ音频,其周期为1/200秒,即5ms。这样,当P1.4的高电平或低电平的持续时间为2.5ms,即R3的时间常数取2500/20=125(7DH)时,就能发出200HZ的音调。将上述程序键入学习机,并持续修改R3的常数能感到音调的变化。乐曲中,每一音符对应着确定的频率,表1给出C调时各音符频率及其对应的时间常数。读者能根据表1所供给的常数,将其16进制代码送入R3,反复练习体会。根据表1能奏出音符。仅这还不够,要准确奏出一首曲子,必须准确地控制乐曲节奏,即一音符的持续时间。
) s2 j# o3 X) z音符的节拍我们能用定时器T0来控制,送入不一样的初值,就能产生不一样的定时时间。便如某歌曲的节奏为每分钟94拍,即一拍为0.64秒。其它节拍与时间的对应关系见表2。# n' Z/ X2 ^. F% G7 i
但时,由于T0的最大定时时间只能为131毫秒,因此不可能直接用改变T0的时间初值来实现不一样节拍。我们能用T0来产生10毫秒的时间基准,然后设置一个中断计数器,通过判别中断计数器的值来控制节拍时间的长短。表2中也给出了各种节拍所对应的时间常数。例如对1/4拍音符,定时时间为0.16秒,对应的时间常数为16(即10H);对3拍音符,定时时间为1.92秒,对应时间长数为192(即C0H)。, W6 D+ p: n, Y, x" d, j
我们将每一音符的时间常数和其对应的节拍常数作为一组,按次序将乐曲中的所有常数排列成一个表,然后由查表程序依次取出,产生音符并控制节奏,就能实现演奏效果。此外,结束符和体止符能分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生对应的停顿效果。为了产生手弹的节奏感,在某些音符(例如两个相同音符)音插入一个时间单位的频率略有不一样的音符。" p: z i# G& \# [" L' K# B
下面给出程序序清单,可直接在TD-III型学习机上演奏,对其它不一样型号的学习机,只需对应地改变一下地址即可。本程序演奏的是民歌“八月桂花遍地开”,C调,节奏为94拍/分。读者也能自行找出一首歌,按表1和表2给定的常数,将乐曲翻译成码表输入机器,而程序不变。本实验办法简便,即使不懂音乐的人,将一首陌生的曲子翻译成代码也是易事,和着机器的演奏学唱一首歌曲,其趣味无穷。
, E \2 i) ^. j5 }5 B/ E程序清单(略,请参看源程序的说明)。" |' o) F' ?" F6 M1 q
程序框图如图2所示。
% F- h) A8 n) K 5 V1 l d9 j' ?8 A+ u U+ ]7 ~
<单片机音乐程序的设计图>$ H. P( Q, b6 ^% Y( a3 T4 C& C. q
3 }) }! \ m/ e% ^' F; F
硬件连接说明:9 g0 j% f- u: W% O- J5 f- f: i
随便找一个仿真机或者什么单片机实验板,只要能工作的就行,将程序输入,运行,然后找个音箱(你计算机旁边应当就有一对吧)拨出插头,插头的前端接在P1。0上,后面部分找根线接单片机的地,就应当有声了,然后怎么改进硬件连接就是你的事了。。。。
: `# a* o( h3 X" n" H* g音乐程序汇编代码代码1 -------------Voice.asm--------------------------7 N5 X( p j0 v m
ORG 0000H
8 N: i7 v) b' Q6 d- ?" R4 s LJMP START
' [+ g7 N% a5 H ORG 000BH. {6 \/ d8 ~! }9 C
INC 20H ;中断服务,中断计数器加13 T7 S/ A! T& @# d
MOV TH0,#0D8H, @1 W& S0 e# T0 k+ H8 d# O% C
MOV TL0,#0EFH ;12M晶振,形成10毫秒中断* V$ k4 `* C4 y' e0 f5 M6 a
RETI0 b& H& _& C8 h9 U$ d
START: 8 L2 X* R( s% d/ R8 c) \+ c
MOV SP,#50H3 T0 _* B2 R+ |( V- X6 w: C
MOV TH0,#0D8H
* Z8 Q, [; s4 y% L, n% x8 A MOV TL0,#0EFH' A& r: a6 S0 A2 Y
MOV TMOD,#01H0 m. f/ d5 M. _' H
MOV IE,#82H
- X8 N' n7 h' }) H6 c v8 tMUSIC0:
6 x5 M3 l8 q# _; s9 A, V3 _) e9 c" e NOP$ l' I5 c2 C% L. i0 j
MOV DPTR,#DAT ;表头地址送DPTR
* ^2 k' z0 p o8 A1 Y) n MOV 20H,#00H ;中断计数器清0" V2 ~+ N" d5 e ~. e; {% i
MOV B,#00H ;表序号清08 L8 p0 o# }+ U" b
MUSIC1:/ |1 {3 z' k0 ^4 [/ n; y& D' g
NOP" E/ T5 J: A( k1 s( h& O- Q" \7 R2 O
CLR A* r, g1 E% p. f |
MOVC A,@A+DPTR ;查表取代码
/ [" Q$ b) t" q JZ END0 ;是00H,则结束
3 I" b9 N7 g6 N CJNE A,#0FFH,MUSIC5. Y1 d$ Y# m2 B8 w/ Q8 H. q
LJMP MUSIC3) ^ B- L7 w/ [" l4 }. O. z9 z6 z
MUSIC5:/ ?5 _8 z1 |7 ?; f
NOP
) J6 S8 O7 L& R* n7 B: [ MOV R6,A
* U2 V5 K$ `) I z/ f INC DPTR
7 R' a8 Q2 k2 E- y! C MOV A,B& L2 G0 \; @3 }, w
MOVC A,@A+DPTR ;取节拍代码送R75 j5 k$ [+ J; v" V+ N. j: x6 Q
MOV R7,A
, s: |9 i# o. g; l# J SETB TR0 ;启动计数
4 b- o4 ?4 P* K. K$ G% qMUSIC2:
4 }$ S3 ], c N* o9 \- a NOP) ]0 W5 L. Y# F
CPL P1.0
$ S7 I5 @. v* B$ A MOV A,R6; M$ B5 S3 K' B1 K4 t' z% R
MOV R3,A
6 C: z; L" [9 A LCALL DEL' I1 V$ N* p; y8 d
MOV A,R7
4 S0 v" d6 n5 W* c CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否?, l: Z7 B# V6 }% ~9 [! H* e' y6 Z
;不等,则继续循环
8 H' M1 l4 q. U) B# l/ [! V MOV 20H,#00H ;等于,则取下一代码
# B4 }7 ~. Q: y+ j( B INC DPTR) v" E( B# a: }
; INC B4 J' C5 D u! @) F6 {
LJMP MUSIC1, Y7 s: |# h$ ]! t+ @5 I
MUSIC3:) ^9 T( V: L: B9 I$ {+ d
NOP
7 s- o @/ X1 N, o( h w# m CLR TR0 ;休止100毫秒) R- W9 x# q7 w4 C# Z1 S
MOV R2,#0DH" R9 O F5 [ R- ~8 \0 }
MUSIC4:* H: ?: K& G( }, M" f0 V7 e
NOP9 x5 H1 C- w+ S+ Q
MOV R3,#0FFH
: u5 |, M/ l% ~# {* g6 l# f LCALL DEL) s& r: J. p8 W% `$ x. Z. \
DJNZ R2,MUSIC4
5 M3 @) f( o- K+ V INC DPTR
4 y( m2 B- w8 ~, H$ {) P LJMP MUSIC1" Q% R' [) G" S. O7 ~
END0:
- F4 [6 V+ z% j% Q3 S NOP2 ^+ D: Z! c# z, j
MOV R2,#64H ;歌曲结束,延时1秒后继续
, k$ W. D% X. FMUSIC6:
" l9 J( O5 I: z5 G. D MOV R3,#00H) D J$ @" }- S7 i* v- Y
LCALL DEL
% |' B, z* ^ r2 T DJNZ R2,MUSIC64 m1 z" H$ D& X5 W6 \
LJMP MUSIC0' L# X8 h, S- O2 Z/ H" w
DEL:
3 J) E' i: s) L h# a' y3 j NOP' @( `4 m1 `+ y0 ^ e, _- V/ A
DEL3: ' ` g$ P2 [$ _' x) B3 p
MOV R4,#02H6 D5 u% N5 Q& }3 {8 |
DEL4:
[9 e9 `2 a8 P1 @9 C- E& c0 B NOP1 s/ S( `& w/ h: X1 m* ]5 E, y
DJNZ R4,DEL4
A: ^9 D7 ^* c* i2 Q, j NOP. v; S) L$ R3 L a
DJNZ R3,DEL3+ N$ o2 t- o' }
RET6 ?: p; S/ |% ^, i: u
NOP
/ S, j g5 J5 X9 X" WDAT:8 z$ z4 ^1 |' d
db 26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h4 }( _; m0 ?! I( H+ \! g
db 30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h+ N! V! L2 d+ T
db 20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h; E5 V" a, A6 y% Z; W+ V$ P
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h
* T' p* z9 m* V; K9 p db 30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h
# w# H: u4 y3 t- @ db 2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h
& [) U6 V# n" \6 ?# t7 F db 20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h
9 G: F5 j' I7 N0 Y5 \+ ^0 B db 20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h& I h' ]# o k( h0 m$ o) p
db 20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h6 v* m! t$ ` {/ }! N0 r$ ?" N
db 20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h. s. U7 R6 x/ j3 K; ^, q
db 18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h
& x; Q: z* V) | V0 ]/ G db 30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h
' s$ ]6 V0 Z% j* A6 N- L/ g9 X db 39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h! d4 |+ K& a+ M' S) V( N* ?, `
db 20h,10h,2bh,10h,26h,30h,30h,80h,00H. f* ]4 O8 E6 \1 S+ F
END
. q2 b1 [# E7 z- }音乐程序汇编代码代码2 -------------Voice1.asm--------------------------6 t. I6 ?, t4 j
;标题 '八月桂花香'发声程序 . Y4 L; p$ q5 m) U9 w0 e
;摘要 详见'无线电'92年3期% P5 O2 y% W3 k
;作者 周振安
+ T0 w+ Y5 C' U1 j. t7 l0 K+ n9 H ORG 0000H
4 T, H$ `, s0 ]* b LJMP START
. u9 ~+ B- o* i' L+ [ ORG 000BH
$ u0 }- r. u2 S K2 q INC 20H ;中断服务,中断计数器加1) H8 p# u% B6 f/ X6 x9 G9 H/ Y- @
MOV TH0,#0D8H
' i I& j' _+ e MOV TL0,#0EFH ;12M晶振,形成10毫秒中断5 ^, W$ v% G- o5 _/ y/ m
RETI
9 H# t1 R/ D( j7 @6 B* S8 ASTART:
6 |+ l6 v% I+ o! W+ z MOV SP,#50H
/ R$ a7 V. l% ^! l# l8 ?6 ` MOV TH0,#0D8H
@- j* m& V, y MOV TL0,#0EFH
5 s R2 m& p5 n1 Q. M3 c! I( ~9 ~( c MOV TMOD,#01H
6 G& S. D& j$ X MOV IE,#82H
2 i, F9 b+ p8 L% _6 _MUSIC0:
$ T8 x1 `/ c* H NOP
5 u E+ s( e9 h6 G, i9 u& A% s MOV DPTR,#DAT ;表头地址送DPTR' u8 X" O7 H; F& x8 K9 j
MOV 20H,#00H ;中断计数器清0
) P' F' ]% {, i$ k/ Y$ c' Z MOV B,#00H ;表序号清0
! x* r0 N9 H* j0 v/ R" d# ]MUSIC1:4 c; m2 c( [3 }8 J: p4 v! r) M7 F" K
NOP I: e3 L# ], |, g3 c U2 S) H+ \
CLR A
% w7 A: L, c6 ?+ \! n3 p# W MOVC A,@A+DPTR ;查表取代码2 x' ^2 [5 @ @
JZ END0 ;是00H,则结束
' Q0 f- J) L) Q8 I CJNE A,#0FFH,MUSIC5' p5 _) \' |- s; z3 B3 Q; |4 @
LJMP MUSIC3
5 y' B4 A6 O/ |/ Q( BMUSIC5:2 |9 a' q8 D* R" v
NOP
4 t6 l/ a. S- H" J K) k3 u MOV R6,A
. L. D) m o3 x* K INC DPTR4 I! C! i* g) Y+ C2 k7 @( u0 h
MOV A,B8 V/ k4 B$ o% K( J6 \4 \3 {. V0 y, D
MOVC A,@A+DPTR ;取节拍代码送R7
" h4 a9 ~- s" i! Y9 S MOV R7,A
- ?% }( u/ z) h SETB TR0 ;启动计数
& f7 `6 _% f F- q3 o+ jMUSIC2:
7 v0 w# k! ~. E3 V0 [, j( H NOP1 f: l3 s* {( j
CPL P1.06 `0 i. s% r3 m; S( j$ E
MOV A,R6
4 e$ [# L" R$ Q MOV R3,A
: O3 N) H0 U4 I9 r$ _ LCALL DEL
+ d/ u; `, |& F7 y MOV A,R7
$ h6 `- S7 r2 g5 W CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否?
1 [8 c0 j: @$ p6 n2 @0 R9 N2 v7 [ ;不等,则继续循环8 {8 f+ _+ r2 Y7 T& l0 `
MOV 20H,#00H ;等于,则取下一代码
, k. E4 q7 `4 W/ i9 F" I j9 ? INC DPTR
T7 ~) c0 g! O3 O+ J; INC B
" @7 L/ h8 o; u: Q! L LJMP MUSIC11 b/ Z0 Y& M0 n2 Q2 p. A( `( H* t
MUSIC3:
; w# S. |) l9 d NOP
2 d' P% @7 G5 `; n5 D3 h' @, W5 \ CLR TR0 ;休止100毫秒
/ g& J9 n5 k/ O& ^" O MOV R2,#0DH. w$ j% S7 k( L5 T+ P$ W% F3 u( _6 ]
MUSIC4:# H; T5 n# U7 x3 R
NOP
- K" ?; ^" w& f9 P% y% u MOV R3,#0FFH1 v4 U/ i7 x- D) C! R( {
LCALL DEL& u+ t1 b9 T% {5 b( I8 Q- G
DJNZ R2,MUSIC4% z/ r5 I9 h- U' c( _. w2 }
INC DPTR
; z+ i6 T/ _# v+ R* g" V LJMP MUSIC1
( a1 R U b4 a% UEND0:, P+ W/ g& y/ C' u, }1 q) v
NOP
9 p5 J9 S! D& h; j4 m MOV R2,#64H ;歌曲结束,延时1秒后继续4 m. w; G; j8 E4 T
MUSIC6:
" X) r5 C' {* Y% k7 ~ MOV R3,#00H* E4 u* i7 `9 c: v/ x$ l
LCALL DEL0 y7 }8 k1 |3 f7 b4 ?/ R. ?+ h
DJNZ R2,MUSIC6
. k- ]% {# y% L& N* }/ p LJMP MUSIC04 I7 y9 g6 e' s7 b
DEL:* u" g( ]1 \5 D% f' B* P
NOP% n! E3 U) E& f8 o5 k2 ~* ^3 n$ a
DEL3: - y) h4 O7 H9 L2 j
MOV R4,#02H# v) D; B* k1 b; r1 J. y+ H
DEL4:
: n! j- a N* o; f3 p/ h. g NOP2 W, D8 ?2 D: o
DJNZ R4,DEL4# j* T- ]' e& b1 r( D- C( ?
NOP7 m% }: I: h, X7 c: c
DJNZ R3,DEL3
8 n' i& R- b. k RET
g$ h; S1 [- u, v' { NOP
+ `7 C2 U' j4 L+ f9 c! fDAT: $ R: @5 e, f# N
DB 18H, 30H, 1CH, 10H
( g6 E& n) |; R+ s( U DB 20H, 40H, 1CH, 10H
' y, D, h* Q" |' t) S) l DB 18H, 10H, 20H, 10H
# }: ~4 @) P6 c) X8 n# ^! V DB 1CH, 10H, 18H, 40H
8 q) ^' X( M; G& Z DB 1CH, 20H, 20H, 20H
" k1 d. U4 b( S e& f DB 1CH, 20H, 18H, 20H
7 O3 a% ?, ]* u& _ DB 20H, 80H, 0FFH, 20H
( o3 l; W5 q% S6 O$ r1 `( @ DB 30H, 1CH, 10H , 18H
$ |/ v" W. r8 G DB 20H, 15H, 20H , 1CH) T) r3 F' ~7 i; ^
DB 20H, 20H, 20H , 26H8 [* K* `$ b4 X4 H
DB 40H, 20H , 20H , 2BH$ e3 j7 X: u& W% _" g7 B% C$ f+ _
DB 20H, 26H, 20H , 20H 3 r9 {$ ^9 T) K: T' a
DB 20H, 30H , 80H , 0FFH
8 P9 W8 z9 _+ e7 k DB 20H, 20H, 1CH , 10H1 @; a% j1 c, n& S' n! J
DB 18H, 10H, 20H , 20H% M- a* r" a0 P/ _ g
DB 26H, 20H , 2BH , 20H* A" c! \# l9 _0 ~ d
DB 30H, 20H , 2BH , 40H* e6 M' U* N& u0 G% r* Q
DB 20H, 20H , 1CH , 10H+ m5 K/ M- m1 o, B+ e" J9 ~
DB 18H, 10H, 20H, 20H# M; X, I4 B8 k8 g3 ?4 V e
DB 26H, 20H , 2BH, 20H3 W2 b0 `' |9 A9 M( p- Q, K, f
DB 30H, 20H, 2BH , 40H
8 t1 T% O1 k9 h0 y! g/ K5 p DB 20H, 30H, 1CH , 10H
9 S, I. v/ A5 ], P) K r7 a8 V DB 18H, 20H , 15H , 20H Y+ U$ Q) a/ P/ ~1 L0 ^+ C
DB 1CH, 20H , 20H , 20H
' o* B1 d* Y0 t4 {/ D DB 26H, 40H, 20H , 20H
2 {& I5 @" m1 h1 m" k+ V& t/ u DB 2BH, 20H, 26H , 20H
5 ~2 b4 F8 Z5 c& r$ \ DB 20H, 20H, 30H , 80H
; I- u4 K* B; c& C/ Q8 G3 J DB 20H, 30H, 1CH , 10H( S" Q% K- e! W' {
DB 20H, 10H, 1CH , 10H
2 b- V1 d8 Y0 D6 C: \6 q- L# i DB 20H, 20H, 26H , 20H- z2 I# }: C/ w! G3 h: P* v! Z) |/ n
DB 2BH, 20H, 30H , 20H; }4 g2 L4 k- T8 o( D
DB 2BH, 40H, 20H , 15H
2 B; i+ R8 q3 K V% k4 g# ]' ^" b DB 1FH, 05H, 20H , 10H
5 Y3 C: l% G: ~0 ?6 y& ?, _ DB 1CH, 10H, 20H , 20H0 N* J8 C) T1 \8 X
DB 26H, 20H, 2BH , 20H
3 M1 L, k9 C" C9 ? DB 30H, 20H, 2BH , 40H
: D9 c3 t. ^2 U$ { DB 20H, 30H, 1CH , 10H
& P4 s% A* {! R" r/ I4 A8 u' I DB 18H, 20H , 15H , 20H
# F5 _: _9 Q1 R0 k' w. I. w DB 1CH, 20H , 20H , 20H
. `* a; g0 c3 `8 f4 G0 O7 A1 O DB 26H, 40H, 20H , 20H
, `% f- l2 g9 }! n# b' S5 J, M DB 2BH, 20H, 26H , 20H
+ }& M6 Y- o* i$ R/ d2 P/ i3 @ DB 20H, 20H, 30H, 30H * [# U6 s" s4 Z
DB 20H, 30H, 1CH, 10H
. H3 m/ y, D/ C2 |. u9 A4 [ y2 X) \ DB 18H, 40H, 1CH, 20H
/ C7 O8 |& m# I8 p/ X4 @- _ DB 20H, 20H, 26H, 40H% V) w6 ]6 {2 X# V6 ~- y
DB 13H, 60H, 18H , 20H& z) s- L% P4 Y% f, c$ ?
DB 15H, 40H, 13H , 40H
& z6 j/ o5 n7 D) m$ l DB 18H, 80H, 00H
) _' Y" F7 N" C* U+ }end& k* Y' Z9 n- g A) g x! U; C
|
|