微机课程设计实验报告修改版.docx
《微机课程设计实验报告修改版.docx》由会员分享,可在线阅读,更多相关《微机课程设计实验报告修改版.docx(18页珍藏版)》请在冰点文库上搜索。
微机课程设计实验报告修改版
课程设计说明书
课程名称:
《微机原理及接口技术》课程设计
设计题目:
定时与计数:
利用8253控制扬声器发声,播放一段音乐
班级:
网络工程1502
姓名:
潘万丁
开始时间:
_2018_____年_01___月_15___日
完成时间:
_2018_____年_01___月_19___日
成绩评定
平时考勤(20%)
实验室调试(30%)
创新(10%)
答辩(20%)
说明书(20%)
总评
指导教师签名:
___年__月__日
目录
摘要
随着科技的高速发展,计算机已经经过了好几代的更新,然而计算机的运行的基本原理依然没有改变的。
而今,我们通过一个学期的学习,已经初步了解了计算机的基本结构和原理,并且已经学会了用汇编语言进行基本的程序编写。
1、概述
汇编语言是计算机能够提供给用户使用的最快而有效的语言,也是能够利用计算机所有特性并能直接控制硬件的唯一语言。
借助于汇编程序,计算机本身可以自动地把 汇编源程序翻译成用机器语言表示的目的程序,从而实现了程序设计工作的部分自动化。
而本次课程设计的主要目的就是巩固所学过的知识,用汇编语言熟练地运用三大结构,进一步掌握一些指令的功能、掌握子程序的定义及调用和INT21H、INT10H中断的使用,同时熟练运用通用寄存器和堆栈来进行编写一个完整的具有某种特定功能的程序。
二、方案设计
1.功能分析
在此次设计中,第一个重点就是音乐播放的控制,要想能按照正常的频率和节拍播放出音乐,就需要合理的设计出给蜂鸣器的频率值和播放的时间。
这样就能比较准确的把音乐按一定的节奏播放出来。
如果我们要想加快播放速度,我们可以改变每一节拍的播放时间,如果我们改变了播放的频率值,那么歌曲也就相应的改变了。
我们根据上面的功能分析,同时通过查阅相关资料,了解了计算机的内部结构的同时还清楚的理解了DOS中的21H和10H中断的调用,因此我们设计出如下方案:
(1)音乐的代码化
我们首先收集了一首简单的歌曲《两只老虎》,同时还带有相应的音谱,通过查阅相关的音乐资料,了解了节拍的概念和各音符所对应的频率,而后我们把每一首歌曲都转化成两个数据段,一个是把各个音符翻译成相应的频率值,第二是把相应的节拍转化成对应的时间值,来控制播放每一个音符所对应的时间。
这样我们在播放歌曲时,同时调用频率值和时间值就可以把相应的歌曲播放出来了。
(2)音乐演奏的硬件配合
我们了解到在计算机的主板上有8253、8255和蜂鸣器,同时了解到蜂鸣器的驱动是通过8255和8253共同控制的,我们通过对8253的通道2进行写数据来控制蜂鸣器的声音频率,再通过8255来控制播放时间的长短,就通过这样的巧妙配合来达到播放完整音乐的效果。
(3)音乐演奏的软件设计
软件设计是本设计的重点,在软件设计中,我们要给8253和8255写数据,执行相应的代码来控制音乐的播放。
三、软件设计
在介绍音乐的播放之前,先来说说PC机的小喇叭是怎样与机器相连的呢?
下面的“发声原理图”表示了喇叭与机器简单的相连情况。
喇叭的一端连接在电源正极,另一端与机器的61H端口的bit位相连。
可以想象,若能连续改变61H端口的bit位0,1状态,就可以使喇叭线圈内的电流时有时无,从而使喇叭发声。
我们编制的汇编程序的工作,就是连续改变61H端口的bit位状态。
我们使用PC机有一个专门用于定时的电路,型号为8253。
它有三个通道,第一个通道用于控制始终正常运转;第二个通道用于存储器刷新;这两个通道与我们现在要讨论的问题无关。
第三个就是一组电路域喇叭相连。
如下图所示就是PC机中完整的发声电路,定时器通道3的G端与61H端口的bit0位相连,如果把61H端口的bit0位置为1,那么定时器通道3就会被启动,此时将有一组信号从OUT输出,信号的频率可以用程序控制;若61H的端口bit0位为0,则定时器被关闭,out端就恒为1.
发声原理图:
发声程序设计原理:
PC机发声系统以8253的2号计数器为核心。
系统初始化时,2号计数器I作在“方波发生器”方式,初值为二进制数,,写入顺序为先低后高,CLK2为1.193182MHz,当计数初值为533H时,OUT2输出的方波大约为900Hz,经过简单的滤波之后,送至扬声器。
改变1、4号计数器的计数初值就可以使扬声器发出不同频率的音响。
ROM BIOS 中有个BEEP子程序,这能根据BL中组出的时间计数值控制8253定时器,产生持续时间为1个或几个0.5秒,频率为896HZ的声音,我们可以利用并修改BEEP,使其产生任一频率的声音。
为此我们需要做两点修改,首先,BEEP程序只能产生896HZ的声音,我们的通用发声程序应能产生任一频率的声音。
其次,BEEP产生声音的持续时间(音长)只能是0.5秒的倍数,我们希望声音的持续时间更易于调整,例如可以是10ms的倍数。
我们知道BEEP能将计数值533H送给定时器2产生896HZ的声音的,那么产生其它频率声音的时间计数值应为:
533H×896÷给定频率=123280H÷给定频率
发声程序包括4个步骤:
(1)在8253中的42端口送一个控制字0B6H(10110110B),该控制字对定时器2进行初始化,使定时器2准备接收计数初值。
(2)在8253中的42H端口(Timer2)装入一个16位的计数值(533H×895/频率),以建立将要产生的声音频率。
(3)把输出端口61H的PB0、PB1两位置1,发出声音。
对于发音部分。
PC机上的大多数输入/输出(I/O)都是由主板上的8255(或8255A)可编程序外围接口芯片(PPI)管理的。
PPI包括3个8位寄存器,两个用于输入功能,一个用于输出功能。
输入寄存器分配的I/O端口号为60H和62H,输出寄存器分配的I/O端口号为61H。
由PPI输出寄存器中的0、1两位来选择扬声器的驱动方式。
(4)注意音乐节拍表的频率表的设定。
一个频率对应一个节拍,如果频率表和节拍表有问题,同样不会发出声音。
对于发音部分。
PC机上的大多数输入/输出(I/O)都是由主板上的8255(或8255A)可编程序外围接口芯片(PPI)管理的。
PPI只有PB0和PB1同时为“1”时,才能驱动扬声器地声。
当从8255中采集到输入的数据时,需要确定相应的频率,所以在软件编程时要建立一个数据表。
把相应的频率送到一个寄存器上,通过公式:
计数值=533H×896÷ f=1234DCH÷ f
算出计数值,再把算得的计数值送给8253,就可产生所要频率的方波。
在把计数值送8253前,必须先把8253进行初始化:
使其选用通道2,工作在方式3下。
就整个电路而言,接好电路后,通过软件编程不断地采集从8255口中输入的信号,而8个开关都接在8255的A口上,只要有开关按下,就会采集到一个数据,根据这个数据与事先编好的表对应,得到一个计数值,把这个计数值送给8253的通道2,8253的通道2工作的方式3下,这样就可以产生满足频率要求的发声方波。
这个方波经驱动放大就可以使扬声器发出相应的声音。
所以8255在这里完成两个任务,它不仅从A口中采集到数据,而且B口的PB1和PB0两个位要控制发声。
8253的主要任务就是产生所要求发声的不同频率的方波。
本例程序是由8253芯片控制发声的音阶和节拍,由8255芯片控制扬声器的端口地址开启扬声器发生。
音阶对应的数据表如下
音符
简谱音阶
频率
音符
简谱音阶
频率
音符
简谱音阶
频率
C’’
1.
139
C
1
262
C’
.1
524
D’’
2.
147
D
2
294
D’
.2
587
E’’
3.
165
E
3
330
E’
.3
659
F’’
4.
175
F
4
349
F’
.4
698
G’’
5.
196
G
5
392
G’
.5
784
A’’
6.
220
A
6
440
A’
.6
880
B’’
7.
247
B
7
494
B’
.7
988
通过编写程序,由计算机主板上的8253芯片和8255芯片连接到主板上的扬声
器来控制主板发声。
1.算法描述流程图:
Y
N
实现代码如下:
;***************************************************************************;程序名称:
ceshi
;两只老虎乐曲
;***************************************************************************
stacksegmentparastack'stack'
db64dup('stack...')
stackends
;*******************************************************************
dsegsegmentpara'data'
mus_freqdw262,294,330,262,262,294,330,262
dw330,349,392,330,349,392,392,440
dw392,349,330,262,392,440,392,349
dw330,262,294,196,262,294,196,262,-1
mus_timedw25,25,25,25,25,25,25,25,25,25
dw50,25,25,50,12,12,12,12,25,25
dw12,12,12,12,25,25,25,25,50,25,25,50
dsegends
;*******************************************************************
csegsegmentpara'code'
assumecs:
cseg,ss:
stack,ds:
dseg
;-------------------------------------------------------------------
musicprocfar
movax,dseg
movds,ax
leasi,mus_freq
leabp,ds:
mus_time
freq:
movdi,[si]
cmpdi,-1
jeend_mus
movbx,ds:
[bp]
callsoundf
addsi,2
addbp,2
jmpfreq
end_mus:
movax,4c00h
int21h
musicendp
;--------------------------------------------------------------------------
soundfprocnear
pushax
pushbx
pushcx
pushdx
pushdi
moval,0b6h
out43h,al
movdx,12h
movax,348ch
divdi
out42h,al
moval,ah
out42h,al
inal,61h
movah,al
oral,3
out61h,al
wait1:
movcx,6630
callwaitf
decbx
jnzwait1
moval,ah
out61h,al
popdi
popdx
popcx
popbx
popax
ret
soundfendp
;--------------------------------------------------------------------------
waitfprocnear
pushax
waitf1:
inal,61h
andal,10h
cmpal,ah
jewaitf1
movah,al
loopwaitf1
popax
ret
waitfendp
;--------------------------------------------------------------------------
csegends
;***************************************************************************
endmusic
;***************************************************************************
4、调试过程
1.编辑源程序,假定源文件名为YINYUE.ASM。
2.汇编源程序YINYUE.ASM。
调用宏汇编程序MASM对源文件YINYUE.ASM进行汇编,生成目标文件YINYUE.OBJ。
若汇编无错误,则进入第三步。
3.用连接命令LINK连接目标程序文件YINYUE.OBJ。
若连接成功,则进入下一步。
4.运行可执行文件YINYUE.EXE。
5.两只老虎音乐响起。
5、结果描述
按上面的调试步骤过后,运行ceshi过后,音乐就响起了。
六、总结
1.在这一周的实验过程中碰到了很多的难题和障碍,我们组刚开始各做各的,最后选择最好的程序进行答辩,所以我们每个人都得到了锻炼。
在实验的过程中我认识到平时基础知识的重要性,只有能够熟练的掌握指令的含义才能在实验过程中得心应手,否则一步错则整个试验都会陷入困境,因而,严谨的态度是试验成功的重要保障!
2.通过这次课程设计,我对各个芯片有了进一步的了解,对各个芯片的功能有了更深刻的认识和体会,平时上课的理论知识只是停留在理论的层面,只有通过了这样的试验才能更好的体会到,做到了理论和实际的相结合,使理论知识真正运用到了实践中去。
同时在实验过程中我还遇到了很多没见过的指令,同时自己也自己回到宿舍花时间在网上看了一些有关于指令的视频教程,对自己的原有知识进一步巩固与提升了。
3.我们大家在实验的时候都团结合作,遇到问题时候一起探讨,增强了我们的合作精神。
特别是在制作仿真图的时候大家都很积极帮忙,讨论。
七、参考文献
[1]韩雁,徐煜明。
《微机原理与接口技术》。
北京:
电子工业出版社,2007。
[2]超想-3000TC微机原理与接口实验指导书。
[3]StephenE.Derenzo著,蔡梅琳等译。
PracticalInterfacingintheLaboratory,UsingaPCfortheInstrumentation,DataAnalysis,andControl(微机接口技术实验教程)。
北京:
机械工业出版社,2006.
[4]钱晓捷编著。
32位汇编语言程序设计。
机械工业出版社,2011.
音乐播放仿真图:
仿真图里导入的《两老虎》音乐程序:
stacksegment
db64dup('stack...')
stackends
datasegment
mus_freqdw262,294,330,262,262,294,330,262
dw330,349,392,330,349,392,392,440
dw392,349,330,262,392,440,392,349
dw330,262,294,196,262,294,196,262,-1
music_timedw10dup(25)
dw50,25,25,50,12,12,12,12,25,25
dw12,12,12,12,25,25,25,25,50,25,25,50
dataends
codesegment
assumecs:
code,ds:
data,ss:
stack
musicprocfar
movax,data
movds,ax
movax,stack
movss,ax
leasi,mus_freq
leabp,ds:
music_time
freq:
movdi,[si]
cmpdi,-1
jeend_mus
movbx,ds:
[bp]
callsoundf
addsi,2
addbp,2
jmpfreq
end_mus:
moval,0
out62h,al
movah,4ch
int21h
musicendp
soundfproc
pushax
pushbx
pushcx
pushdx
pushdi
;MOVAL,80H
;OUT66H,AL
moval,0b6h
out46h,al
MOVDX,00H
MOVAX,6000
divdi
out44h,al
moval,ah
out44h,al
moval,0
movah,al
oral,3
out62h,al
d1:
movcx,2801
d2:
loopd2
decbx
jnzd1
moval,ah
out62h,al
popdi
popdx
popcx
popbx
popax
ret
soundfendp
codeends
endmusic