东南大学微机报告数字录音机Word下载.docx
《东南大学微机报告数字录音机Word下载.docx》由会员分享,可在线阅读,更多相关《东南大学微机报告数字录音机Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
1、参数设置:
datasegment
ioportequ0ec00h-0280h
luportequioport+29ah;
录音口地址
fangportequioport+290h;
放音口地址
io8253aequioport+283h
io8253bequioport+280h
io8253eequioport+281h
io8255cequioport+28bh
io8255dequioport+288h
redequioport+2a0h
yellowequioport+2a8h
rowequioport+2b0h;
rowchoose
orderdb01h,02h,04h,08h,10h,20h,40h,80h
data_qudb64000dup(?
);
录音数据存放数据区
news_1db'
PressPA1torecord:
'
24h;
录音提示
news_2db0dh,0ah,'
Playing:
放音提示
news_3db'
success'
24h
volumedb00h;
声音倍数
nbdb00h;
选择声音
middledw00h;
录音中跳转的数据数
tempdb00h;
根据强弱显示波形
colourdb00h;
选择波形颜色
countdb00h;
选择技术间隔
numdw00h;
选择列选
dataends
stackssegmentstack
db50dup(?
)
stacksends
2、主要程序流程图及关键代码:
1)主流程图
codesegment
assumecs:
code,ds:
data,es:
data,ss:
stacks
begin:
movax,stacks
movss,ax
movax,data;
初始化
movds,ax
moves,ax
test_1:
movdx,io8255c;
设8255的A口为输入
moval,9bh
outdx,al
movdx,io8255d;
从8255的A口输入
delayPA1:
inal,dx
andal,02h;
判断开关是否为让其开始录音PA11开始录音
jzdelayPA1
movdx,offsetnews_1;
显示录音提示
movah,9
int21h
calllu;
调用录音子程序
movdx,offsetnews_2;
显示放音提示
delayPA2:
movdx,io8255d;
inal,dx
testal,4h;
判断PA2是否为1为1开始放音
jzdelayPA2;
若PA2不为1,转delayPA2
play:
callfang;
调用放音子程序
testal,10h;
判断PA4是否为1为1一直重复播放
jnzplay;
若PA3不为1结束
movax,0c07h
int21h
cmpal,53h;
输入S正式退出
jzover
cmpal,73h;
输入s正式退出
jneplay
over:
movah,4ch;
返回DOS
2)录音放音子流程图:
luprocnear;
录音子程序
movdi,offsetdata_qu;
置数据区首地址为DI
movcx,64000;
录64000个数据
movcolour,00h
cld;
令DF=0
xunhuan:
movdx,luport;
启动A/D
outdx,al
calldelay;
延时
inal,dx;
从A/D读数据到AL
movtemp,al
stosb;
存入数据区,df为0,使DI加1al到di地址处
stop:
moval,9bh
从8255的A口输入
inal,dx
testal,20h;
判断PA5若是1则暂停,为0继续执行
jnzstop
incmiddle
testal,40h;
录音中跳转
jnzlai
inccount
cmpcount,50
jzshow
jmpcontinue
show:
callwave
cmpnum,7
jzclear
clear:
movnum,0
continue:
loopxunhuan;
循环
ret
lai:
callfang
ret;
子程序返回
luendp
;
fangprocnear;
放音子程序
movcx,middle;
放64000个数据
movsi,offsetdata_qu;
置数据区首地址为SI
movcolour,01h
cld;
清方向标志令df=0
fang_yin:
movdx,fangport
lodsb;
从数据区取出数据读SI存储区si自+1
callvol;
控制音量0-10个档位
movtemp,al
subal,30h;
控制最初音量?
mulvolume
pushbx
movbl,10
divbl
popbx
outdx,al;
放音
calldelay;
stop1:
movdx,io8255c;
inal,dx
testal,20h;
jnzstop1
inccount
cmpcount,10
jzshow1
jmpcontinue1
show1:
callwave
cmpnum,7
jzclear1
jmpcontinue1
clear1:
movnum,0
continue1:
loopfang_yin;
movdx,offsetnews_3;
ret;
子程序返回
fangendp
3)其它子过程:
;
延时子程序
delayPROCNEAR;
pushdx
moval,10h;
设8253通道0工作方式0
movdx,io8253a
moval,125;
写入计数器初值125
movdx,io8253b
outdx,al
delay1:
testal,1;
判断PA0是否为1
jzdelay1;
若PA0不为1,转de_lay
popdx
delayendp
音量调节子程序
volprocnear
pushax
pushcx
movah,0bh;
键盘输入不等待
cmpal,0ffh
jzgo
jmpgos
Nwait:
moval,39
go:
movah,08
movnb,al
gos:
cmpnb,30h
jzvol1
cmpnb,31h
jzvol2
cmpnb,32h
jzvol3
cmpnb,33h
jzvol4
cmpnb,34h
jzvol5
cmpnb,35h
jzvol6
cmpnb,36h
jzvol7
cmpnb,37h
jzvol8
cmpnb,38h
jzvol9
cmpnb,39h
jzvol10
vol1:
movvolume,1
jmpexit
vol2:
movvolume,2
vol3:
movvolume,3
vol4:
movvolume,4
vol5:
movvolume,5
vol6:
movvolume,6
vol7:
movvolume,7
vol8:
movvolume,8
vol9:
movvolume,9
vol10:
movvolume,10
exit:
stc
popcx
popdx
popax
ret
volendp
四.提高与创新研究
要求在8*8双色点阵显示器上显示录音和放音的粗略波形,红色为放音,黄色为录音。
显示子程序如下:
waveprocnear
pushsi
cmptemp,31
jbelight1
cmptemp,63
jbelight2
cmptemp,95
jbelight3
cmptemp,127
jbelight4
cmptemp,159
jbelight5
cmptemp,191
jbelight6
cmptemp,223
jbelight7
cmptemp,255
jbelight8
light1:
moval,1h
jmpCrow
light2:
moval,3h
light3:
moval,7h
light4:
moval,0fh
light5:
moval,1fh
light6:
moval,3fh
light7:
moval,7fh
light8:
moval,0ffh
Crow:
movdx,row
cmpcolour,00h
jzLyellow
movdx,red
jmpgood
Lyellow:
movdx,yellow
good:
movsi,num
moval,order[si];
循环选中一列直接用si即可
popsi
popcx
addnum,1
movcount,0
waveendp
codeends
endbegin
显示流程图:
运行结果:
运行程序,打开开关K1或按下键盘上任一键,显示“PressPA1torecord:
”开始录音,录音结束后按K2播放,显示“Play……”。
播放过程,可以用K5控制停止,K4控制重放;
幅度和放音增益由开关键盘0-9指定。
并且可以实现在8×
8双色点阵显示器上显示录音和放音的粗略波形,红色为放音,绿色为录音此外在录音的任意时刻可以用K6来控制录音中直接转入播放程序。
总流程图:
五.分析与总结
思路:
基于TPC演示实验:
数字录音机。
TPC下数字录音机只可实现基本的录音和放音。
我要通过扩展接线和扩展编码来实现以下功能:
1、实现录音8秒。
2、由开关控制开始录音,播放录音,循环播放录音,录音、放音中暂停,在录音8s过程中任一时刻直接跳转到放音。
3、实现调节音量我选择用键盘0-9输入调节音量。
4、8*8点阵可动态显示录音放音波形。
遇到问题:
主要遇到程序结构的问题以及实验箱的问题。
1、关于显示波形函数调用问题,我想通过连续使用call来调用函数,虽然代码看着简介清晰,但是内部结构过于混乱导致频频出错。
2、跳转指令用时一定要谨慎,否则极易出错。
3、在fang内给temp赋值时需要注意赋值位置,我一开始将处理完的al赋给temp结果显示的始终是最后一行,后来经反复检查,发现处理完的al信号变得很小,故导致这一错误。
4、有时候相同的程序在实验箱上表现出来的错误也不尽相同,故需要仔细检查实验箱。
5、在选择使用TPC还是cmd运行程序时也要注意,因为同样的程序在二者的运行结果往往也不尽相同。