乐趣区

关于接口:接口与通讯综合设计数字量与模拟量相互转换

〇、写在后面

这是我《接口与通信》试验的综合设计,如果大家有相似作业的话心愿不要适度借鉴,本程序仅供参考和学习!不要剽窃!

这个程序在设计上有两点有余:

  1. 在数字量转化成模拟量的过程中,在数码管上仅显示了十六进制值,该值无奈与理论电压对应。如果改良的话,能够将模拟量与电位器最大电压(5V)相乘,失去理论电压值,再以十进制的模式输入。
  2. 在模拟量转化成数字量的过程中,我采纳了十分偷懒的设计,仅将数字量划分为不同“档位”管制电机不同的转速。如果改良的话,能够通过公式对应不同的占空比,真正实现数字量与电压的线性关系。

因为我设计这个程序只是想在硬件上综合 8255 芯片LED(共阴极)数码管ADC0809 芯片DAC0832 芯片直流电机,因而在软件上的细节方面没有进行设计。期待您的欠缺。

一、设计目标

  1. 相熟 A / D 转换的基本原理,把握 A / D 转换器 ADC0809 的应用办法及对应的硬件电路。
  2. 相熟 D / A 转换的基本原理,把握 DAC0832 的应用办法及对应的硬件电路。
  3. 相熟 8255 并行接口编程原理,把握 LED 字型显示的编程办法及硬件构造。

二、试验设施

硬件:PC 兼容机、微机实验仪、直流电机。
软件:操作系统 MS-DOS;MASM.EXE、LINK.EXE。

三、设计内容

  1. 8255A 芯片的片选 CS 连贯 288H,PA0~PA7 连贯 LED 数码管 A~DP,PC0~PC1 连贯 LED 数码管 S0~S1。
  2. DAC0832 芯片的片选 CS 连贯 290H,模拟输出端 AOUT 连贯电机。
  3. ADC0809 的片选 CS 连贯 298H,输出端 IN0 连贯电位器。
  4. 编辑、汇编、链接、调试汇编程序。
  5. 运行程序,在 DOS 命令行界面看到主菜单,键盘输入‘1’开始程序,从电位器输出数字量,在屏幕输入模拟量十六进制值并在数码管显示,再将模拟量转换为数字量使电机在不同的转速下转动。
  6. 键盘输入‘0’则退出程序,返回 DOS。

四、试验原理

8255 芯片的原理、LED(共阴极)数码管的原理、ADC0809 芯片的原理、DAC0832 芯片的原理不赘述。直流电机调速的原理如下:

利用 DAC0832 输入一串脉冲,经放大后驱动直流电机,扭转输入脉冲的电平及持续时间以达到使电机减速、加速的目标。小直流电机的转速是由输入脉冲的占空比来决定的,正向点空比越大转速越快;反之越慢。

本试验中,模拟量输入 Ua 为双极性,当输出数字量小于 80H 时输入为负,输出等于 80H 时为 0V,输出 80H 时输入为正。因而,试验中 DAC0832 输出数字量只有 2 个(80H 和 FFH),通过不同的延迟时间达到扭转小电机转速的目标。

五、试验原理图

六、试验流程图

七、试验程序

DATA SEGMENT
LED  DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
C12M DB 0DH,0AH
DB '--- A/D conversion & D/A conversion ---',0DH,0AH
DB 'PRESS 1 -> Display Hexadecimal Digital Voltage to LED',0DH,0AH
DB 'PRESS 0 -> Quit',0DH,0AH,'$'
ERR  DB 'PRESS ERROR!',0DH,0AH,0DH,0AH,'$'
C1M  DB 0DH,0AH
     DB '-- A/D conversion & D/A conversion --',0DH,0AH
     DB 'PRESS 1 -> Continue',0DH,0AH
     DB 'PRESS 0 -> Return to menu',0DH,0AH,'$'
COL  DB 'Collecting data... Data:','$'
BYE  DB 0DH,0AH,'Bye!',0DH,0AH,'$'
BUF  DW 300 DUP(?)
BUF1  DW ?
BUF2  DW ?
DATA ENDS
STACK SEGMENT
STA DW 20 DUP(?)
TOP EQU LENGTH STA
STACK ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
        MOV AX,DATA
        MOV DS,AX
        MOV AX,STACK
        MOV SS,AX
        MOV SP,TOP
MENU:
        LEA DX,C12M
        MOV AH,9
        INT 21H                ; 显示菜单
        MOV AH,1
        INT 21H                ; 输出
        CMP AL,'1'
        JZ CASE1
        CMP AL,'0'
        JZ QUIT
        LEA DX,ERR
        MOV AH,9
        INT 21H                ; 显示谬误提醒
        JMP MENU

CASE1:
        LEA DX,COL
        MOV AH,9
        INT 21H                ; 显示收集数据提醒
CONV:   MOV DX,298H            ; 抉择模拟信号输出端口 IN0
        MOV AL,0
        OUT DX,AL            ; 向端口输入数据
        CALL ADINT            ; 调用 ADINT 子程序,对模拟量进行 AD 转换
        
        MOV DX,28BH            ;8255 管制端口
        MOV AL,80H            ; 设置管制字,C 口输入
        OUT DX,AL
        
        MOV AX,SI
        LEA DI,BUF
        MOV [DI],AL            ; 将读入数据存入缓存区
        
        CALL DISPH
        CALL DISPL

        CALL LEDH
        CALL LEDL
        
        LEA DX,C1M
        MOV AH,9
        INT 21H                ; 显示菜单 1

LLL:    
        MOV AL,80H
        MOV DX,290H
        OUT DX,AL         ;DA 转换输出数字量 80H 时输入 0V
        PUSH DX
        MOV AH,06H         ; 程序调用 06H 性能,在键盘无键按下时 ZF=1,有键按下 ZF=0
        MOV DL,0FFH
        INT 21H
        POP DX
        JE INTK             ; 没有键按下程序跳转到 INTK 程序
        JMP CASE1MENU             ; 有键按下跳转菜单
INTK:
        MOV AX,SI
        AND AL,0F0H            ; 将 AL 低四地位为 0
        MOV CL,4
        SHR AL,CL            ; 将 AL 逻辑右移 4 位, 此时 AL 为高位
        CMP AL,0H
        JE LLL
        CMP AL,4H
        JBE K0
        CMP AL,8H
        JBE K1
        CMP AL,0CH
        JBE K2
        CMP AL,0FH
        JBE K3
        JMP LLL
K0:        MOV BUF1,0FFFFH        ; 设置延时常数
        MOV BUF2,1000H
        JMP DEL
K1:        MOV BUF1,0FFFFH        ; 设置延时常数
        MOV BUF2,6000H
        JMP DEL
K2:        MOV BUF1,0FFFFH        ; 设置延时常数
        MOV BUF2,0A000H
        JMP DEL
K3:        MOV BUF1,0FFFFH        ; 设置延时常数
        MOV BUF2,0FFFH
        JMP DEL
DEL:    MOV CX,BUF1
DEL1:    LOOP DEL1
        MOV AL,0FFFFH            ; 使 D / A 输入为 5V
        MOV DX,290H
        OUT DX,AL
        MOV CX,BUF2          ;BUF2 为延时工夫示意对电机供电工夫
DEL2:    LOOP DEL2
        JMP LLL
CASE1MENU:
        CMP AL,'0'
        JZ MENU
        CMP AL,'1'                ; 持续
        JNZ DISERR
        JMP CASE1
DISERR: LEA DX,ERR
        MOV AH,9
        INT 21H                ; 显示谬误提醒
        LEA DX,C1M
        MOV AH,9
        INT 21H                ; 显示菜单 1
        MOV AH,1
        INT 21H                ; 输出
        JMP CASE1MENU
QUIT:
        LEA DX,BYE
        MOV AH,9
        INT 21H                ; 显示 BYE
        MOV AH,4CH            ; 返回 DOS
        INT 21H
        
DISPH    PROC NEAR
        PUSH AX                ;AL 为输出信号
        PUSH CX
        AND AL,0F0H            ; 将 AL 低四地位为 0
        MOV CL,4
        SHR AL,CL            ; 将 AL 逻辑右移 4 位
        ADD AL,30H            ; 转换为 ASCII 码
        CMP AL,39H            ; 将 AL 与 '9' 比拟
        JBE SHOW
        ADD AL,07H            ; 若为字母,加 7
SHOW:    MOV DL,AL            ; 转换为 ASCII 码并显示高 4 位数据
        MOV AH,2
        INT 21H
        POP CX
        POP AX
        RET
DISPH    ENDP
        
LEDH    PROC NEAR
        PUSH AX
        PUSH BX
        
        MOV AH,0
        AND AL,0F0H            ; 将 AL 低四地位为 0
        MOV CL,4
        SHR AL,CL            ; 将 AL 逻辑右移 4 位
        
        LEA DI,LED
        ADD DI,AX
        
        MOV DX,28AH            ;C 口,显示十位
        MOV AL,02H
        OUT DX,AL
        
        MOV DX,288H            ;A 口,数码管显示高 4 位
        MOV AL,0
        OUT DX,AL                ; 数码管清零
        
        MOV AL,[DI]
        OUT DX,AL
        CALL DELAY
        
        POP BX
        POP AX
        RET
LEDH    ENDP

LEDL    PROC NEAR
        PUSH AX
        PUSH BX
        
        MOV AH,0
        AND AL,0FH            ; 将 AL 高四地位为 0
        
        LEA DI,LED
        ADD DI,AX
        
        MOV DX,28AH            ;C 口,显示个位
        MOV AL,01H
        OUT DX,AL
        
        MOV DX,288H            ;A 口,数码管显示低 4 位
        MOV AL,0
        OUT DX,AL                ; 数码管清零
        
        MOV AL,[DI]
        OUT DX,AL
        ;CALL DELAY
        
        POP BX
        POP AX
        RET
LEDL    ENDP

DISPL    PROC NEAR
        PUSH AX                ;AL 为输出信号
        PUSH CX
        AND AL,0FH            ; 将 AL 高四地位为 0
        ADD AL,30H            ; 转换为 ASCII 码
        CMP AL,39H            ; 将 AL 与 '9' 比拟
        JBE SHOW2
        ADD AL,07H            ; 若为字母,加 7
SHOW2:    MOV DL,AL            ; 转换为 ASCII 码并显示高 4 位数据
        MOV AH,2
        INT 21H
        POP CX
        POP AX
        RET
DISPL    ENDP

ADINT   PROC NEAR            ; 延时子程序
        PUSH AX
        PUSH BX
        PUSH CX
        MOV CX,0FFFFH
DELA:    MOV BX,2FH
DELA1:    DEC BX
        CMP BX,0
        JNZ DELA1
        LOOP DELA
        MOV DX,298H
        IN AL,DX            ; 端口读入数据
        MOV SI,AX
        POP CX
        POP BX
        POP AX
        RET
ADINT   ENDP

DELAY   PROC NEAR            ; 延时子程序
        PUSH AX
        PUSH BX
        PUSH CX
        MOV CX,0FFFFH
DELAY1:    MOV BX,0FFH            ;2FH
DELAY2:    DEC BX
        CMP BX,0
        JNZ DELAY2
        LOOP DELAY1
        POP CX
        POP BX
        POP AX
        RET
DELAY   ENDP

CODE    ENDS
END     START

八、试验感触

本次综合设计试验中,将 DAC0832、ADC0809、8255A、数码管、直流电机联合起来,实现了一个较为综合的试验,将所学常识联合在了一起,较好地实现了各元器件的综合利用,也加深了我对本课程的了解。

在实现该设计试验中遇到诸多未曾预料到的艰难,首先解决的问题是个位与十位拆散,该问题较为简单。最大的麻烦便是数码管显示问题,起初思路是对每一个采样值的电压进行屡次循环交替显示,已达到两个数码管同时显示的错觉,然而并未能胜利,呈现的景象是两个数码管显示的后果总是雷同的。之后更换思路,在两个数码管显示之间退出延时,因为采样的速度原本就比拟快,因而达到了两个数码管同时显示,胜利解决问题。

整个试验由设计到遇到问题,再到解决问题,播种很多。整个设计试验是我更加的灵便的应用了 DAC0832、ADC0809、8255A 芯片,更加深切的把握了芯片的原理。

退出移动版