|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
利用单片机(或单板机)奏乐大概是无线电爱好者感兴趣的问题之一。本文从单片机的基本发间实验出发,谈谈音乐程序的设计原理,并给出具体实例,以供参考。
2 `3 c9 o& M( `$ {9 f8 j单片机的基本发音实验
$ X8 V) s# `. x. X% k我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单处机某个口线的“高”电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调。
) I" j9 Q; L% E% E/ b; f" z例如,要产生200HZ的音频信号,按图1接入喇叭(若属临时实验,也可将喇叭直接接在P1口线上),实验程序为:+ G" r' ^/ x7 R: i; G$ ~
其中子程序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能奏出音符。仅这还不够,要准确奏出一首曲子,必须准确地控制乐曲节奏,即一音符的持续时间。+ ]# I1 I7 q" D2 H
音符的节拍我们能用定时器T0来控制,送入不一样的初值,就能产生不一样的定时时间。便如某歌曲的节奏为每分钟94拍,即一拍为0.64秒。其它节拍与时间的对应关系见表2。( _& T0 V S7 U+ t5 O( {: ?* p3 {
但时,由于T0的最大定时时间只能为131毫秒,因此不可能直接用改变T0的时间初值来实现不一样节拍。我们能用T0来产生10毫秒的时间基准,然后设置一个中断计数器,通过判别中断计数器的值来控制节拍时间的长短。表2中也给出了各种节拍所对应的时间常数。例如对1/4拍音符,定时时间为0.16秒,对应的时间常数为16(即10H);对3拍音符,定时时间为1.92秒,对应时间长数为192(即C0H)。( M9 R6 F* H4 o; [; y
我们将每一音符的时间常数和其对应的节拍常数作为一组,按次序将乐曲中的所有常数排列成一个表,然后由查表程序依次取出,产生音符并控制节奏,就能实现演奏效果。此外,结束符和体止符能分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生对应的停顿效果。为了产生手弹的节奏感,在某些音符(例如两个相同音符)音插入一个时间单位的频率略有不一样的音符。
. F9 A" G$ S! _+ [7 u% K$ L下面给出程序序清单,可直接在TD-III型学习机上演奏,对其它不一样型号的学习机,只需对应地改变一下地址即可。本程序演奏的是民歌“八月桂花遍地开”,C调,节奏为94拍/分。读者也能自行找出一首歌,按表1和表2给定的常数,将乐曲翻译成码表输入机器,而程序不变。本实验办法简便,即使不懂音乐的人,将一首陌生的曲子翻译成代码也是易事,和着机器的演奏学唱一首歌曲,其趣味无穷。
/ E) ~$ x* U% H( O程序清单(略,请参看源程序的说明)。
, `2 ?" ?, h3 m程序框图如图2所示。1 p' Q, `; T5 m; y4 ~
* U4 M; _1 U' W* n3 r
<单片机音乐程序的设计图>; ?, D" o/ b Y+ O* }5 m4 J
! Y; s+ M @" _+ \3 J硬件连接说明: ~: {1 ^' A: v( z8 a. M
随便找一个仿真机或者什么单片机实验板,只要能工作的就行,将程序输入,运行,然后找个音箱(你计算机旁边应当就有一对吧)拨出插头,插头的前端接在P1。0上,后面部分找根线接单片机的地,就应当有声了,然后怎么改进硬件连接就是你的事了。。。。 Y/ c. ~9 y& Z+ u" @
音乐程序汇编代码代码1 -------------Voice.asm--------------------------
$ o* B$ q6 H/ U/ B' } ORG 0000H
$ a0 D& l' V S4 `, F4 X4 l* I LJMP START
$ H; t- y; x% k ORG 000BH
/ m( D7 g. G# \; e INC 20H ;中断服务,中断计数器加18 w& |( o' v0 Z5 l
MOV TH0,#0D8H
6 j, ]* y4 K5 K# v MOV TL0,#0EFH ;12M晶振,形成10毫秒中断
" |& u; [, k7 ^6 V RETI
1 K5 U& N1 p9 \6 w1 r* G1 wSTART:
& n' }6 p9 j/ ~! h MOV SP,#50H
9 O$ I4 H+ g% f1 Y0 R MOV TH0,#0D8H
( g' l1 c, |. B) @/ L" ~- I: L MOV TL0,#0EFH9 c: ?% S0 F" Q# A& u
MOV TMOD,#01H
1 ]7 O5 v2 z9 y6 W9 B: F( G MOV IE,#82H" a0 c7 ]5 [8 ^/ W
MUSIC0:
0 A, E0 k6 {6 G NOP. x Y6 k% { m" }, K
MOV DPTR,#DAT ;表头地址送DPTR
G4 g! p# P6 |! X* R MOV 20H,#00H ;中断计数器清01 X- h+ `. e- W, L5 ]1 x
MOV B,#00H ;表序号清0 i1 ~. W5 X7 \# @2 R
MUSIC1:, _9 P% ^, O! q6 P8 t
NOP
: G, o- k2 B/ m5 e9 A( r CLR A
9 T7 w, P% H+ [ @+ l, B7 H# @9 { MOVC A,@A+DPTR ;查表取代码
/ k, c2 p+ J6 Y2 B* s7 h/ n JZ END0 ;是00H,则结束
/ ?3 T3 H: E D CJNE A,#0FFH,MUSIC5
3 j3 o5 m+ _7 P, s2 k. |4 ~" q LJMP MUSIC3
$ I# E: u6 m0 S- \MUSIC5:
; M( J$ K& v/ l" I NOP
9 z4 v6 s, J& z* d2 E MOV R6,A& @" t' e p# P
INC DPTR9 z/ T3 E5 H2 [$ m. m) |' H9 J" M
MOV A,B0 k" ~, ]3 x/ r
MOVC A,@A+DPTR ;取节拍代码送R7
0 U* x2 B8 K& {3 G9 T MOV R7,A
0 A+ R4 Q& \3 a# @& y$ k2 J# W SETB TR0 ;启动计数
: K( U7 z; A; G5 M0 @/ gMUSIC2:% ?3 s ]$ A6 D4 q. `7 h
NOP
$ z8 P& l+ j6 b, l CPL P1.0 h) ~: [/ `- P- J+ e/ b3 q
MOV A,R6# ~1 D; A6 m4 {: A1 {0 T. x
MOV R3,A
" D k+ K1 H1 Q8 k LCALL DEL
- V6 s: f. a# b" y2 c, w MOV A,R7; f. v, p" J" h9 k8 M7 u
CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否?
- K+ L4 o# x! e l2 k; T ;不等,则继续循环
1 c/ O- l* B4 O' n, g% y( I MOV 20H,#00H ;等于,则取下一代码
, K N6 t H7 G, b: r INC DPTR
4 a$ O, ~ P2 m- p) B% }; INC B& c3 o, n% n( |
LJMP MUSIC1
6 V" N$ t5 G$ @MUSIC3:0 I% h. I0 U: }, s: {& p1 |( _
NOP! H1 |9 j! T/ X$ M
CLR TR0 ;休止100毫秒
! q" a3 K( x5 q7 G z/ G MOV R2,#0DH3 d5 o% A4 J) ^8 P
MUSIC4:2 r" c) |( c# @0 o
NOP
& l( d# D6 B H+ i MOV R3,#0FFH. R: v% v0 [5 t, t7 c
LCALL DEL
; |3 S: j. L+ q DJNZ R2,MUSIC42 D3 w. n* E! j+ h- \# c
INC DPTR
3 x S, _8 J/ b9 g, B! ~/ Y6 V LJMP MUSIC1
9 R3 g) F, l4 YEND0:8 H9 I0 }3 m- r& B( T; P
NOP
5 L- }& |9 S9 \: @" L MOV R2,#64H ;歌曲结束,延时1秒后继续
; {/ _4 O. F& Y/ P3 @% UMUSIC6:3 e& U; E8 Q# @; u! {, M K
MOV R3,#00H# t: K u" D) ^# I+ M% U8 W
LCALL DEL& Y2 W1 d4 Z3 q5 @( W
DJNZ R2,MUSIC6
. M( z6 O( b0 r. |5 _ n LJMP MUSIC0
- p/ L% s6 Z, y7 O! D# VDEL:
! V7 q/ {+ ~& Q2 N! ]: ^6 n NOP
5 @/ v) Q$ P2 C! I, SDEL3: " M/ P! K Q+ \7 _5 z# K2 n/ D' ], `
MOV R4,#02H5 R4 }* a& ^9 H J7 h
DEL4:
6 j$ V( S3 G5 P0 W: r: n, K0 ] NOP% S: R; {# X- T; i( y
DJNZ R4,DEL4: A: b/ |& s% n7 g4 ?1 x
NOP
4 v& G' c8 w& x- n DJNZ R3,DEL3) P0 D9 F0 h2 a4 L% o# U/ j& z* }
RET& Y" v2 r6 s. w& I0 G' z% w
NOP. | N$ X3 Y: ^ i- _# Z
DAT:- q8 m$ @+ t: O; [" U2 Q7 T6 W
db 26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h
) O P. Y/ h) W4 N8 M db 30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h
( ] O) W8 q O* U3 k db 20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h
8 P# a @- o# q db 30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h; [3 C( i% J3 x- e# H) j& W
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h- V3 _( m( c1 l% A: n" ^ }
db 2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h
" l( o' o, ?1 u- C db 20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h
( A& G) t! T0 {5 V6 `) F8 J db 20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h0 B$ C. n& H+ ^. n+ M& S, v) k
db 20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h
$ Z) F4 |- x0 p! U4 v* B$ @ l db 20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h
0 }( \! r. G1 x$ Q R2 y db 18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h3 k2 p' ]' c! J8 x* F
db 30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h
& ^2 c# r5 u7 l h db 39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h
: X! o" x- W* X2 E db 20h,10h,2bh,10h,26h,30h,30h,80h,00H
; {1 m0 N! Y8 g, @ ~END
; [& [# ~* X2 o) }& Z* x: K* k" A音乐程序汇编代码代码2 -------------Voice1.asm--------------------------
1 J5 Z2 C; f+ {3 k3 K7 ?: ^! ?;标题 '八月桂花香'发声程序 5 s1 @8 S. C/ ~7 @- V U
;摘要 详见'无线电'92年3期7 w! a" U# R6 Q2 J# c
;作者 周振安: Z- F% M* y; r
ORG 0000H
1 Z! e( O; k) y1 I LJMP START
0 H1 M- Z' P8 E1 w ORG 000BH) {( e9 w- ~8 N9 D# F0 W
INC 20H ;中断服务,中断计数器加1
1 C3 {2 s6 C! p; ?" s* ]3 P$ f& N MOV TH0,#0D8H
2 g M/ l( T1 l1 i) {& [3 h MOV TL0,#0EFH ;12M晶振,形成10毫秒中断
' s- c0 r/ z7 I) W* ^2 Y RETI0 m2 {2 A9 ^! i0 w( S( P* B. |
START:
3 w9 J6 w; N# o1 F d" R MOV SP,#50H
* w; @' i3 m* s" V6 ^, g MOV TH0,#0D8H. i% F4 y& t* o3 ` M" {; |
MOV TL0,#0EFH# V. U9 t; J1 c) n2 n' v+ _! p
MOV TMOD,#01H
* }: I [+ d. |9 T9 y" j MOV IE,#82H
# v. B2 q+ m5 ^+ a0 F7 ?MUSIC0:1 v' c5 g, J j5 Y8 ^
NOP! w- U1 M6 _3 a0 W# ~# e
MOV DPTR,#DAT ;表头地址送DPTR
. n6 ]9 c- G C) f% u& _ MOV 20H,#00H ;中断计数器清05 @! U0 M; | E3 B" ~7 |4 j+ e
MOV B,#00H ;表序号清0& k% b: m4 K+ M4 U# i) O" M
MUSIC1:
# T$ \6 F" R+ G& E& L7 \* P2 Z NOP7 c. R! j2 M7 g! R1 [
CLR A ]6 G6 e5 P5 \3 V* a8 }6 z$ J4 U! U. s
MOVC A,@A+DPTR ;查表取代码4 B, L) a8 f6 ^% U! y
JZ END0 ;是00H,则结束/ X3 M+ u; B. L4 f: ^+ s/ X8 Z4 a
CJNE A,#0FFH,MUSIC50 {; G. q6 t/ \+ g0 D
LJMP MUSIC32 e# V& M7 q. i+ g
MUSIC5:" n% q: J; H, i3 U: ?/ u9 \% [
NOP
! A5 E. B( s/ U$ q6 N MOV R6,A
4 c1 }, v/ T1 v/ E: z4 _ INC DPTR. l( V- E, M6 z2 S5 X
MOV A,B
1 S1 b4 v5 }0 R' j1 F4 l$ l, @ MOVC A,@A+DPTR ;取节拍代码送R7
1 L. i2 D) t9 N MOV R7,A
; ~8 h2 G/ [8 S* Z# m SETB TR0 ;启动计数9 z) e8 s w0 N T" q
MUSIC2:
' ], a( S7 [1 S/ B) ~ NOP
$ W- y1 K5 ^6 r. h1 Y CPL P1.0: r9 o# P( T: Z% K$ L7 n
MOV A,R6
, d+ k' W1 L2 @( ^6 s2 L3 _ MOV R3,A# ]) o) b. g! n" F& Q# C1 M- r
LCALL DEL& E4 N8 S0 l: A+ v$ B: p1 m
MOV A,R7
$ j% U6 X% c- M# f3 J( ~, s6 J CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否?- A4 g' |7 {* r
;不等,则继续循环! P- B8 ^/ w Q y+ ^; |+ V
MOV 20H,#00H ;等于,则取下一代码
8 a3 a0 p3 K( O5 ~" l) l: T. p# L' q, i INC DPTR
5 s, z8 R; c" i- i/ V7 w/ t; INC B
0 j& m# k" E! o2 ?8 J4 ?# y LJMP MUSIC1( r- o- P' A, G* b
MUSIC3:/ S h' A! `3 Z' Y% j
NOP
; [1 j! Z- I0 S CLR TR0 ;休止100毫秒2 q; |% t1 }# ]. K
MOV R2,#0DH
3 n- q- A9 Z$ i0 MMUSIC4:0 M! h: E: |6 q, {0 T( z
NOP0 s* S; b+ \; F2 U. Z. `
MOV R3,#0FFH {/ L9 U* Y/ u& _2 i, z4 I4 p
LCALL DEL* c# U% P1 T2 X" Z. g; g4 o. E' b9 i9 n
DJNZ R2,MUSIC4
' r& A* o# O9 b/ [, P0 W INC DPTR
8 B" M, ^+ v4 j2 a" w LJMP MUSIC1
$ |8 w- i* h( T( HEND0:* q* q( |1 W3 A- [) d9 a- ?
NOP$ j$ E" ^ \/ Z# O* O- ?
MOV R2,#64H ;歌曲结束,延时1秒后继续
2 j E$ a+ K2 e( o( ^MUSIC6:
$ P- u. r* |% t+ J* D1 ` MOV R3,#00H
# m/ o" w! p, ?. j" v4 \, R LCALL DEL
" C! P8 g- e$ h% s* B0 @! }# f' \ DJNZ R2,MUSIC6
6 l: ]; c: W8 Y$ k9 |9 T LJMP MUSIC0) @. _1 i+ q# `3 g' M( v& k9 y
DEL:
" b0 c" A3 F9 \5 L NOP
1 C( {7 H3 l0 V& D0 FDEL3: 4 [8 z+ y+ P5 r5 O' l
MOV R4,#02H
$ I5 u4 n* ?. }) z8 \8 h- ADEL4: 6 E$ h% x L7 \! o9 l4 \
NOP- {1 T* p; M, g% c3 U1 F
DJNZ R4,DEL4
6 S5 H+ r- {9 ] NOP! C, M, ], n! _
DJNZ R3,DEL3
- h. l; {: M4 H. k1 a# [7 H RET
" d" h/ @7 O) Z) B% Q! F NOP
. Q6 n9 Y3 f6 M. eDAT: , |' k2 A5 r' l2 J; z
DB 18H, 30H, 1CH, 10H( F% p) M: X# B- A) ^; H+ j) a
DB 20H, 40H, 1CH, 10H
2 p3 J1 E) H! s DB 18H, 10H, 20H, 10H
0 G: R+ B/ R5 q" w5 U: X5 a DB 1CH, 10H, 18H, 40H' c0 i8 l1 }* b$ L0 [
DB 1CH, 20H, 20H, 20H
: _0 n& U, p1 i6 {3 h DB 1CH, 20H, 18H, 20H
' x2 C( R U% r- W DB 20H, 80H, 0FFH, 20H" W5 Q3 t( @* C" o
DB 30H, 1CH, 10H , 18H! v$ ^+ e( w3 o
DB 20H, 15H, 20H , 1CH4 {2 ?0 i2 S4 V' q; }7 j# h$ U, ^4 u
DB 20H, 20H, 20H , 26H
% }8 @/ P2 C8 x! D# a DB 40H, 20H , 20H , 2BH
' Y# g/ B V' C) d DB 20H, 26H, 20H , 20H ( x- _7 u0 b& u/ [! |' o
DB 20H, 30H , 80H , 0FFH
( I) h# J6 _3 U( K4 }8 M8 \8 k/ f DB 20H, 20H, 1CH , 10H/ F) R* f4 G' B2 t' P6 Y
DB 18H, 10H, 20H , 20H
/ T9 m1 t/ x9 k DB 26H, 20H , 2BH , 20H S) g# @. i) z/ P6 O1 a/ ~6 Z
DB 30H, 20H , 2BH , 40H3 O1 \6 \$ K/ O8 O
DB 20H, 20H , 1CH , 10H' m! @/ A4 ^. l" w: F' ?" j
DB 18H, 10H, 20H, 20H
& A7 K1 G1 t0 y9 y DB 26H, 20H , 2BH, 20H
% V7 J0 R# j+ v4 O- n5 | DB 30H, 20H, 2BH , 40H& C' X) t7 r, n M2 @
DB 20H, 30H, 1CH , 10H
3 \) j) n% V' ~6 i/ R; r' Z DB 18H, 20H , 15H , 20H( ^9 b% j, v# h4 _
DB 1CH, 20H , 20H , 20H7 f# F+ o! c. w6 X7 G1 b
DB 26H, 40H, 20H , 20H 9 ^& H$ C, C2 }7 f
DB 2BH, 20H, 26H , 20H
+ f# P* c! h; }* f& | DB 20H, 20H, 30H , 80H
+ D5 ^* s' i( `% Z4 q DB 20H, 30H, 1CH , 10H
1 z: |/ |+ I! u! V+ {. g/ L1 g2 O DB 20H, 10H, 1CH , 10H
; p& N4 f( o" z, O' j8 `, B7 h( { DB 20H, 20H, 26H , 20H
( W# p7 ?: ]4 J; ^3 o DB 2BH, 20H, 30H , 20H
0 g9 _0 g$ Z; u/ R n DB 2BH, 40H, 20H , 15H. x u! _5 \" J( }- R( B
DB 1FH, 05H, 20H , 10H5 u. F( S; @' h; p3 ?. \
DB 1CH, 10H, 20H , 20H
& `5 Q4 }3 ^3 w& u# M5 r DB 26H, 20H, 2BH , 20H
0 z; [- A: O" h& g( ^ DB 30H, 20H, 2BH , 40H# U9 f: |3 Z3 X1 @- {
DB 20H, 30H, 1CH , 10H# F. i! w& ]" G# d; D4 K- ~
DB 18H, 20H , 15H , 20H
/ H' w+ y% {3 B, A9 K$ q' j. @ DB 1CH, 20H , 20H , 20H: ? f, P, _; H' b2 B4 L; N, o l
DB 26H, 40H, 20H , 20H
7 e$ d. f9 h" p, h DB 2BH, 20H, 26H , 20H1 k. _; O3 }4 j" x" ~
DB 20H, 20H, 30H, 30H
" x1 L# ]! i/ j. H$ V; N, O DB 20H, 30H, 1CH, 10H
) q& Q8 S/ k. x4 @% f$ R" D DB 18H, 40H, 1CH, 20H' Z, y2 S9 T/ i( \) d1 C
DB 20H, 20H, 26H, 40H/ \: j$ o3 w( \/ W6 H2 w& l% B5 ^
DB 13H, 60H, 18H , 20H
C: |& ` F. U1 {# |& P DB 15H, 40H, 13H , 40H0 E+ {6 x3 ~0 [; |" @, C2 L3 A: I
DB 18H, 80H, 00H
( k C8 _2 T) z# Q. Fend
+ ^5 r3 q- M+ l# D' g( U- T& `: P |
|