单片机音乐发生器论文.docx
《单片机音乐发生器论文.docx》由会员分享,可在线阅读,更多相关《单片机音乐发生器论文.docx(13页珍藏版)》请在冰豆网上搜索。
单片机音乐发生器论文
西安建筑科技大学华清学院
课程设计(论文)
课程名称:
微型计算机基本原理与接口技术
题目:
基于8088的音乐发生器设计
院(系):
机电系
专业班级:
电信0801
姓名:
张晓飞
学号:
10号
指导教师:
张爱萍
2011年1月14日
目录
1引言…………………………………………………………………2
2系统设计方案………………………………………………………2
3整个系统实现功能…………………………………………………14
4总结…………………………………………………………………14
参考文献
音乐发生器实验
一、引言
如今的科技发展可谓日新月异,而接口的应用也在逐渐的引领生活的脚步。
本次通过音乐发生器课程设计,熟悉基于8253定时/计数器的音乐发生电路的设计与程序控制方法,通过8253定时/计数器产生不同频率的音频电信号,经放大后送至扬声器产生音乐。
该设计分为硬件设计和软件设计。
硬件设计是利用电路板实现一个基于8253定时/计数器的音乐发生器电路;软件设计是编写控制该电路发生音乐的程序。
最终需利用MFID实验平台和音乐发生器模块进行硬件连接,可用8253定时/计数器来控制音频发生器唱出乐曲,并且实现当按不同键时,唱出不同的乐曲。
8253的输入时钟CLK的频率为1.19318MHz。
二、系统设计方案
1、硬件电路设计
可编程定时器/计数器8253是一种在微机系统中实现定时和记数功能的LSI外围接口电路。
它的内部有三个独立的16位定时器/计数器。
每个计数器都有六种工作方式(方式0—方式5),由8253的控制字来控制。
在写入控制字及计数初值后8253才能正常工作。
由于计数过程中门控信号GATE的电平变化、计数初值的重新设置都会对实际计数造成影响,因此最终的OUT波形可能各种各样,实现控制关系各不相同,为了更好的完成本次设计,我们必须对8253的知识进行全面的了解,以及如何运用MF2KP编写汇编语言来实现软件部分的设计,程序设计在后面将介绍。
由实验原理图上的模块可以看出,硬件的设计很简单,将8255的PC6与8253的GATE相连;将PC0与8253的OUT经过一个与门电路然后接在音乐发生器的音频输入上;将8253的CLK2接1.19318Hz,以上便是硬件电路的连接,硬件部分的连接并不难,我们只需要按照图将电路接好就行了。
本此课程设计需要用的是发生器驱动模块,该模块包括喇叭SPK,LM386A,74L138,以及74LS245和LED等。
为了实现该原理图,需要以下实验资源配置:
1.电源:
机器内部供电,将平台的电源开关拨到“内”的位置上,将模块电源JP3接通。
2.电缆线:
采用单线/20芯扁平线。
3.本实验所用到资源:
J(8253),I(8255),R(音乐发生器)模块电源四个模块。
4.I/O端口地址:
8255的4个端口地址为300H-303H。
其中A口=300H,B口=301H,C口=302H,命令口=303H。
8253的四个端口地址为304H-307H。
其中通道0为304H,通道1为305H,通道2为306H,命令口为307H。
发生器模块板电路原理图如下所示:
图
(1)发生器原理框架图
2、软件程序设计
以下是音符频率参照表:
图
(2)音符频率参照表
图(3)音符频率参照表
程序的流程图如下:
图(4)程序流程图
汇编程序如下:
sstacksegmentstack
dw200dup(?
)
sstackends
datasegment
bgdb0ah,0dh,"pleasechooseasong.....$";提示信息
freq1dw330,392,330,294,330,392,330,294,330;音符的频率
dw330,392,330,294,262,294,330,392,294
dw262,262,220,196,196,220,262,294,332,262,0
time1dw3dup(8),4,4,8,4,4,16,;音符的延时
dw2dup(8,8,4,4),16
dw3dup(8,4,4),16
freq2dw330,292,262,294,3dup(330)
dw3dup(394),330,392,392
dw330,294,262,294,4dup(330)
dw294,294,330,294,262,0
time2dw6dup(4),8
dw2dup(4,4,8)
dw12dup(4),16
freq3dw330,294,262,294,330,330,330
dw294,294,294,330,392,392
dw330,294,262,294,330,330,330,330
dw294,294,330,294,262,0
time3dw4,4,4,4,4,4,8,4,4,8,4,4,8
dw12dup(4),16
freq4dw392,523,440,523,392,330,392,294,330,392,330,392,440,523,392,440,392,330,392,262,330,294,330,294,262,294,330,440,392,330,392,440,392,523,440,392,330,392,294,392,294,330,294,262,0
time4dw8,8,4,4,8,4,4,4,4,16,4,4,4,4,4,4,4,4,4,8,4,16,4,4,4,4,16,4,4,4,4,16,4,4,4,4,4,4,8,4,4,4,4,16
freq5dw262,262,294,262,349,294
dw262,262,294,262,349,294
dw262,523,440,349,330,294
dw466,266,440,349,392,349,0
time5dw4,4,8,8,8,16,4,4,8,8,8,16
dw4,4,8,8,8,16,4,4,8,8,8,16
old_segdw?
old_offdw?
dataends
codesegment
assumecs:
code,ds:
data,ss:
sstack
start:
starprocfar;程序开始
movax,data
movds,ax
movax,sstack
movss,ax
pushdi;寄存器压栈
pushsi
pushbp
pushbx
moval,90h;8255初始化
movdx,303h
outdx,al
moval,0ch;关闭8253的T2计数器(8255的PC6=0)
movdx,303h
outdx,al
moval,00h;关闭喇叭(8255的PC0=0)
movdx,303h
outdx,al
moval,0b6h;8253初始化
movdx,307h
outdx,al
movdx,offsetbg;显示提示信息
movah,9
int21h
movah,01h
int21h
cmpal,'1';判断按键来选择不同歌曲
jemusic1
cmpal,'2'
jemusic2
cmpal,'3'
jemusic3
cmpal,'4'
jemusic4
cmpal,'5'
jemusic5
cmpal,'0'
jeend_sing
music1:
movsi,offsetfreq1;设置频率指针→si
movbp,offsettime1;设置延时指针→bp
jmppp
music2:
movsi,offsetfreq2
movbp,offsettime2
jmppp
music3:
movsi,offsetfreq3
movbp,offsettime3
jmppp
music4:
movsi,offsetfreq4
movbp,offsettime4
jmppp
music5:
movsi,offsetfreq5
movbp,offsettime5
jmppp
pp:
movah,0bh;检测是否有任意键按下?
int21h
cmpal,00
jnestart;若按下则跳转至程序开始
movdi,[si];检测是否是乐曲结尾
cmpdi,0
jeend_sing;为0的话,演奏结束
movdx,12h
movax,34dch;计算音符的频率所对应的8253计数初值
divdi
movdx,306h;向8253装入计数初值
outdx,al;先装低字节
moval,ah
outdx,al;再装高字节
movdx,303h;打开喇叭(8255的PC0=1)
moval,01h
outdx,al
moval,0dh;打开8253的T2(PC6=1),开始发声
outdx,al
movbx,ds:
[bp];取1个音符的延时次数→bx
calltime_delay;调用延时子程序
movdx,303h;关闭8253的T2(PC6=0)
moval,0ch
outdx,al
moval,00h;关闭喇叭(PC0=0)
outdx,al
addsi,2;取下1个音符的频率
addbp,2;取下1个音符的延时次数
jmppp;继续
end_sing:
movdx,303h;关闭8253的T2
moval,0ch
outdx,al
moval,00h;关闭喇叭
outdx,al
popbx;寄存器出栈
popbp
popsi
popdi
movax,4c00h;返回DOS
int21h
starendp
new_intrproc;新中断服务程序
decbx;该服务程序只将延时次数-1
iret
new_intrendp
time_delayprocnear;延时子程序
Pushf;压栈
pushds
pushes
pushbx
movah,35h;取原中断(INT1CH)的向量,并保存
moval,1ch
int21h
movold_off,bx
movbx,es
movold_seg,bx
popbx
popes
pushds
movah,25h;设置新中断服务程序的向量
moval,1ch
movdx,segnew_intr
movds,dx
leadx,new_intr
int21h
popds
TD:
cmpbx,0h;延时次数已到?
jnzTD;未到,则继续
movah,25h;已到,则恢复原中断向量
moval,1ch
movdx,old_seg
pushdx
movdx,old_off
popds
int21h
popds
popf
ret
time_delayendp
codeends
endstar;程序结束
三、整个系统实现功能
连接好硬件,运行程序后如下:
图(5)程序运行后图示
当按下1键时,发生器唱第一首曲子;当按下2键时,唱第二首曲子;当按下3键时,唱第三首曲子;当按下4键时,唱第4首曲子;当按下5键时,唱第5首曲子。
四、总结
本设计报告主要介绍了用8253实现音乐发声器的设计方法,系统的介绍了该电路的硬件构成和软件工作过程,主要采用中断控制系统,结合所学的知识,实现系统的功能要求。
设计中很好的使软件,硬件相结合,基本上达到了设计的要求。
通过这次毕业设计,使我对8253有了一定了解,对课本上的知识有了近一步掌握,也深刻明白了自己的不足。
完成本次课程设计,是一个从无到有的过程,经历了兴奋,自信,失落,奋发,所悟。
课程设计时,自习阅读设计的题目和要求,以为设计没什么困难,所用的知识书上都有。
可是当我开始动手时才发现,其中的算法是那么的难。
经过一天的努力,毫无结果,失落的心情悠然而生。
于是,再到图书馆和网上查找资料,在经过借鉴很多书籍后,总算是有点眉目了。
埋头苦干的过程是痛苦的,尤其是在思考算法和程序框架时,迷茫,烦躁,特别是当苦思出来一个结果,又被自己推翻,心痛的感觉无言以绘,在这不断的循环中,终于完成了程序。
中间的煎熬时很痛苦的,深刻明白攻克自己未知领域的困难。
但当课程设计完成时,那感觉很爽,很舒服,俗话说,没有耕耘,就没有收获。
这次课程设计,让我学到了很多书本上学不到的东西,学到了十几应用时,是取用成本的最小化,做设计不仅要考虑大的方面,小的方面也必须做到完美。
最大的收获是:
对按键,显示器,汇编语言的应用有了深刻的了解。
参考文献
[1]柴欣,李然,李煦,VisualBasic程序设计基础[M],第1版,中国铁道出版社,2003年
[2]石柯,阳富民,胡贯荣,基于UML的嵌入式系统模型验证机制的研究[J],计算机工程与应用,2001年
[3]罗加奇,《〈微机原理与接口技术〉学生实验指导书》,扬州大学,2002年
[4]胡刚,《微机原理及应用》,机械工业出版社,2003年
[5]SaschaKonrad,BettyH.C.Cheng,LauraA.Campbell.ObjectAnalysisPatternsforEmbeddedSystems[J].IEEETRANSACTIONSONSOFTWAREENGINEERING,2004年