电子音调发生器.docx
《电子音调发生器.docx》由会员分享,可在线阅读,更多相关《电子音调发生器.docx(15页珍藏版)》请在冰豆网上搜索。
电子音调发生器
单片机课程设计
电子音调发生器
实
验
报
告
班级:
1.设计目的
1.了解计算机发声原理。
2.熟悉定时器和键盘扫描电路的工作原理及编程方法。
2.设计要求
利用JD51开发板上的按键S1~S4和蜂鸣器设计电子音调发生器,要求:
1.利用JD51开发板上的按键S1~S4进行音调选择,即按下不同的开关产生不同的音调,依次按动S1~S4及组合按键,蜂鸣器发出1234567i八个音调;并在数码管上显示。
2.编写2支歌曲,并可进行选择播放。
3.设计原理
音节由不同频率的方波产生,音节与频率的关系通过查表可得。
要产生音频方波,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。
利用计时器计时此半周期时间,每当计时到后就将输出方波的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚得到此频率的方波。
在JD51单片机上,产生方波的I/O脚选用P2.4,通过跳线选择器将单片机的P2.4与蜂鸣器的驱动电路相连。
这样P2.4输出不同频率的方波,蜂鸣器便会发出不同的声音。
另外,音乐的节拍是由延时实现的,如果1拍为0.4秒,1/4拍是0.1秒。
只要设定延时时间,就可求得节拍的时间。
延时作为基本延时时间,节拍值只能是它的整数倍。
每个音节相应的定时器初值X可按下法计算:
(1/2)*(1/f)=(12/fose)*(216-x)
即x=216-(fose/24f)
其中f:
音调频率,当晶振fose=11.0592MHz时,音节“1”相应的定时器初值为x,则可得x=63777D=F921H其它的可同样求得。
表1
音调
频率(Hz)
X(HEX)
1
262
F921
2
294
F9E1
3
330
FA8C
4
349
FAD8
5
392
FB68
6
440
FBE9
7
494
FC5B
i
523
FC8F
4.设计方案及思路
4.1总体框图
89C51
单片机
矩阵
键
控制
声音输出电路
数码管显示电路
按键重播控制
音乐播放控制
硬件图
4.2蜂鸣电路
模块鸣器驱动电路和89C51组成。
选择一只压电式蜂鸣器,压电式蜂鸣器工作时约需要100MA驱动电流。
当89C51输出为低电平时蜂鸣器产生蜂鸣音,89C51输出为高电平时,蜂鸣器不发声。
5.软件设计流程及描述
根据要实现的功能,流程图如下:
熟悉定时器和键盘扫描电路的工作原理及编程方法。
5.1软件设计思路
电子琴主要的工作是将按键的信息读取,然后根据按键的数字,用计数器输出相对应的频率,实现电子琴的音调。
程序主要为5部分,键盘扫描、中断计时、数码显示、音乐播放、主程序,他们分别执行不同的功能。
5.2各部分功能介绍
5.2.1键盘键值读取程序
键盘键值读取程序包括键盘扫描、消除抖动、键译码等内容。
按键的识别主要有两种方法:
行反转法和行扫描法。
因为键盘为机械开关,容易引入抖动。
为了消除抖动干扰,在程序中要加入消除抖动的部分。
5.2.2中断计时
中断部分,中断定时器1主要负责输出不同频率的方波,产生声音,中断定时器1主要是计时按键时间及按键间隔时间的功能,在播放音乐的时候,还担任着播放音乐的节拍的任务。
5.2.3音乐播放
音乐播放部分主要是播放音乐,实现按键重播和播放程序里面的音乐的功能。
5.2.4主程序
主程序主要是随时发出按键的声音功能,并且通过不同P口的扫描,判断是否是播放按键声音还是播放音乐,还是继续发出按键声音。
6.实验源程序
汇编程序:
/*SB11音SB22音SB33音SB44音SB1SB25音SB2SB36音SB3SB47音SB1SB4i音SB1SB3第一首歌SB2SB4第二首歌*/
ORG0000H
LJMPKEYP0
KEYP0:
MOVR0,#00H
CLRTR0
SETBP2.4;关蜂鸣器
SETBP2.3;关数码管
WU:
MOVR0,P3;扫描键盘输入
CJNER0,#0FFH,KEYPO1;有输入时跳转
JMPWU
KEYPO1:
CJNER0,#0FBH,KEYPO2;输入1音,非1音跳转
SETBP2.4;蜂鸣器置于高电平
MOVR3,#200
MAIN01:
MOVTMOD,#01H;初始化,工作方式1
MOVTL0,#21H;写入计数初值
MOVTH0,#0F9H
SETBTR0;启动计数
WAIT1:
JNBTF0,WAIT1
CLRTF0
CPLP2.4;蜂鸣器响
CLRP2.3;数码管显示1
MOVA,#11111001B
MOVP0,A
DJNZR3,MAIN01
LJMPKEYP0;返回程序KEYP0
KEYPO2:
CJNER0,#0F7H,KEYPO3;输入2音,非2音跳转
SETBP2.4;蜂鸣器置于高电平
MOVR3,#200
MAIN02:
MOVTMOD,#01H
MOVTL0,#0E1H;写入计数初值
MOVTH0,#0F9H
SETBTR0
WAIT2:
JNBTF0,WAIT2
CLRTF0
CPLP2.4;蜂鸣器响
CLRP2.3;数码管显示2
MOVA,#10100100B
MOVP0,A
DJNZR3,MAIN02
LJMPKEYP0
KEYPO3:
CJNER0,#0EFH,KEYPO4;输入3音,非3音跳转
SETBP2.4;蜂鸣器置于高电平
MOVR3,#200
MAIN03:
MOVTMOD,#01H
MOVTL0,#08CH
MOVTH0,#0FAH
SETBTR0
WAIT3:
JNBTF0,WAIT3
CLRTF0
CPLP2.4
CLRP2.3
MOVA,#10110000B
MOVP0,A
DJNZR3,MAIN03
LJMPKEYP0
KEYPO4:
CJNER0,#0DFH,KEYPO5;输入4音,非4音跳转
SETBP2.4
MOVR3,#200
MAIN04:
MOVTMOD,#01H
MOVTL0,#0D8H
MOVTH0,#0FAH
SETBTR0
WAIT4:
JNBTF0,WAIT4
CLRTF0
CPLP2.4
CLRP2.3
MOVA,#10011001B
MOVP0,A
DJNZR3,MAIN04
LJMPKEYP0
KEYPO5:
CJNER0,#0F3H,KEYPO6;输入5音,非5音跳转
SETBP2.4
MOVR3,#200
MAIN05:
MOVTMOD,#01H
MOVTL0,#068H
MOVTH0,#0FBH
SETBTR0
WAIT5:
JNBTF0,WAIT5
CLRTF0
CPLP2.4
CLRP2.3
MOVA,#10010010B
MOVP0,A
DJNZR3,MAIN05
LJMPKEYP0
KEYPO6:
CJNER0,#0E7H,KEYPO7;输入6音,非6音跳转
SETBP2.4
MOVR3,#200
MAIN06:
MOVTMOD,#01H
MOVTL0,#0E9H
MOVTH0,#0FBH
SETBTR0
WAIT6:
JNBTF0,WAIT6
CLRTF0
CPLP2.4
CLRP2.3
MOVA,#10000010B
MOVP0,A
DJNZR3,MAIN06
LJMPKEYP0
KEYPO7:
CJNER0,#0CFH,KEYPO8;输入7音,非7音跳转
SETBP2.4
MOVR3,#200
MAIN07:
MOVTMOD,#01H
MOVTL0,#05BH
MOVTH0,#0FCH
SETBTR0
WAIT7:
JNBTF0,WAIT7
CLRTF0
CPLP2.4
CLRP2.3
MOVA,#11111000B
MOVP0,A
DJNZR3,MAIN07
LJMPKEYP0
KEYPO8:
CJNER0,#0DBH,KEYPO9;输入i音,非i音跳转
SETBP2.4
MOVR3,#200
MAIN08:
MOVTMOD,#01H
MOVTL0,#08FH
MOVTH0,#0FCH
SETBTR0
WAIT8:
JNBTF0,WAIT8
CLRTF0
CPLP2.4
CLRP2.3
MOVA,#10000000B
MOVP0,A
DJNZR3,MAIN08
LJMPKEYP0
KEYPO9:
CJNER0,#0EBH,KEYPO10;跳转到第一首歌程序
LJMPMUSTART1
KEYPO10:
CJNER0,#0D7H,JIELI;跳转到第二首歌程序
LJMPMUSTART2
JIELI:
JMPKEYP0;返回主程序
MUSTART1:
;歌曲1的播放程序
MOVR0,#00H;节拍表指针置零
MOVR1,#00H;音符表指针置零
RTAB:
MOVA,R0
MOVDPTR,#RYTH
MOVCA,@A+DPTR;查表法将一个节拍数据取出放R2计数器中
MOVR2,A
TTAB:
MOVA,R1
MOVDPTR,#TONE
MOVCA,@A+DPTR
MOVR3,A;取出音符表高8位
INCR1;指针加1
MOVA,R1
MOVDPTR,#TONE
MOVCA,@A+DPTR
MOVR4,A;取出低8位
SETBP2.4;输出相应音调的方波
LOOP:
MOVR5,#3BH
MAIN:
MOVTMOD,#01H
MOVTL0,R4
MOVTH0,R3
SETBTR0
WAIT:
JNBTF0,WAIT
CLRTF0
CPLP2.4
MAYA:
JBP3.2,MAYB;判断P3.2口是否有为1
JBP3.4,MAYB;判断P3.4口是否有为1
LJMPRA;P3.4口为0则跳转到程序RA
MAYB:
JBP3.3,JIELI;判断P3.3口是否有为1
JBP3.5,JIELI;判断P3.5口是否有为1
LJMPMUSTART2;P3.5口为0则放第二首歌
RA:
DJNZR5,MAIN;无打断则继续放第一首歌
DJNZR2,LOOP
INCR0;两个表的指针都加1
INCR1
CJNER1,#88,RTAB;判断是否取完
LJMPKEYP0
TONE:
DB0FBH,68H,0FDH,6EH,0FDH,45H,0FCH,0EFH,0FCH,8FH,0FCH,8FH,0FCH,8FH,0FCH,5BH,0FCH,8FH
DB0FCH,0EFH,0FDH,45H,0FBH,68H,0FBH,68H,0FCH,8FH,0FCH,5BH,0FBH,0E9H,0FBH,68H,0FBH,68H
DB0FAH,