计算机学院课程设计报告Word文档下载推荐.docx
《计算机学院课程设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《计算机学院课程设计报告Word文档下载推荐.docx(27页珍藏版)》请在冰豆网上搜索。
教研室审核意见:
教研室主任签字:
指导教师(签名)
日
学生(签名)
课程设计总结:
在不知不觉中两个星期过去了,回想起来,真是一言难尽,期间既有无奈辛酸,又有成功的喜悦。
学了一学期的单片机,对单片机的硬件设计,软件设计掌握的掌握程度远远不够,但经过这段时间努力,在老师的耐心指导下,从设计、论证、修改到编程、调试,终于使我的设计完成了。
使我无论在理论基础知识还是在实际的操作能力上都有了较大的提高,更让我懂得了一分耕耘一分收获的道理。
通过本次音乐盒的设计,极大地激发了我对单片机的学习兴趣,同时也让我学习到了很多新的东西,比如单片机的定时器功能,LED的数码显示,功能键盘的设计等,这些都让我受益匪浅。
这其中有以前书本上学习过的知识,也有很多未曾注意到得新知识,比如如何将乐谱转换成机器能识别的代码,并让机器演奏音乐这一点,课本上并未涉及,但通过查找资料,让我学会了如何实现,我认为更主要的是让我明白了如何主动学习。
这些曾使我的设计出错的问题,通过自己的努力,老师指导和同学的帮助,终于被我一个一个的克服了,顺利把硬件实物顺利做好,把软件调试完成了。
通过此次课程设计,让我明白了很多,不光让我明白了很多新的知识,更让我懂得了如何学习,让我知道了如何做人,这一点主要感谢我的课设指导教师p潘老师,是他一直在教导我,鼓励我,才让我顺利完成了任务,在这里我表示衷心的感谢。
一分耕耘一分收获,只要真心付出了,就一定会有所回报。
我愿在未来的学习和研究过程中,以更加丰厚的成果来答谢曾经帮助过我的老师,同学和朋友.
1概述
1.1数字音乐盒简介
音乐盒的起源,可追溯至中世纪欧洲文艺复兴时期。
当时为使教会的的钟塔报时,而将大小的钟表上机械装置,被称为“可发出声音的组钟”。
音乐盒300多年的产品发展,同时也是人类文明300多年发展的历史鉴证。
每个不同时期的音乐盒造型,都能折射出当时不同的社会心态和文明发展现状,它也成了时代的一面镜子。
现今,音乐盒的制造,延袭传统,结合现代,正日益成为人们或为了典藏一段岁月,或为了收藏一份情感,或出于对音乐的追求,或对于旧时代的怀念,或为了居室的美化,等等,而得到众多品位人士的追求。
音乐盒的分类:
18音,30音,这些是代表音乐盒机芯的音数,其实也就是机芯里面,那一排钢条的数量,钢条的数量越多,也就是音数越高,奏出来的音色就越丰富,曲子也就是越好听,同时曲子的播放时间也相应长一点。
一般18音的曲子为25秒左右,30音的曲子为35秒左右。
50音的差不多有60秒。
目前来说,一般市面上卖的“爱丽丝”都是18音的,其次是30音,50音。
此次设计的目的就是运用单片机来设计一套控制系统,来完成音乐播放的控制,并设计一套硬件来进行音调播放的实际模拟,从而有欣赏音乐的效果。
1.2发声原理介绍
首先介绍蜂鸣器的发声原理。
众所周知,音调和音调的时长是音符的主要特征,通过产生不同的音调和音调的时长可以奏出不同的音符来。
然后一个个音符串联在一起就可以产生美妙的音乐来了。
音调主要由声音的频率决定,通过单片机给蜂鸣器不同的音频脉冲来产生不同的音调。
要产生音频脉冲,只要算出某一音频的周期(周期=1/频率),然后将此周期除以2即为半周期的时间。
利用单片机的定时器工作在计数模式MODE1下,设定TH0和TL0的值以产生这半个周期,每当计时到达时就将输出脉冲的I/O(即接蜂鸣器的那个管脚)反相,然后重复计时此半个周期再对I/O反相,就可以在I/O引脚上得到此频率的脉冲。
下面附上不同音调所对应的频率表:
音符
频率(Hz)/初值(
)
低1DO
262/63627
中1DO
523/64580
高1DO
1042/65056
低2RE
294/63835
中2RE
589/64687
高2RE
1245/65134
低3M
330/64021
中3M
661/64780
高3M
1318/65157
低4FA
350/64107
中4FA
700/64822
高4FA
1397/65178
低5SO
393/64264
中5SO
786/64900
高5SO
1568/65217
低6LA
441/64402
中6LA
882/64969
高6LA
1760/65252
低7SI
495/64526
中7SI
990/65031
表1.1C调各音符频率与计数初值T的对照表
节拍的产生:
音乐中的节拍用延时时间产生。
例如,1拍=0.4s,1/4拍=0.1s,以此类推。
假设1/4拍执行一次延时程序,则1/2拍就执行两次延时程序,所以只要求出1/4拍的延时时间,其余节拍就是它的倍数。
为了方便,将节拍数也进行了编码,并且计算了乐谱节拍编程时的延时时间。
按1/4拍为一个延时时间的节拍编码与节拍对应的表
按1/8拍为一个延时时间的节拍编码与节拍对应的表
节拍编码
节拍
1
1/4
6
6/4
1/8
6/8
2
2/4
8
8/4
2/8
8/8
3
3/4
A
10/4
3/8
10/8
4
4/4
C
12/4
4/8
12/8
5
5/4
F
15/4
5/8
表1.2节拍数编码表
乐谱节拍
1/4拍的延时时间
1/8拍的延时时间
125ms
62ms
187ms
94ms
250ms
表1.3乐谱节拍编程时的时间延时表
如果没有必要进行精确的计时,可以用for循环空语句来粗略计时即可(本次课设选用此法)。
当单片机使用11.0592Mhz的晶振时,for(i=0;
i<
115;
i++);
这个空循环延时约为1ms;
当晶振选用12Mhz时,可使用for(i=0;
125;
这个空循环来延时1ms。
在这个空循环外头再进行一次循环就可以实现延时若干ms。
2音乐盒总体设计
2.1设计要求
本次数字音乐盒课程设计是利用I/O口产生一定频率的方波,从而驱动蜂鸣器,发出不同的音调,从而演奏乐曲因为产生的频率不同,所以导致蜂鸣器发出的音调不同,由不同的音调和节拍可组成不同的音乐。
演奏过程中可采用七段数码管显示当前播放的歌曲序号和播放时间。
同时可通过键盘数字键直接选择乐曲,也可以用功能键选择上一曲和下一曲,具有暂停和播放控制功能。
例如本次课设按1键选择第一首歌曲,按2键选择第二首歌曲,按A键暂停,按B键继续唱歌。
2.2方案论证与设计
2.2.1总体方案设计
通过单片机的定时器产生一定长度的方波,方波脉冲驱动蜂鸣器发声。
要产生音频脉冲,只需算出某一音频的周期(1/音频),然后取半周期的时间定时。
利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O口反相,就可在I/O脚上得到此频率的脉冲。
如中音D0,频率为523HZ,其周期T=1/523=1912微秒,因此只要令计数器定时1912/2=956,在每计数956次时将I/O口反相,就可得到中音D0(523HZ)。
当键盘有键按下时,判断键值,启动计数器T0,产生一定频率的脉冲,驱动蜂鸣器,放出乐曲。
同时启动定时器T1,在LED显示歌曲号,。
数码管采用共阴极数码管,实现歌曲序号的显示;
功能键盘采用按键开关,实现歌曲播放顺序的调换和暂停播放功能;
蜂鸣器由单片机的P3.6口控制,实现歌曲播放。
通过按下功能键实现上一首和下一首及暂停播放,同时有数码管显示当前播放歌曲的序号,蜂鸣器播放出音乐。
2.2.2LED驱动模块设计
方案一:
采用静态锁存方式,将每一个LED发光管的一端接至单片机的一个I/O口,另一端通过电阻接电源。
这种方法可以直接驱动LED,原理简单,驱动能力强,LED的亮度也可以通过限流电阻调节,非常方便,但此种方法太浪费单片机的I/O口,只适合于较小的系统。
方案二:
采用动态扫描方式,通过三极管驱动并联在一起的LED发光管的一端(共阴极),LED发光管的另一脚接通用I/O口,控制其亮灭。
该方法能驱动较多的LED,控制方式较灵活,而且节省单片机的资源。
比较以上两种方案,系统设计中采用方案二。
2.2.3系统总体结构框图
3系统硬件设计
本设计中用到了8051单片机,4*6键盘,蜂鸣器,8段数码管等硬件电路常用元器件。
3.1管脚说明
8051芯片如图3.1所示:
VCC:
供电电压。
GND:
接地。
P0口,P1口,P2口,P3口:
四个8位I/O口
P3口也可作为8051的一些特殊功能口,如下所示:
管口管脚备选功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
/PSEN:
外部程序存储器的选通信号。
/EA/VPP:
/EA保持低电平时,在此期间为外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;
当/EA端保持高电平时,此时为内部程序存储器。
X1:
反向振荡放大器的输入及内部时钟工作电路的输入。
X2:
来自反向振荡器的输出。
图3.18051芯片示意图
3.2振荡器特性
X1和X2分别为反向放大器的输入和输出。
该反向放大器可以配置为片内振荡器。
石晶振荡和陶瓷振荡均可采用。
如采用外部时钟源驱动器件,X2应不接。
有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
3.3LED显示器的结构
常用的LED显示器为8段。
每一个段对应1个发光二极管,这种显示器有共阳极和共阴极两种:
共阴极LED显示器的发光二极管的阴极连接在一起,通常此公共阴极接地。
当某个发光二极管的阳极为高电平时,发光二极管点亮,相应的段被显示。
同样,共阳极LED显示器的发光二极管的阳极连接在一起,通常此公共阳极接正电压,当某个发光二极管的阴极接低电平时,发光二极管被点亮,相应的段被显示。
为了使LED显示器显示不同的符号或数字,就要把不同段的发光二极管点亮,这样就要为LED提供代码,因为这些代码可使LED相应的段发光,从而显示不同字型,因此该代码称为段码。
7段发光二极管,再加上1个小数点位,共计8位。
因此提供给LED显示器的段码正好是1B。
各段与字节中各位对应关系如下表3.2:
代码位
D7
D6
D5
D4
D3
D2
D1
D0
显示位
dp
g
f
E
d
c
b
a
表3.28段LED结构及外形
3.4LED显示器工作原理
由N个LED显示块可以拼接成N位的LED显示器。
如图是LED数码管。
图3.3数码管结构图
N个LED显示器有N个位选线和8*N位根段码线。
段码线控制显示字符的字型,而位选线为各个LED显示块中各段的公共端,它控制该LED显示位的亮或暗。
LED显示器有静态显示和动态显示两种。
3.5键盘
图3.4键盘电路
键盘在单片机应用系统中能实现向单片机输入数据,传送命令等功能,是人工干预单片机的主要手段。
键盘实质上是一级按键开关的集合。
通常,键盘开关利用了机械触点的合、断作用。
键的闭合与否,反映在行线输出电压上就呈现高电平或低电平,如果高电平表示键断开,低电平则表示键闭合,通过对行线电平高低状态的检测,便可确认按键按下与否。
为了确保CPU对一次按键动作只确认一次按键有效,必须消除抖动的影响。
采用软件来消除按键抖动的基本思想是:
在一次检测到有键按下时,该键所对应的行线为低电平,执行一段延时10MS的子程序后,确认该行线电平是不否仍为低电平,如果仍为低电平,则确认为该行确实有键按下。
当按键松开时,行线的低电平变为高电平,执行一段延时10MS的子程序后,检测该行线为高电平,说明按键确实已经松开。
3.6时钟电路模块
时钟电路在单片机系统中起着非常重要的作用,是保证系统正常工作的基础。
在一个单片机应用系统中,时钟是保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢。
图3.5时钟电路
为达到振荡周期是12MHZ的要求,这里要采用12MHZ的晶振,另外有两个22P的独石电容,两晶振引脚分别连到X1和X2振荡脉冲输入引脚。
其中74HC244-2表示74HC244芯片的2号引脚。
3.7音频输出部分
图3.6音频输出部分
音频输出部分主要由NPN三极管和蜂鸣器组成。
用P1.0口控制蜂鸣器。
3.8整体电路设计
图3.7整体电路设计
4子函数描述
4.1定时器中断设计:
在本设计中采用定时器中断0方式。
工作方式寄存器TMOD用于选择定时器/计数器的工作方式和工作模式。
其格式如下表4.1:
TMOD
GATE
M1
M0
T1方式字段
T0方式字段
表4.1寄存器TMOD工作方式和工作模式
定时器初始化子函数如下:
voidTimerConfiguration()
{
TMOD=0x01;
//选择工作方式1
TH0=0xfc;
//设置初始值,定时1ms
TL0=0x18;
EA=1;
//打开总中断
ET0=1;
//打开定时器0中断
TR0=0;
//关闭定时器0
}
4.2数码管显示模块设计:
模块设计的重点是由显示代码取得相应的段码,显示段码数据的并行发送,高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟,石英表,石英钟都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。
子函数如下:
voidDigDisplay()//显示函数
unsignedchari;
unsignedcharPos;
unsignedcharLED;
Pos=0x04;
//从左边开始显示
for(i=0;
i<
3;
i++)
{
OUTBIT=0;
//关所有八段管
LED=DisplayData[i];
OUTSEG=LED;
OUTBIT=Pos;
//显示一位八段管
Delay
(1);
Pos>
>
=1;
//显示下一位
}
4.3键盘控制模块设计:
此模块主要由键盘扫描程序组成,在主函数中通过switch()语句根据键盘扫描函数的返回值来进入相应的功能函数中。
扫描程序具体为先扫描列找出按键所在的列再扫描行找出按键所在的行,列为高四位行为低四位,因此有键值=列*4+行,然后等待键位释放,最后根据相应的键码值返回按键对应的值,若无按键则返回0xff。
流程图如下:
图4.2键盘扫描流程图
函数代码如下:
unsignedcharGetKey()
unsignedchark;
i=6;
Pos=0x20;
//找出键所在列
do{
OUTBIT=~Pos;
Pos>
k=~IN&
0x0f;
}while((--i!
=0)&
&
(k==0));
//键值=列x4+行
if(k!
=0)
i*=4;
if(k&
2)
i+=1;
elseif(k&
4)
i+=2;
8)
i+=3;
OUTBIT=0;
doDelay
(1);
while(TestKey());
//等键释放
return(KeyTable[i]);
//取出键码
elsereturn(0xff);
4.4蜂鸣器演奏子函数模块设计:
本模块通过循环获取频率和节拍数组来使蜂鸣器发出不同的音调以及延时音调时间,子函数如下:
voidyanzou(unsignedcharpinlv,unsignedintjiepai)//播放乐曲
{unsignedcharpl;
unsignedintjp;
for(jp=0;
jp<
jiepai;
jp++)
KeyDown();
if(flag==1)
{
TR0=0;
DisplayData[0]=LEDMAP[KeyValue];
DisplayData[1]=LEDMAP[s/10];
DisplayData[2]=LEDMAP[s%10];
while
(1)
{
KeyDown();
DigDisplay();
if(flag==2)
{
TR0=1;
break;
}
}
}
elseif(flag==3)
{TR0=0;
}
Buzzer=0;
for(pl=0;
pl<
pinlv;
pl++);
Buzzer=1;
4.5整体流程图设计:
图4.3整体流程图设计
5调试与结果分析
5.1调试步骤及方法
1.在实验箱上连接所需要的线
2.将实验箱LAB8000和电脑相连接
3.将程序载入实验箱
4.复位
5.运行程序
5.2实验结果
程序运行后,实验箱的数码管显示三个0,按1键蜂鸣器开始演奏第一首音乐,同时开始计时,并且显示当前演奏音乐的序号程序运行过程中,按A键音乐暂停,同时计时暂停,再按B键,音乐继续演奏,数码管继续计时,音乐结束后,可继续选择播放音乐序号,如此循环。
综上,本次设计符合设计要求。
参考文献
[1]张毅刚.单片机原理及应用[M].哈尔滨:
哈尔滨工业大学出版社,2008
[2]戴仙金.51单片机及其C语言程序开发实例[M].北京:
清华大学出版社,2011
[3]黄惟公.单片机原理及应用技术[M].西安:
西安电子科技大学出版社,2010
[4]高锋.单片微型计算机原理与接口技术[M].北京:
科学出版社,2007
[5]李叶紫.MCS-51单片机应用教程[M].北京:
清华大学出版社,2002
[6]刘守亦.单片机应用技术[M].陕西:
西安电子科技大学出版社,1995
附录(关键部分程序清单)
#include<
reg51.h>
xdataunsignedcharOUTBIT_at_0x8002;
//位控制口
xdataunsignedcharOUTSEG_at_0x8004;
//段控制口
xdataunsignedcharIN_at_0x8001;
//键盘读入口
sbitBuzzer=P1^0;
//蜂鸣器
unsignedcharDisplayData[10];
//数码管显示码
unsignedcharcodeLEDMAP[]={//共阴极八段管显示码
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsignedcharcodewema[]={0x20,0x10,0x08,0x04,0x02,0x01};
//位选,0-5位数码管
codeunsignedcharKeyTable[]={//键码定义
0x16,0x15,0x14,0xff,
0x13,0x12,0x11,0x10,
0x0d,0x0c,0x0b,0x0a,
0x0e,0x03,0x06,0x09,
0x0f,0x02,0x05,0x08,
0x00,0x01,0x04,0x07
};
unsignedcharcodepinlv1[]={131,110,98,87,73,87,110,98,131,0,110,98,87,73,73,65,98,87,87,87,73,65,73,65,55,58,65,73,65,87,110,98,87,73,110,131,110,98,87,65,73,73,0,87,65,65,73,82,87,98,87,73,131,110,98,0,110,98,87