|
这里看起来很冷清。之前我曾经在中国crystalradio论坛里,那里的论坛蛮活跃。我希望可以分享一些资料也让马来西亚对电子有兴趣的朋友可以活跃起来。
这里我是用STC15F104E 的单晶片,用定时器0 的TL0 8bits加中断来产生PWM。PWM的frequency大约117Khz左右来代替简易的8bits DAC。比如当输入值是30时,就设定 P3。0为1,然后把255-30 或者用反值30 (0011 0000 为 1100 1111)写入 TL0 ,TL0 就从225 开始算起到了 Overflow时就 中断cpu, 当CPU测试 P3.0为1时就 把 P3.0 写为0 ,然后直接把30 放进TL0 在return 中断。这样以来就可以利用 TL0加中断来完成 简单的PWM。
除了 TL0 可以用来做简易的PWM,也可以用来做分频时钟给其他的LUT。这个程式有一些问题待遇改善,例如音调不准,只能单旋。
不好意思,本人其实不太会解释。不过可以看看一下的程式就可以了解了。其他的原理可以看看这个网页。
http://elm-chan.org/works/mxb/report.html
演戏效果可以看看这个
http://www.youtube.com/watch?v=m0aAVJ73zwo
这个是之前用电脑实验的钢琴波。
程式如下。
----------------------------------------------------------
;STC15F104E @ 30Mhz
;ZANARKAND
3.0 PWM output TO SPEAKER OR AMPLIFIER
A .EQU 0E0H
B .EQU 0F0H
SP .EQU 081H
DPL .EQU 082H
DPH .EQU 083H
TCON .EQU 088H
TMOD .EQU 089H
TL0 .EQU 08AH
TL1 .EQU 08BH
TH0 .EQU 08CH
TH1 .EQU 08DH
AUXR .EQU 08EH
PORT0 .EQU 080H
PORT1 .EQU 090H
PORT2 .EQU 0A0H
PORT3 .EQU 0B0H
P1ASF .EQU 09DH
P1M1 .EQU 091H
P1M0 .EQU 092H
P0M1 .EQU 093H
P0M0 .EQU 094H
P2M1 .EQU 095H
P2M0 .EQU 096H
P3M1 .EQU 0B1H
P3M0 .EQU 0B2H
IE .EQU 0A8H
IP .EQU 0B8H
ADC_CONTR .EQU 0BCH
ADC_RES .EQU 0BDH
ADC_RESL .EQU 0BEH
INT_CLKO .EQU 08FH
;----------BIT ADDRESS --------------
EA .EQU 0AFH ;GLOBAL INTERRUPT ENABLE
ET0 .EQU 0A9H ;TIMER 0 INTERRUPT ENABLE
ET1 .EQU 0ABH ;TIMER 1 INTERRUPT ENABLE
TR0 .EQU 08CH ;TIMER 0 ENABLE
TR1 .EQU 08EH ;TIMER 1 ENABLE
P0.0 .EQU 080H
P0.1 .EQU 081H
P1.7 .EQU 097H
P1.5 .EQU 095H
P3.0 .EQU 0B0H
P3.1 .EQU 0B1H
P3.2 .EQU 0B2H
P3.3 .EQU 0B3H
P3.4 .EQU 0B4H
P3.5 .EQU 0B5H
P3.7 .EQU 0B7H
A.7 .EQU 0E7H
;----------------------------------
SETTING .EQU 37H
DACSET .EQU 31H
X1 .EQU 32H
NOTEP .EQU 33H
X2 .EQU 34H
TEMP .EQU 35H
X5 .EQU 36H
SIGN_BIT .EQU 00H ;BITS ADDRESS
DOT_OUT .EQU 01H
.ORG 0H
LJMP INIT
.ORG 0BH
SJMP INTSRV
;----------------Interrupt Service-----------------
INTSRV:
PUSH A
CLR TR0 ;DISABLE TIMER 0
JB P3.0,CLR_PWM ;TEST P3.0 ,IF 1 JUMP TO CLR_PWM
MOV A,DACSET ;255 - DACSET = TL0
CPL A
MOV TL0,A
SETB P3.0
SETB TR0
POP A
RETI
CLR_PWM:
MOV A,DACSET ;DACSET = TL0
MOV TL0,A
CLR P3.0
SETB TR0
INC X1 ;117kHZ COUNT
INC R1
CJNE R1,#0FFH,IEND
MOV R1,#0H
INC R2
CJNE R2,#8D,IEND
MOV R2,#0H
INC R3 ;100HZ
IEND:
POP A
RETI ;return interrupt
;------------------------INIT----------------------
INIT:
;--------------Port initialize ---------------------
MOV A,#00000011B ;SET P3.0 ,P3.1 as output Push Pull mode
MOV P3M0,A ;The rest of port as input with pull up
MOV A,#0B
MOV P3M1,A
;--------------Timer initialize---------------------
MOV A,#11000000B
MOV AUXR,A ;SET TIMER0 AND 1 AS 1T
MOV A,#00110011B
MOV TMOD,A ;SET TIMER0 AS 8BITS , NO AUTO REFILL
MOV A,#0B ;DISABLE INTERRUPT AND TIMER OUTPUT.
MOV INT_CLKO,A
MOV A,#10000010B
MOV IE,A ;ENABLE EA(GLOBAL INTERUPT),ET0 (INTERRUPT FROM TMR0)
MOV R1,#0H
MOV A,#0H
MOV NOTEP,A
MOV A,#00010000B
MOV TCON,A ;SET TR0 =1 ,FOR START TIMER.
;----------------------------------------------------
START:
MOV A,R5 ;FREQUENCY MAP POINTER
MOV DPTR,#FREMAP ;LOAD FREMAP BASE ADDRESS TO DPTR
MOVC A,@A+DPTR
CJNE A,X1,START
MOV X1,#0
MOV DPTR,#PIANO ;LOAD PIANO BASE ADDRESS TO DPTR
MOV A,R4
MOVC A,@A+DPTR
MOV B,TEMP
MUL AB
MOV A,B
MOV DACSET,A
INC R4
CJNE R4,#18D,START ;WAVETABLE POINTER
MOV R4,#0H
MOV DPTR,#MUSICTABLE
MOV A,NOTEP
MOVC A,@A+DPTR
MOV R5,A
MOV DPTR,#NOTED
MOV A,NOTEP
MOVC A,@A+DPTR
MOV X2,R3
CJNE A,X2,DECAY1OP
MOV R3,#0H
INC NOTEP
MOV A,NOTEP
CJNE A,#87D,START
MOV A,#0H
MOV NOTEP,A
LJMP START
DECAY1OP:
MOV DPTR,#DECAY1
MOV A,R3
MOVC A,@A+DPTR
MOV TEMP,A
LJMP START
DECAY1:
.DB 0FFH,154D,93D,92D,91D,90D,89D,88D,87D,86D,85D,84D,83D,82D,81D,80D
.DB 79D,78D,77D,76D,75D,74D,74D,72D,71D,70D,68D,67D,66D,65D,64D,63D,62D,61D
.DB 60D,58D,56D,54D,52D,50D,48D,46D,44D,42D,40D,38D,36D,34D,32D,30D,28D,28D,
.DB 28D,28D,28D,28D,28D,28D,28D,28D,28D,28D,28D,28D,0D ;65POINT
FREMAP:
.DB 59D,53D,50D,45D,39D,37D,33D
.DB 30D,26D,25D,22D,20D,19D,17D
.DB 15D,13D,12D,11D,10D,9D,8D
.DB 54D,49D,46D,41D,36D,34D,30D,27D,24D,20D ;7A2 ,13 A3
.DB 18D,17D,16D,15D,13D,12D,11D,10D,9D,8D,7D ;21POINT
PIANO:
.DB 09BH,0EEH,0D1H,078H,043H,033H
.DB 05FH,097H,083H,07EH,065H,068H
.DB 07FH,08AH,094H,0A9H,077H,000H ;18POINT
;7A 8B 9C 10D 11E 12F 13G
MUSICTABLE: .DB 11D,8D,11D,12D,13D,12D,11D,10D,11D,10D,8D,11D,8D,11D,12D,13D,12D,13D,14D,13D,14D,15D
; E ,B ,E, F. G, F, E. D, E, D. B. E, B, E, F. G, F, G. A1,G,A1. B1,
.DB 11D,8D,11D,12D,13D,12D,11D,10D,11D,10D,8D,6D,7D,8D,8D,8D,8D,7D,10D
; E,B,E,F. G,F,E. D,E,D. B,G0,A. B,B,B. B,A,D.
.DB 6D,6D,5D,3D,4D,4D,6D,9D,11D,4D,6D,9D,11D,13D
;G0,G0,F0,D0. E0,E0,G0,C. E,E0,G0,C,E,G.
.DB 07D,11D,11D,10D,9D,8D,13D,13D,15D,18D,18D,14D,18D,17D,16D,8D,12D,12D,11D,10D
;A,E. E,D,C. B,G. G. B1,E1. E1. A1,E1.D1,C1,B,F.F,E,D.
.DB 9D,14D,14D,13D,11D,8D,8D,12D,7D,5D,7D,8D ;32+
;C,A1.A1.G,E,B.B,F.A,F0,A.B.
NOTED:
.DB 30D,10D,10D,10D,20D,20D,20D,30D,10D,20D,60D,30D,10D,10D,10D,20D,20D,20D,30D,10D,20D,60D ; 87POINT
;3 1 1 1.2 2 2.3 1 2. 6. 3 1 1 1.2 2 2.3 1 2. 6
.DB 30D,10D,10D,10D,20D,20D,20D,30D,10D,20D,40D,10D,10D,20D,20D,20D,20D,20D,20D
;3 1 1 1. 2 2 2. 3 1 2.4 1 1. 2 2 2.2 2 2.
.DB 30D,10D,10D,10D,30D,10D,10D,10D,10D,10D,10D,10D,10D,10D
; 3 1 1 1. 3 1 1 1. 1 1 1 1 1 1.
.DB 40D,20D,20D,20D,20D,40D,20D,60D,40D,20D,60D,40D,20D,20D,40D,40D,20D,20D,20D,20D
;4,2. 2,2,2. 4,2. 6. 4,2. 6. 4,2. 2,4. 4,2. 2,2,2.
.DB 40D,20D,60D,20D,20D,20D,40D,20D,30D,10D,20D,60D
;4,2. 6. 2,2,2. 4,2. 3,1,2. 6.
.END
|
|