硬件课程设计 可存储式电子琴.docx

上传人:b****5 文档编号:7636322 上传时间:2023-01-25 格式:DOCX 页数:27 大小:979.11KB
下载 相关 举报
硬件课程设计 可存储式电子琴.docx_第1页
第1页 / 共27页
硬件课程设计 可存储式电子琴.docx_第2页
第2页 / 共27页
硬件课程设计 可存储式电子琴.docx_第3页
第3页 / 共27页
硬件课程设计 可存储式电子琴.docx_第4页
第4页 / 共27页
硬件课程设计 可存储式电子琴.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

硬件课程设计 可存储式电子琴.docx

《硬件课程设计 可存储式电子琴.docx》由会员分享,可在线阅读,更多相关《硬件课程设计 可存储式电子琴.docx(27页珍藏版)》请在冰豆网上搜索。

硬件课程设计 可存储式电子琴.docx

硬件课程设计可存储式电子琴

中国矿业大学计算机学院

2012级本科生课程报告

 

课程名称硬件课程设计

报告时间2012.1.16

学生姓名刘明清

学号08123359

专业计算机科学与技术

任课教师王凯

 

目录

1.选题1

2.需求分析1

3.设计任务与要求1

3.1实验原理与内容

4.总体方案与说明1

4.1电路设计

4.2地址说明

4.3功能模块

4.4电路原理图

4.5实物连线图

5.硬件框图与说明7

5.18255A芯片介绍7

5.28253芯片介绍9

6.软件功能14

7.软件主要模块流程图15

7.1高中低音转换程序流程图

7.2播放预定音乐子程序流程图

7.3弹奏子程序流程图

8.程序代码16

9.问题分析与解决方案25

10.实验体会25

参考文献26

1.选题

我的硬件课程设计的课题是《可存储式电子琴》,这是一个很好的课题。

我们不仅可以在设计中学习硬件、软件相关的知识,通过实践巩固理论知识,并做到活学活用,更能在美妙动听的音乐中享受我们的劳动成果,可谓是一举多得,能够在过程中有动力,所以选择了这个电子琴来增强我们对硬件课程设计的学习。

2.需求分析

加强学生们对硬件课程设计的掌握,熟练使用汇编语言解决硬件问题,制作电子琴,弹奏音乐,也可以作为娱乐工具.也可以进一步开发作为一个小玩具的内置芯片程序.

3.设计任务与要求

利用8255A、8253芯片和4×4键盘、喇叭等器件设计硬件电子琴,具备如下功能:

当按下琴键时,扬声器发出该琴键相对应的音阶,同时可以通过按键转换高中低音节,会有灯显示此时的按键是哪种音阶,可以播放预存音乐。

3.1实验原理与内容

可存储式电子琴硬件课程设计主要是居于8255A芯片和8253芯片的基本功能进行设计的。

我们将8255A芯片的A端口作为输出端口,而B端口作为输入端口,两个端口都与键盘相连接:

A端口的低四位连在键盘的行线上,B端口的高四位连在键盘的列线上。

再将它的输出端口PC1与8253相应门控信号GATE0相连接。

这样可以通过控制PC1来控制8253的输出:

当PC1为“1”时,GATE0有效,8253能够输出频率方波;当PC1为“0”时,GATE0无效,OUT0无法输出频率方波。

而8253的时钟输入引脚CLK0与相应的时钟发生器相连接,8253的0通道的OUT0信号与8255A的PC0通过与门以后与蜂鸣器相连接,从而驱动并控制蜂鸣器发音的发音和终端:

当PC0为“1”时蜂鸣器连通,能够发出声音;当PC0为“0”时蜂鸣器被中断,不能发出声音。

这样,我们在硬件上实现了通过8255A芯片输入设备的输入信号并通过它传送给8253,让8253进行相应的处理后输出给蜂鸣器的功能。

从8255A芯片的端口中确认是键盘中的哪一个键被按下,并进行编码。

从8255A的B端口中读入键盘的状态,进行一系列的比较。

确认是哪一个键按下了,接着再通过着不同的键被按下进行执行不同的程序段。

将不同的键所对应的频率的N值送入8253的0通道。

这样,就产生了不同频率的方波。

在送入扬声器后就能发出不同音频和音长的声音。

电子琴电路图

4.总体方案与说明

方案利用8253进行周期性扫描8255A是否有键按下,使用小键盘的按键实现电子琴音节按键、功能的切换。

本次设计功能分为:

高中低音阶的音频转换,提供给8253的时钟频率为1MHZ,

4.1设计电路如下

键盘扫描,把扫描到的值给8255A,8255A再把信号给8253,不同的按键,赋给不同的初始计数,然后产生不同频率的方波,输出端给喇叭,并控制喇叭的放音的开关,既可以发出不同的声音。

4.2.地址说明

(1)各芯片及器件地址:

8255A的控制端地址为28BH,A口,B口,C口地址分别为:

288H,289H,28AH。

8253的控制端地址为:

283H,计数器0地址为:

280H。

(2)按键说明如下表4-3:

1

dou音

7

xi音

2

rui音

A

高音转换键

3

mi音

B

中音转换键

4

fa音

C

低音转换键

5

so音

D

放歌键1

6

la音

4.3功能模块图

主要包括:

中音模块,低音模块,高

音模块,键盘扫描,发声

模块,延时模块六部分

4.31低中高音模块

进入模块,先进行键盘扫描,获得键盘行列值,并与键盘扫描码比对,如果是功能键A,B,C等跳转到相应的模块,不是则默认进入中音,并且按照键盘值,按照对应的计数初值,由8253进行发出对应频率的方波。

调用发声模块发出声音

4.32键盘扫描模块

(1)检测所有按键是否全都松开了,直到所有键松开

(2)检测是否有键按下,直到有键按下。

(3)若有键按下,消除抖动,确认有键按下

(4)然后得到一个行列值跟键盘扫描码比较,即可判定哪个键按下

4.33键盘扫描流程图

键盘扫描流程图

4.34发声、延时模块

8255A控制C端口,PC1,PC0的值,通过与门来控制喇叭的开关。

全为1,喇叭打开—发声。

全为0,喇叭关闭—发声停止。

通过延时,来控制发声的时间。

如果没有延时,发声模块无法正常工作。

4.4电路原理图

电子琴电路图

4.5电路实物连线图

电子琴实物连接图

5.硬件框图与说明

5.18255A芯片介绍

8255可编程外围接口芯片是Intel公司生产的通用并行I/O接口芯片,它具有A、B、C三个并行接口,并行接口是以数据的字节为单位与I/O设备或被控制对象之间传递信息。

CPU和接口之间的数据传送总是并行的,即可以同时传递8位、16位、32位等。

用+5V单电源供电,能在以下三种方式下工作:

方式0--基本输入/出方式、方式1--选通输入/出方式、方式2--双向选通工作方式。

8255的内部结构及引脚如图5.1

内部结构及引脚

为读信号线,与其他信号线一起实现对8255接口的读操作。

通常接系统总线的

信号。

为写信号线,与其他信号一起实现对8255的写操作,通常接系统总线的

为片选信号线,当它为低电平时,才能选中该8255芯片,也才能对8255进行操作。

D0~D7:

三态双向数据总线,8255与CPU数据传送的通道,当CPU执行输入输出指令时,通过它实现8位数据的读/写操作,控制字和状态信息也通过数据总线传送。

PA0~PA7:

端口A输入输出线,一个8位的数据输出锁存器/缓冲器,一个8位的数据输入锁存器。

PB0~PB7:

端口B输入输出线,一个8位的I/O锁存器,一个8位的输入输出缓冲器。

PC0~PC7:

端口C输入输出线,一个8位的数据输出锁存器/缓冲器,一个8位的数据输入缓冲器。

端口C可以通过工作方式设定而分成2个4位的端口,每个4位的端口包含一个4位的锁存器,分别与端口A和端口B配合使用,可作为控制信号输出或状态信号输入端口。

这里的8255接口所占地址范围为0680H~0686H。

当对8255接口进行写操作时,各信号线的状态如表5.1所示

CS

A1

A0

IOR

IOW

操作

0

0

0

1

0

写A口

0

0

1

1

0

写B口

0

1

0

1

0

写控制寄存器

0

1

1

1

0

写C口

8255在应用过程中,将不同的控制字装入芯片中控制寄存器,即可确定8255的工作方式。

8255的控制字由8位二进制数构成,各位的控制功能如图5.2所示:

8255控制字

5.28253芯片介绍

8253芯片引脚图

8253是可编程计数器/定时器,内部有三个计数器,分别为计数器0、计数器1和计数器2,一个时钟输入端CLK,一个为门控信号输入端GATE,另一个为输出端OUT。

每个计数器内部有一个8位的控制寄存器。

8253的通道:

8253有3个通道,分别为通道0、通道1和通道2。

8253中各通道可有6种可供选择的工作方式,以完成定时、计数或脉冲发生器等多种功能。

8253的各种工作方式如下:

(1)方式0:

计数结束则中断

工作方式0被称为计数结束中断方式。

当任一通道被定义为工作方式0时,OUT输出为低电平;若门控信号GATE为高电平,当CPU利用输出指令向该通道写入计数值WR#有效时,OUT仍保持低电平,然后计数器开始减“1”计数,直到计数值为“0”,此刻OUT将输出由低电平向高电平跳变,可用它向CPU发出中断请求,OUT端输出的高电平一直维持到下次再写入计数值为止。

在工作方式0情况下,门控信号GATE用来控制减“1”计数操作是否进行。

当GATE=1时,允许减“1”计数;GATE=0时,禁止减“1”计数;计数值将保持GATE有效时的数值不变,待GATE重新有效后,减“1”计数继续进行。

显然,利用工作方式0既可完成计数功能,也可完成定时功能。

当用作计数器时,应将要求计数的次数预置到计数器中,将要求计数的事件以脉冲方式从CLK端输入,由它对计数器进行减“1”计数,直到计数值为0,此刻OUT输出正跳变,表示计数次数到。

当用作定时器时,应把根据要求定时的时间和CLK的周期计算出定时系数,预置到计数器中。

从CLK,输入的应是一定频率的时钟脉冲,由它对计数器进行减“1”计数,定时时间从写入计数值开始,到计数值计到“0”为止,这时OUT输出正跳变,表示定时时间到。

有一点需要说明,任一通道工作在方式0情况下,计数器初值一次有效,经过一次计数或定时后如果需要继续完成计数或定时功能,必须重新写入计数器的初值。

(2)方式1:

单脉冲发生器

工作方式1被称作可编程单脉冲发生器。

进入这种工作方式,CPU装入计数值n后OUT输出高电平,不管此时的GATE输入是高电平还是低电平,都不开始减“1”计数,必须等到GATE由低电平向高电平跳变形成一个上升沿后,计数过程才会开始。

与此同时,OUT输出由高电平向低电平跳变,形成了输出单脉冲的前沿,待计数值计到“0”,OUT输出由低电平向高电平跳变,形成输出单脉冲的后沿,因此,由方式l所能输出单脉冲的宽度为CLK周期的n倍。

如果在减“1”计数过程中,GATE由高电平跳变为低电乎,这并不影响计数过程,仍继续计数;但若重新遇到GATE的上升沿,则从初值开始重新计数,其效果会使输出的单脉冲加宽,如教材图9-22(b)中的第2个单脉冲。

这种工作方式下,计数值也是一次有效,每输入一次计数值,只产生一个负极性单脉冲。

(3)方式2:

速率波发生器

工作方式2被称作速率波发生器。

进入这种工作方式,OUT输出高电平,装入计数值n后如果GATE为高电平,则立即开始计数,OUT保持为高电平不变;待计数值减到“1”和“0”之间,OUT将输出宽度为一个CLK周期的负脉冲,计数值为“0”时,自动重新装入计数初值n,实现循环计数,OUT将输出一定频率的负脉冲序列,其脉冲宽度固定为一个CLK周期,重复周期为CLK周期的n倍。

如果在减“1”计数过程中,GATE变为无效(输入0电平),则暂停减“1”计数,待GATE恢复有效后,从初值n开始重新计数。

这样会改变输出脉冲的速率。

如果在操作过程中要求改变输出脉冲的速率,CPU可在任何时候,重新写人新的计数值,它不会影响正在进行的减“1”计数过程,而是从下一个计数操作用期开始按新的计数值改变输出脉冲的速率。

(4)方式3:

方波发生器

工作方式3被称作方波发生器。

任一通道工作在方式3,只在计数值n为偶数,则可输出重复周期为n、占空比为1:

1的方波。

进入工作方式3,OUT输出低电平,装入计数值后,OUT立即跳变为高电平。

如果当GATE为高电平,则立即开始减“1”计数,OUT保持为高电平,若n为偶数,则当计数值减到n/2时,OUT跳变为低电平,一直保持到计数值为“0”,系统才自动重新置入计数值n,实现循环计数。

这时OUT端输出的周期为n×CLK周期,占空比为1:

1的方波序列;若n为奇数,则OUT端输出周期为n×CLK周期,占空比为((n+1)/2)/((n-1)/2)的近似方波序列。

如果在操作过程中,GATE变为无效,则暂停减“1”计数过程,直到GATE再次有效,重新从初值n开始减“l”计数。

如果要求改变输出方波的速率,则CPU可在任何时候重新装入新的计数初值n,并从下一个计数操作周期开始改变输出方波的速率。

 

8253的控制字:

6.软件功能

(1)键盘控制发声

(2)高、中、低音转换

(3)可以预置播放音乐

 

7.软件主要模块流程图

7.1高中低音转换程序流程图

高中低音转换程序流程图

7.2播放预定音乐子程序流程图

演奏时,通过判断按键为D来调用音乐播放子程序,音乐播放子程序流程图如图12所示。

音乐播放子程序流程图

7.3弹奏子程序流程图

当按键为1-8时,调用演奏子程序,演奏子程序的流程图如下图所示:

弹奏子程序流程图

 

8.程序代码

datasegment

io8253aequ280h

io8253ctrequ283h

port_Aequ288h

port_Bequ289h

port_Cequ28ah

port_ctrlequ28bh

tabledb7bh,7dh,7eh,0b7h,0bbh,0bdh,0beh,0d7h,0dbh,0ddh,0deh,0e7h,0ebh,0edh,0eeh

table_highdw524,588,660,698,784,880,988,1048;高音的

table_middw262,294,330,347,392,440,494,524;中音的

table_lowdw131,147,165,175,196,220,247,262;低音的

;msgdb'Press1,2,3,4,5,6,7,8,ESC:

',0dh,0ah,'$'

song1dw262,262,494,494,330,524,392,392

dw347,294,294,347,347,440,262,262,330

dw494,494,440,294,330,330,330,440,330

dw262,262,262,262;无名曲1

dataends

codesegment

assumecs:

code,ds:

data

start:

callskim

cmpal,0ddh;若按下键为A,转高音子程序

jzhigh

cmpal,0deh;若按下键为B,转中音子程序

jzmid

cmpal,0e7h;若按下键为C,转低音子程序

jzlow

cmpal,0ebh;若按下键为D,转播放预定音乐子程序1

jzm

m:

callmusic1

jmpstart

high:

begin1:

callskim

next_try1:

cmpal,table[bx]

jzsing1

cmpal,0deh

jzmid

cmpal,0e7h

jzlow

cmpal,0ebh

jzm

decbx

jnsnext_try1

sing1:

moval,bl

shlal,1;转为查表偏移量

movbl,al;保存偏移到bx

movbh,0

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

movdx,0FH

divwordptr[table_high+bx]

movbx,ax

callsound

jmpbegin1

mid:

begin2:

callskim

next_try2:

cmpal,table[bx]

jzsing2

cmpal,0ddh

jzhigh

cmpal,0e7h

jzlow

cmpal,0ebh

jzm

decbx

jnsnext_try2

sing2:

moval,bl

shlal,1;转为查表偏移量

movbl,al;保存偏移到bx

movbh,0

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

movdx,0FH

divwordptr[table_mid+bx]

movbx,ax

callsound

jmpbegin2

low:

begin3:

callskim

next_try3:

cmpal,table[bx]

jzsing3

cmpal,0ddh

jzhigh

cmpal,0deh

jzmid

decbx

jnsnext_try3

sing3:

moval,bl

shlal,1;转为查表偏移量

movbl,al;保存偏移到bx

movbh,0

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

movdx,0FH

divwordptr[table_low+bx]

movbx,ax

callsound

jmpbegin3

delay1procnear;延时子程序

pushcx

pushax

movax,40

loop1:

movcx,0ffffh

loop2:

deccx

jnzloop2

decax

jnzloop1

popax

popcx

ret

delay1endp

soundprocnear;发音子程序

movdx,io8253ctr;8254初始化设置8254计时器0方式3

moval,00110110B

outdx,al

movdx,io8253a

movax,bx

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

moval,ah

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

movdx,port_ctrl;8255初始化,设置8255C口输出

moval,10000000B

outdx,al

movdx,port_C

moval,03h

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

calldelay1;延时

moval,0h

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

ret

soundendp

music1procnear;音乐1播放子程序

movcl,0

ad1:

inccl

cmpcl,31

jereturn1

moval,cl

subal,1;取偏移量

shlal,1

movbl,al;保存偏移量

movbh,0

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

movdx,0FH

divwordptr[song1+bx]

movbx,ax

callsound

jmpad1

return1:

ret

music1endp

skimprocnear

movax,data

movds,ax

;8255初始化

movdx,port_ctrl

moval,10000010b

outdx,al

movdx,port_A

moval,00h

outdx,al

movdx,port_B

wait_open:

inal,dx

andal,0Fh

cmpal,0Fh

jnzwait_open

wait_press:

inal,dx

andal,0fh

cmpal,0fh

jewait_press

movcx,16eah

delay:

loopdelay

inal,dx

andal,0fh

cmpal,0fh

jewait_press

moval,0feh

movcl,al

next_row:

movdx,port_A

outdx,al

movdx,port_B

inal,dx

andal,0fh

cmpal,0fh

jnzencode

rolcl,01

moval,cl

jmpnext_row

encode:

movbx,000fh

inal,dx

ret

skimendp

codeends

endstart

 

9.问题分析与解决方案

在实验中,的确遇到很多问题,不过经过查询资料和书籍终于解决

问题一:

由于编写的源程序代码过长,跳转语句JE,不能顺利顺利跳转到

解决方案:

利用二次跳转,JE先跳转到一个中间标签,然后再用JMP跳转

问题二:

按下按键,发出相应频率的音阶,但一直发声,无法停下来

解决方案:

延时一段时间后,给8253的GATE0门输入0值

问题三:

高中低音每次选择后,要有显示灯显示此时是哪种频率,出错

解决方案:

把发声程序服用,分别调用程序给那几个LED灯不同的值

10.实验体会

这次课程设计,我的题目听起来不太复杂,但是实际操作起来,也并不容易,如何设置高低音这个问题困扰了我好久,当时看到其他同学的方法,觉得有点复杂,就开始想,怎么样就能更加简洁,在老师的耐心指导和同学的细心帮助下,同时自己也查阅了资料的情况下顺利解决了。

这次设计,采用总体思想为化总体为部分,部分到最后再合成,便于各个功能的实现。

 

只要相信认真踏实的做事,必会有成果。

因此我秉着此方针,相信肯定能够完成属于我自己的的电子琴。

于是我开始一步一步探索与尝试,从刚开始的音响不发音,到后来能发出乱声,到中音的发声,最后调出高音,低音.这一路的艰辛与快乐,苦恼于兴奋,那一刻我兴奋的不得了。

本次试验就让我深刻地感悟到这一点。

对问题的处理,方法是最重要的。

我不仅完成了任务,也使自己的专业知识又得到了提升,还考验了自身的独立思考的能力。

通过这次设计,我觉得自己对软硬件结合有了新的认识,巩固了原来所学的知识,对未来的学习起到了一定的帮助和铺垫作用。

参考文献

【1】周荷琴,吴秀清微型计算机原理与接口技术中国科学技术大学出版社.

【2】李真香汇编语言程序设计案例精选中国水利水电出版社.

【3】秦晓梅微机原理与接口技术综合实验教程大连理工大学出版社.

【4】王兵音乐学习器的原理与设计电子工程师.

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

当前位置:首页 > 自然科学 > 数学

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

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