单片机电子琴电路结构及工作原理 第2页
2.工作原理
振荡器一般用电感三点振荡电路。如果忽略晶体管、电阻等因素的影响,则它的振荡周期T可由下式决定:
只要适当选择电感l和电容c的数值,就可以得到所需要的信号频率。分频器是一个双稳态电路,即晶体管bg1导通、bg2截止和bg1截止、bg2导通两种稳定状态。如果在它的输入端输入一个信号脉冲,它就翻转一次,即由一种稳态迅速变成另一种稳态,再输入一个信号脉冲,它又会翻转一次,还原成起始的稳态。这样,在它的输入端输入两个信号脉冲时,在它的输出端就得到一个信号脉冲。就是说,输出信号频率比输入信号频率低一半,好像用2除过一样,所以叫二分频。
可以看出,,说明一个音的频率刚好是比它低八度音的频率的两倍。所以,只要把一个音的频率除以2就得到比它低八度的一个音的频率。实现这一点就需要使用二分频电路。这样,只要振荡器产生一个标准音的频率信号,如高音“1”的信号,通过二分频就产生中音“2”的频率,再一次二分频就产生低音“1”的频率了。如果按照键盘上最高音组的频率制作七个振荡器,并将得到的七个音阶信号分别二分频,便可得到低八度的一组音阶信号;再次二分频,就可得到再低八度的一组音阶信号。依此类推,最后,就能得到键盘上所有的音阶信号了。
三、设计方案与流程图
四、软件的设计
由于一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。本次设计中单片机晶振为12MHZ,那么定时器的计数周期为1us,假如选择工作方式1,那T值便为T= 216--5﹡105/相应的频率 ,那么根据不同的频率计算出应该赋给定时器的计数值,列出不同音符与单片机计数T0相关的计数值如下表所示:
音符 频率(HZ) 简谱码(T值)
中 1 DO 523 64580
中 2 RE 587 64684
中 3 M 659 64777
中 4 FA 698 64820
中 5 SO 784 64898
中 6 LA 880 64968
中 7 SI 988 65030
采用查表程序进行查表时,可以为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据:
TABLE DW 64580,64684,64777,64820,64898,64968,65030
源程序:
方案一:产生按键音符
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP BREAK
MAIN: MOV TMOD,#01H ;设置定时器0的工作方式
SETB EA
SETB ET0 ; 设置定时器0中断
SETB TR0 ; 启动定时器0
WAIT1: LCALL KEY ; 调用KEY子程序,判断有键按下否?第几个键?
CLR EA ;屏蔽中断
CJNE R3,#00H,WAIT1 ;如果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
WAIT2: LCALL KEY
SETB EA
CJNE R3,#00H,WAIT1
JMP WAIT2
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
WAIT3: RLC A ;移位判断
JNC STORE
INC R0
DJNZ R2,WAIT3
STORE: MOV 22H,R0 ; 将按键号存22H,R3=0有键按下
MOV R3,#00H
RET