接口与通讯综合设计(数字量与模拟量相互转换)
〇、写在前面
这是我《接口与通讯》实验的综合设计,如果大家有类似作业的话希望不要过度借鉴,本程序仅供参考和学习!不要抄袭!
这个程序在设计上有两点不足:
- 在数字量转化成模拟量的过程中,在数码管上仅显示了十六进制值,该值无法与实际电压对应。如果改进的话,可以将模拟量与电位器最大电压(5V)相乘,得到实际电压值,再以十进制的形式输出。
- 在模拟量转化成数字量的过程中,我采用了非常偷懒的设计,仅将数字量划分为不同“档位”控制电机不同的转速。如果改进的话,可以通过公式对应不同的占空比,真正实现数字量与电压的线性关系。
一、设计目的
- 熟悉A/D转换的基本原理,掌握A/D转换器ADC0809的使用方法及对应的硬件电路。
- 熟悉D/A转换的基本原理,掌握DAC0832的使用方法及对应的硬件电路。
- 熟悉8255并行接口编程原理,掌握LED字型显示的编程方法及硬件结构。
软件:操作系统MS-DOS;MASM.EXE、LINK.EXE。
三、设计内容
- 8255A芯片的片选CS连接288H,PA0~PA7连接LED数码管A~DP,PC0~PC1连接LED数码管S0~S1。
- DAC0832芯片的片选CS连接290H,模拟输出端AOUT连接电机。
- ADC0809的片选CS连接298H,输入端IN0连接电位器。
- 编辑、汇编、链接、调试汇编程序。
- 运行程序,在DOS命令行界面看到主菜单,键盘输入‘1’开始程序,从电位器输入数字量,在屏幕输出模拟量十六进制值并在数码管显示,再将模拟量转换为数字量使电机在不同的转速下转动。
- 键盘输入‘0’则退出程序,返回DOS。
利用DAC0832输出一串脉冲,经放大后驱动直流电机,改变输出脉冲的电平及持续时间以达到使电机加速、减速的目的。 小直流电机的转速是由输出脉冲的占空比来决定的,正向点空比越大转速越快;反之越慢。
文章图片
本实验中,模拟量输出Ua为双极性,当输入数字量小于80H时输出为负,输入等于80H时为0V,输入80H时输出为正。因此,实验中DAC0832输入数字量只有2个(80H和FFH),通过不同的延迟时间达到改变小电机转速的目的。
五、实验原理图
文章图片
六、实验流程图
文章图片
七、实验程序
DATA SEGMENT
LEDDB 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,'$'
ERRDB 'PRESS ERROR!',0DH,0AH,0DH,0AH,'$'
C1MDB 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,'$'
COLDB 'Collecting data... Data: ','$'
BYEDB 0DH,0AH,'Bye!',0DH,0AH,'$'
BUFDW 300 DUP(?)
BUF1DW ?
BUF2DW ?
DATA ENDS
STACK SEGMENT
STA DW 20 DUP(?)
TOP EQU LENGTH STA
STACK ENDSCODE 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 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,ALMOV AX,SI
LEA DI,BUF
MOV [DI],AL;
将读入数据存入缓存区CALL DISPH
CALL DISPLCALL LEDH
CALL LEDLLEA 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 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 21HDISPHPROC 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
DISPHENDPLEDHPROC NEAR
PUSH AX
PUSH BXMOV AH,0
AND AL,0F0H;
将AL低四位置为0
MOV CL,4
SHR AL,CL;
将AL逻辑右移4位LEA DI,LED
ADD DI,AXMOV DX,28AH;
C口,显示十位
MOV AL,02H
OUT DX,ALMOV DX,288H;
A口,数码管显示高4位
MOV AL,0
OUT DX,AL;
数码管清零MOV AL,[DI]
OUT DX,AL
CALL DELAYPOP BX
POP AX
RET
LEDHENDPLEDLPROC NEAR
PUSH AX
PUSH BXMOV AH,0
AND AL,0FH;
将AL高四位置为0LEA DI,LED
ADD DI,AXMOV DX,28AH;
C口,显示个位
MOV AL,01H
OUT DX,ALMOV DX,288H;
A口,数码管显示低4位
MOV AL,0
OUT DX,AL;
数码管清零MOV AL,[DI]
OUT DX,AL
;
CALL DELAYPOP BX
POP AX
RET
LEDLENDPDISPLPROC 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
DISPLENDPADINTPROC 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
ADINTENDPDELAYPROC 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
DELAYENDPCODEENDS
ENDSTART
八、实验感受 本次综合设计实验中,将DAC0832、ADC0809、8255A、数码管、直流电机结合起来,完成了一个较为综合的实验,将所学知识结合在了一起,较好地完成了各元器件的综合应用,也加深了我对本课程的理解。
【接口与通讯综合设计(数字量与模拟量相互转换)】在实现该设计实验中遇到诸多未曾预料到的困难,首先解决的问题是个位与十位分离,该问题较为简单。最大的麻烦便是数码管显示问题,起初思路是对每一个采样值的电压进行多次循环交替显示,已达到两个数码管同时显示的错觉,但是并未能成功,出现的现象是两个数码管显示的结果总是相同的。之后更换思路,在两个数码管显示之间加入延时,由于采样的速度本来就比较快,因此达到了两个数码管同时显示,成功解决问题。
整个实验由设计到遇到问题,再到解决问题,收获很多。整个设计实验是我更加的灵活的使用了DAC0832、ADC0809、8255A芯片,更加深切的掌握了芯片的原理。
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- Docker应用:容器间通信与Mariadb数据库主从复制
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 第326天
- Shell-Bash变量与运算符
- 基于微信小程序带后端ssm接口小区物业管理平台设计
- 2020-04-07vue中Axios的封装和API接口的管理
- 逻辑回归的理解与python示例
- Guava|Guava RateLimiter与限流算法
- 我和你之前距离