〇、写在后面

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

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

  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 SEGMENTLED  DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71HC12M DB 0DH,0AHDB '--- A/D conversion & D/A conversion ---',0DH,0AHDB 'PRESS 1 -> Display Hexadecimal Digital Voltage to LED',0DH,0AHDB '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 ENDSSTACK SEGMENTSTA DW 20 DUP(?)TOP EQU LENGTH STASTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:        MOV AX,DATA        MOV DS,AX        MOV AX,STACK        MOV SS,AX        MOV SP,TOPMENU:        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 MENUCASE1:        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                ;显示菜单1LLL:            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 LLLK0:        MOV BUF1,0FFFFH        ;设置延时常数        MOV BUF2,1000H        JMP DELK1:        MOV BUF1,0FFFFH        ;设置延时常数        MOV BUF2,6000H        JMP DELK2:        MOV BUF1,0FFFFH        ;设置延时常数        MOV BUF2,0A000H        JMP DELK3:        MOV BUF1,0FFFFH        ;设置延时常数        MOV BUF2,0FFFH        JMP DELDEL:    MOV CX,BUF1DEL1:    LOOP DEL1        MOV AL,0FFFFH            ;使D/A输入为5V        MOV DX,290H        OUT DX,AL        MOV CX,BUF2          ;BUF2为延时工夫示意对电机供电工夫DEL2:    LOOP DEL2        JMP LLLCASE1MENU:        CMP AL,'0'        JZ MENU        CMP AL,'1'                ;持续        JNZ DISERR        JMP CASE1DISERR: LEA DX,ERR        MOV AH,9        INT 21H                ;显示谬误提醒        LEA DX,C1M        MOV AH,9        INT 21H                ;显示菜单1        MOV AH,1        INT 21H                ;输出        JMP CASE1MENUQUIT:        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            ;若为字母,加7SHOW:    MOV DL,AL            ;转换为ASCII码并显示高4位数据        MOV AH,2        INT 21H        POP CX        POP AX        RETDISPH    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        RETLEDH    ENDPLEDL    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        RETLEDL    ENDPDISPL    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            ;若为字母,加7SHOW2:    MOV DL,AL            ;转换为ASCII码并显示高4位数据        MOV AH,2        INT 21H        POP CX        POP AX        RETDISPL    ENDPADINT   PROC NEAR            ;延时子程序        PUSH AX        PUSH BX        PUSH CX        MOV CX,0FFFFHDELA:    MOV BX,2FHDELA1:    DEC BX        CMP BX,0        JNZ DELA1        LOOP DELA        MOV DX,298H        IN AL,DX            ;端口读入数据        MOV SI,AX        POP CX        POP BX        POP AX        RETADINT   ENDPDELAY   PROC NEAR            ;延时子程序        PUSH AX        PUSH BX        PUSH CX        MOV CX,0FFFFHDELAY1:    MOV BX,0FFH            ;2FHDELAY2:    DEC BX        CMP BX,0        JNZ DELAY2        LOOP DELAY1        POP CX        POP BX        POP AX        RETDELAY   ENDPCODE    ENDSEND     START

八、试验感触

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

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

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