单片机课程设计电子音调发生器.docx

上传人:b****6 文档编号:16669512 上传时间:2023-07-16 格式:DOCX 页数:21 大小:709.61KB
下载 相关 举报
单片机课程设计电子音调发生器.docx_第1页
第1页 / 共21页
单片机课程设计电子音调发生器.docx_第2页
第2页 / 共21页
单片机课程设计电子音调发生器.docx_第3页
第3页 / 共21页
单片机课程设计电子音调发生器.docx_第4页
第4页 / 共21页
单片机课程设计电子音调发生器.docx_第5页
第5页 / 共21页
单片机课程设计电子音调发生器.docx_第6页
第6页 / 共21页
单片机课程设计电子音调发生器.docx_第7页
第7页 / 共21页
单片机课程设计电子音调发生器.docx_第8页
第8页 / 共21页
单片机课程设计电子音调发生器.docx_第9页
第9页 / 共21页
单片机课程设计电子音调发生器.docx_第10页
第10页 / 共21页
单片机课程设计电子音调发生器.docx_第11页
第11页 / 共21页
单片机课程设计电子音调发生器.docx_第12页
第12页 / 共21页
单片机课程设计电子音调发生器.docx_第13页
第13页 / 共21页
单片机课程设计电子音调发生器.docx_第14页
第14页 / 共21页
单片机课程设计电子音调发生器.docx_第15页
第15页 / 共21页
单片机课程设计电子音调发生器.docx_第16页
第16页 / 共21页
单片机课程设计电子音调发生器.docx_第17页
第17页 / 共21页
单片机课程设计电子音调发生器.docx_第18页
第18页 / 共21页
单片机课程设计电子音调发生器.docx_第19页
第19页 / 共21页
单片机课程设计电子音调发生器.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

单片机课程设计电子音调发生器.docx

《单片机课程设计电子音调发生器.docx》由会员分享,可在线阅读,更多相关《单片机课程设计电子音调发生器.docx(21页珍藏版)》请在冰点文库上搜索。

单片机课程设计电子音调发生器.docx

单片机课程设计电子音调发生器

单片机课程设计报告

电子音调发生器

 

学院电子信息工程学院

 

1、题目

电子音调发生器

2、设计的任务及要求

利用JD51开发板上的按键S1~S4和蜂鸣器设计电子音调发生器,要求:

(1)利用JD51开发板上的按键S1~S4进行音调选择,即按下不同的开关产生不同的音调,依次按动S1~S4及组合按键,蜂鸣器发出1234567i八个音调;并在数码管上显示。

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

三、工作原理及设计思路

工作原理:

音节由不同频率的方波产生,音节与频率的关系通过查表可得。

要产生音频方波,只要算出某一音频的周期(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/fosc)*(256-x)

即x=256-(fosc/24f)

其中f:

音调频率,当晶振fosc=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

设计思路

1.总体框图

 

硬件图

2.蜂鸣电路

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

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

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

四、软件设计流程及描述

根据要实现的功能,流程图如下:

熟悉定时器和键盘扫描电路的工作原理及编程方法。

 

 

1.程序设计描述

电子音调主要的工作是将按键的信息读取,然后根据按键的数字,用定时器输出相对应的频率,实现音调的发生。

程序主要为5部分,按键扫描、中断计时、数码显示、音乐播放、主程序,他们分别执行不同的功能。

2.各部分功能介绍

(1)按键读取程序

键盘键值读取程序包括键盘扫描、消除抖动、键译码等容。

按键的识别主要有两种方法:

行反转法和行扫描法。

因为键盘为机械开关,容易引入抖动。

为了消除抖动干扰,在程序中要加入消除抖动的部分。

(2)中断计时

中断部分,中断定时器1主要负责输出不同频率的方波,产生声音,中断定时器1主要是计时按键时间及按键间隔时间的功能,在播放音乐的时候,还担任着播放音乐的节拍的任务。

(3)音乐播放

音乐播放部分主要是播放音乐,实现按键重播和播放程序里面的音乐的功能。

(4)主程序

主程序主要是随时发出按键的声音功能,并且通过不同P口的扫描,判断是否是播放按键声音还是播放音乐,还是继续发出按键声音。

五、proteus仿真设计及描述

按键S1:

数码管显示1,同时能听到蜂鸣器响音调1

按键S2:

数码管显示2,同时能听到蜂鸣器响音调2

 

按键S3:

数码管显示3,同时能听到蜂鸣器响音调3

按键S4:

数码管显示4,同时能听到蜂鸣器响音调4

因为音调5,6,7,i以及音乐都是由两个按键控制的,所以在仿真时不能实现。

实际效果图

音调1:

音调2

音调5

音调6

 

六、汇编源程序代码

/*SB11音SB22音SB33音SB44音SB1SB25音SB2SB36音SB3SB47音SB1SB4i音SB1SB3第一首歌SB2SB4第二首歌*/

ORG0000H

LJMPKEYP0;跳至KEYP0程序

KEYP0:

MOVR0,#00H;数据首地址

CLRTR0;TR0置零,定时未开始

SETBP2.4;关蜂鸣器

SETBP2.3;关数码管

W:

MOVR0,P3;扫描按键输入

CJNER0,#0FFH,KEYPO1;有输入时跳转(R0≠0FFH时跳至KEYP01程序)

JMPW;无输入时继续扫描

KEYPO1:

CJNER0,#0FBH,KEYPO2;输入1音,非1音跳转

SETBP2.4;蜂鸣器置于高电平,音调1方波发生

MOVR3,#200;设循环初值,使开关在R3=0时播放一段时间

MAIN01:

MOVTMOD,#01H;定时,方式1

MOVTL0,#21H;置定时初值,音调1初值为0F921H

MOVTH0,#0F9H

SETBTR0;启动T0工作

WAIT1:

JNBTF0,WAIT1;定时未到,循环等待

CLRTF0;定时到,软件清零TF0

CPLP2.4;由P2.4输出,信号取反,蜂鸣器响

CLRP2.3;数码管显示1

MOVA,#11111001B;置比较初值

MOVP0,A

DJNZR3,MAIN01;若R3-1不等于0,继续跳至MAIN01程序

LJMPKEYP0;=0则返回程序KEYP0

KEYPO2:

CJNER0,#0F7H,KEYPO3;输入2音,非2音跳转

SETBP2.4;蜂鸣器置于高电平,音调2方波发生

MOVR3,#200;设循环初值

MAIN02:

MOVTMOD,#01H;定时,方式1

MOVTL0,#0E1H;置定时初值

MOVTH0,#0F9H

SETBTR0;启动T0工作

WAIT2:

JNBTF0,WAIT2;定时未到,循环等待

CLRTF0;定时到,软件清零TF0

CPLP2.4;由P2.4输出,信号取反,蜂鸣器响

CLRP2.3;数码管显示2

MOVA,#10100100B;置比较初值

MOVP0,A

DJNZR3,MAIN02;判断R3是否等于0,未完,继续

LJMPKEYP0;返回程序KEYP0

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;将节拍表记入DPTR指针

MOVCA,A+DPTR;查表法将一个节拍数据取出放R2计数器中

MOVR2,A;将节拍存入R2

TTAB:

MOVA,R1

MOVDPTR,#TONE;将音符记入DPTR

MOVCA,A+DPTR;查表法将一个音符数据取出放入R1计数器中

MOVR3,A;取出音符表高8位,存入R3

INCR1;指针加1

MOVA,R1

MOVDPTR,#TONE;将音符记入DPTR

MOVCA,A+DPTR;查表法将一个音符数据取出放入R1计数器中

MOVR4,A;取出低8位,存入R4

SETBP2.4;输出相应音调的方波

LOOP:

MOVR5,#3BH

MAIN:

MOVTMOD,#01H;主程序初始化,定时器T0工作于方式1

MOVTL0,R4;置定时初值(音符)

MOVTH0,R3

SETBTR0;启动T0

WAIT:

JNBTF0,WAIT;定时未到,循环等待

CLRTF0;定时到,软件清零TF0

CPLP2.4;由P2.4输出,信号取反,蜂鸣器响

MAYA:

JBP3.2,MAYB;判断P3.2口是否有为1,为1则跳至MAYB

JBP3.4,MAYB;判断P3.4口是否有为1,为1则跳至MAYB

LJMPRA;P3.4口为0则跳转到程序RA

MAYB:

JBP3.3,JIELI;判断P3.3口是否有为1

JBP3.5,JIELI;判断P3.5口是否为1(为1则继续播放第一首歌)

LJMPMUSTART2;P3.5口为0则放第二首歌

RA:

DJNZR5,MAIN;无打断则继续放第一首歌

DJNZR2,LOOP;判断R2是否等于0

INCR0;两个表的指针都加1

INCR1

CJNER1,#88,RTAB;判断是否取完(R1不等于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,0DBH,0FAH,8CH,0F9H,21H,0FAH,8CH,0FAH,0D8H,0FBH,68H,0FBH,68H,0FBH,68H,0FBH,68H

DB0FBH,0E9H,0FBH,0E9H,0FBH,68H,0FBH,0E9H,0FCH,5BH,0FAH,8CH,0FCH,8FH,0FCH,8FH,0FCH,5BH

DB0FCH,8FH,0FCH,0EFH,0FCH,0EFH,0FCH,0EFH,0FCH,8FH,0FDH,45H,0FDH,6EH,0FCH,0EFH

;节拍表

RYTH:

DB04,04,04,04,04,04,04,04,04,04

DB04,05,04,04,04,04,04,04,04,04

DB04,04,04,06,04,04,04,07,04,04

DB04,04,04,06,04,04,04,07,04,04

DB04,04,04,04

MUSTART2:

;歌曲2的播放程序

MOVR0,#00H;节拍表指针置零

MOVR1,#00H;音符表指针置零

RTAB2:

MOVA,R1

MOVDPTR,#TABLE1;将节拍表记入DPTR指针

MOVCA,A+DPTR;查表法将一个节拍数据取出放R2计数器中

MOVR2,A;将节拍存入R2

TTAB2:

MOVA,R1

MOVDPTR,#TONE2;将音符记入DPTR

MOVCA,A+DPTR;查表法将一个音符数据取出放入R1计数器中

MOVR3,A;取出音符表高8位

INCR1;指针加1

MOVA,R1

MOVDPTR,#TONE2;将音符记入DPTR

MOVCA,A+DPTR;查表法将一个音符数据取出放入R1计数器中

MOVR4,A;取出低8位

SETBP2.4;输出相应音调的方波

LOOP2:

MOVR5,#9BH

MAIN2:

MOVTMOD,#01H;主程序初始化,定时器T0工作于方式1

MOVTL0,R4;置定时初值

MOVTH0,R3

SETBTR0;启动T0

WAITR:

JNBTF0,WAITR;定时未到,循环等待

CLRTF0;定时到,软件清零TF0

CPLP2.4;由P2.4输出,信号取反,蜂鸣器响

MAYA1:

JBP3.3,MAYB1;判断P3.3口是否为1

JBP3.5,MAYB1;判断P3.5口是否为1

LJMPRB;P3.5口为0则跳转到程序RA

MAYB1:

JBP3.2,BACK;判断P3.2口是否有为1

JBP3.4,BACK;判断P3.4口是否有为1

LJMPMUSTART1;P3.2,3.4口皆为0则播放第一首歌

BACK:

LJMPJIELI

RB:

DJNZR5,MAIN2;无打断则继续播放第二首歌

DJNZR2,LOOP2;判断R2是否等于0

INCR0;两个表的指针都加1

INCR1

CJNER1,#64,RTAB2;判断是否取完

LJMPKEYP0

;音符表

TONE2:

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,0DBH,0FAH,8CH,0F9H,21H,0FAH,8CH,0FAH,0D8H,0FBH,68H,0FBH,68H,0FBH,68H,0FBH,68H

DB0FBH,0E9H,0FBH,0E9H,0FBH,68H,0FBH,0E9H,0FCH,5BH,0FAH,8CH,0FCH,8FH,0FCH,8FH,0FCH,5BH

DB0FCH,8FH,0FCH,0EFH,0FCH,0EFH,0FCH,0EFH,0FCH,8FH,0FDH,45H,0FDH,6EH,0FCH,0EFH

;节拍表

TABLE1:

DB04,04,04,04,04,04,04,04,04,04

DB04,05,04,04,04,04,04,04,04,04

DB04,04,04,06,04,04,04,07,04,04

DB04,04,04,06,04,04,04,07,04,04

DB04,04,04,04

END

七、课程设计总结及体会

编完程序及调试时,遇到的几个问题以及解决办法。

问题一:

刚开始接通电源时,单片机就开始发出声音,为了解决这个问题,我将程序里加入了SETBP2.4这步程序,把蜂鸣器的初值设定为1。

问题二:

按完S1按键时,未发出音调1,这是由于我未将蜂鸣器置于高电平,加上SETBP2.4后,问题解决。

问题三:

按按键S2时,数码管第一位而不是第四位出现数字2,不过我之后发现是因为我将本应是CLRP2.3的程序写成了CLRP2.0,改变后,数码管显示正常。

问题四:

最开始我并未在程序中设置循环扫描按键输入这部分程序。

因此在按按键S1发出音调1后,按按键S2~S4音调2、3、4等等都不会发出相应的音调。

检查完程序,发现原因,再加入循环扫描按键输入这部分程序,问题得到解决。

总结及体会

此次实验的硬件电路是固定的,控制按键有4个:

S1~S4,还有复位按键,晶振电路,蜂鸣器。

在电脑上安装Keil软件以及proteus软件及它们的联调不是很困难,只要照着安装调试视频即可,焊单片机的板子过程还是比较简单的,只需要把每个原件焊到正确的位置即可,再加上把芯片改为调试模式。

用电脑上的软件测试单片机芯片时,我使用的是跑马灯程序,程序运行正确,这些都不是很困难,而困难的是程序的编写以及调试。

本次程序的编写,我首先明确自己要实现的功能,之后进行整体规划,将程序分为四大部分,

(1)按键读取程序

(2)中断计时,中断部分,中断定时器1主要负责输出不同频率的方波,产生声音,中断定时器1主要是计时按键时间及按键间隔时间的功能,在播放音乐的时候,还担任着播放音乐的节拍的任务。

(3)音乐播放主要是实现按键重播和播放音乐。

(4)主程序,主程序主要是随时发出按键的声音功能,并且通过不同P口的扫描,判断播放按键声音还是播放音乐。

再逐步设计每个部分的程序,设计各个端口怎么用,定时器怎么来分,编写程序来实现需要的功能。

在编写程序时,对于我来说是有些困难的,因为单片机的课程是从第九周开始上,老师讲课大概只用了4、5周的时间,课讲得很快在此之前,我没有上过微机原理的课程,所以对此课程理解起来比较困难。

我不是十分了解汇编语言,所以在编程序的时候,对汇编语言运用比较艰难。

通过查阅相关资料以及学习,我最终编写出了这个程序,我觉得,这次写程序有很多收获,通过编写程序,我再一次复习了单片机的知识,对于定时器有了更多了解,了解了更多语句的用法,复习了定时器方式1初值的计算方法,。

焊接单片机板子的过程培养了我的动手能力,并且通过这次程序的编写使我更加了解了汇编语言,提高了我编写以及调试程序的能力,加深了我对与单片机原理与应用这门课的理解和学习。

十、参考文献

1.《单片机原理与应用》戴胜华等著,:

清华大学、交通大学,2006

2.《汇编语言程序设计》2008

3.《MCS-51系列单片机实用编程》贺哲荣,甄旭编著:

电力,2010

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2