Created with Raphaël 2.1.2
开始
初始化
设置周期?
修改延时周期
数据采集
延时
发送
yes
no
下位机
S_SHOW MACRO STRING
MOV AH,9
MOV DX,OFFSET STRING
INT 21 H
ENDM
DATAS SEGMENT
RESULT DB 40 H
num_h db 0
num_l db 0
msg db
;msg db
str1 db
errm db
s1 db 0
;延时周期
time_cycle DB 3
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;;;;;;;;;;;;;8255 初始化
call init_8255
;;;;8253 初始化
call init_8253
;设置延时周期
call SetTimeCycle
;;;发送初始化
call init_send
againshow:
;调用数据采集
caLl SHUJUCAIJI
;显示数据
; call show
;发送数据
call send
;判断键盘是否有输入
MOV AH,0 BH
INT 21 H
CMP AL,0
JE againshow
MOV AH,1
INT 21 H
JMP START
;显示数据
show proc
MOV AL, RESULT
MOV BL,50
MUL BL
MOV AL,AH
MOV AH,0
MOV BL,10
DIV BL
;ASCLL码加30
ADD AL,30 H
MOV num_h,AL
ADD AH,30 H
MOV num_L,AH
MOV AH,02 H
MOV DL,num_h
INT 21 H
MOV AH,02 H
MOV DL,
INT 21 H
MOV AH,02 H
MOV DL,num_L
INT 21 H
MOV AH,02 H
MOV DL,
INT 21 H
ret
show endp
;功能:回车换行
huiche proc
MOV AH,02 H
MOV DL,0 AH
INT 21 H
MOV AH,02 H
MOV DL,0 DH
INT 21 H
RET
huiche endp
;功能:设置延时周期
SetTimeCycle proc
S_SHOW msg
;循环判断是否有输入
again: MOV AH,0 BH
INT 21 H
CMP AL,0
JE again
;因是字符串
;获取的ASCLL码值减30 得到延时周期
MOV AH,1
INT 21 H
sub AL, 30 H
MOV time_cycle, AL
MOV AH,02 H
MOV DL,0 AH
INT 21 H
MOV AH,02 H
MOV DL,0 DH
INT 21 H
RET
SetTimeCycle endp
;功能:数据采集
;出口:返回RESULT 数据采集的值
SHUJUCAIJI proc
MOV DX, 0E098 H;通道0 对应298
OUT DX,AL ;启动
CALL delay
MOV DX,0E098 H;
IN AL,DX;读取电压 al
MOV RESULT,AL
RET
SHUJUCAIJI ENDP
;延时子程序
delay proc
MOV DX,0E08 BH
MOV AL,01110000 B
OUT DX,AL
MOV DX,0E089 H
;计算相乘
MOV AL,time_cycle
MOV BL,100
MUL BL
;先传低后传高
OUT DX,AL
MOV AL,AH
OUT DX,AL
;取出C端口
MOV DX,0E082 H
;看最高位是否是高电平
ISNO:IN AL,DX
TEST AL,1
JZ ISNO
RET
delay endp;
;功能:发送数据
send proc
mov al,RESULT
;发送
mov ah,1
mov dx,0
int 14 h
send endp
init_8253 proc
;;;;8253 初始化
;给送控制字, 使其工作在方式三
MOV DX,0E08 BH
MOV AL,00110110 B
OUT DX,AL
;送通道0 的计数初值
MOV DX, 0E088 H
MOV AX,10000
;送低送高
OUT DX,AL
MOV AL,AH
OUT DX,AL
RET
init_8253 endp
init_8255 proc
MOV DX,0E083 H
MOV AL,10000001 B
OUT DX, AL
RET
init_8255 endp
init_send proc
mov ah,0
mov dx,0
mov al,10111011 b
int 14 h
RET
init_send endp
CODES ENDS
END START
上位机
DATAS SEGMENT
;此处输入数据段代码
str1 db 'Please input! Enter q key exit!' ,0ah,0dh,'$'
;str2 db 'V=:' ,0ah,0dh,'$'
errm db 'Error!' ,0ah,0dh,'$'
num_L db 0
num_H db 0
RESULT DB 40 H
data db 0
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
mov ah,9
mov dx,offset str1
int 21 h
mov ah,0
mov dx,0
mov al,10111011 b
int 14 h;调用中断
send :
mov ah,3 ;读入串行口状态
mov dx,0
int 14 h
test ah,00100000 b;判断输入缓冲器是否为空
jz receive;空跳转到接收
mov ah,0bh;检查标准输入状态
int 21 h
cmp al,0
je receive ;未准备好输入就跳到接收
mov ah,8
int 21 h ;无回显的控制台输入
mov data,al
cmp data,'q'
je exit
receive:
mov ah,3
mov dx,0
int 14 h
test ah,1 ;判断输入缓冲器是否为满
jz send ;不满跳到发送
mov ah,2 ;读入缓冲器的数据
mov dx,0 ;收字符
int 14 h
test ah,10001110 b
jnz error
mov RESULT,al
call show
cmp al,'q'
je exit
mov dl,al
mov ah,2
int 21 h;显示
jmp send
exit :
mov dx,0
mov ah,1 ;输出字符
int 14 h
test ah,80 h
jnz error
mov ax,4 c00h
int 21 h
error: mov ah,9
mov dx,offset errm
int 21 h
mov ax,4 c00h
int 21 h
show proc
MOV AL, RESULT
MOV BL,50
MUL BL
MOV AL,AH
MOV AH,0
MOV BL,10
DIV BL
;ASCLL码加30
ADD AL,30 H
MOV num_h,AL
ADD AH,30 H
MOV num_L,AH
MOV AH,02 H
MOV DL,num_h
INT 21 H
MOV AH,02 H
MOV DL,'.'
INT 21 H
MOV AH,02 H
MOV DL,num_L
INT 21 H
MOV AH,02 H
MOV DL,'V'
INT 21 H
call huiche
ret
show endp
;功能:回车换行
huiche proc
MOV AH,02 H
MOV DL,0AH
INT 21 H
MOV AH,02 H
MOV DL,0DH
INT 21 H
RET
huiche endp
CODES ENDS
END START