稳压电源

输出频率 = 1/(长周期 + 短周期)为能够产生一定时间长度的声音,需要计算进行驱动的完整周期数:
周期数 = (声音持续时间 × 输出频率)以中C基本钢琴音标音频为例。对这些频率进行调谐,音符“中C的A”等于440Hz。表1中列出的值是近似值。
| Note | Frequency (Hz) |
| Middle C | 261 |
| C sharp/D flat | 277 |
| D | 294 |
| D sharp/E flat | 311 |
| E | 330 |
| F | 349 |
| F sharp/G flat | 370 |
| G | 392 |
| G sharp/A flat | 415 |
| A | 440 |
| A sharp/B flat | 466 |
| B | 494 |
| C (next octave up) | 523 |
move HRNC, #1 ; Turn the piezoelectric horn driver on.
;; Play Middle C for one second.
move LC[1], #261 ; Outer loop counter = 261 cycles (1s * 261Hz)
middleC:
move PO0.0, #1 ; Switch output high.
move LC[0], #6839 ; Half period : (1/261Hz) / (1/3.57MHz) / 2
djnz LC[0], $ ; Decrement and jump, if not zero, to current
; instruction.
move PO0.0, #0 ; Switch output low.
move LC[0], #6839 ; Half period : (1/261Hz) / (1/3.57MHz) / 2
djnz LC[0], $ ; Decrement and jump if not zero to current
; instruction.
djnz LC[1], middleC ; Decrement and jump, if not zero, to top of loop.
通过改变循环计数器LC[0]装载的数值来改变输出频率(对应于产生的音符)。通过改变循环计数器LC[1]装载的数值来改变音符持续时间。把这些代码打包到一个简单宏中,定义几个常数,就很容易产生播放一小段音乐的代码。 #define NOTE_C 261
#define NOTE_C_SH 277
#define NOTE_D_FL 277
#define NOTE_D 294
#define NOTE_D_SH 311
#define NOTE_E_FL 311
#define NOTE_E 330
#define NOTE_F 349
#define NOTE_F_SH 370
#define NOTE_G_FL 370
#define NOTE_G 392
#define EIGHTH 1 ; 120 beats per minute, 4/4 time
#define QUARTER 2 ; 120 beats per minute, 4/4 time
#define QUARTERDOT 3 ; 120 beats per minute, 4/4 time
#define HALF 4 ; 120 beats per minute, 4/4 time
#define WHOLE 8 ; 120 beats per minute, 4/4 time
play macro note, duration
local L1, L2
move HRNC, #1
move LC[1], #(note * duration / 8)
L1:
move PO0.0, #1 ; Switch output high.
move LC[0], #(1785000 / note)
djnz LC[0], $ ; Decrement and jump, if not zero, to current
; instruction.
move PO0.0, #0 ; Switch output low.
move LC[0], #(1785000 / note)
djnz LC[0], $ ; Decrement and jump, if not zero, to current
; instruction.
djnz LC[1], L1 ; Decrement and jump, if not zero, to top of loop.
move HRNC, #1
move LC[1], #50 ; 50ms of silence
L2:
move LC[0], #3570 ; 1ms (inner loop)
djnz LC[0], $
djnz LC[1], L2
endm
;; First 8 bars of Beethoven's "Ode to Joy"
play NOTE_E, QUARTER
play NOTE_E, QUARTER
play NOTE_F, QUARTER
play NOTE_G, QUARTER
play NOTE_G, QUARTER
play NOTE_F, QUARTER
play NOTE_E, QUARTER
play NOTE_D, QUARTER
play NOTE_C, QUARTER
play NOTE_C, QUARTER
play NOTE_D, QUARTER
play NOTE_E, QUARTER
play NOTE_E, QUARTERDOT
play NOTE_D, EIGHTH
play NOTE_D, HALF
play NOTE_E, QUARTER
play NOTE_E, QUARTER
play NOTE_F, QUARTER
play NOTE_G, QUARTER
play NOTE_G, QUARTER
play NOTE_F, QUARTER
play NOTE_E, QUARTER
play NOTE_D, QUARTER
play NOTE_C, QUARTER
play NOTE_C, QUARTER
play NOTE_D, QUARTER
play NOTE_E, QUARTER
play NOTE_D, QUARTERDOT
play NOTE_C, EIGHTH
play NOTE_C, HALF
可以缩小这一例子需要的代码空间。只使用子程序(而不是解开的代码宏)和查找表就可以产生音符值。其基本原理相同。全部0条评论
快来发表一下你的评论吧 !