电子音调发生器实验报告

  • 格式:docx
  • 大小:2.48 MB
  • 文档页数:17

电子音调发生器班级:信号1402姓名: 潘佳琪学号:142121522016年4月28日1课程设计总体目标1.1总体结构利用JD51开发板上的按键S1--S4和蜂鸣器设计电子音调发生器,要求:(1)利用JD51开发板上的按键S1--S4进行音调选择,即按下不同的开关产生不同的音调,依次按动S1--S4 及组合按键,蜂鸣器发出1234567i八个音调;并在数码管上显示。

(2)编写2支歌曲,并可进行选择播放。

1.2功能计时器计时定时器预置定时初值,工作在工作方式1,定时器溢出位变为1计时结束。

音乐播放音乐播放部分主要是播放音乐,按下不同按键可以发出不同声音。

按下K1键,显示“1”,发出“1”的声音。

按下K2键,显示“2”,发出“2”的声音。

按下K3键,显示“3”,发出“3”的声音。

按下K4键,显示“4”,发出“4”的声音。

按下K1和K2键,显示“5”,发出“5”的声音。

按下K2和K3键,显示“6”,发出“6”的声音。

按下K3和K4键,显示“7”,发出“7”的声音。

按下K1和K3键,显示“8”,发出高“1”的声音。

按下K1和K4键,显示“1”,发出第一首歌小星星。

按下K2和K4键,显示“2”,发出第二首歌天空之城。

2硬件设计利用51单片机的P3(P3.2—P3.5)口读取开关键盘状态,CPU不断查询P3口状态,根据P3口不同状态跳转到不同的程序段中执行,具体执行为1.定时器预置定时初值,工作在工作方式1,定时器溢出位变为1计时结束,启动蜂鸣器,发出不同音调的声音。

2.播放歌曲,程序段中存储了两个表,分别是音符表和节拍表。

音符表中存放的是蜂鸣器发出音调的对应的频率所需的定时器的频率定时初值的高低位;节拍表存放的是发出每一个音调所需要持续的时间的双层循环中的内循环次数值。

通过查表法在一次循环中通过累加器A连续取两个数据,分别送到定时器的定时初值寄存器TL0,TH0中,接着从节拍表中将一个对应节拍取出放入内循环的计数器(R5)中,并控制定时器发出对应方波并循环对应次数达到合适的节拍和音调效果,从而放出歌曲。

蜂鸣电路模块鸣器驱动电路和89C51组成。

选择一只压电式蜂鸣器,压电式蜂鸣器工作时约需要100MA驱动电流。

当输出为低电平时蜂鸣器产生蜂鸣音,89C51 输出为高电平时,蜂鸣器不发声。

总体电路图如下:3软件设计软件使用:单击“Project菜单/Options for Target”选项或者点击工具栏的“option for ta rget”按钮,弹出窗口,点击“Debug”按钮,出现如图所示页面。

Proteus的设置进入Proteus的ISIS,鼠标左键点击菜单“Debug”,选中“use romote debuger monitor”,如图所示。

此后,便可实现KeilC与Proteus连接调试。

KeilC与Proteus连接仿真调试单击仿真运行开始按钮,就开始仿真,在proteus中点击不同的开关,就可以发出不同的声音,并显示对应的数字。

下面是利用proteus仿真的过程:工作原理及设计思路音节由不同频率的方波产生,音节与频率的关系如表1所示。

要产生音频方波,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。

利用计时器计时此半周期时间,每当计时到后就将输出方波的I/0反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚得到此频率的方波。

JP1将单片机的P1.7与蜂鸣器的驱动电路相连。

这样P1.7输出不同频率的方波,蜂鸣器便会发出不同的声音。

另外,音乐的节拍是由延时实现的,如果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,依次可以求得。

表一汇编程序ORG 0000HLJMP KEYP0KEYP0: MOV R0,#00HCLR TR0SETB P2.4 ;关蜂鸣器SETB P2.2 ;关数码管WU: MOV R0,P3 ;扫描键盘输入CJNE R0,#0FFH,KEYPO1 ;有输入时跳转JMP WUDELAY1: MOV R7, #20D1: MOV R6, #150DJNZ R6, $DJNZ R7, D1KEYPO1:CJNE R0,#0FBH,KEYPO2 ;输入1音,非1音跳转 SETB P2.4 ;蜂鸣器置于高电平MOV R3,#200MAIN01:MOV TMOD,#01H ;初始化,工作方式1MOV TL0,#21H ;写入计数初值MOV TH0,#0F9HSETB TR0 ;启动计数WAIT1:JNB TF0,WAIT1CLR TF0CPL P2.4 ;蜂鸣器响CLR P2.2 ;数码管显示1MOV A,#11111001BMOV P0,ADJNZ R3,MAIN01LJMP KEYP0 ;返回程序KEYP0KEYPO2:CJNE R0,#0F7H,KEYPO3 ; 输入2音,非2音跳转SETB P2.4 ;蜂鸣器置于高电平MOV R3,#200MAIN02:MOV TMOD,#01HMOV TL0,#0E1H ;写入计数初值MOV TH0,#0F9HSETB TR0WAIT2:JNB TF0,WAIT2CLR TF0CPL P2.4 ;蜂鸣器响CLR P2.2 ;数码管显示2MOV A,#10100100BMOV P0,ADJNZ R3,MAIN02LJMP KEYP0KEYPO3:CJNE R0,#0EFH,KEYPO4 ; 输入3音,非3音跳转SETB P2.4 ;蜂鸣器置于高电平MOV R3,#200MAIN03:MOV TMOD,#01HMOV TL0,#08CHMOV TH0,#0FAHSETB TR0WAIT3:JNB TF0,WAIT3CLR TF0CPL P2.4CLR P2.2MOV A,#10110000BMOV P0,ADJNZ R3,MAIN03LJMP KEYP0KEYPO4:CJNE R0,#0DFH,KEYPO5 ; 输入4音,非4音跳转SETB P2.4MOV R3,#200MAIN04:MOV TMOD,#01HMOV TL0,#0D8HMOV TH0,#0FAHSETB TR0WAIT4:JNB TF0,WAIT4CLR TF0CPL P2.4CLR P2.2MOV A,#10011001BMOV P0,ADJNZ R3,MAIN04LJMP KEYP0KEYPO5: CJNE R0,#0F3H,KEYPO6 ; 输入5音,非5音跳转SETB P2.4MOV R3,#200MAIN05:MOV TMOD,#01HMOV TL0,#068HMOV TH0,#0FBHSETB TR0WAIT5:JNB TF0,WAIT5CLR TF0CPL P2.4CLR P2.2MOV A,#10010010BMOV P0,ADJNZ R3,MAIN05LJMP KEYP0KEYPO6:CJNE R0,#0E7H,KEYPO7 ; 输入6音,非6音跳转SETB P2.4MOV R3,#200MAIN06:MOV TMOD,#01HMOV TL0,#0E9HMOV TH0,#0FBHSETB TR0WAIT6:JNB TF0,WAIT6CLR TF0CPL P2.4CLR P2.2MOV A,#10000010BMOV P0,ADJNZ R3,MAIN06LJMP KEYP0KEYPO7:CJNE R0,#0CFH,KEYPO8 ; 输入7音,非7音跳转SETB P2.4MOV R3,#200MAIN07:MOV TMOD,#01HMOV TL0,#05BHMOV TH0,#0FCHSETB TR0WAIT7:JNB TF0,WAIT7CLR TF0CPL P2.4CLR P2.2MOV A,#11111000BMOV P0,ADJNZ R3,MAIN07LJMP KEYP0KEYPO8:CJNE R0,#0DBH,KEYPO9 ; 输入i音,非i音跳转SETB P2.4MOV R3,#200MAIN08:MOV TMOD,#01HMOV TL0,#08FHMOV TH0,#0FCHSETB TR0WAIT8:JNB TF0,WAIT8CLR TF0CPL P2.4CLR P2.2MOV A,#10000000BMOV P0,ADJNZ R3,MAIN08LJMP KEYP0KEYPO9:CJNE R0,#0EBH,KEYPO10 ;跳转到第二首歌程序LJMP MUSTART2KEYPO10:CJNE R0,#0D7H,JIELI ;跳转到第一首歌程序LJMP MUSTART1JIELI:JMP KEYP0 ;返回主程序MUSTART2: ;歌曲2的播放程序MOV R0,#00H ;节拍表指针置零MOV R1,#00H ;音符表指针置零RTAB:MOV A,R0MOV DPTR,#RYTHMOVC A,@A+DPTR ;查表法将一个节拍数据取出放R2计数器中 MOV R2,ATTAB:MOV A,R1MOV DPTR,#TONEMOVC A,@A+DPTRMOV R3,A ;取出音符表高8位INC R1 ;指针加1MOV A,R1MOV DPTR,#TONEMOVC A,@A+DPTRMOV R4,A ;取出低8位SETB P2.4 ;输出相应音调的方波LOOP:MOV R5,#3BHMAIN:MOV TMOD,#01HMOV TL0,R4MOV TH0,R3SETB TR0CLR P2.2MOV P0,#11111001BWAIT:JNB TF0,WAITCLR TF0CPL P2.4MAYA:JNB P3.2,MAYB ;判断P3.2口是否有为1JNB P3.4,MAYB ;判断P3.4口是否有为1LJMP RA ;P3.4口为0则跳转到程序RAMAYB:JNB P3.3,JIELI ;判断P3.3口是否有为1JNB P3.5,JIELI ;判断P3.5口是否有为1LJMP MUSTART2 ;P3.5口为0则放第二首歌RA: DJNZ R5,MAIN ;无打断则继续放第一首歌DJNZ R2,LOOPINC R0 ;两个表的指针都加1INC R1CJNE R1,#84,RTAB ;判断是否取完SETB P2.3LJMP KEYP0TONE:DB0F9H,21H,0F9H,21H,0FBH,68H,0FBH,068H,0FBH,0E9H,0FBH,0E9H,0FBH,68H,0FAH,0D8H,0FA H,0D8HDB0FAH,8CH,0FAH,8CH,0F9H,0E1H,0F9H,0E1H,0F9H,21H,0FBH,68H,0FBH,68H,0FAH,0D8H,0FAH ,0D8HDB0FAH,8CH,0FAH,8CH,0F9H,0E1H,0FBH,68H,0FBH,68H,0FAH,0D8H,0FAH,0D8H,0FAH,8CH,0FAH ,8CHDB0F9H,0E1H,0F9H,21H,0F9H,21H,0FBH,68H,0FBH,68H,0FBH,0E9H,0FBH,0E9H,0FBH,68H,0FAH ,0D8HDB 0FAH,0D8H,0FAH,8CH,0FAH,8CH,0F9H,0E1H,0F9H,0E1H,0F9H,21HRYTH:DB 04,04,04,04,04,04,08,04,04,04DB 04,04,04,08,04,04,04,04,04,04DB 08,04,04,04,04,04,04,08,04,04 DB 04,04,04,04,08,04,04,04,04,04 DB 04,08MUSTART1: ;第一首歌程序(同上) MOV R0,#00HMOV R1,#00HRTAB2:MOV A,R1MOV DPTR,#TABLE1MOVC A,@A+DPTRMOV R2,ATTAB2: MOV A,R1MOV DPTR,#TONE2MOVC A,@A+DPTRMOV R3,AINC R1MOV A,R1MOV DPTR,#TONE2MOVC A,@A+DPTRMOV R4,ASETB P2.4LOOP2: MOV R5,#9BHMAIN2:MOV TMOD,#01HMOV TL0,R4MOV TH0,R3SETB TR0CLR P2.2MOV P0,#10100100BWAITR:JNB TF0,WAITRCLR TF0CPL P2.4MAYA1:JNB P3.3,MAYB1JNB P3.5,MAYB1LJMP RBMAYB1:JNB P3.2,BACKJNB P3.4,BACKLJMP MUSTART1BACK:LJMP JIELIRB: DJNZ R5,MAIN2DJNZ R2,LOOP2INC R0INC R1CJNE R1,#46,RTAB2SETB P2.2LJMP KEYP0TONE2:DB0FBH,0E9H,0FCH,5BH,0F9H,21H,0FCH,5BH,0F9H,21H,0FAH,8CH,0FCH,5BH,0FAH,8CH,0FAH,8 CHDB0FBH,0E9H,0FBH,68H,0FBH,0E9H,0F9H,21H,0FBH,68H,0FAH,8CH,0FAH,8CH,0FAH,0D8H,0FAH ,8CHDB 0FAH,0D8H,0F9H,21H,0FAH,8CH,0F9H,21H,0F9H,21HTABLE1:DB 04,04,12,04,08,08,20,04,04,12DB 04,08,08,20,04,04,12,04,04,12DB 20,04,04END4实验结果按下K1键,显示“1”,发出“1”的声音。