|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
利用单片机(或单板机)奏乐大概是无线电爱好者感兴趣的问题之一。本文从单片机的基本发间实验出发,谈谈音乐程序的设计原理,并给出具体实例,以供参考。
8 S/ J% {9 r( u& H% `, o) R5 m& t单片机的基本发音实验
$ y4 ~4 A$ }4 W8 M* J% ^! `, D7 r6 i我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单处机某个口线的“高”电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调。+ E* w) Z8 X# x6 q6 n& V! O
例如,要产生200HZ的音频信号,按图1接入喇叭(若属临时实验,也可将喇叭直接接在P1口线上),实验程序为:" S! ]7 m. @" ?$ j- r+ h0 U
其中子程序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能奏出音符。仅这还不够,要准确奏出一首曲子,必须准确地控制乐曲节奏,即一音符的持续时间。) G: x# O/ J. g: x" Y* U+ ?
音符的节拍我们能用定时器T0来控制,送入不一样的初值,就能产生不一样的定时时间。便如某歌曲的节奏为每分钟94拍,即一拍为0.64秒。其它节拍与时间的对应关系见表2。
8 S7 V; n& {3 Q但时,由于T0的最大定时时间只能为131毫秒,因此不可能直接用改变T0的时间初值来实现不一样节拍。我们能用T0来产生10毫秒的时间基准,然后设置一个中断计数器,通过判别中断计数器的值来控制节拍时间的长短。表2中也给出了各种节拍所对应的时间常数。例如对1/4拍音符,定时时间为0.16秒,对应的时间常数为16(即10H);对3拍音符,定时时间为1.92秒,对应时间长数为192(即C0H)。" N8 b; T1 T- e+ O; |: j, G
我们将每一音符的时间常数和其对应的节拍常数作为一组,按次序将乐曲中的所有常数排列成一个表,然后由查表程序依次取出,产生音符并控制节奏,就能实现演奏效果。此外,结束符和体止符能分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生对应的停顿效果。为了产生手弹的节奏感,在某些音符(例如两个相同音符)音插入一个时间单位的频率略有不一样的音符。9 D2 ]" |3 [% ^5 j/ y
下面给出程序序清单,可直接在TD-III型学习机上演奏,对其它不一样型号的学习机,只需对应地改变一下地址即可。本程序演奏的是民歌“八月桂花遍地开”,C调,节奏为94拍/分。读者也能自行找出一首歌,按表1和表2给定的常数,将乐曲翻译成码表输入机器,而程序不变。本实验办法简便,即使不懂音乐的人,将一首陌生的曲子翻译成代码也是易事,和着机器的演奏学唱一首歌曲,其趣味无穷。7 B5 z+ V% k7 N, D
程序清单(略,请参看源程序的说明)。
7 J1 L* H d/ \9 S* w" \" C程序框图如图2所示。
5 a: [$ E! z$ v$ K7 K7 W2 a) F![]()
$ [9 D. U9 r& U5 J) O* P* \; b<单片机音乐程序的设计图>
1 l* y l& O) F0 n- S+ b3 f; ~! y+ J7 X5 ?3 L3 l7 s
硬件连接说明:2 |+ E; I7 [8 `$ o; P
随便找一个仿真机或者什么单片机实验板,只要能工作的就行,将程序输入,运行,然后找个音箱(你计算机旁边应当就有一对吧)拨出插头,插头的前端接在P1。0上,后面部分找根线接单片机的地,就应当有声了,然后怎么改进硬件连接就是你的事了。。。。' Q3 O$ X# x. c' n+ Q$ q
音乐程序汇编代码代码1 -------------Voice.asm--------------------------% g. c9 k6 Z4 k; Z s- Z2 K/ G
ORG 0000H
) i7 p. t8 N3 n+ r) } LJMP START
- k9 I. m" E, F4 F5 j- J% x. _ ORG 000BH9 d6 D: g( j% |9 ^6 Z6 s
INC 20H ;中断服务,中断计数器加1
- R' ^0 t, [# X7 g, T% _; t MOV TH0,#0D8H& a/ N$ W, [; o6 R% |
MOV TL0,#0EFH ;12M晶振,形成10毫秒中断
, |+ R. `. {& x2 ?; V" A) e RETI
2 }& ^. g0 E7 u& N/ ^' mSTART: # W, f* r3 O6 ^* Z, _2 O
MOV SP,#50H4 O4 W O# v. X6 d. X
MOV TH0,#0D8H
; C. @, w% L3 z0 p MOV TL0,#0EFH/ ^) R, @$ P) D# P
MOV TMOD,#01H
+ c! ]$ ~$ H# q1 `: @' t; E' _1 S MOV IE,#82H! K9 X- J! D% G$ U
MUSIC0:. o; c6 F6 r0 z/ g0 ~% b/ r6 u
NOP* ^7 B4 u# Q6 t- `+ g8 i+ Z, B2 [% B, p, M
MOV DPTR,#DAT ;表头地址送DPTR
: o2 g- M7 T0 r+ h; Z+ U! z3 } MOV 20H,#00H ;中断计数器清0% n! E7 [, V3 g N: Z+ M
MOV B,#00H ;表序号清0
b Q5 U& J7 @" c' tMUSIC1:% G1 b* H/ k+ U$ Q# e$ G
NOP% f9 W( z2 C p, D/ J m
CLR A! Y% z7 {/ z) w% |
MOVC A,@A+DPTR ;查表取代码
% F- D8 i! U* c+ b" A7 p JZ END0 ;是00H,则结束
! o* m, u2 x; F y D1 [ CJNE A,#0FFH,MUSIC55 V! g s; `! g- H3 G7 z9 L. k; d
LJMP MUSIC3
. G1 F# S; w( r8 P# F4 PMUSIC5:
0 X* G2 ~ V$ P0 Q# J NOP
! I) q$ l3 x- p MOV R6,A
' q6 h: i" u3 a0 x0 E$ a9 { INC DPTR
+ J. O& ?4 F; b4 x0 K9 g0 B MOV A,B
, o* A% U7 {; {9 Z- w5 M) s) a$ m MOVC A,@A+DPTR ;取节拍代码送R7* K0 z/ p& q$ b$ y1 @
MOV R7,A! a+ f8 d' V0 G( f
SETB TR0 ;启动计数: o& _/ V$ w+ b. w9 Z
MUSIC2:) E+ @# _; U) ^+ L. ~
NOP U2 M, N+ d6 ]2 M8 h
CPL P1.0: x2 ] f% j2 J( z" i
MOV A,R6
& E: Y3 v+ a. w- j# F$ V3 C# ? MOV R3,A
- M g6 s" } r( H LCALL DEL$ U) d0 C* l$ x n- s
MOV A,R7. X _* t4 d+ O& k) j
CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否?: U0 x7 @" }) p$ W8 O
;不等,则继续循环
0 s8 w# U# B, y- |1 u6 f: q MOV 20H,#00H ;等于,则取下一代码
+ j% d0 C" H+ H& f1 z, v* v! l INC DPTR' r* c9 G2 c# a$ ?
; INC B
, D7 @, `3 T2 T. I9 s LJMP MUSIC1
9 I J% y: h1 v+ [$ IMUSIC3:, V4 g' E' E* U+ ~' H, o: p
NOP
: { q# ^9 u7 P CLR TR0 ;休止100毫秒4 y, c) K& E$ D- e# | T- Q
MOV R2,#0DH5 v8 h2 S. \9 r
MUSIC4:
: }: K5 ^ K5 p2 b* g, `, T NOP
; v5 a5 w7 _5 ^2 h$ Z. r MOV R3,#0FFH
1 r& ~! t1 v" j9 @* x0 y- Y4 O LCALL DEL! e4 a# r- d6 M; [; W3 D
DJNZ R2,MUSIC4
a6 K- U! ~, G. s INC DPTR8 R: w9 U6 p/ n1 Y7 A! P! P4 t
LJMP MUSIC1" e9 ?( [! J; m' z
END0:
+ d' V2 R7 |. B NOP
& G% m7 `1 M/ V6 Q/ P! w MOV R2,#64H ;歌曲结束,延时1秒后继续
: O0 ?7 ?$ a; j' s/ V4 sMUSIC6:
6 L* O, b3 F* Z: A1 I" E' @ MOV R3,#00H
, ?7 N" k8 L. I LCALL DEL* ]3 j7 y A& a* W, e( F- B
DJNZ R2,MUSIC6- P( t# Z$ [/ z- B
LJMP MUSIC06 c6 S1 x5 J3 G% @% R6 m
DEL:( t o+ ^6 p0 N1 E# T6 C! B
NOP0 w4 p; |8 L5 v; t9 D
DEL3: + B/ Y# i5 E4 y9 ]0 G0 U
MOV R4,#02H
. l6 R2 T W- k) o- f3 |& r; IDEL4: 3 w$ O ]7 c( ^+ |8 P+ K8 J
NOP5 J* g# g& \/ g. g1 w5 M5 _: }- K
DJNZ R4,DEL4
1 w4 \, _1 r! I: I1 Y NOP4 q( x X9 l) Q* I7 v6 e1 Z, ?
DJNZ R3,DEL3
3 V" X5 C1 j/ r RET4 ^" `7 Y: o8 Q
NOP: S& N: N, m: j0 U7 ~& W& e
DAT:
6 ?, O, t* C9 b- J; M3 u3 c db 26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h
. N9 ?1 I% ?' y db 30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h- L8 U1 m7 T" v
db 20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h2 R% v; z% a2 z) F3 m" U
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h
& }# J+ K+ T: J0 v db 30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h
' q' E6 y2 \5 N0 h3 G5 a db 2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h, ~( s8 R; f- t# M0 F$ _" M9 R
db 20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h
4 B; o- o" l- t db 20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h$ I# W& |& Q; g# f5 c# g
db 20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h
3 \+ {7 i, E- q; a5 a! ? ` db 20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h
0 v" Q9 _ o) q- d$ P db 18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h2 N6 a0 _ H* r3 Y: L& l
db 30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h- j {, S' R! n+ |. V. M! ]
db 39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h
1 \: }9 w6 m1 R, I5 J) T+ ] db 20h,10h,2bh,10h,26h,30h,30h,80h,00H) b9 A1 s3 L3 P
END, S& l6 S; s% S( d4 P8 z; F
音乐程序汇编代码代码2 -------------Voice1.asm--------------------------% {7 C$ ^, v, L7 [, a
;标题 '八月桂花香'发声程序
' Z' S2 }; V0 C; W* |6 S/ r;摘要 详见'无线电'92年3期
3 a! N$ w# v8 `$ H4 r;作者 周振安5 |; F3 C" f3 v: w& W, \. r5 f
ORG 0000H" ~4 z" L: `! [( H. K* o0 P
LJMP START
9 T0 |# h+ S H2 W3 q; R: c; d ORG 000BH! @8 m4 y! @( u2 s0 p$ j
INC 20H ;中断服务,中断计数器加1) {7 s' [% q1 @) d
MOV TH0,#0D8H
: T- x# R Y# _1 E, @1 C) f7 C MOV TL0,#0EFH ;12M晶振,形成10毫秒中断- H" m' |3 K% G
RETI& c8 m1 R# y4 a- E& e( w+ H0 b0 l
START:
5 w- m" c" H* X' b% g5 X. f MOV SP,#50H4 A0 O8 ?6 C q
MOV TH0,#0D8H+ Z5 f, _$ Q; `5 ]
MOV TL0,#0EFH5 m" W% c- C2 G* \# @8 N. v9 @/ U
MOV TMOD,#01H
# F* p% M3 y, `+ E; B* {$ r2 s, u. d MOV IE,#82H
8 b% e( x( y2 s# D: n5 PMUSIC0:" B& U* A# g. N. V2 C
NOP+ D( Q- z9 `% f5 q: L. I% r
MOV DPTR,#DAT ;表头地址送DPTR0 K2 h) _: m+ o2 y1 L
MOV 20H,#00H ;中断计数器清0
, g+ L; |. j; R p MOV B,#00H ;表序号清0
9 ~6 v" v* h4 s9 rMUSIC1:8 H" L1 e8 b- E( A, k; g& E9 b
NOP
9 H' y' G% x1 n, M& N0 H% x CLR A; S3 y% r. o5 m+ l
MOVC A,@A+DPTR ;查表取代码
7 w4 F5 [ F' l7 ?" a JZ END0 ;是00H,则结束* m) C& ?) O3 r) S8 v+ ~2 e
CJNE A,#0FFH,MUSIC5
5 _- o9 @6 N6 h, ]) s LJMP MUSIC3
6 w2 ` c1 q9 |' ~ e. ?MUSIC5:% X+ L! l, e' H% [8 ~
NOP: Q' o; R8 G4 I1 }8 v+ u$ g
MOV R6,A! b6 e, e5 o7 g! {7 }
INC DPTR
. ]- F: U3 ^4 g) U. t) _7 | MOV A,B% U6 z7 w8 d# J4 B
MOVC A,@A+DPTR ;取节拍代码送R7
) q3 C5 c% ^6 x6 Y; O MOV R7,A$ A* }* }$ r7 v6 k+ X0 D
SETB TR0 ;启动计数
3 n& y; G5 v) Z# gMUSIC2:
8 m5 D9 p$ d$ f. j& }7 O( B NOP# e5 H0 E) F% a* c% Y/ k7 L( C# d! P
CPL P1.0
1 ]8 q. L1 T$ M/ J MOV A,R6 j* e" b. m+ p4 O3 W" H* |
MOV R3,A W- x- s( A1 l7 i8 F- o' ~0 _) L3 m+ x
LCALL DEL7 R/ F- W. Z6 V# Y: p% O/ ?
MOV A,R7
% W; R$ n5 L1 G CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否?" K3 d6 T* `! v% H9 t
;不等,则继续循环, h. U9 \3 l. N
MOV 20H,#00H ;等于,则取下一代码
- U4 p$ F' g3 g* V# } INC DPTR
; }& j' C6 C* g7 W5 D7 p; INC B5 F: V, `/ C7 d
LJMP MUSIC1: n+ L& C+ T6 D, f
MUSIC3:( u: R ?; C1 m, o
NOP
9 n- x+ Y% q2 k: C CLR TR0 ;休止100毫秒
8 D! T3 o) D5 D9 B MOV R2,#0DH) S6 Z) A% D) |/ \/ V! o: _8 S' J
MUSIC4:4 M7 V2 T& k% e9 [8 e1 `
NOP' _. C( {5 ~1 z+ M" z0 n
MOV R3,#0FFH
* Y- c# n6 o7 K; g1 T5 X$ R* X7 P LCALL DEL
3 o$ Z& O8 C8 Z DJNZ R2,MUSIC4+ m* R/ d7 L3 ^' o
INC DPTR/ ?" r. Y6 \' m+ U
LJMP MUSIC1/ r2 b. n( L) M* t" F3 m# B
END0:
R) v8 a& ?) u( a% w: w* C; P NOP
+ S3 x# v; K; G- N$ O3 n0 p+ ^ MOV R2,#64H ;歌曲结束,延时1秒后继续
. t* e; f: p, i/ a, @0 j: QMUSIC6:: U0 \, p/ N# T3 W0 P" G8 T O
MOV R3,#00H
# P" V+ b1 d& x6 v( q LCALL DEL+ S7 J/ m, Z) |1 O! ^. T, C1 c
DJNZ R2,MUSIC6/ @, K) L* u- m; U$ J
LJMP MUSIC03 f- F: c2 e* m2 C7 j( W
DEL:
) p2 A1 _6 o1 {$ t4 U NOP
9 C/ b7 z3 T: M- P/ q" y- kDEL3:
0 a7 j, ^9 e/ p. t7 k5 f: t0 d MOV R4,#02H
& q! ^- C8 ?6 j5 _' h- _7 S: B$ F) zDEL4: / V1 m. g5 B* I9 l7 Q# F
NOP% F1 C9 U9 x. M2 v8 F
DJNZ R4,DEL42 M& {) d8 G; Q. B6 C1 c( w: k) S/ H
NOP6 N/ `* s; d/ d
DJNZ R3,DEL3, w2 l3 t* E1 ]$ _3 A4 b
RET
# G* N* }4 S# H, y7 B" {+ D NOP3 u0 h7 k$ w" B7 ~7 Z
DAT:
" x7 }- r- ^. V& ` DB 18H, 30H, 1CH, 10H
2 W S5 {! ?8 D* V DB 20H, 40H, 1CH, 10H
9 H7 E* |: S2 h5 Q- @( \ DB 18H, 10H, 20H, 10H
0 E. M: z: j9 h' w DB 1CH, 10H, 18H, 40H
3 b9 D% S' Z$ @& w5 ?6 T DB 1CH, 20H, 20H, 20H g, V |; G$ e3 r& _4 l
DB 1CH, 20H, 18H, 20H
: X6 D/ @, W8 w9 ~ DB 20H, 80H, 0FFH, 20H
1 w+ C; m, ]$ @" P. B/ @ Q DB 30H, 1CH, 10H , 18H8 Q6 [9 H$ q8 p2 q0 X4 z
DB 20H, 15H, 20H , 1CH
3 t) J9 G" M3 c" s DB 20H, 20H, 20H , 26H7 z* e( K) V/ f# |6 v$ Z8 K; w7 B
DB 40H, 20H , 20H , 2BH! Y0 _- B, a2 E) @; M/ F* c0 N
DB 20H, 26H, 20H , 20H
$ O$ _ ?7 b+ W) j& W% ]' L/ H5 r' W DB 20H, 30H , 80H , 0FFH% g) s" _# F! u- y7 N; l7 B4 W
DB 20H, 20H, 1CH , 10H! |5 A5 Q3 l- W) J
DB 18H, 10H, 20H , 20H
" g: {, ~8 ^. f E6 f DB 26H, 20H , 2BH , 20H2 n7 u9 i, f3 ~$ O0 u: d, p7 Y
DB 30H, 20H , 2BH , 40H
- L4 j) c0 E; T# W7 m8 g DB 20H, 20H , 1CH , 10H) S6 e" I7 T" o; n4 D
DB 18H, 10H, 20H, 20H
% t; B. \6 I0 X' J+ r DB 26H, 20H , 2BH, 20H( |. a; j" r* A4 G
DB 30H, 20H, 2BH , 40H6 _2 Y- r$ n) V& d" T& s8 G( j, ^
DB 20H, 30H, 1CH , 10H; e0 g, S+ K2 g x& |
DB 18H, 20H , 15H , 20H
5 y$ ~2 @0 ^- z# a% g4 `4 c( m5 T DB 1CH, 20H , 20H , 20H% K) U/ R. E i9 T$ R1 M* e
DB 26H, 40H, 20H , 20H ' a" b; |2 L! M- D- ?
DB 2BH, 20H, 26H , 20H 1 d& ~3 n6 h) O( W8 o1 p
DB 20H, 20H, 30H , 80H9 z8 i4 q! b% \* H# Z- U
DB 20H, 30H, 1CH , 10H
: E% W! O6 U9 {* g7 Z: u DB 20H, 10H, 1CH , 10H
% C. m) A6 }- U; E( I DB 20H, 20H, 26H , 20H
7 n- d; m7 E% F/ I DB 2BH, 20H, 30H , 20H( D& j4 [* e% s6 K+ }8 x
DB 2BH, 40H, 20H , 15H! Q- f5 F- Z5 m# K8 m6 R* ]: d0 Q
DB 1FH, 05H, 20H , 10H* z5 L; f! u3 v! K1 f
DB 1CH, 10H, 20H , 20H5 E) m! k2 U$ k7 v" |. s
DB 26H, 20H, 2BH , 20H6 r3 ~5 P" T1 e0 x+ B0 ^, H0 T
DB 30H, 20H, 2BH , 40H' n7 j! T7 N2 E0 l1 X
DB 20H, 30H, 1CH , 10H/ t1 ]2 {) h1 O! E7 n
DB 18H, 20H , 15H , 20H
: M" Y4 j( h, ` DB 1CH, 20H , 20H , 20H
3 e# w; m8 r6 h# I! G# B" p0 \$ P% k x DB 26H, 40H, 20H , 20H
* Q- d/ J) j! }- f* O7 k: P# x DB 2BH, 20H, 26H , 20H& e: \- e: _6 S" u3 j
DB 20H, 20H, 30H, 30H . h* N, a* s7 X( j
DB 20H, 30H, 1CH, 10H
, r6 c9 T1 U! H1 [7 Y% m% z" J2 V DB 18H, 40H, 1CH, 20H
5 E# u) d% J8 h. c5 n DB 20H, 20H, 26H, 40H
' l" E1 H5 S, z- }" F2 Z% p DB 13H, 60H, 18H , 20H. J! K; v$ [; N3 V9 Z2 G
DB 15H, 40H, 13H , 40H$ f1 R+ g _1 m3 `- E' }0 |
DB 18H, 80H, 00H
' h* s; \# E4 ^) t, eend
]8 a* J% Q4 H8 k |
|