八音盒.docx

上传人:b****5 文档编号:5971219 上传时间:2023-01-02 格式:DOCX 页数:21 大小:755.73KB
下载 相关 举报
八音盒.docx_第1页
第1页 / 共21页
八音盒.docx_第2页
第2页 / 共21页
八音盒.docx_第3页
第3页 / 共21页
八音盒.docx_第4页
第4页 / 共21页
八音盒.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

八音盒.docx

《八音盒.docx》由会员分享,可在线阅读,更多相关《八音盒.docx(21页珍藏版)》请在冰豆网上搜索。

八音盒.docx

八音盒

华北科技学院

 

课程设计说明书

 

班级:

计科ZB111姓名:

王科

学号:

201107012104

设计题目:

八音盒

设计时间:

2012-6-4至2012-6-14

指导教师:

于咏霞、顾涛、吴静、孟广学

评语:

___________________________________

____________________________________________

____________________________________________

____________________________________________

____________________________________________

评阅成绩:

____评阅教师:

________

《接口技术》课程设计实验报告

开课实验室:

接口实验室2012年6月12日

课程设计题目

八音盒

一、

设计目的

◆了解键盘阵列结构,学会读取按键的方法

◆了解利用8254和8255产生音乐的基本方法。

◆掌握定时/计数器8254和8255芯片的编程原理。

◆通过8254产生不同的频率信号,,在实验平台上实现各个音阶发声。

二、设备与环境

◆硬件环境:

微机、TPC-386EM32位微机接口实验系统。

◆软件环境:

WindowsXP操作系统、汇编程序集成开发环境

三、设计内容

(一)、设计目标

通过按下实验台小键盘上的键码,对应的7段数码管显示‘0’—‘F’,PC机的屏幕上也对应显示出‘0’—‘F’。

并且小键盘每个键码都有自己的功能,比如数字‘1’-‘9’能发出单音,字母‘A’—‘E’播放歌曲,字母‘F’退出整个系统。

(二)实验原理图

1.8255芯片连接图

8255的C口接实验台小键盘(8255的PC0~PC3接小键盘的列0~列3,PC4~PC7接行0~行3)。

2.七段数码管字形代码表

显示字形

g

f

e

d

c

b

a

断码

0

0

1

1

1

1

1

1

3fh

1

0

0

0

0

1

1

0

06h

2

1

0

1

1

0

1

1

5bh

3

1

0

0

0

1

1

1

4fh

4

1

1

0

0

1

1

0

66h

5

1

1

0

1

1

0

1

6dh

6

1

1

1

1

1

0

1

7dh

7

0

0

0

0

1

1

1

07h

8

1

1

1

1

1

1

1

7fh

9

1

1

0

1

1

1

1

6fh

A

1

1

1

0

1

1

1

77h

B

1

1

1

1

1

0

0

7ch

C

0

1

1

1

0

0

1

3bh

D

1

0

1

1

1

1

0

5eh

E

1

1

1

1

0

0

1

7bh

F

1

1

1

0

0

0

1

71h

 

 

3.8255和8254组合发音的接线图

4.小键盘设计

众所周知,“哆瑞咪发嗦啦西”是组成所有音乐最基本的音调。

实验台上共有0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F十六个键码,我利用数字键0作为开始键,只在数码管和PC屏幕上显示其字形;而数字键1-7,每个键发出一个单音,而8和9键发出了两个高调单音,这样通过这9个单音键就基本能弹出简单的音乐了;后面的字母A-E就是上述单音组成的几首好听的儿歌;字母F控制整个程序结束!

具体每个键对应的功能如下图所示:

四、程序流程图

1.主程序流程图

2.小键盘扫描流程图

3.音乐发声流程图

四、实物接线图

8255的片选CS接地址译码输出的288~28F,A口PA0~PA7接七段数码管a~g,C口接小键盘(8255的PC0~PC3接小键盘的列0~列3,PC4~PC7接行0~行3);8254CLK0接1MHZ时钟,GATE0接8255的PB1,OUT0接与门输入端1,片选CS接280H~287H,8255PB0接与门输入端2,与门输出端接喇叭。

8255的A口地址为288h,8255的B口地址为289h,8255的C口地址为8ah,8255的控制口地址为28bh,8254的A口地址为280h,8254的B口地址为283h。

五、设计结果

1.小键盘所有键(0123456789ABCDEF)依次按下,PC机屏幕显示结果:

2.小键盘单个键按下,数码管显示结果:

六、程序代码

;*******************************;

;*八音盒*;

;*******************************;

datasegment

aio8255equ288h;A口

bio8255equ289h;B口

cio8255equ28ah;C口

kio8255equ28bh;控制口

io8253aequ280h

io8253bequ283h

table1dw0770h,0B70h,0D70h,0E70h,07B0h,0BB0h,0DB0h,0EB0h

dw07D0h,0BD0h,0DD0h,0ED0h,07E0h,0BE0h,0DE0h,0EE0h;键盘扫描码表

leddb3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH

db39h,5EH,79h,71h,0ffh;LED段码表,0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f

chardb'0123456789ABCDEF';字符表

mesdb0ah,0dh,'****************************************'

db0ah,0dh,'*Playanykeyinthesmallkeyboard!

*'

db0ah,0dh,'*Itwillbeonthescreen!

*'

db0ah,0dh,'*StrikeF,itwillgameover!

*'

db0ah,0dh,'****************************************',0ah,0dh,'$'

key_indb0h

kydb0h

bzdb0h

tabledw524,588,660,698,784,880,988,1048,1976;哆来咪

Atabledw524,524,524,660,784,784,784,784,880,880,880,1048,784;我有一只小毛驴

Btabledw524,588,660,524,524,588,660,524,660,698,784,660,698,784;两只老虎

Ctabledw524,524,660,698,784,784,784,660,698,698,698,588,524,660,784,1048;洋娃娃和小熊跳舞

Dtabledw660,660,698,784,784,698,660,588,524,524,588,660,660,588,588;欢乐颂

Etabledw660,698,784,698,660,698,784,698,660,698,784,698,784,1320,1048;可爱的蓝精灵

dataends

codesegment

assumecs:

code,ds:

data

start:

movax,data

movds,ax

movdx,offsetmes

movah,9

int21h;显示提示信息

movdx,kio8255;初始化8255控制字

moval,81h

outdx,al

main_key:

callkey;getacharin(key_in)anddisplayit

calldisply;调显示子程序,显示得到的字符

moval,byteptrkey_in

cmpal,'F'

jzexit

cmpal,'0'

jzmain_key

jmpm

exit:

movax,4c00h;if(dl)='F'returntoEXIT!

int21h;退出

m:

cmpal,'1'

jlsing1

cmpal,'9'

jgsing1;若不在'1'-'8'之间转main_key

ddd:

subal,31h

shlal,1;转为查表偏移量

movbl,al;保存偏移到bx

movbh,0

movax,4240H;计数初值=1000000/频率,保存到AX

movdx,0FH

divwordptr[table+bx]

movbx,ax

movdx,io8253b;设置8254计时器0方式3,先读写低字节,再读写高字节

moval,00110110B

outdx,al

movdx,io8253a

movax,bx

outdx,al;写计数初值低字节

moval,ah

outdx,al;写计数初值高字节

movdx,bio8255

moval,03h

outdx,al;置PB1PB0=11(开扬声器)

calldelay3;延时

moval,0h

outdx,al;置PB1PB0=00(关扬声器)

jmpmain_key

sing1:

cmpal,'A'

jzAsing

cmpal,'B'

jzBsing

cmpal,'C'

jzCsing

cmpal,'D'

jzDsing

cmpal,'E'

jzEsing

Asing:

movbz,0

movcx,13

subal,41h

shlal,1;转为查表偏移量

movbl,al;保存偏移到bx

movbh,0

a:

movax,4240H;计数初值=1000000/频率,保存到AX

movdx,0FH

divwordptr[Atable+bx]

movbx,ax

jmps

Bsing:

movbz,0

movcx,14

subal,42h

shlal,1;转为查表偏移量

movbl,al;保存偏移到bx

movbh,0

b:

movax,4240H;计数初值=1000000/频率,保存到AX

movdx,0FH

divwordptr[Btable+bx]

movbx,ax

jmps

Csing:

movbz,0

movcx,15

subal,43h

shlal,1;转为查表偏移量

movbl,al;保存偏移到bx

movbh,0

c:

movax,4240H;计数初值=1000000/频率,保存到AX

movdx,0FH

divwordptr[Ctable+bx]

movbx,ax

jmps

Dsing:

movbz,0

movcx,15

subal,44h

shlal,1;转为查表偏移量

movbl,al;保存偏移到bx

movbh,0

d:

movax,4240H;计数初值=1000000/频率,保存到AX

movdx,0FH

divwordptr[Dtable+bx]

movbx,ax

jmps

Esing:

movbz,0

movcx,15

subal,45h

shlal,1;转为查表偏移量

movbl,al;保存偏移到bx

movbh,0

e:

movax,4240H;计数初值=1000000/频率,保存到AX

movdx,0FH

divwordptr[Etable+bx]

movbx,ax

jmps

s:

movdx,io8253b;设置8254计时器0方式3,先读写低字节,再读写高字节

moval,00110110B

outdx,al

movdx,io8253a

movax,bx

outdx,al;写计数初值低字节

moval,ah

outdx,al;写计数初值高字节

movdx,bio8255

moval,03h

outdx,al;置PB1PB0=11(开扬声器)

calldelay3;延时

moval,0h

outdx,al;置PB1PB0=00(关扬声器)

addbz,2

movbl,bz

movbh,0

cmpbyteptrkey_in,'A'

jzaa

cmpbyteptrkey_in,'B'

jzbb

cmpbyteptrkey_in,'C'

jzcc

cmpbyteptrkey_in,'D'

jzdd1

cmpbyteptrkey_in,'E'

jzee

aa:

loopL1

jmpmain_key

bb:

loopL2

jmpmain_key

cc:

loopL3

jmpmain_key

dd1:

loopL4

jmpmain_key

ee:

loopL5

jmpmain_key

L1:

calln1

L2:

calln2

L3:

calln3

L4:

calln4

L5:

calln5

keyprocnear

key_loop:

movdx,cio8255

moval,0fh

outdx,al

inal,dx;读行扫描值

andal,0fh

cmpal,0fh

jzkey_loop;未发现有键按下则转

calldelay;delayforamoment

movah,al

movdx,kio8255

moval,88h

outdx,al

movdx,cio8255

moval,ah

oral,0f0h

outdx,al

inal,dx;读列扫描值

andal,0f0h

cmpal,0f0h

jzkey_loop;未发现有键按下则转

movsi,offsettable1;键盘扫描码表首址

movdi,offsetchar;字符表首址

movcx,16;待查表的表大小

key_tonext:

cmpax,[si];cmp(col,row)witheveryword

jzkey_findkey;inthetable

deccx

jzkey_loop;未找到对应扫描码

addsi,2

incdi

jmpkey_tonext

key_findkey:

movdl,[di]

movah,02

int21h;显示查找到的键盘码

movbyteptrkey_in,dl

key_waitup:

movdx,kio8255

moval,81h

outdx,al

movdx,cio8255

moval,0fh

outdx,al

inal,dx;读行扫描值

andal,0fh

cmpal,0fh

jnzkey_waitup;按键未抬起转

calldelay;delayforamoment

keyendp

delayprocnear

pushax;delay50ms--100ms

movah,0

int1ah

movbx,dx

delay1:

movah,0

int1ah

cmpbx,dx

jzdelay1

movbx,dx

delay2:

movah,0

int1ah

cmpbx,dx

jzdelay2

popax

ret

delayendp

displyprocnear

pushax

movbx,offsetled

moval,byteptrkey_in

subal,30h

cmpal,09h

jngdis2

subal,07h

dis2:

xlat

movdx,aio8255

outdx,al;输出显示数据,段码

popax

displyendp

delay3procnear;延时子程序

pushcx

pushax

movax,60

x1:

movcx,0ffffh

x2:

deccx

jnzx2

decax

jnzx1

popax

popcx

ret

delay3endp

n1procnear

jmpa

n1endp

n2procnear

jmpb

n2endp

n3procnear

jmpc

n3endp

n4procnear

jmpd

n4endp

n5procNEAR

jmpe

n5endp

codeends

endstart

七、设计总结

通过这次接口技术课程设计,不仅使我复习了以前所学过的知识,而且也使我有目标性的学习了课堂未曾讲过的知识,把这些都结合起来,我便完成了在学过的知识上扩展出了其他功能的八音盒。

我的八音盒主要通过计数器8254、可编程并行接口芯片8255A、小键盘实现了其功能。

具体功能是定时/计数器8254作为音阶频率发生器,对每一段音乐进行编码后存入一张音乐表,程序中可调用每一张音乐表中的歌曲,再通过与可编程并行接口芯片8255的配合,将发声频率输出到实验平台的喇叭上,这样喇叭就发出了美妙动听的音乐;接下来通过对可编程并行接口芯片8255A的编程,采用行扫描法和行翻转法,程序中将小键盘的各个键对应的代码(列值,行值)放在一个表中,程序通过查表来确定具体按下的为哪一个键,便实现了实验台上小键盘的扫描功能和七段数码管的显示字形;另外,在程序中还放置了一个放键盘所有数据的字符表,实现了PC机屏幕的回显字符。

在整个课程设计中,我觉得最让我苦恼的和耗时最多的是开始的设计阶段。

当脑海中有了整个设计的目标时,一切操作就容易多了。

在遇到障碍事,老师们和同学们都给了很多意见和帮助,这对我完成本次课设起到了很大的帮助。

在此,特别感谢老师们和同学们,八音盒里动听的音符都是为你们演奏!

 

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 笔试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1