数字录音机实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验目的
1、了解数字录音技术的基本原理。
2、进一步掌握A/D转换器与D/A转换器的使用方法。
二、实验内容
1、按图41连接电路,将声传感器接J2,把代表语音的电信号送给ADC0809通道2(IN2);D/A转换器的输出端通过K8跳线接喇叭。
2、编程,以每秒钟5000次的速率采集IN2输入的语音数据并存入内存,共采集60000个数据(录12秒),然后再以同样的速率将数据送DAC0832使喇叭发声(放音)。
三、实验提示
1、将8253设置成方式0,计数200个,(定时0.2ms),利用PA0查询OUT0电平,若高电平表示定时时间到。
2、ADC0809通道2(IN2)的口地址为298H
data segment
ioport equ 01400h-0280h
luport equ ioport+29ah ;录音口地址
fangport equ ioport+290h ;放音口地址
io8253a equ ioport+283h
io8253b equ ioport+280h
io8255c equ ioport+28bh
io8255d equ ioport+288h
data_qu db 60000 dup(?) ;录音数据存放数据区news_1 db 'Press any key to record:',24h ;录音提示
news_2 db 0dh,0ah,' Playing:',24h ;放音提示
data ends
code segment
assume cs:code,ds:data,es:data
begin: mov ax,data ;初始化mov ds,ax
mov es,ax
mov dx,offset news_1 ;显示录音提示
mov ah,9
int 21h
test_1: mov ah,1 ;等待键盘输入int 16h
jz test_1 ;若不是则循环等待
call lu ;调用录音子程序
mov dx,offset news_2 ;显示放音提示
mov ah,9
int 21h
fy: call fang ;调用放音子程序mov ax,0c07h
int 21h
cmp al,20h
jz fy
mov ah,4ch ;返回DOS
int 21h
lu proc near ;录音子程序
mov di,offset data_qu ;置数据区首地址为DI
mov cx,60000 ;录60000个数据
cld
xunhuan: mov dx,luport ;启动A/D out dx,al
call delay ;延时
in al,dx ;从A/D读数据到AL
stosb ;存入数据区,使DI加1
loop xunhuan ;循环
ret;子程序返回
lu endp
fang proc near ;放音子程序mov cx,60000 ;放60000个数据
mov si,offset data_qu ;置数据区首地址为SI cld
fang_yin: mov dx,fangport
lodsb ;从数据区取出数据
sub al,30h
out dx,al ;放音
call delay ;延时
loop fang_yin ;循环
ret;子程序返回
fang endp
delay proc near ;延时子程序push d x
mov al,10h ;设8253通道0工作方式0
mov dx,io8253a
out dx,al
mov al,200 ;写入计数器初值200
mov dx,io8253b
out dx,al
mov dx,io8255c ;设8255的A口为输入
mov al,9bh
out dx,al
mov dx,io8255d ;从8255的A口输入
delay1: in al,dx
and al,1 ;判断PA0是否为1
jz delay1 ;若PA0不为1,转de_lay
pop dx
ret;子程序返回delay endp
code ends
end begin
o/*****************************/
/* 数字录音机 */
/*****************************/
#include
#include
#include"ApiEx.h"
#pragma comment(lib,"ApiEx.lib")
void lu(); /*录音函数*/
void fang(); /*放音函数*/
void de_lay(); /*延时函数*/
int i;
BYTE *ii;
void main()
{
printf("--------------------EXP22_13_LYJ---------------------\n");
printf("1. MIC === J2\n");
printf("2. I/O (298-29F) === 0809 (CS)\n");
printf("3. (JUMP 2 TO 3) of JP2\n");
printf("4. SPEAKER === J1\n");
printf("5. I/O (290-297) === 0832 (CS)\n");
printf("6. 8253 (CLK0) === (1MHz) or (2MHz)\n");
printf("7. TPC (+5V) === 8253 (GATE0)\n");
printf("8. 8253 (OUT0) === 8255 (PA0)\n");
printf("9. I/O (280-287) === 8253 (CS)\n");
printf("10. I/O (288-28F) === 8255 (CS)\n");
printf("Press any key to begin!\n\n");
getch();
if(!Startup()) /*打开设备*/
{
printf("ERROR: Open Device Error!\n");
return;
}
ii = (BYTE *)malloc(60000); /*分配空间用于存放录音数据*/
if(!ii)
{
printf("No memory!\7");
exit(0);
}
PortWriteByte(0x28b,0x9b); /*设8255A口为输入方式*/
PortWriteByte(0x283,0x10); /*初始化8253通道0为方式0*/
printf("Press any key to record!\n"); /*录音提示*/
getch();
printf("Playing record!\n");
lu(); /*按任意键后开始录音*/
printf("Press any key to playing!ESC is exit!\n"); /*放音提示*/
while(getch() != 0x1b)
{
fang(); /*按任意键后开始放音*/
printf("Playing end!\n");
}
Cleanup(); /*关闭设备*/
}