其中集成电路BBD称为模拟延时器,其内部有由场效应管构成的多级电子开关和高精度存储器。在外加时钟脉冲作用下,这些电子开关不断地接通和断开,对输入信号进行取样、保持并向后级传递,从而使BBD的输出信号相对于输入信号延迟了一段时间。BBD的级数越多,时钟脉冲的频率越高,延迟时间越长。BBD配有专用时钟电路,如MN3102时钟电路与MN3200系列的BBD配套。电子混响器的电路如上图所示,其中两级二阶低通滤波器(MFB)A1、A2滤去4kHz(语音)以上的高频成分,反相器A3用于隔离混响器的输出和输入级间的相互影响。RP1调节混响器的输入电压,RP2调节MN3207的平衡输出以减小失真,RP3调节时钟频率,RP4控制混响器的输出电压。图中MN3207和MN3102各引脚的电压如下表所示:
MN3207和MN3102各引脚电压
引脚 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧
MN3207的电压/V 0.0 3.2 0.0 5.6 6.0 3.2 2.6 2.6
MN3102的电压/V 6.0 3.2 0.0 3.2 3.2 3.2 2.8 5.6
四 音乐产生原理
由于一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。本次设计中单片机晶振为12MHZ,那么定时器的计数周期为1MHZ,假如选择工作方式1,那T值便为T= 216--5﹡105/相应的频率 ,那么根据不同的频率计算出应该赋给定时器的计数值,列出不同音符与单片机计数T0相关的计数值如下表所示:
音符 频率(HZ) 简谱码(T值) 音符 频率(HZ) 简谱码(T值)
低1DO 262 63628 # 4 FA# 740 64860
#1 DO# 277 63731 中 5 SO 784 64898
低2 RE 294 63835 # 5 SO# 831 64934
# 2 RE# 311 63928 中 6 LA 880 64968
低 3 ME 330 64021 # 6 932 64994
低 4 FA 349 64103 中 7 SI 988 65030
# 4 FA# 370 64185 高1 DO 1046 65058
低 5 SO 392 64260 # 1 DO# 1109 65085
# 5 SO# 415 64331 高 2 RE 1175 65110
低 6 LA 440 64400 # 2 RE# 1245 65134
# 6 466 64463 高3 ME 1318 65157
低 7 SI 494 64524 高 4 FA 1397 65178
中 1 DO 523 64580 #4 FA# 1480 65198
# 1 DO# 554 64633 高 5 SO 1568 65217
中 2 RE 587 64684 #5 SO# 1661 65235
# 2 RE# 622 64732 高 6 LA 1760 65252
中 3 ME 659 64777 # 6 1865 65268
中 4 FA 698 64820 高 7 SI 1967 65283
采用查表程序进行查表时,可以为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据:
下面我们要为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据,低音0-19之间,中音在20-39之间,高音在40-59之间
TABLE:DW 0,63628,63835,64021,64103,64260,64400,64524,0,0
DW:0, 63731,63928,0,64185,64331,64463,0,0,0
DW:0,64580,64684,64777,64820,64898,64968,65030,0,0
DW:0,64633,64732,0,64860,64934,64994,0,0,0
DW:0,65058,65110,65157,65178,65217,65252,65283,0,0
DW:0,65085,65134,0,65198,65235,65268,0,0,0
DW:0
音乐的节拍,一个节拍为单位(C调)
曲调值 DELAY 曲调值 DELAY
调4/4 125ms 调4/4 62ms
调4/4 187ms 调4/4 94ms
调4/4 250ms 调4/4 125ms
五 流程图
流程图如下图所示:
优 电子琴程序设计
1:产生按键音符
方案(1)
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP BREAK
MAIN: MOV TMOD,#01H ;设置定时器0的工作方式
SETB EA
SETB ET0 ; 设置定时器0中断
SETB TR0 ; 启动定时器0
POS1: LCALL KEY ; 调用KEY子程序,判断有键按下否?第几个键?
CLR EA ;屏蔽中断
CJNE R3,#00H,POS1 ;如果R3=0,表示有键按下
MOV A,22H ;将22H里存放的按键号送给A
RL A ; 因为查表里都是字,所以得乘2查得数据
MOV DPTR,#TABLE ;指向表头
MOVC A,@A+DPTR ; 查表
MOV TH0,A ;将数据高位送TH0
MOV 21H,A ; 将高位备份
MOV A,22H ;将22H里存放的按键号送给A
RL A ;因为查表里都是字,所以得乘2查得数据
INC A ;取低位数据
MOVC A,@A+DPTR
MOV TL0,A
MOV 20H,A
POS2: LCALL KEY
SETB EA
CJNE R3,#00H,POS1
JMP POS2
KEY: MOV R3,#00H ; KEY子程序,判断有键按下否?第几个键?
MOV R1,#0FFH
MOV R0,#00H
MOV A,R1
MOV P2,A
MOV A,P2
CLR C
CPL C ;利用标志位CY来判断是哪个键按下
MOV R2,#08H
POS3: RLC A ;移位判断
JNC STORE
INC R0
DJNZ R2,POS3
STORE: MOV 22H,R0 ; 将按键号存22H,R3=0有键按下
MOV R3,#00H
RET
BREAK: PUSH ACC ; 中断产生方波,从P1.0口输出
PUSH PSW
MOV TL0,20H
MOV TH0,21H
CPL P1.0
POP PSW
POP ACC
RETI
TABLE: DW 65030,64968,64898,64820,64777,64684,64580 ; 7,6,5,4,3,2,1
END
方案(2):
ORG 0000H
SJMP START
ORG 000BH
AJMP INT_0
ORG 0030H
START: MOV P1,#00H
SETB EA
SETB ET0 ;计数器0
MOV TMOD,#02H
MOV TH1,#09CH
MOV TL1,#09CH ;定时器初值
CLR TR0 ;定时器不允许
BLOCK: ;键盘扫描
MOV A,P2 ;判断键盘按下,跳到BLOCK_1,若未按,继续扫描
CJNE A,#0FFH,BLOCK_1
NOP
SJMP BLOCK
BLOCK_1:ACALL DELAY ;是不是真的要按下?如果是,则跳转SU_KEY查询是哪个按下?
MOV A,P2
CJNE A,#0FFH,SU_KEY
NOP
SJMP BLOCK
SU_KEY:JNB P2.1,LOOP_1 ;判断是哪个键按下?
JNB P2.2,LOOP_2
JNB P2.3,LOOP_3
JNB P2.4,LOOP_4
JNB P2.5,LOOP_5