|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
利用单片机(或单板机)奏乐大概是无线电爱好者感兴趣的问题之一。本文从单片机的基本发间实验出发,谈谈音乐程序的设计原理,并给出具体实例,以供参考。" V3 o3 b6 {. k6 B% h
单片机的基本发音实验
% r1 g+ s' L( u" z我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单处机某个口线的“高”电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调。/ P$ T" k3 X) w& C3 t5 i
例如,要产生200HZ的音频信号,按图1接入喇叭(若属临时实验,也可将喇叭直接接在P1口线上),实验程序为:0 `- N: g+ U" M$ X
其中子程序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能奏出音符。仅这还不够,要准确奏出一首曲子,必须准确地控制乐曲节奏,即一音符的持续时间。
' X: G7 V* J# L5 F5 L音符的节拍我们能用定时器T0来控制,送入不一样的初值,就能产生不一样的定时时间。便如某歌曲的节奏为每分钟94拍,即一拍为0.64秒。其它节拍与时间的对应关系见表2。
- N( V) _. G, m- _但时,由于T0的最大定时时间只能为131毫秒,因此不可能直接用改变T0的时间初值来实现不一样节拍。我们能用T0来产生10毫秒的时间基准,然后设置一个中断计数器,通过判别中断计数器的值来控制节拍时间的长短。表2中也给出了各种节拍所对应的时间常数。例如对1/4拍音符,定时时间为0.16秒,对应的时间常数为16(即10H);对3拍音符,定时时间为1.92秒,对应时间长数为192(即C0H)。
1 ]+ N* A6 w6 o' g* y我们将每一音符的时间常数和其对应的节拍常数作为一组,按次序将乐曲中的所有常数排列成一个表,然后由查表程序依次取出,产生音符并控制节奏,就能实现演奏效果。此外,结束符和体止符能分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生对应的停顿效果。为了产生手弹的节奏感,在某些音符(例如两个相同音符)音插入一个时间单位的频率略有不一样的音符。
1 V9 R# p' p& ~ u8 m$ T下面给出程序序清单,可直接在TD-III型学习机上演奏,对其它不一样型号的学习机,只需对应地改变一下地址即可。本程序演奏的是民歌“八月桂花遍地开”,C调,节奏为94拍/分。读者也能自行找出一首歌,按表1和表2给定的常数,将乐曲翻译成码表输入机器,而程序不变。本实验办法简便,即使不懂音乐的人,将一首陌生的曲子翻译成代码也是易事,和着机器的演奏学唱一首歌曲,其趣味无穷。
7 f0 n# k% j: P) s. L程序清单(略,请参看源程序的说明)。6 \4 V2 \% L' ~( N/ S8 K: ?8 [( z
程序框图如图2所示。
. G: @0 Q$ a8 _6 E) S/ s2 P: X6 d 6 m: _# Y) |% T5 Q" V
<单片机音乐程序的设计图>
! B" |4 X5 U+ P* e' M: _2 j( x; Y, t8 D% W+ m
硬件连接说明:8 R7 l4 d% ^8 I' D( T! q8 i
随便找一个仿真机或者什么单片机实验板,只要能工作的就行,将程序输入,运行,然后找个音箱(你计算机旁边应当就有一对吧)拨出插头,插头的前端接在P1。0上,后面部分找根线接单片机的地,就应当有声了,然后怎么改进硬件连接就是你的事了。。。。1 w2 M: |2 l) Q, i3 F
音乐程序汇编代码代码1 -------------Voice.asm--------------------------# E0 g% j/ B9 |# R0 h
ORG 0000H! U* G9 G8 P/ g9 @" r
LJMP START7 c# U4 L/ }2 S1 h6 C$ p
ORG 000BH5 }( G9 Z$ G8 F4 ?) f, O
INC 20H ;中断服务,中断计数器加1
9 P \0 u& A+ S2 A0 f& \, S6 u MOV TH0,#0D8H7 e- b% ~/ T9 d2 x* `6 @5 J0 [3 K/ G
MOV TL0,#0EFH ;12M晶振,形成10毫秒中断( H- a' H6 C% C4 A- Q( y
RETI
* L4 e( {; z! h/ ]1 WSTART: . C! q: W/ i& W
MOV SP,#50H
$ a8 @4 B/ `: u+ b0 I MOV TH0,#0D8H
0 Z7 } V: O6 V$ L' |, G* ]2 ? MOV TL0,#0EFH
2 n- E9 o; d, z& y2 }7 l/ S MOV TMOD,#01H
% j) v0 e$ o/ C; k0 w MOV IE,#82H: D Q8 r* X3 f% J0 v
MUSIC0:. y, _* p/ I1 D
NOP
! w1 E" n Y, V( R7 [ MOV DPTR,#DAT ;表头地址送DPTR% p3 t6 @* i. B4 C$ N" x( H# q
MOV 20H,#00H ;中断计数器清0
" R( N- @$ Y4 F MOV B,#00H ;表序号清0
* ], t5 Q; l& i5 w. B/ p/ xMUSIC1:
' {* v3 |' S: r: S NOP* @/ n v/ E: ^
CLR A
% l; v! d- p- @8 g3 y$ E6 G* r5 W; { MOVC A,@A+DPTR ;查表取代码& h2 A/ P: B; r z) R
JZ END0 ;是00H,则结束
" G6 y7 Q$ ]# X" r9 a { CJNE A,#0FFH,MUSIC58 U# a* v. K5 B
LJMP MUSIC3
" _$ I! Z5 a% f4 E' pMUSIC5:
- W5 k8 K) h# C2 i6 F4 h NOP7 t" f2 t- |. c4 F R' X3 b
MOV R6,A; D( w9 f! \" I0 P$ {4 x' O# P
INC DPTR
; j1 I, G/ `' q MOV A,B B/ R( Y* k% H7 j; |) ?9 B$ h' ?
MOVC A,@A+DPTR ;取节拍代码送R7
, J; _3 V3 ~" m7 K5 ~( V' \8 y% b MOV R7,A/ Y8 ~5 I8 O# r! ^: I
SETB TR0 ;启动计数
X, E6 S* T9 \& c1 v' A* E9 HMUSIC2:7 U4 H' n" d: e3 Q! c
NOP4 N( g$ J8 U/ b7 l( H
CPL P1.0
: j1 l0 S+ i$ ` MOV A,R6* X1 c7 ~ C! g# o
MOV R3,A
9 [& g, q. F1 n2 A0 ^5 N LCALL DEL
* F' K/ U. M& O' l; z) h) ?6 _" A MOV A,R7# S( @3 @2 ^; O) \, L" |8 j/ f) J
CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否?& x. \( y8 L( u8 d
;不等,则继续循环
/ M5 h- a7 [' K% ]" X, ^/ r MOV 20H,#00H ;等于,则取下一代码! D$ Y6 c$ G# K: G7 Z
INC DPTR
# M# r$ z" R; x0 m+ W$ i; INC B
: v2 L9 `0 l& `) u$ v: S LJMP MUSIC14 q8 K/ X- I1 o* S& k
MUSIC3: C0 H0 e9 Y4 ?4 e9 y
NOP4 p6 e9 A' _, _: u, P$ X# p9 v
CLR TR0 ;休止100毫秒
2 \( e6 Y7 ]. N& @0 a MOV R2,#0DH) Y1 V- `# W( o& _
MUSIC4:
4 ^3 a) z: H, u3 d( `; _ NOP" Y! N( p, ?+ g* e+ Q
MOV R3,#0FFH0 F: h; @. {; n# @2 E
LCALL DEL6 k7 \% `& L( ~0 C3 P
DJNZ R2,MUSIC45 N; l' V9 O* P( a
INC DPTR/ N5 |. c) M/ {5 e1 k9 H8 M
LJMP MUSIC1
. Y5 K% ?6 a3 W0 A( {END0: l( X: c' ~( x+ }+ v l& R
NOP
9 ?8 }* b, l7 G: R7 f$ G7 s MOV R2,#64H ;歌曲结束,延时1秒后继续
8 {; H! `9 j6 U' OMUSIC6:1 o% R3 n, i; \4 U0 U+ |# F
MOV R3,#00H B5 O4 K# C& s( b0 d7 V _
LCALL DEL; }( O2 m* W D( U$ y
DJNZ R2,MUSIC6% B' F' X/ {9 f9 A& ]
LJMP MUSIC0
4 t( p4 O1 m; Z( V* Q' wDEL:
% ?6 W) W+ f8 g3 }+ g NOP
4 T5 W- g7 S V6 C" U6 MDEL3:
+ p$ j) N( K2 c MOV R4,#02H+ K+ X3 d W5 v
DEL4:
% }! s* X$ R, ^ NOP4 ~3 A; F* [ U6 K5 S. O4 l( m
DJNZ R4,DEL4
4 A3 @+ P) B; k3 p NOP$ Z+ R( I$ V, J
DJNZ R3,DEL3 T: W9 i S/ O8 M, M' T: P- F* g
RET
" q( U5 {. H8 O( ` NOP1 A- U3 }! g% P" c8 n0 p
DAT:
' w5 v% Z3 k0 A. O. {6 X6 @ db 26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h1 l/ q* Q/ I0 z& g* s2 i1 z- a
db 30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h2 t' y9 T, Y8 y1 g6 @) _/ O9 C8 i$ P+ c
db 20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h% l& E9 r, f# p) ?* Y& I. {
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h" z0 m" g3 B4 W- j7 {* ?$ a
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h# \2 O' |) T; V0 X+ R6 {
db 2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h0 `- J3 c) T# m% c
db 20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h7 O. T% D `* l% E! o* ~
db 20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h0 f' [3 B+ c. e8 t0 A9 d6 ?0 F
db 20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h# M+ L. F, }/ a0 }4 [
db 20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h
1 p$ c$ K2 \3 K4 z db 18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h2 Q! G$ ]5 \0 S
db 30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h
) |( z4 u0 U* n8 T) \ db 39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h
9 F5 x b2 c! x9 ^ S db 20h,10h,2bh,10h,26h,30h,30h,80h,00H
1 K8 h: q- Z+ X. r' v r% rEND
; ?4 s G7 ?2 v音乐程序汇编代码代码2 -------------Voice1.asm--------------------------
) F6 e# F; P+ A3 O- k;标题 '八月桂花香'发声程序
. t# ?& `* w$ n1 b" W$ w0 G/ H;摘要 详见'无线电'92年3期) z* K/ J% R* u# ]) K: U
;作者 周振安/ d/ C2 j& B6 p
ORG 0000H
5 P' ~* s. K% l$ J9 b LJMP START
# A0 t6 a+ G# M/ J2 o+ [/ f3 b ORG 000BH3 \0 x$ U4 a3 D. z9 r0 [
INC 20H ;中断服务,中断计数器加1
2 [% a* e' m# |5 r7 J! B MOV TH0,#0D8H d* W+ ^3 Y& r5 q! j2 U- k
MOV TL0,#0EFH ;12M晶振,形成10毫秒中断, }5 \5 U7 j+ ?0 }" P/ d' X
RETI
4 ]; O4 u. l# V! F* m4 w3 a5 l6 GSTART: 3 _ O+ }5 {. S( C6 `* x( `6 o2 D
MOV SP,#50H7 c, z* B( F! Q6 F
MOV TH0,#0D8H- G( ?* `; h8 I1 n
MOV TL0,#0EFH
- R8 ^2 Y6 [, ^, O9 Q MOV TMOD,#01H& z! h; M$ V8 I
MOV IE,#82H. w, o- ~: X j9 G( W/ D
MUSIC0:
' R' C- [9 d$ X5 |9 Y' u9 o NOP
* n9 f n$ o6 u: _' C* A6 _& } MOV DPTR,#DAT ;表头地址送DPTR
* J, a) D/ k, v% `# C MOV 20H,#00H ;中断计数器清0
# q# v+ I0 y- \# N3 i1 c5 g MOV B,#00H ;表序号清02 D+ n: K9 ^$ j+ k, }8 |. H
MUSIC1:
2 k6 ]; |2 l2 }( K) l+ g; F1 l NOP
; v8 |7 Q9 \3 F# L+ i; J5 S CLR A
( T2 @: t0 o- g7 \/ i. n2 m MOVC A,@A+DPTR ;查表取代码
" K0 T3 z- `; P' H! g X+ z JZ END0 ;是00H,则结束, w m8 N7 }, N6 I$ n) s$ ^) C3 v3 z) N
CJNE A,#0FFH,MUSIC5
6 @: G6 I9 s. y+ K7 e LJMP MUSIC3
1 f3 q% I! C1 f2 E( ]' T* l. mMUSIC5:
6 ]7 Y! G. T# Y/ _3 v; a NOP$ U, D* q, I% l
MOV R6,A
0 O. ?" ^8 \( O INC DPTR |0 k3 ~% g$ o, r$ {4 ]. \
MOV A,B
7 e7 W$ S0 G+ A9 C1 f1 U MOVC A,@A+DPTR ;取节拍代码送R7. U0 E9 U2 ~" [) j1 p: m8 `
MOV R7,A
$ d O$ R2 C. d1 w' k SETB TR0 ;启动计数
; ^) C9 `; I7 hMUSIC2:
' B1 j: L( ~4 _1 |6 Y NOP
) C8 w" O4 _# w1 P' W CPL P1.0
) V V* v2 y) S8 ]+ k0 D MOV A,R6# `: Q+ l- m4 n
MOV R3,A4 ?- Q0 u. q5 H- r9 f2 q
LCALL DEL; s! k# G8 Y' d+ V& F. J( \
MOV A,R7, m1 Q+ k( {3 x: q+ q
CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否?0 Q- \2 t) {$ W; d( y
;不等,则继续循环
* o& T9 n, A, m MOV 20H,#00H ;等于,则取下一代码6 G* ~" N% R& g/ F, C* j. ~" G3 m) D9 H+ i
INC DPTR* b1 {- S& a# P% P
; INC B+ c) e( K+ h, t
LJMP MUSIC1; H$ x% S7 ^1 s% h( X& Q
MUSIC3:
) M$ T, C# o/ ^- C7 Z' q1 b, z NOP
% C0 \5 l/ X( y CLR TR0 ;休止100毫秒8 V. @* D3 q. [
MOV R2,#0DH
, i7 `# b: A" OMUSIC4:
% u5 N& w; f: N; d E$ U- | NOP
5 m# n4 s+ Z* D$ V" g8 E$ D MOV R3,#0FFH7 e. w0 b2 }! H1 y2 q( Y
LCALL DEL
; e0 Q1 a7 `; B% i4 R4 M c DJNZ R2,MUSIC4; v5 Y8 i0 K% Q" k* F1 r9 G
INC DPTR) L. W# B5 t% @# E" ?$ G
LJMP MUSIC1
6 d1 b2 f4 [, u& V7 R& V8 ^END0:% {. R9 e; X6 Z' Q% i
NOP) Q9 R$ G' z+ j. n$ {
MOV R2,#64H ;歌曲结束,延时1秒后继续
+ i& `# [$ o- Y" @MUSIC6:
3 X8 d5 h1 F# I, F MOV R3,#00H
1 \" g: p) D! ?! ? LCALL DEL
8 }4 h+ U5 V% A+ m. T DJNZ R2,MUSIC6
: h6 W) m& p/ a+ q8 W( E LJMP MUSIC0
( J A0 r' M4 ?) yDEL:* ?. n1 b7 v' [( ^/ M0 O
NOP
7 u2 N+ n, W, vDEL3:
( h0 P) |/ h6 ~3 l, _, b MOV R4,#02H
) m- `# H6 V3 B5 T8 g0 J% J+ j3 ZDEL4:
6 K" a( I, @* g( \: H/ j NOP; E H( y7 ~$ Q' z& F6 K
DJNZ R4,DEL4
# v" H) d5 P) C& k NOP
( U- [8 m* n* F6 Q DJNZ R3,DEL3
) S! g6 b" M+ p; t" c- [ RET
7 y4 I4 e" Z# J7 h4 z NOP' t5 ?5 `" I( Y' u- d! K/ ^5 k
DAT:
8 d' c( v( X. F. ^ DB 18H, 30H, 1CH, 10H/ |, y0 s+ s% T
DB 20H, 40H, 1CH, 10H ; N# @5 @4 E4 B% n
DB 18H, 10H, 20H, 10H
; v9 ^" @& M8 O DB 1CH, 10H, 18H, 40H5 ?% B. p0 W# v3 L3 A$ a
DB 1CH, 20H, 20H, 20H8 c, V! n( \5 m& q
DB 1CH, 20H, 18H, 20H # j& |3 [) y6 J$ {2 ^, |% m" x
DB 20H, 80H, 0FFH, 20H
, a7 O' B D* ~% {5 N8 l! c DB 30H, 1CH, 10H , 18H! c8 U/ |; x# g' V9 _3 _% }+ u$ T& G
DB 20H, 15H, 20H , 1CH: ^! A) I6 q0 Q3 _
DB 20H, 20H, 20H , 26H
! |; C) `1 w# x DB 40H, 20H , 20H , 2BH
; N( A% }2 c) d* Q K! N DB 20H, 26H, 20H , 20H / W8 d. k) I" P8 Z
DB 20H, 30H , 80H , 0FFH9 V7 r8 E% v' N
DB 20H, 20H, 1CH , 10H
' J- n( H' v. L# [4 ? DB 18H, 10H, 20H , 20H+ h9 w+ N6 L4 Z
DB 26H, 20H , 2BH , 20H6 l6 T4 R- K4 y" F
DB 30H, 20H , 2BH , 40H
: Q7 o& ?4 j" ] Z, E9 p. l DB 20H, 20H , 1CH , 10H" {* l+ e: B% h2 I# {+ p. b
DB 18H, 10H, 20H, 20H
) B! Q. z3 h2 ]/ \1 F DB 26H, 20H , 2BH, 20H
0 F; ?& ^; l7 {" F# s0 V DB 30H, 20H, 2BH , 40H5 W6 S1 V4 y, F5 f4 d
DB 20H, 30H, 1CH , 10H
5 j( \5 \( Q. c' P DB 18H, 20H , 15H , 20H" \5 D) j% w+ Y) ]6 J9 M
DB 1CH, 20H , 20H , 20H
$ v8 g7 d; A9 b( p* N8 a$ \ DB 26H, 40H, 20H , 20H
" m3 z+ y; _6 n- w, n8 e- | DB 2BH, 20H, 26H , 20H 1 H5 u. Y2 c$ a# m* j4 ~& x* O
DB 20H, 20H, 30H , 80H D3 t* ^3 @* f. ~) K2 S7 b
DB 20H, 30H, 1CH , 10H
3 D; ?! }& O1 K h7 y( h DB 20H, 10H, 1CH , 10H
0 A8 H1 L1 J6 E7 R DB 20H, 20H, 26H , 20H6 }+ Y; R- Y) `/ _& l) V' F
DB 2BH, 20H, 30H , 20H1 W5 y6 e1 E4 O4 N1 D7 W
DB 2BH, 40H, 20H , 15H4 a7 Y2 C k7 }- d
DB 1FH, 05H, 20H , 10H8 m9 y* f, ~* ]) ]) G- I
DB 1CH, 10H, 20H , 20H0 s; F" u! F' C; I0 A& I
DB 26H, 20H, 2BH , 20H
+ S0 O. Z& _8 K h# M' Q DB 30H, 20H, 2BH , 40H
; p& V8 H. {1 m DB 20H, 30H, 1CH , 10H( A1 D; W+ V3 n* C* B
DB 18H, 20H , 15H , 20H
{9 u X4 z: ~$ w h' V; ~9 \ DB 1CH, 20H , 20H , 20H. Q, L t G! w: I3 z
DB 26H, 40H, 20H , 20H
3 X k S5 @* K4 b0 v- n DB 2BH, 20H, 26H , 20H% o. k8 d1 Z+ k5 U! ~5 ?9 [# m9 }
DB 20H, 20H, 30H, 30H 8 i2 m( d( C. V. J* S
DB 20H, 30H, 1CH, 10H
7 g. _% ?2 L9 z. \$ l6 v; R DB 18H, 40H, 1CH, 20H
( X5 G1 P5 a. j DB 20H, 20H, 26H, 40H! O" ?0 i) m5 u9 v1 g0 ]
DB 13H, 60H, 18H , 20H
& r8 k7 P: j0 U4 e: G3 j1 ] DB 15H, 40H, 13H , 40H" T" j) V" s9 `
DB 18H, 80H, 00H
( u% X- f& p8 y. ^8 Oend- z; q, g+ B1 g) T
|
|