资源描述
《微机实验及课程设计》
课程设计报告
电子琴
姓 名: *** 学 号: ********
专 业: ******** 实 验 室: 电工电子实验中心 103
设计时间: 2009年 5 月 30日 —— 2009年 6 月 4日
评定成绩: 审阅教师:
目 录
一.实验简介……………………………………………………………3
二.基本设计思想………………………………………………………3
三.程序流程和程序实现………………………………………………3
四.测试方案和测试结果………………………………………………10
五.分析与总结…………………………………………………………10
一.实验简介
目的:
检验和提高我在原理与接口综合应用方面分析问题与解决问题的能力,同时也给我提供更多、更好的训练机会。根据设计要求,尽可能完成设计要求的功能,选择最合适的器件,构成最有效的硬件电路来完成。
基本实验要求:
构造一模拟/数字电子琴
1、选择利用实验仪扬声器/PC机内8253驱动内扬声器与键盘1、2、3、4、5、6、7、8设计一个电子琴,通过按数字键响相应的乐符1、2、3、4、5、6、7、i,使能演奏简单的乐曲。按1~8数字键同时点亮相应的8个LED灯,使具有声、光效果;
2、 利用实验仪DAC和喇叭,软件控制上述功能。选择机内还是实验仪由开关设置,课随时切换;
3、在8*8点阵上表示音节高低;
4、精确显示从第一个键按下后的时间(单位秒,要求精确到0.1秒,显示到秒)。
进一步设计要求:
1.、能准确记录开始演奏到结束演奏的时间,在八段码上显示;
2、 数字、模拟合奏,能同时指示音阶;
3、自动录音,并具有回放功能(分两种水平、难易不等、即记录按键,同时记录按键和时间。
实现情况:
实现基本实验要求的1~3。
二.基本设计思想
1、先分别设计机内电子琴和实验仪电子琴。机内电子琴参照实验五8253计数器/定时器的选做与探索中使用PC机内8253驱动声音接口;实验仪电子琴参照实验中演示实验的电子琴流程图;
2、再把两者结合起来,用一个高低电平作开关控制是机内还是实验仪,可通过8255A口输入,判断10(二进制)则实验仪DAC,00则机内喇叭;
3、点阵显示。根据输入的数字判断应显示点阵的哪一行。具体可先把点阵的8列全选通,输入为1~8某个数字时,判断显示相应的行;
4、LED灯显示。同样,根据输入的数字判断应显示哪一个LED灯。具体可设置8255B口为输出,根据输入的数字,输出控制LED灯相应灯亮。
三.程序流程和程序实现
1、机内电子琴
开始
流程图:
键盘读入一个字符
是ESC键吗?
Y
N
N
返回DOS
是数字1~8键吗?
Y
求出音阶值保存
赋相应频率值
延时
程序:
dseg segment
freq dw 262,294,330,349,392,440,494,523
;扬声器发声各频率值
msg db 'Press 1,2,3,4,5,6,7,8,ESC:',0dh,0ah,'$'
tim dw 400
num db ?
dseg ends
sseg segment stack
dw 256 dup(?)
sseg ends
cseg segment
assume cs:cseg,ds:dseg
start: mov ax,dseg
mov ds,ax
mov dx,offset msg
mov ah,9
int 21h ;显示提示信息
sss: mov ah,7
int 21h
;等待从键盘接收字符,不回显al=asc码
cmp al,1bh
je exit;若为ESC键,则转EXIT退出
cmp al,31h
jl sss ;小于31h
cmp al,38h ;大于38h
jg sss ;不在'1'-'8'之间转sss
sub al,31h
mov num,al ;num求出相应的时间常数的序号
jinei: mov al,num
add al,al
mov ah,00h
mov si,ax
again: mov di,freq[si]
mov bx,tim
call gen
jmp sss
exit: mov ah,4ch
int 21h
gen proc near
mov al,0b6h ;设置8253通道2方式3二进制计数
out 43h,al
mov dx,12h
mov ax,12928
; DX AX=896*533h=18*65536+12928=1.19M
div di
out 42h,al ;8253通道2口设置初值
mov al,ah
out 42h,al
in al,61h ;读8255PB口
mov ah,al
or al,3
out 61h,al
wait1: mov cx,0h
delay3: mov ax,10 ;延时子程序
delay2: nop
dec ax
jnz delay2
loop delay3
dec bx
jnz wait1
mov al,ah
out 61h,al
ret
gen endp
cseg ends
end start
2、实验仪电子琴
流程图:
实验电路:
程序:
data segment
ioport equ 0d400h-0280h
io8253a equ ioport+280h
io8253b equ ioport+283h
io8255a equ ioport+288h
io8255b equ ioport+28bh
io0832a equ ioport+290h
data1 db 80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh
db 0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h
db 80h,66h,4eh,38h,25h,15h,09h,04h
db 00h,04h,09h,15h,25h,38h,4eh,66h ;正弦波数据
time db 120,106,94,89,79,70,63,59 ;发不同音时8253的计数器初值
msg db 'Press 1,2,3,4,5,6,7,8,ESC:',0dh,0ah,'$'
num db ? ;num为8253计数器初值的序号
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov dx,offset msg
mov ah,9
int 21h ;显示提示信息
sss: mov ah,7
int 21h ;从键盘接收字符,不回显
cmp al,1bh
je exit ;若为ESC键,则转EXIT
cmp al,31h
jl sss
cmp al,38h
jg sss ;若不在'1'-'8'之间转sss
sub al,31h
mov num,al ;求出相应的时间常数的序号
mov cx,60 ;取60次32个正弦波数据
ddd: mov si,0
lll: mov al,data1[si] ;取正弦波数据
mov dx,io0832a
out dx,al ;放音
call delay ;调延时子程序
inc si
cmp si,32 ;是否取完32个数据
jl lll ;若没有,则继续
loop ddd ;总循环次数60是否完,没有,则继续
jmp sss
exit: mov ah,4ch
int 21h
delay proc near ;延时子程序
ccc: mov bx,offset time
mov dx,io8253b ;置8253通道0为方式0工作
mov al,10h
out dx,al
mov dx,io8255b ;设8255A口输入
mov al,9bh
out dx,al
mov al,num ;取相应的时间常数
xlat
mov dx,io8253a
out dx,al ;向8253通道0输出
kkk: mov dx,io8255a
in al,dx ;从8255A口读一字节
test al,01 ;判PA0口是否为1
jz kkk ;若不为1,则转KKK
ret ;子程序返回
delay endp
code ends
end start
3.电子琴总设计
流程图:
开始
键盘读入一个字符
Y
是ESC键吗?
N
N
是数字1~8键吗?
返回DOS
Y
点亮点阵
Y
点亮LED灯
N
是机内吗?
60个正弦波
完了吗?
Y
N
求出音阶值保存
正弦波个数计数器赋值60
每个正弦波数据个数计数器赋初值
取正弦波数据送DAC0832
求出音阶值保存
Y
赋相应频率值
一个正弦波
完了吗?
N
延时
延时
电路图:
8个LED灯
PB7~PB0
PA0
PA1
CS
CLK0
GATE0
OUT0
CS
8253 8255
1MHZ
+5V
DAC0832
CS
280H
K0开关 288H
290H
程序:
data segment
ioport equ 0c800h-0280h
io8253a equ ioport+280h;8253通道0地址
io8253b equ ioport+283h;8253控制字寄存器地址
io8255a equ ioport+288h ;8255A口地址
io8255b equ ioport+289h ;8255B口地址
io8255d equ ioport+28bh;8255控制字寄存器地址
io0832a equ ioport+290h
proth equ ioport+2a8h ;点阵行选的地址
protlr equ ioport+2b0h ;点阵列选的地址
data1 db 80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh
db 0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h
db 80h,66h,4eh,38h,25h,15h,09h,04h
db 00h,04h,09h,15h,25h,38h,4eh,66h
;正弦波数据
time db 120,106,94,89,79,70,63,59
;发不同音时8253的计数器初值
banquan db 0dh,0ah
db '
*************************************************',0dh,0ah
db ' **
**',0dh,0ah
db ' ** WELCOME TO USE
dianziqin **',0dh,0ah
db ' ** THIS PROGRAMME IS
DESIGHED BY **',0DH,0AH
db ' ** zhouqiuping 61007204
**',0DH,0AH
db ' **
**',0dh,0ah
db '
*************************************************',0dh,0ah
db ' Press 1,2,3,4,5,6,7,8,ESC:',0dh,0ah,'$'
num db ? ;num为8253计数器初值的序号
freq dw 262,294,330,349,392,440,494,523 ;扬声器发声各频率值
tim dw 400
data ends
stack segment stack
dw 256 dup(?)
stack ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov dx,offset banquan ; 版权显示
mov ah,9
int 21h ;显示提示信息
sss: mov ah,7
int 21h ;等待从键盘接收字符,不回显al=asc码
cmp al,1bh
je exit ;若为ESC键,则转EXIT推出
cmp al,31h
jl sss ;小于31h
cmp al,38h ;大于38h
jg sss ;不在'1'-'8'之间转sss
sub al,31h
mov num,al ;num求出相应的时间常数的序号
dianzhen: mov al,0ffh ;点阵板的列全部选通
mov dx,proth
out dx,al
mov al,00000001 :点阵的行赋初值
shl al,num ;根据输入的数字,左移相应位数,即点阵亮相应行
mov num,al ;如输入3,则num为2,左移两位,第三行亮
mov dx,prothl
out dx,al
led: mov dx,io8255d
mov al,99h ;设置8255A口入B口出
mov dx,io8255b
out dx,num ;根据移位后的num点亮相应led灯
kaiguan: mov dx,io8255a ;判断机内机外
in al,dx ;从8255B口读一字节
test al,10b ;判断PA0口是否为10(二进制)
jz jiwai ;是的话转实验仪
jmp nei ;否则转机内
;---------------------------------jiwai
jiwai: mov cx,60 ;取60次32个正弦波数据
ddd: mov si,0
lll: mov al,data1[si] ;取正弦波数据
mov dx,io0832a
out dx,al ;放音
call delay ;调延时子程序
inc si
cmp si,32 ;是否取完32个数据
jl lll ;若没有,则继续
loop ddd ;总循环次数60是否完,没有,则继续
jmp sss
exit: mov ah,4ch
int 21h
delay proc near ;延时子程序
ccc: mov bx,offset time
mov dx,io8253b ;置8253通道0为方式0工作
mov al,10h
out dx,al
mov al,num ;取相应的时间常数
xlat
mov dx,io8253a
out dx,al ;向8253通道0输出
kkk: mov dx,io8255a
in al,dx ;从8255A口读一字节
test al,01 ;判PA0口是否为1
jz kkk ;若不为1,则转KKK
ret ;子程序返回
delay endp
;-------------------------------------机内部分
jinei: mov al,num
add al,al
mov ah,00h
mov si,ax
again: mov di,freq[si]
mov bx,tim
call gen
jmp sss
gen proc near
mov al,0b6h ;设置8253通道2方式3二进制计数
out 43h,al
mov dx,12h
mov ax,12928
; DX AX=896*533h=18*65536+12928=1.19M
div di
out 42h,al ;8253通道2口设置初值
mov al,ah
out 42h,al
in al,61h ;读8255PB口
mov ah,al
or al,3
out 61h,al
wait1: mov cx,0h
delay3: mov ax,10 ;延时子程序
delay2: nop
nop
dec ax
jnz delay2
loop delay3
dec bx
jnz wait1
mov al,ah
out 61h,al
ret
gen endp
code ends
end start
四.测试方案和测试结果
测试方案
测试结果
启动程序,出现按键提示,按下1~8键
机内/实验仪发出相应的音阶
同时led和点阵板亮相应的灯和行
改变开关状态(可随时任意改变),按1~8键
对应发出相应的音阶
“弹琴”
发出优美旋律
按下ESC键
退出程序
五.分析与总结
问题分析:
关于开关改变发声源为机内或机外和led灯的点亮,原来想用前面学过的简单输入输出实验,用74LS273做输出,到led上驱动led灯亮;用74LS244做输入,把开关值输入控制发声源。后来发现这样很麻烦,虽然在程序上没有太繁杂,但是这样就加了两个地址,而且对于电路来说,就很复杂。因此,后来想到直接用8255做输入输出,设A口为输入,B口输出,这样用一个片子即可完成几个功能。
关于点亮点阵板,原来想将num逐个与0~7比较,来判断亮哪一行,后来这样写代码时比较繁杂,就改成移位来实现,给点阵的行赋初值00000001,然后再左移num位,即可亮相应的行。
实验总结:
这次微机实验课程设计,使我对微机软硬件结合有了进一步的了解。原来并不太清楚是什么意思,一直都很模糊,听课本也是很迷茫;而之前的那些单元实验,也没有都做好。之前做的实验,由于大部分是验证性的,所以就很被动地去做,甚至并没有想为什么要那样连电路,内部的代码更没有认真看。这次课程设计,因为要自己去设计整个过程,所以就不得不去了解学习自己原来并没有真正弄懂的东西。比如一些程序的代码的意思,汇编语言的逻辑,比如一些芯片的用途。使我对前面所做的实验有了原理性的了解,回头看一些实验,也知其然其所以然了。同时对课本上讲的一些内容,不再像以前那样觉得抽象,通过这次设计,有了具体的理解。
同时,我也知道了设计一个项目,应该如何下手。应该先对项目要求有个全面的了解,知道要做什么,然后根据要求所要涉及到的知识我们要主动去摄取,结合自己已学过的,再对整体框架有个感知,心里有数后,进行设计。设计时用流程图,这很重要,这样整个思路就很清晰,而且是按照软硬件语言的逻辑顺序进行,就很方便。设计过程可以分模块,不要一开始就想把所有的功能都实现了,应该一个模块一个模块地实现,再总的连起来,实现最后的总模块。在每个模块设计时,尽量想到比较简单的设计,简化编程和电路,也可少出错。对微机是这样,对其他的像数字系统设计,也是一样的。
因此,我也觉得微机实验的这种形式的课程设计是很好也很有必要的。对我们对微机实验的理解有很大帮助。
参考书目:
【1】 杨素行《微型计算机系统原理及应用》,北京,清华大学出版社,2004年
【2】 微机实验及课程设计教程(试用版2.0),东南大学《微机系统与接口》课程组,2009年2月
展开阅读全文