|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
利用单片机(或单板机)奏乐大概是无线电爱好者感兴趣的问题之一。本文从单片机的基本发间实验出发,谈谈音乐程序的设计原理,并给出具体实例,以供参考。* W$ w" {9 [( e" c7 O, d* j
单片机的基本发音实验8 K0 j4 h A& P7 n8 f
我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单处机某个口线的“高”电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调。* d( A& @) F& P; z5 M5 |* \- _
例如,要产生200HZ的音频信号,按图1接入喇叭(若属临时实验,也可将喇叭直接接在P1口线上),实验程序为:
' }& D6 M" Z6 y& _其中子程序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能奏出音符。仅这还不够,要准确奏出一首曲子,必须准确地控制乐曲节奏,即一音符的持续时间。
. @. E6 u1 P! c7 U! k$ b音符的节拍我们能用定时器T0来控制,送入不一样的初值,就能产生不一样的定时时间。便如某歌曲的节奏为每分钟94拍,即一拍为0.64秒。其它节拍与时间的对应关系见表2。% x# w9 R( O- {! R0 J
但时,由于T0的最大定时时间只能为131毫秒,因此不可能直接用改变T0的时间初值来实现不一样节拍。我们能用T0来产生10毫秒的时间基准,然后设置一个中断计数器,通过判别中断计数器的值来控制节拍时间的长短。表2中也给出了各种节拍所对应的时间常数。例如对1/4拍音符,定时时间为0.16秒,对应的时间常数为16(即10H);对3拍音符,定时时间为1.92秒,对应时间长数为192(即C0H)。
+ o$ |0 U" A, }/ _) C; G我们将每一音符的时间常数和其对应的节拍常数作为一组,按次序将乐曲中的所有常数排列成一个表,然后由查表程序依次取出,产生音符并控制节奏,就能实现演奏效果。此外,结束符和体止符能分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生对应的停顿效果。为了产生手弹的节奏感,在某些音符(例如两个相同音符)音插入一个时间单位的频率略有不一样的音符。
1 A$ I5 I% v" l! U! x6 g9 L下面给出程序序清单,可直接在TD-III型学习机上演奏,对其它不一样型号的学习机,只需对应地改变一下地址即可。本程序演奏的是民歌“八月桂花遍地开”,C调,节奏为94拍/分。读者也能自行找出一首歌,按表1和表2给定的常数,将乐曲翻译成码表输入机器,而程序不变。本实验办法简便,即使不懂音乐的人,将一首陌生的曲子翻译成代码也是易事,和着机器的演奏学唱一首歌曲,其趣味无穷。
9 E2 z2 C* j6 w" p# I. n( `3 v) v程序清单(略,请参看源程序的说明)。
% }5 K& Z7 e- p' d/ K/ y& S程序框图如图2所示。
& F. B& m8 [' `0 { . i6 I: y) ? e
<单片机音乐程序的设计图>% a5 P' t' [* E8 g! V
( ]! w) i) G$ Z0 i, Y+ h6 |, z硬件连接说明:
: v( w9 Q) r6 @9 w) [随便找一个仿真机或者什么单片机实验板,只要能工作的就行,将程序输入,运行,然后找个音箱(你计算机旁边应当就有一对吧)拨出插头,插头的前端接在P1。0上,后面部分找根线接单片机的地,就应当有声了,然后怎么改进硬件连接就是你的事了。。。。2 {" f2 ^# s3 r
音乐程序汇编代码代码1 -------------Voice.asm--------------------------" j0 P. n+ c+ y7 t! N+ Y6 |$ h, v
ORG 0000H
: {4 z( \# ^; H LJMP START
9 B* z) M2 ?/ i, g1 o ORG 000BH, E$ y9 y/ l H$ i: l5 W
INC 20H ;中断服务,中断计数器加17 V, N9 j. n3 U" f
MOV TH0,#0D8H
+ _9 G; i$ V9 p- k1 n* L3 m# R8 P MOV TL0,#0EFH ;12M晶振,形成10毫秒中断- s% e0 \0 f! J5 v& E$ j& \
RETI/ y9 t L) W3 ^/ C4 t6 [& ^% R* c
START: : E0 p; c' j1 G8 X3 |1 [$ o
MOV SP,#50H6 w* R7 Y; [! |+ o( S9 j
MOV TH0,#0D8H2 r- @- S9 g; r( a$ X5 p. m0 @' Z
MOV TL0,#0EFH( c7 C j3 ]( [. k
MOV TMOD,#01H
Q* G+ Q% O9 a v: I MOV IE,#82H @* I8 D. a4 k- B3 B8 a7 @
MUSIC0:
5 J" }" l# i- c: Q NOP7 {1 G3 z. d; i6 n4 \& M, G* ]
MOV DPTR,#DAT ;表头地址送DPTR
! P6 Z1 N' p# C# r MOV 20H,#00H ;中断计数器清0: c, ]# h0 Q e" A5 P6 j
MOV B,#00H ;表序号清01 d& B8 J3 G1 \$ t
MUSIC1:* R) F% ?! l6 A- O0 o
NOP
$ G8 U6 G# g \ p6 j7 C CLR A
( X( a' X$ s3 \) E; | MOVC A,@A+DPTR ;查表取代码
* C0 P. Q* `. O6 Q$ T6 Q- y JZ END0 ;是00H,则结束
1 ~; @4 ^( @6 z! h CJNE A,#0FFH,MUSIC5
6 d- G: `! O" ]$ u. D5 L LJMP MUSIC3# T8 B6 Q$ J. l% i1 a4 Y
MUSIC5:6 u. s6 f4 h0 s
NOP7 w0 P# ^' @! j
MOV R6,A
7 D% ]6 ~* ?4 s+ O, v# \) Y' Z INC DPTR3 E# n2 ]/ {$ ^2 e1 K! t4 z* W0 R7 z
MOV A,B
, c, u: Y! t1 u0 \5 F2 w MOVC A,@A+DPTR ;取节拍代码送R7
7 ` ^6 {5 l) k9 a" D: h9 U |% ~ MOV R7,A! h4 L" \4 Q9 }* a, Z& ]
SETB TR0 ;启动计数
1 f Y' p! T5 d1 D$ q' ZMUSIC2:
% {; Z9 L$ M: D9 `! |- F4 ^( j4 P T+ s NOP, f* J; t7 b- c- C9 R8 R, y
CPL P1.09 F% l# N5 v0 F+ Y$ a
MOV A,R6
/ P0 @2 h2 }# [4 i. I; T MOV R3,A
+ B9 ^+ U9 c7 D- M1 d' W LCALL DEL4 U5 U6 E( [4 a: E& Q0 n
MOV A,R7
0 [0 Y7 N* V" k5 Q% O, y/ S- x CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否?
" F- E# q/ K" l ;不等,则继续循环
% |' n- `6 r+ n" `6 V* k MOV 20H,#00H ;等于,则取下一代码6 I- }8 M+ a+ a$ g/ ~+ A/ j
INC DPTR8 u2 ]9 @# y9 Z8 S% b4 R; H
; INC B+ ~2 K) \+ _' n" r: R
LJMP MUSIC19 V( J) P e* d& U8 H( `( L
MUSIC3:
' n* Z9 I8 D; }# c/ l9 W' ` NOP
: ?1 T" _ V: g* M) N* c CLR TR0 ;休止100毫秒( I4 b. x: F# q7 z0 ^
MOV R2,#0DH* m' F! }) ]7 T3 l1 P: p/ ]
MUSIC4:
4 L. |. O1 i7 z6 l NOP0 P8 l" o- w7 H. a
MOV R3,#0FFH
" \* o1 ?' z* Z0 X- c* ^ LCALL DEL
3 t3 T/ r; ^! p( i$ C% n DJNZ R2,MUSIC4
# g$ x! W% m7 k- I3 { INC DPTR
( I+ Q+ T3 ]' f% @2 ^: O. z LJMP MUSIC1: U0 N8 `( g0 l
END0:
% t" ^! `+ d- t NOP
/ A* M8 D$ F% z( F MOV R2,#64H ;歌曲结束,延时1秒后继续
! P0 W4 p! W1 s; ]! fMUSIC6:1 ], w+ _, Q! c' q
MOV R3,#00H
! a6 S$ Z9 J6 `+ w& x LCALL DEL, P5 _6 b. k) K: j
DJNZ R2,MUSIC6% w4 X* Z. s4 f2 q: d" |" G
LJMP MUSIC0
3 D. ~( C/ {+ L4 Z; d/ MDEL:( Z; h+ |- F/ f
NOP
5 G3 `7 K$ z4 Y- n# v8 M9 o: P# `DEL3: . ]' @! q. L/ ?/ y6 I) j( X: F: m
MOV R4,#02H4 N! n) U. [1 F2 o# R
DEL4:
) M9 V) _( R5 F1 O NOP
8 }4 y- \1 k- c' V# \9 ? DJNZ R4,DEL4" L3 \& y/ K3 m8 G
NOP
# ]% h d, h* W) E+ H% z V DJNZ R3,DEL3
+ ^3 p$ v6 e( v% y RET3 p, X! y; _( D3 [* \
NOP
: | \1 V, Y$ _+ S1 v# d5 XDAT:
# g% _' p4 `3 f" @9 _# _ db 26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h
N$ D1 @7 F& K! D4 K! @/ T db 30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h" O7 \7 p4 P9 g
db 20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h
1 J( r/ U! z2 N f+ X( K, t db 30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h
0 n; n/ b" P, y- o: Z9 L, \ db 30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h. m* n; M8 ~) ]& k% h6 E! m. b
db 2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h
+ x" ~) E3 p: n8 T db 20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h
) {+ m9 F% H/ P db 20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h
1 t! @/ z' m! ]6 E: q3 h, w db 20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h
- E+ E) S. |+ \4 Y/ i' [1 @ db 20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h
2 G5 |6 l4 F$ {3 w db 18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h* l9 q9 z. z3 v( g, o4 b5 C y S
db 30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h3 @* }& ~! B& M, n: r
db 39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h
, S6 i7 k7 d- T3 o2 Q9 ]! q" |" [) Z& Z' O db 20h,10h,2bh,10h,26h,30h,30h,80h,00H1 t8 \. F- |+ L/ j$ { w/ c
END
4 ?$ j7 G/ a3 @: C音乐程序汇编代码代码2 -------------Voice1.asm--------------------------5 ^/ K! ?8 X1 E0 n
;标题 '八月桂花香'发声程序 & b" K" L+ p- K( z0 O
;摘要 详见'无线电'92年3期
' f9 w7 @3 q2 g: g6 c;作者 周振安
2 I0 O+ Q- K! j' h- a% i- S ORG 0000H
$ Z+ E! q0 N+ }5 p/ U1 w2 w+ f LJMP START1 \& |; z0 f5 d2 _& t/ Q! E. n
ORG 000BH
/ Z2 q3 u* k) _* S B! s/ K9 y INC 20H ;中断服务,中断计数器加1
0 A' e' s+ {( q, W; G( ~$ G1 D! x MOV TH0,#0D8H' s5 p% Y" a$ B9 \" [
MOV TL0,#0EFH ;12M晶振,形成10毫秒中断# V: f0 g" f5 A8 J5 A
RETI% y6 e# F) R8 B* N* ]# k2 Q
START:
' s1 u7 @7 u$ I; f4 W5 v8 A MOV SP,#50H
& g) o& ~2 u( @! o; { MOV TH0,#0D8H) m5 `9 t! V: Y8 V( L
MOV TL0,#0EFH" S& G3 h5 w1 o
MOV TMOD,#01H
3 H' a# p# \2 i MOV IE,#82H( Z1 j1 x/ Y% U2 {& d. {& ^2 O- X
MUSIC0:
# z; i8 g, {' v, P: ` NOP' m+ N: _: b& j8 N7 m- L; V Y
MOV DPTR,#DAT ;表头地址送DPTR
3 T, D. ?* }5 \# e I) m, u MOV 20H,#00H ;中断计数器清0+ I: o) A" G* G8 ^$ g( ]
MOV B,#00H ;表序号清0* R: T) p; U6 J6 b/ R
MUSIC1:
" K/ [* u, A4 J& s8 { NOP4 N) h6 a! `! {- r7 x! _2 n
CLR A
; _0 x5 ^. a0 d$ F/ i8 ]$ B2 \ MOVC A,@A+DPTR ;查表取代码 H/ }1 O6 l9 _$ O- o$ R, B" f
JZ END0 ;是00H,则结束
9 H0 Y- i$ w/ | CJNE A,#0FFH,MUSIC5
! O; u, p4 A& D+ t8 C LJMP MUSIC3; M4 l' m2 {2 s
MUSIC5:
+ `/ X% n5 `+ x" Q NOP, t3 F& P) h- w0 X
MOV R6,A
2 R0 g" H p& m% y3 a INC DPTR
0 S$ ]& h2 h7 K: Q" g9 r, b4 o" O MOV A,B
+ f. c8 f0 x' i" { MOVC A,@A+DPTR ;取节拍代码送R7
4 b* S" ~; D0 L- Q MOV R7,A" I8 O* w8 d) Z% o J( c4 \
SETB TR0 ;启动计数
1 O- c& r8 x7 N7 x/ n- ]MUSIC2:0 w* v$ V3 w. T4 o( K4 F, l3 q
NOP! l+ ?( Z6 r' @* r# f# {# _+ A
CPL P1.0# Z& b7 @' N- @
MOV A,R6
0 q9 s5 p+ i) r M. h/ s) ~ MOV R3,A" ?# Z( p+ ~( Q3 c
LCALL DEL
0 Y, k) H9 O0 S8 `1 { MOV A,R7$ [- J; f8 }; Y; y% X: N3 b3 z: c
CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否?) Y8 e3 I2 r, D0 k' c4 [ [
;不等,则继续循环( h; t& u% {* d6 U; a4 s
MOV 20H,#00H ;等于,则取下一代码
1 X9 P, v. D7 X* s# ~( X INC DPTR2 k2 U' I6 A4 d/ ~9 r) ?. ]
; INC B8 f9 H, K% E) l. ?* }& C
LJMP MUSIC1
7 J; K) | Z+ v2 hMUSIC3: n: U7 t, M( X% c) q
NOP
: ^3 t: z3 h" y* J% u. [+ M4 n: L CLR TR0 ;休止100毫秒+ M: ]& m, }" p" `: [
MOV R2,#0DH
( j; G& U9 K6 ?MUSIC4:
5 H0 B C: {7 i NOP" v/ L& d/ S4 d. _! f4 [+ S1 l6 n
MOV R3,#0FFH
* g0 v' ?7 C% s LCALL DEL/ i1 [' z$ k/ V% G! _7 y
DJNZ R2,MUSIC4
+ s4 h* o) |$ V$ Z' O$ h INC DPTR
, e& Y, N2 Q# T1 v5 d3 C LJMP MUSIC1
( k! L9 X( ^- QEND0:
$ ?9 d, c- @0 H) F/ S NOP/ r2 \4 h0 J+ V1 w1 p% a n
MOV R2,#64H ;歌曲结束,延时1秒后继续
; o3 f# p, K( N6 F& @; z: QMUSIC6:0 h" G/ R. Q% d. O, Z7 c, i
MOV R3,#00H
. W" v' b2 X! d/ T" } LCALL DEL
' j6 f0 u! |! m( m2 w DJNZ R2,MUSIC6/ B& l: |0 E8 S3 H* v7 t
LJMP MUSIC0
0 F+ H4 q; l" \3 }- C0 N0 a3 E2 q' |DEL:$ H# Y$ k0 O [' M, g: w/ a6 }
NOP$ {) E4 H# e9 Y
DEL3: - Y' ~* ?+ q. R& s
MOV R4,#02H
$ `, L* T9 _" h) sDEL4:
% P: I- k8 \) q I* w NOP
& j9 E7 c5 z" h- q; m! U DJNZ R4,DEL4+ Y/ u8 L% R6 n6 w
NOP
`# G* h# b8 v5 W5 P DJNZ R3,DEL3
" A3 w- Y/ r. ^0 J9 G4 ^4 x RET9 [5 X; |+ M" ~! q7 B
NOP
/ B% Y- r. g: P2 K) W7 EDAT:
% {- _3 c; K4 n+ W; N, Z/ ^5 f: r DB 18H, 30H, 1CH, 10H
* k G! x+ Z7 A/ a DB 20H, 40H, 1CH, 10H . P e5 p# c$ x( |
DB 18H, 10H, 20H, 10H
* Y( ^$ W* w( j! s1 E3 V5 Y DB 1CH, 10H, 18H, 40H
" t+ e4 O8 P. D# G DB 1CH, 20H, 20H, 20H0 q1 D8 n7 W- j1 `7 I/ Q/ j
DB 1CH, 20H, 18H, 20H x" P8 _. u5 _+ H& J- [* p6 ^
DB 20H, 80H, 0FFH, 20H+ X- l/ J) o9 G
DB 30H, 1CH, 10H , 18H- t1 @2 X- R3 W
DB 20H, 15H, 20H , 1CH4 R) S5 u1 V# _1 L/ q/ c1 i
DB 20H, 20H, 20H , 26H4 a2 o) \8 F" j
DB 40H, 20H , 20H , 2BH/ `! ~' c, ]3 ], ^
DB 20H, 26H, 20H , 20H
% n* r7 ~ S) P( ^5 d DB 20H, 30H , 80H , 0FFH. ^# ^& f% u5 Y$ s# P0 m; U; p+ c( k
DB 20H, 20H, 1CH , 10H
9 g1 Y, Q+ W% T% b DB 18H, 10H, 20H , 20H7 H4 d& S4 X Q4 K- Z2 p
DB 26H, 20H , 2BH , 20H
" P. v$ Z$ p6 m8 M3 G( S DB 30H, 20H , 2BH , 40H$ T: d% c" b! Y; E7 r, Z3 y' e
DB 20H, 20H , 1CH , 10H" c! T, {6 _. c0 r) F8 _" d
DB 18H, 10H, 20H, 20H
* q* s; C* u: i9 g! p4 {( k0 v3 ? DB 26H, 20H , 2BH, 20H$ ]/ z8 T: y$ K
DB 30H, 20H, 2BH , 40H
& u$ s/ { d. P# ` DB 20H, 30H, 1CH , 10H
2 u1 h, K! c6 ^ DB 18H, 20H , 15H , 20H
) U8 O9 O2 W3 N2 u! T. \1 p DB 1CH, 20H , 20H , 20H
/ O7 d1 ?$ {4 j! Y& a! A DB 26H, 40H, 20H , 20H
& [( e1 W) z& f8 m4 p DB 2BH, 20H, 26H , 20H # {' Q; i* E4 K) U: }
DB 20H, 20H, 30H , 80H8 g; D6 `0 W6 T& ]* b
DB 20H, 30H, 1CH , 10H8 k% b/ J2 O& K0 v+ a
DB 20H, 10H, 1CH , 10H/ I9 R, F& x! l2 N1 {
DB 20H, 20H, 26H , 20H
2 [% q+ @- P& n8 @$ G2 ~ DB 2BH, 20H, 30H , 20H
$ m K$ B& ~2 U( `. Z+ L1 M DB 2BH, 40H, 20H , 15H
# f& h8 k+ O' t; j0 W DB 1FH, 05H, 20H , 10H7 e4 A" x! p# ~) L; J2 z4 `
DB 1CH, 10H, 20H , 20H; P9 i6 O8 e1 o: q5 z- f
DB 26H, 20H, 2BH , 20H
+ J7 _0 i0 S( v9 D DB 30H, 20H, 2BH , 40H
8 e% V9 K" ?6 }: c [# x/ Q DB 20H, 30H, 1CH , 10H/ e* L( ?" T5 x; J
DB 18H, 20H , 15H , 20H3 y# h/ Y e* x1 b& y
DB 1CH, 20H , 20H , 20H6 B: `3 k- B z* C% L5 a% F
DB 26H, 40H, 20H , 20H, p% A( w0 \0 O& o9 z& h* `% c
DB 2BH, 20H, 26H , 20H
/ o' L) V+ w3 m DB 20H, 20H, 30H, 30H
1 A. Q+ e% R" z8 `7 S1 f- t DB 20H, 30H, 1CH, 10H! e: G, Z$ d2 _+ t
DB 18H, 40H, 1CH, 20H
: I6 m6 |9 o% q1 E3 g4 k# g; O& C DB 20H, 20H, 26H, 40H9 U5 V4 r0 R7 ^1 g0 u
DB 13H, 60H, 18H , 20H, ~7 ?$ }$ {1 R9 |9 T
DB 15H, 40H, 13H , 40H
8 H" e' |8 f2 f3 o DB 18H, 80H, 00H6 P$ j' N9 t/ I. ?# x
end
1 \, P* S9 k" D/ h* J9 w) L: i ? |
|