单片机课程设计电子音调发生器Word格式文档下载.docx
《单片机课程设计电子音调发生器Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机课程设计电子音调发生器Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
![单片机课程设计电子音调发生器Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2023-1/26/678e076e-6393-424e-9a32-a7eb0028b31d/678e076e-6393-424e-9a32-a7eb0028b31d1.gif)
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置零,定时未开始
SETB;
关蜂鸣器
关数码管
W:
MOVR0,P3;
扫描按键输入
CJNER0,#0FFH,KEYPO1;
有输入时跳转(R0≠0FFH时跳至KEYP01程序)
JMPW;
无输入时继续扫描
KEYPO1:
CJNER0,#0FBH,KEYPO2;
输入1音,非1音跳转
蜂鸣器置于高电平,音调1方波发生
MOVR3,#200;
设循环初值,使开关在R3=0时播放一段时间
MAIN01:
MOVTMOD,#01H;
定时,方式1
MOVTL0,#21H;
置定时初值,音调1初值为0F921H
MOVTH0,#0F9H
SETBTR0;
启动T0工作
WAIT1:
JNBTF0,WAIT1;
定时未到,循环等待
CLRTF0;
定时到,软件清零TF0
CPL;
由输出,信号取反,蜂鸣器响
CLR;
数码管显示1
MOVA,#B;
置比较初值
MOVP0,A
DJNZR3,MAIN01;
若R3-1不等于0,继续跳至MAIN01程序
=0则返回程序KEYP0
KEYPO2:
CJNER0,#0F7H,KEYPO3;
输入2音,非2音跳转
SETB;
蜂鸣器置于高电平,音调2方波发生
设循环初值
MAIN02:
MOVTL0,#0E1H;
置定时初值
WAIT2:
JNBTF0,WAIT2;
数码管显示2
MOVA,#B;
DJNZR3,MAIN02;
判断R3是否等于0,未完,继续
返回程序KEYP0
KEYPO3:
CJNER0,#0EFH,KEYPO4;
输入3音,非3音跳转
蜂鸣器置于高电平
MOVR3,#200
MAIN03:
MOVTMOD,#01H
MOVTL0,#08CH
MOVTH0,#0FAH
SETBTR0
WAIT3:
JNBTF0,WAIT3
CLRTF0
CPL
CLR
MOVA,#B
DJNZR3,MAIN03
LJMPKEYP0
KEYPO4:
CJNER0,#0DFH,KEYPO5;
输入4音,非4音跳转
SETB
MAIN04:
MOVTL0,#0D8H
WAIT4:
JNBTF0,WAIT4
DJNZR3,MAIN04
KEYPO5:
CJNER0,#0F3H,KEYPO6;
输入5音,非5音跳转
MOVR3,#200
MAIN05:
MOVTL0,#068H
MOVTH0,#0FBH
WAIT5:
JNBTF0,WAIT5
DJNZR3,MAIN05
KEYPO6:
CJNER0,#0E7H,KEYPO7;
输入6音,非6音跳转
MAIN06:
MOVTMOD,#01H
MOVTL0,#0E9H
WAIT6:
JNBTF0,WAIT6
DJNZR3,MAIN06
KEYPO7:
CJNER0,#0CFH,KEYPO8;
输入7音,非7音跳转
MAIN07:
MOVTL0,#05BH
MOVTH0,#0FCH
WAIT7:
JNBTF0,WAIT7;
DJNZR3,MAIN07
KEYPO8:
CJNER0,#0DBH,KEYPO9;
输入i音,非i音跳转
SETB
MAIN08:
MOVTL0,#08FH
WAIT8:
JNBTF0,WAIT8;
DJNZR3,MAIN08
KEYPO9:
CJNER0,#0EBH,KEYPO10;
跳转到第一首歌程序
LJMPMUSTART1
KEYPO10:
CJNER0,#0D7H,JIELI;
跳转到第二首歌程序
LJMPMUSTART2
JIELI:
JMPKEYP0;
返回主程序
MUSTART1:
;
歌曲1的播放程序
节拍表指针置零
MOVR1,#00H;
音符表指针置零
RTAB:
MOVA,R0
MOVDPTR,#RYTH;
将节拍表记入DPTR指针
MOVCA,@A+DPTR;
查表法将一个节拍数据取出放R2计数器中
MOVR2,A;
将节拍存入R2
TTAB:
MOVA,R1
MOVDPTR,#TONE;
将音符记入DPTR
查表法将一个音符数据取出放入R1计数器中
MOVR3,A;
取出音符表高8位,存入R3
INCR1;
指针加1
MOVA,R1
MOVR4,A;
取出低8位,存入R4
输出相应音调的方波
LOOP:
MOVR5,#3BH
MAIN:
主程序初始化,定时器T0工作于方式1
MOVTL0,R4;
置定时初值(音符)
MOVTH0,R3
启动T0
WAIT:
JNBTF0,WAIT;
MAYA:
JB,MAYB;
判断口是否有为1,为1则跳至MAYB
JB,MAYB;
LJMPRA;
口为0则跳转到程序RA
MAYB:
JB,JIELI;
判断口是否有为1
JB,JIELI;
判断口是否为1(为1则继续播放第一首歌)
LJMPMUSTART2;
口为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,04
MUSTART2:
;
歌曲2的播放程序
节拍表指针置零
RTAB2:
MOVDPTR,#TABLE1;
TTAB2:
MOVDPTR,#TONE2;
取出音符表高8位
取出低8位
LOOP2:
MOVR5,#9BH
MAIN2:
MOVTMOD,#01H;
MOVTH0,R3
WAITR:
JNBTF0,WAITR;
MAYA1:
JB,MAYB1;
判断口是否为1
JB,MAYB1;
LJMPRB;
MAYB1:
JB,BACK;
JB,BACK;
LJMPMUSTART1;
口皆为0则播放第一首歌
BACK:
LJMPJIELI
RB:
DJNZR5,MAIN2;
无打断则继续播放第二首歌
DJNZR2,LOOP2;
CJNER1,#64,RTAB2;
判断是否取完
音符表
TONE2:
TABLE1:
DB04,04,04,04
END
七、课程设计总结及体会
编完程序及调试时,遇到的几个问题以及解决办法。
问题一:
刚开始接通电源时,单片机就开始发出声音,为了解决这个问题,我将程序里加入了SETB这步程序,把蜂鸣器的初值设定为1。
问题二:
按完S1按键时,未发出音调1,这是由于我未将蜂鸣器置于高电平,加上SETB后,问题解决。
问题三:
按按键S2时,数码管第一位而不是第四位出现数字2,不过我之后发现是因为我将本应是CLR的程序写成了CLR,改变后,数码管显示正常。
问题四:
最开始我并未在程序中设置循环扫描按键输入这部分程序。
因此在按按键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