华北电力大学微机原理课程设计报告.docx
《华北电力大学微机原理课程设计报告.docx》由会员分享,可在线阅读,更多相关《华北电力大学微机原理课程设计报告.docx(16页珍藏版)》请在冰豆网上搜索。
华北电力大学微机原理课程设计报告
课程设计报告
(2013—2014年度第一学期)
课程:
微机原理及应用
题目:
电子琴及电子播放器
院系:
自动化系
班级:
自动化1103
学号:
201111010122
201109010113
201102020331
学生姓名:
詹文超
靳朝阳
张晓
指导教师:
张妍
设计周数:
一周
成绩:
日期:
2014年1月10日
微机原理及应用课程设计报告
一、目的与要求
1.通过对微机系统分析和具体设计,使学生加深对所学课程的理解。
2.掌握汇编语言程序设计的基本方法和典型接口电路的基本设计方法。
3.培养学生分析问题、解决问题的能力。
4.培养学生对微型计算机应用系统的基本设计能力。
5.提高学生的实践动手能力和创新能力。
二、主要内容
1.电子琴及电子播放器
2.系统介绍
本设计不仅可以实现小键盘电子琴演奏,还可以通过拨码开关播放不同的电子音乐,主要有小星星,两只老虎和欢乐颂。
硬件设计用到8253和8255芯片,8253工作在方式3,产生一定的频率方波,同时对应着不同音调;8255为可编程接口芯片,用于整个系统的开关控制功能。
3.系统实现的功能
系统主要实现三个功能:
1、自动演奏3首歌曲;
2、利用小键盘手动演奏;
3、歌曲之间的相互切换。
4.所用芯片的工作原理
(1)8253原理
8253有3个独立的计数通道,每个通道结构相同,例若clk0给定频率,向控制字寄存器写入控制字,并向计数器0写入计数初值,采用不同的方式即可产生不同的频率。
8253的内部结构
(1).数据总线缓冲器
实现8253与CPU数据总线连接的8位双向三态缓冲器,用以传送CPU向8253的控制信息、数据信息以及CPU从8253读取的状态信息,包括某时刻的实时计数值。
(2).读/写控制逻辑
控制8253的片选及对内部相关寄存器的读/写操作,它接收CPU发来的地址信号以实现片选、内部通道选择以及对读/写操作进行控制。
(3).控制字寄存器
在8253的初始化编程时,由CPU写入控制字,以决定通道的工作方式,此寄存器只能写入,不能读出。
(4).计数通道0#、1#、2#:
这是三个独立的,结构相同的计数器/定时器通道,每一个通道包含一个16位的计数寄存器,用以存放计数初始值,一个16位的减法计数器和一个16位的锁存器,锁存器在计数器工作的过程中,跟随计数值的变化,在接收到CPU发来的读计数值命令时,用以锁存计数值,供CPU读取,读取完毕之后,输出锁存器又跟随减1计数器变化。
(5).8253外部引脚
8253芯片是具有24个引脚的双列直插式集成电路芯片,其引脚分布如图所示。
8253芯片的24个引脚分为两组,一组面向CPU,另一组面向外部设备,各个引脚及其所传送信号的情况,介绍如下:
1.D7~D0:
双向、三态数据线引脚,与系统的数据线连接,传送控制、数据及状态信息。
2.
:
来自于CPU的读控制信号输入引脚,低电平有效。
3.
:
来自于CPU的写控制信号输入引脚,低电平有效。
4.
:
芯片选择信号输入引脚,低电平有效。
(6).8253端口地址
(2)8255原理
8255有3种工作方式:
方式0,方式1,方式3,本次设计用方式0。
在这种方式下,任何一个端口可以通过方式控制字规定作为输入口,也可作为输出口;8255A有两个控制字:
方式选择控制字和端口C置位/复位控制字。
方式选择控制字的最高位总是1,而端口C置位/复位控制字的最高位总是0,用来区分两个控制字。
8255初始化方式如下图
5.系统分析
(1)系统原理
在了解8253,8255工作原理之后,我们利用2个开关从8255芯片A口输入不同数值,00,01,10,11.利用编程区分4中状态,跳入4个循环,即可演奏3首歌曲和手动电子琴。
8253则是事先算好初值,送如计数器。
每个频率可产生不同的音。
每个音之间停顿相应时间,每个句子之间停顿相应时间,即可演奏完每首歌曲。
每首歌曲和每个句子末尾有数字1,2判断是否停顿或者跳入下一首歌,实现每首歌之间的转换。
小键盘演奏则是利用一些算法得知每个健的值会存入al寄存器中,利用al中的值,判断al大小,设置数据段7个健值,取出响应频率设置循环即可弹奏。
(2)系统思路分析
系统从实现一个音开始,到完成一首歌的编曲,之后加入判断语句,进行第二首,第三首歌的编曲即已完成自动播放部分。
之后单独进行小键盘分析,取出主要部分,判断出运作原理利用最终al的值进行频率换算。
融入前一部分完成的歌曲中,反复调试完成。
6.系统流程图
3.实验总结
1.实验要点和问题分析
(1)计数值足够,所以只采用1个计数器,计数初值在程序中计算不便,所以定义数据段,根据clk0的频率和要产生的频率,计算初值,写入数据段;
(2)改变开关状态,读入数据相应跳转,3首固定歌曲都跳入同一循环W1进行演唱,简短程序;
(3)演唱完一首歌曲才可以进入下首歌曲,所以要在这首歌曲演唱完之前,改变开关状态;
(4)每首歌曲句末为1,2是判断是否加停顿和换歌;
(4)为防止程序太长,超出跳转地址,每次判断都跳到Wo处,简短程序;
(6)小键盘的程序需要看懂如何判别是那个健,最终值存入al中,根据al的值为1-7定义数据段1-7的频率,用si+al*2的值作为地址即可取出相应频率。
(7)1-7之外的数据不要等待,1-7的键入后,去掉停顿,按键长按则一直发生,可控制长短调。
2.实验心得
本次试验从最开始的尝试到最后全部完成,历经很长时间,做了很多努力,让我们都非常欣慰,在做实验的过程中,不断尝试,优化,大大提高了我们的团队合作能力和专业知识的掌握,关键是学和玩相结合,设计的过程虽然有点辛苦,但都很开心,我认为这点很重要。
希望每次的实验都可以从兴趣而发,以乐趣结束,不再为书本而苦恼。
相信我们会越做越好。
另外感谢老师的耐心指导,给了我们很大的帮助。
本次课设圆满成功。
四.参考文献
微机原理及应用马平姚万业王柄谦中国电力出版社2003年4月第一版
附录
程序代码设计
DATASEGMENT
TIME_CTREQU0A003H;8253地址
TIME_R0EQU0A000H
TIME_R1EQU0A001H
OUTBITequ09002h;位控制口
IN_KEYequ09001h;键盘读入口
Musicdw0,3816,3401,3030,2865,2551,2273,2024
KeyTable:
;键码定义
db16h,15h,14h,0ffh
db13h,12h,11h,10h
db0dh,0ch,0bh,0ah
db0eh,03h,06h,09h
db0fh,02h,05h,08h
db00h,01h,04h,07h
FREQ1DW2,3816,3816,2551,2551,2273,2273,2551,2;小星星
DW2865,2865,3030,3030,3401,3401,3816,2
DW2551,2551,2865,2865,3030,3030,3401,2
DW2551,2551,2865,2865,3030,3030,3401,2
DW3816,3816,2551,2551,2273,2273,2551,2
DW2865,2865,3030,3030,3401,3401,3816,1
FREQ2DW2,3816,3401,3030,3816,3816,3401,3030,3816,2;两只老虎
DW3030,2865,2551,2,3030,2865,2551,2
DW2551,2273,2551,2865,3030,3816,2
DW2551,2273,2551,2865,3030,3816,1
FREQ3DW2,3030,3030,2865,2551,2551,2865,3030,3401,3816,3816;欢乐颂
DW3401,3030,3030,3401,3401,2
DW3030,3030,2865,2551,2551,2865,3030,3401,3816,3816
DW3401,3030,3401,3816,3816,1
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAL,00110111B;8253初始化
MOVDX,TIME_CTR
OUTDX,AL
MOVDX,8003H;8255初始化
MOVAL,90H
OUTDX,AL
W0:
MOVDX,8000H;开关判断
INAL,DX
ANDAL,03H
CMPAL,0
JNAMLoop;电子琴
CMPAL,01H
JNASONG1;歌曲1
CMPAL,02H
JNASONG2;歌曲2
JMPSONG3;歌曲3
SONG1:
LEASI,FREQ1
JMPW1
SONG2:
LEASI,FREQ2
JMPW1
SONG3:
LEASI,FREQ3
JMPW1
W1:
MOVAX,[SI];取节奏
MOVDX,TIME_R0
OUTDX,AL
MOVAL,AH
OUTDX,AL
INCSI
INCSI
CALLDELAY1
MOVAX,2;关扬声器一次
MOVDX,TIME_R0
OUTDX,AL
MOVAL,AH
OUTDX,AL
CALLDELAY2
CMP[SI],2;判断句停顿
JZW2
CMP[SI],1;判断歌曲是否结束
JNZW1
JMPW0;若歌曲结束重新判断
W2:
CALLDELAY2
JMPW1
DELAY1PROCNEAR;音长
MOVBX,400
LP1:
MOVCX,200
LP2:
LOOPLP2
DECBX
JNZLP1
RET
DELAY1ENDP
DELAY2PROCNEAR;字间隔
MOVBX,100
LP11:
MOVCX,200
LP22:
LOOPLP22
DECBX
JNZLP11
RET
DELAY2ENDP
MLoop:
callTestKey;有键入?
jeMLoop;无键入,继续显示
callGetKey;读入键码
cmpal,1;判断键盘是否为1~7
jlMLoop
cmpal,7
jaMLoop
movsi,offsetMusic;取键盘节奏首地址
movah,0
movbx,ax
addbx,bx;dw字
movax,[bx+si]
movdx,0a000h;8253计数器0初值
outdx,al
moval,ah
outdx,al
calldelay
MOVAX,2;关扬声器一次
MOVDX,0a000h
OUTDX,AL
MOVAL,AH
OUTDX,AL
JMPW0;判断开关
TestKeyprocnear
movdx,OUTBIT
moval,0
outdx,al;输出线置为0
movdx,IN_KEY
inal,dx;读入键
notal
andal,0fh;高四位不用
ret
TestKeyendp
GetKeyprocnear
movch,00100000b
movcl,6
KLoop:
movdx,OUTBIT
moval,ch;找出键所在列
notal
outdx,al
shrch,1
movdx,IN_KEY
inal,dx
notal
andal,0fh
jneGoon_;该列有键入
deccl
jnzKLoop
movcl,0ffh;没有键按下,返回0ffh
jmpExit1
Goon_:
deccl
shlcl,2;键值=列X4+行
movch,4
LoopC:
testal,1
jnzExit1
shral,1
inccl
decch
jnzLoopC
Exit1:
movdx,OUTBIT
moval,0
outdx,al
movch,0
movbx,offsetKeyTable
addbx,cx
moval,[bx];取出键码
ret
GetKeyendp
delayPROCNEAR;按键音长
pushbx
MOVBX,200
LP13:
MOVCX,200
LP23:
LOOPLP23
DECBX