用到的芯片是 ADC0809 CAD0832 8253 8255
只是从百度上看到的代码,修改了一点点 ,希望对你有帮助
DATAS SEGMENT
ioport equ 0c800h-280h
io0809 equ ioport+29ah
io0832 equ ioport+290h
io8253 equ ioport+280h
io8255 equ ioport+288h
io8253c equ ioport+283h
io8255c equ ioport+28bh
msg0 db'<Press R to start record>',0dh,0ah,'$'
msg1 db 0dh,0ah,'<Input Error!Please input R or r to continue...>',0dh,0ah,'$'
msg2 db 0dh,0ah,'<Press P to play record>',0dh,0ah,'$'
msg3 db 0dh,0ah,'<Input Error!Please input P or p to continue...>',0dh,0ah,'$'
msg4 db 0dh,0ah,'Recording...',0dh,0ah,'$'
msg5 db 0dh,0ah,'Playing...',0dh,0ah,'$'
msg6 db'Input:','$'
msg7 db 0dh,0ah,'Thank you!',0dh,0ah,'$'
msg8 db 0dh,0ah,'Record Complete!',0dh,0ah,'$'
msg9 db 0dh,0ah,'Play Over.',0dh,0ah,'$';
msg10 db 0dh,0ah,'If you want to pause,press any key!','$'
msg11 db 0dh,0ah,'<Press R to play replay>',0dh,0ah,'$'
msg12 db'<Press Q to quit>',0dh,0ah,'$'
buf db 60000 dup(?)
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV DX,OFFSET MSG0 ;显示按R开始
MOV AH,09H
INT 21H
MOV DX,OFFSET MSG6 ;显示并等待input
MOV AH,09H
INT 21H
CHOOSE0: ;直到输入r为止才开始录音
MOV AH,1
INT 21H
CMP AL,'R'
JZ OK0
CMP AL,'r'
JZ OK0
MOV DX,OFFSET MSG1 ;提示输入错误,继续要输入
MOV AH,09H
INT 21H
MOV DX,OFFSET MSG6
MOV AH,09H
INT 21H
JNZ CHOOSE0
OK0:
MOV DX,OFFSET MSG4 ;开始录音
MOV AH,09H
INT 21H
MOV DI,OFFSET BUF
MOV CX,30000
REC:
MOV DX,IO0809 ;启动0809将模拟信号转化成数字信号
OUT DX,AL
CALL DELAY
IN AL,DX ;输入转化数据
MOV [DI],AL
INC DI
LOOP REC ;一直循环30000次,因为cx=30000
OK2:
MOV DX,OFFSET msg8
MOV AH,09H
INT 21H
MOV DX,OFFSET MSG2
MOV AH,09H
INT 21H
MOV DX,OFFSET MSG6
MOV AH,09H
INT 21H
CHOOSE1: ;按p进行播音
MOV AH,1
INT 21H
CMP AL,'P'
JZ OK1
CMP AL,'p'
JZ OK1
MOV DX,OFFSET MSG3
MOV AH,09H
INT 21H
MOV DX,OFFSET MSG6
MOV AH,09H
INT 21H
JNZ CHOOSE1 ;直到按了p才进行播音
OK1:
MOV DX,OFFSET MSG5
MOV AH,09H
INT 21H
MOV DI,OFFSET BUF
MOV CX,30000
PLAY:
MOV DX,IO0832 ;启动0832将数字转换成模拟信号,播音
MOV AL,[DI]
OUT DX,AL
CALL DELAY
INC DI
LOOP PLAY ;一直播放直到cx=0
MOV DX,OFFSET msg9
MOV AH,09H
INT 21H
MOV DX,OFFSET msg11
MOV AH,09H
INT 21H
MOV DX,OFFSET msg12
MOV AH,09H
INT 21H
REPLAY: ;重新播放
MOV DX,OFFSET MSG6
MOV AH,09H
INT 21H
MOV AH,1
INT 21H
CMP AL,'R'
JZ OK1
CMP AL,'r'
JZ OK1 ;按r是重新播放
CMP AL,'Q' ;按q是退出
JZ QUIT
CMP AL,'q'
JZ QUIT
MOV DX,OFFSET MSG1
MOV AH,09H
INT 21H
JNZ REPLAY
QUIT:
MOV DX,OFFSET msg7
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
DELAY PROC NEAR
PUSH DX
MOV DX,IO8253C
MOV AL,10H ;工作方式0,二进制计数
OUT DX,AL
MOV DX,IO8253
MOV AL,200 ;每秒以5千次的速率采集(1mhz/5000)
OUT DX,AL
MOV DX,IO8255C
MOV AL,90H ;8255A进C出
OUT DX,AL
MOV DX,IO8255
OUTTEST:
IN AL,DX ;将out0(pa0)的数据放在al
TEST AL,01 ;检查计数器的out0是不是高电平
JZ OUTTEST
POP DX ;复位
RET
DELAY ENDP
CODES ENDS
END START
本文介绍了一个使用ADC0809和DAC0832进行模拟信号与数字信号相互转换的应用实例。该程序实现了声音的录制与回放功能,通过8253定时器控制采样频率,并利用8255进行外部设备的控制。
1万+

被折叠的 条评论
为什么被折叠?



