资源描述
音乐程序的设计原理和程序如下:2 Z& P/ s# L! C; I! / r7 p, ?6 V设计原理7 l9 8 R! ?! B3 T1 - J! Z 总体原理:- x9 L$ P* S3 c# P! 8 a 乐曲中不同的音符,实质就是不同频率的声音。通过单片机产生不同的频率的脉冲信号,经过放大电路,由蜂鸣器放出,就产生了美妙和谐的乐曲。# a& Q; m+ C. g# g2 C 单片机产生不同频率脉冲信号的原理:/ G& p8 r p7 L V$ k t2 H0 T1)要产生音频脉冲,只要算出某一音频的脉冲(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期的时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期的时间再对I/O反相,就可以在I/O脚上得到此频率的脉冲。: o5 _* o T5 3 X) L2)利用8051的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产生不同频率的方法如下:+ O& O! 0 M1 p0 u, Y2 ? 例如,频率为523Hz,其周期天/523 S=1912uS,因此只要令计数器计时956uS/1us=956,在每计数956次时就将I/O反接,就可得到中音DO(532Hz)。 1 G2 5 e3 o7 V! B. M计数脉冲值与频率的关系公式如下:% 0 l+ ! f5 |5 |0 n+ N=Fi/2/Fr ) f1 Y9 |, ?7 ) J(N:计数值,Fi:内部计时一次为1uS,故其频率为1MHz,Fr:要产生的频率 )9 Kh8 l5 / b 其计数值的求法如下:/ Q: 4 ! a# W. L6 K GT=65536-N=65536-Fi/2/Fr* N+ g1 y# d& l6 F; N7 L- T计算举例:9 w; W2 Q3 7 X1 X4 T0 J设K=65536,F=1000000=Fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的计数值。6 kQ# o% a. _T=65536-N=65536-Fi/2/Fr=65536-1000000/2/Fr=65536-500000/Fr9 K& ) B0 w- - H- S d低音DO的T=65536-500000/262=636279 V4 f; % U5 e4 Z) K7 中音DO的T=65536-500000/523=64580; t9 g/ x c0 s, r高音DO的T=65536-500000/1047=65059! z Q3 H2 q; z9 e C调个音符频率与计数值T的对照表如下表所示:- r* X# t! B D, r Z, G4 u( : X# H) x( W. 1 H# y0 K3 W表9.1C调各音符频率与计数值T的对照表+ X! w- / 5 d5 s音符 频率(Hz) 简谱码T值 音符 频率(Hz) 简谱码T值- c/ X; c+ w3 t& Z; x9 E低1DO 262 63628 #4FA# 740 64860f: Y2 y4 X3 K* i% 3 w4 L0 Z#1DO# 277 63731 中5SO 784 64898$ a. t0 W) |. _7 m& D低2RE 294 63835 #5SO# 831 649237 z% W# L6 d9 a1 Y/ a! D#2RE# 311 63928 中6LA 880 64968 u9 q5 L! # R8 4 l( h低3M 330 64103 #6 932 64994L4 d7 : 3 K! S: q, A低4FA 349 64103 中7SI 988 650301 B, ?& - 8 AC#4FA# 370 64260 高1DO 1046 65058* B& , . U3 x低5SO 392 64260 #1DO# 1109 65085) D/ D I5 W* Q J#5SO# 415 64331 高2RE 1175 65110; N; W2 G1 I, r+ h6 低6LA 440 64400 #2RE# 1245 65124. , r3 x! 6 z0 W#6 466 64463 高3M 1318 651576 R, c# k# i; x) N低7SI 494 64524 高4FA 1397 65178; K/ jp- D4 W中1DO 523 64580 #4FA# 1480 651986 9 w; f h( _+ J7 J/ H: V# Z# F, h7 W! cD 每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,下表为节拍码的对照。但如果1拍为0.4秒,1/4拍是0.1秒,只要设定延迟时间就可求得节拍的时间。假设1/4节拍为1DELAY,则1拍应为4DELAY,以此类推。所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数,如下表为1/4和1/8节拍的时间设定。 1 G2 Y: 2 u# b表9.2节拍码对照表# 1 L& z9 ?* e$ . Y; N1/4节拍 1/8节拍0 W9 s5 E5 Il8 g& _2 T9 V节拍码 节拍数 节拍码 节拍数: R8 % _0 T W; u! Z6 S, n) s1 1/4拍 1 1/8拍5 A. H: v, e( M1 s* U7 I2 2/4拍 2 1/4拍9 b( F- m5 O+ J/ x3 3/4拍 3 3/8拍* ( T$ p1 a6 W! D7 B! A B4 1拍 4 1/2拍- m# c) Y$ q4 O8 l5 1又1/4拍 5 5/8拍- i2 . 7 B8 0 N6 1又1/2拍 6 3/4拍9 t6 K4 p) V/ O, P5 lM, _7 1又3/4拍 7 7/8拍6 3 2 9 n+ c8 2拍 8 1拍) a2 U2 C, C- D# 9 2又1/4拍 9 1又1/8拍8 - Y; / q X+ yA 2又1/2拍 A 1又1/4拍 Q( 2 |# v) h* N1 a8 S( aB 2又3/4拍 B 1又3/8拍3 b( ! u( g$ R+ p0 g: B6 hC 3拍 C 1又1/2拍2 j9 b( I; k1 K! cD 3又1/4拍 D 1又5/8拍- ( g( c! - R3 A; gE 3又1/2拍 E 1又3/4拍; D. 5 e! b; J KF 3又3/4拍 F 1又7/8拍) c1 U; V0 p& m6 D9 Kq表9.3 各调节拍的时间设定表$ + 6 R. t6 E9 0 q1/4节拍 1/8节拍+ o/ Yn5 Q4 eU& |$ k5 m曲调值 DELAY 曲调值 DELAY8 * U! M W# J5 p8 S+ c调4/4 125毫秒 调4/4 62毫秒4 c9 - n O! y: TF& IC# a调3/4 187毫秒 调3/4 94毫秒& S8 e9 r# n$ f* Q/ K9 Y. b8 调2/4 250毫秒 调2/4 125毫秒$ v7 Q8 e. z5 W! y) 6 b* I 建立音乐的步骤:! K t5 C% Z1 n0 G0 v- R7 W 1)先把吧乐谱的音符找出,然后由上表建立T值表的顺序。+ N e; K) * |4 W; |+ F 2)把T值表建立在TABLE1,构成发音符的计数值放在“TABLE”。! w, D+ ! p5 k- p. N3)简谱码(音符)为高位,节拍为(节拍数)为低4位,音符节拍码放在程序的“TABLE”处。+ o) a! 0 F) f; o/ G4 _! b6 u1 B5 X表9.4简谱对应的简谱码、T值、节拍数- C5 |5 ) C6 K3 L0 Z! X简谱 发音 简谱码 T值 节拍码 节拍数: F$ o+ B8 f J2 u, e: % f5 低5SO 1 64260 1 1/4拍0 O; k5 x. U0 K+ V! y6 低6LA 2 64400 2 2/4拍5 T0 G% v: g; J nY+ Z7 低7SI 3 64524 3 3/4拍- r* S7 q E, Z U9 ( z7 I1 中1DO 4 64580 4 1拍! l- |. v0 P. m2 N/ - ! q; E, 2 中2RE 5 64684 5 1又1/4拍! G+ f5 k4 ( Z/ X7 K) * 3 中3M 6 64777 6 1又2/4拍. E p H) es4 中4FA 7 64820 7 1又3/4拍q p& I4 yh5 4 * t9 Z. 5 中5SO 8 64898 8 2拍: y4 J/ m, 2 _& Q: u6 中6LA 9 64968 9 2又1/4拍( _6 Y6 G5 e2 K7 中7SI A 65030 A 2又2/4拍/ y: o% ! n8 p9 0 F9 y1 e9 T1 高1DO B 65058 B 2又3/4拍) H) & b 4 P 2 A7 U1 F B2 高2RE C 65110 C 3拍* n, Z# P( W3 J5 F) q, * C J3 高3M D 65157 D 3又1/4拍2 z$ p3 W3 j6 EW- 5 _5 y4 高4FA E 65178 E 3又2/4拍1 e2 c5 x5 Z+ O0 D$ o- c5 高5SO F 65217 F 3又3/4拍8 b$ 6 ?% - 不发音 0 5 G6 K; E; |1 q7 n* f% J, y T0 Y* A1/4拍的延迟时间=187毫秒8 t: e, v4 f) g- W nDELAY: MOVR7,#2. nv8 0 Q; g; d) fD2: MOVR4,#1874 ?1 ?! 0 S: l% e2 E5 V0 G0 T9 uD3: MOVR3,#2480 E# Y g# N7 j; lDJNZR3,$0 t! j$ T. W6 B! p/ oDJNZR4,D38 a5 r3 k4 M5 H9 y5 ) q$ KDJNZR7,D2# _/ G* T, d1 P( ) J/ H. Z& GRET5 A7 m3 z) H0 R) T9 h9 d( V4程序范例3 N. O& BU1 k: j7 ORG 0000H ;主程序起始地址% |, d x7 j% l% L, R( T7 oSJMP START ;跳至主程序, x. ?6 f, C- Q% z0 Z* v( T! BORG 000BH ;TIMER0中断起 始地址i1 o7 X, V% 7 1 g LJMP TIM0 ;跳至TIMER0中断子程序9 9 ?s. n5 v8 D b3 lSTART:MOV TMOD,#01H ;设T0在M1 C - d/ x$ dq MOV IE,#82H ;中断使能% z; o9 q K, K I. SSTART0:MOV 30H,#00 ;取简谱码指针! u; f S& k+ bNEXT: MOV A,30H ;简谱码指针载入A2 e. F ! - v# W) N% MOV DPTR,#TAB ;至TAB取简谱码! D! X! ( r9 e, s0 . LMOVC A,A+DPTR ;* 4 g V. W2 r5 y& ?* I* d0 c& n MOV R2,A ;渠道的简谱码暂存于R2- O w3 , d* b % G0 U JZEND0 ;是否渠道00(结束码)% r h o+ y1 9 c ANLA,#0FH ;不是,则取低4位(节拍码)2 g R& G m( w* T MOV R5,A;将节拍码存入R5. E7 R2 c! 1 o8 Y2 y+ F U MOV A,R2;将取到的简谱码再载入A+ . + y7 T0 l0 k1 A; F5 SWAP A ;高低4位交换m: u; I! + u5 m lW ANLA,#0FH;取低4位(音符码)% M6 H; J e6 m9 e JNZSING;取到的音符码是否为0? x. A- k% C% Z1 t2 e v! r9 P1 o* D, z CLR TR0 ;开始,则不发音! L- T5 , P2 k F; n SJMP D1 ;跳至D1# U 9 ) A: 3 / jSING: DEC A ;取到的音符码减1(不含0)5 e( g/ a+ C& h2 Z- l, b MOV 22H,A;存入(22H)5 2 _% K% O Z1 RLA ;乘23 l- t7 l5 u: O+ p MOV DPTR,#TAB1 ;至TABLE1取相对的高位字节计数值. n8 e0 , Q0 t6 E W |$ u: J MOVC A,A+DPTR ;5 _O; * d* 0 cH7 MOV TH0,A;取到的高位字节存入TH0+ r9 k/ T# * C: ?) sMOV 21H,A;取到的高位字节存入(21H)1 T7 ?0 j; Y h F6 aMOV A,22H;在载入取到的音符码& 6 u# z( 0 EZ- M/ e& ORLA ;乘2Te) X6 r g8 C% _0 XINCA ;加14 C. b) a: D5 ?MOVC A,A+DPTR ;至TABLE1取相对的低位字节计数值& G4 y+ N$ I/ n; g7 U) oMOV TL0,A;取到的低位字节存入TL01 n4 k& ?0 n8 , C+ % ZMOV 20H,A;取到的低位字节存入(20H)0 a1 w% S& . Q6 l: dSETB TR0 ;启动TIMER0$ 0 ? ?/ U9 W2 G. z/ o: b0 PD1:LCALL DELAY;其本单位时间1/4拍187毫秒1 g: G7 3 x1 e INC30H ;取简谱码指针加1* z z$ l: o5 m2 U JMP NEXT;取下一个简谱码3 D1 S! N E/ e# D1 yEND0: CLR TR0 ;停止TIMER0) q% : Q6 7 _: M5 v JMP START0;重复循环 I0 r) m( W; i2 FTIM0: PUSH ACC;将A的值暂存于堆栈! r! p) K1 f. _6 m1 Q6 d l, he PUSH PSW;将PSW的值暂存于堆栈: V& L% f9 a% x MOV TL0,20H ;重设计数值4 U/ n6 a3 6 w* z. U ?1 b( W5 r2 P MOV TH0,21H ;: yd8 0 M8 S CPLP3.0;将P3.0位反相,控制蜂鸣器发声( * e0 m4 v. F5 e( : j- g POP PSW;至堆栈取回PSW的值6 h( E$ H; S K- ( o) K POP ACC;至堆栈取回A的值* x8 g$ Y9 a+ D- / K2 S6 RETI : s z* O: w6 Y% k/ B/ U) . ?) IDELAY:MOV R7,#02 ) P& # w# e& 1 g0 q; e Z* FD2: MOV R4,#187 $ |. E! D9 V3 W$ K. ! TD3: MOV R3,#248 4 m4 h3 u! O! d* l: uS DJNZ R3,$ # Z K, + K I7 M% : Z DJNZ R4,D3 4 G7 U- R/ ) a$ Q. v6 q. H DJNZ R7,D2 _7 O$ g+ U& $ L$ C RET g2 a+ 9 O) - l6 y. TAB1: ;决定节拍, U( G$ s9 O7 6 y+ W6 H n0 Q5 DDW64260,64400,64521,64580 N9 j j, D9 # B: C DW64684,64777,64820,64898. r1 Q. R# 4 g n# * k# A N5 DW64968,65030,65058,651100 U, p6 X9 E( k0 k; W4 I) l6 I DW65157,65178,65217 6 bR$ e, X, G, H/ l9 i( XTAB: ;乐曲名称梁祝4 WK 1 W% w/ s$ M DB02H,82H,62H,52H,48H,02H,52H,32H,22H,18H4 N+ h: S0 n) d1 5 y& _& , F: U DB83H,91H,72H,62H,51H,61H,71H,61H,83H,61H. t# B G% l2 O# 8 L DB81H,51H,61H,71H,61H,51H,46H,82H,32H,52H9 K4 Y) x+ C: _2 Y. i J DB22H,42H,16H,21H,41H,18H,0E4H,13H,21H,43H/ Z; d) P( F% c! s: v DB51H,21H,41H,12H,83H,81H,61H,81H,58H,53H# ?& 7 s* I/ | wDB61H,31H,22H,13H,21H,42H,52H,0E2H,42H,21H0 M: + m& d ?1 B- ? DB11H,91H,41H,18H,63H,81H,32H,52H,21H,41H,$ h* B5 K5 , A0 i5 t DB16H,0E4H,11H,21H,31H,51H,26H,11H,21H,43H. T- h1 V4 v5 : T DB51H,82H,62H,52H,61H,51H,42H,21H,11H,0E4H A( j$ w( Y4 p5 x1 c* H DB44H,21H,41H,21H,11H,0E1H,11H,21H,41H,18H. k7 x. O0 Z8 i8 K) G DB61H,81H,51H,61H,51H,41H,32H,21H,41H,18H5 n2 s! b9 ! DB08H,0H,04H ;曲子最后静音5拍长的时间# c) r9 O6 r5 o DB00H ;乐曲结束*
展开阅读全文