仅代码编写方面,AD/DA转换本身比较简单,操作一下处理芯片就行;重点是和其他芯片的连接。
1.A/D转换
有三种方式,查询,中断,和DMA方式的数据采集程序框架。最后一个一看就很复杂,所以重点是前两个。
查询的意思就是转换好了在那等着cpu来查,中断是转换好了芯片积极地发出信号中断cpu,说可以读取数据了。
查询方式数据采集 ADC0804
先out随便一个值,产生脉冲;然后开个循环查询转换成功没有,成功了,就存起来,看下一个。
代码:
STARTP EQU 310H ; 转换启动端口 STATEP EQU 311H ; 状态端口 DATAP EQU 310H ; 数据端口 ;注意:ADC器件本身不具有A0等地址线,不提供多个数据/控制/状态端口,也无需CPU对其写命令字。
;IN/OUT这三个端口的指令的作用是让相关管脚产生电平或脉冲,不一定非得有数据进/出CPU。 DATA SEGMENT BUFR DB 100(0) DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA BEGIN: MOV SI, OFFSET BUFR ; 缓冲区指针 MOV CX,100 ; 采样次数 START: MOV DX,STARTP ; 启动转换 MOV AL,00H ;(可以是其它值) OUT DX,AL ;使CS和WR同时有效 WAIT1: MOV DX,STATEP ; 查转换结束 IN AL,DX AND AL,80H ; 查D7=0(INTR=0?) JNZ WAIT1 ; 未结束,等待 MOV DX,DATAP ; 已结束,读数据 IN AL,DX MOV[SI],AL ; 数据传输到BUFR区 INC SI ;缓冲区地址加1 DEC CX ; 采样次数减1 JNZ START ; 未完,继续启动 MOV AX,4C00H ; 已完,退出 INT 21H CODE ENDS END BEGIN
中断方式数据采集 ADC0809
用8259进行中断处理,无需给8259初始化。需要修改8259向量和开放屏蔽。
D0-D7读取数据,ADD锁存地址,这两个都是A口,它又读又写;ALE启动转换,OE读取转换数据,这些扔给8255处理。所以还要初始化一下8255。中间处理完EOC扔给8259,发出中断,然后cpu来读数据。
8259下降沿启动转换。
代码:
MOV DX,303H ;82C55初始化 MOV AL,80H ;10000000B, 0方式,A口出,C口出 ;书上有误,A口在地址选择时为输出,在获取采样数据时为输入,8255需要被两次初始化才行 OUT DX,AL
MOV AL,0EH ;置PC7=0,使START和ALE无效 OUT DX,AL MOV AL,0CH ;置PC6=0,使OE无效(位控字) OUT DX,AL
--------------------------------------------------- MOV AX,350CH ;获取IRQ4的中断向量并保存 INT 21H MOV OLD-OFF,BX MOV BX,ES MOV OLD-SEG,BX
CLI MOV AX,250CH ;置新中断向量 MOV DX,SEG A-D MOV DS,DX MOV DX,OFFSET A-D INT 21H MOV AX,DATA ;恢复数据段 MOV DS,AX
STI
IN AL,21H ;开放IRQ4 AND AL,0EFH OUT 21H,AL
MOV CX,100 ;设置采集字节数 MOV AX,OFFSET BUFF ;设置内存指针 MOV PRT,AX
MOV DX,300H ;选择通道 MOV AL,07H OUT DX,AL
------------------------------------------------
BEGIN:MOV DX,303H ;启动转换 MOV AL,0FH ;产生START启动脉冲信号 OUT DX,AL NOP MOV AL,0EH OUT DX,AL
STI ;开中断 HLT ;等待中断 DEC CX ;采样次数减1 JNZ BEGIN ;没完,继续
----------------------------------------------- CLI ;已完,关中断
MOV AX,250CH ;恢复IRQ4的原中断向量 MOV DX,OLD-SEG MOV DS,DX MOV DX,OLD-OFF INT 21H
MOV AX,DATA ;恢复数据段 MOV DS,AX STI
IN AL,21H OR AL,10H ;屏蔽IRQ4 OUT 21H,AL
MOV AX,4C00H ;返回DOS INT 21H
2.D/A转换器 DA823C
主要目的是生成各种各样的波。
跟上面差不多,把各种口扔给8255,然后只要根据点画图就行了。
3.参数
1.分辨率
能输出几位数据
2.转换时间