数字录音机实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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(); /*关闭设备*/

}

相关文档
最新文档