📄 dasend.asm
字号:
;*------------------------------------------------------*
;* Aexp11.asm A/D转换-数据采集实验 *
;* A/D转换数据采集程序source file *
;* 运行步骤:1.在平台板的8位AD通道选择开关上 选定通道号 *
;* 2.程序运行后,转动电位器,观测数据的变化 *
;* Copyright (c) 2002 by HUST *
;*------------------------------------------------------*
data51 equ 308h ;8251A数据口
ctrl51 equ 309h ;8251A命令/状态口
ctrl55 equ 303h ;8255命令口
timer2 equ 306h ;8253的2号计数器端口
timctl equ 307h ;8253的命令口
clk00 equ 12h ;8251输入时钟频率(十六进制表示)
clk01 equ 34deh
factor equ 16 ;波特率因子16
sseg segment para stack 'stack'
dw 200 dup (?)
sseg ends
dseg segment para public 'data'
input_message db 'Please input number of A/D channel'
db 0dh,0ah,'$'
error_message db 'input incorrect A/D channel!',0dh,0ah
db 'please input number of A/D channel again:'
db '$'
message db 'If you want to quit A/D convert,please press ''ESC'''
db 0dh,0ah,'$'
temp db (?)
control dw (?)
bps00 dw (?)
input1_message db 'now enter the serial communication',0ah,0dh
db 'end with esc',0ah,0dh
db 'please input characters to transmit',0dh,0ah,'$'
dseg ends
cseg segment para public 'code'
assume ss:sseg,cs:cseg,ds:dseg
a_dpo proc far
start: mov ax,sseg
mov ss,ax
mov ax,dseg
mov ds,ax
mov bps00,1200 ;送传输率
call set_bps
call init51
mov ah,9 ;显示提示信息
mov dx,seg message
mov ds,dx
mov dx,offset message
int 21h
mov ah,9 ;提示输入通道号
mov dx,seg input_message
mov ds,dx
mov dx, offset input_message
int 21h
input: mov ah,8 ;检查输入通道号是否有错
int 21h
cmp al,'0'
jb error
cmp al,'7'
ja error
sub al,30h
mov temp,al ;若无错,则保存通道号
jmp begin
error: mov ah,9 ;显示出错信息
mov dx,seg error_message
mov ds,dx
mov dx, offset error_message
int 21h
jmp input
begin: mov dx,30eh ;送通道号
mov al,temp
out dx,al
mov cx,0f00h
lop: loop lop
mov dx,30ch ;启动A/D转换
mov al,00
out dx,al
mov cx,0f00h ;delay
lop1: loop lop1
mov ah,0bh ;检测是否有ESC键按下
int 21h
inc al
jnz wait1 ;若无键按下,则查转换结束
mov ah,8 ;若有ESC键按下,则程序退出
int 21h
cmp al,1bh
jz quit
wait1: mov dx,30ch ;查转换结束EOC(EOC=D7)
in al,dx
and al,80h
jz wait1 ;若未结束(D7=0),则等待
read: mov dx,30eh ;若已结束,则读数据
in al,dx
push ax
mov control,ax ;存数据
show: and al,0f0h ;显示高4位
shr al,4
cmp al,9
ja hex
add al,30h
jmp next
hex: add al,37h
next: mov dl,al
mov ah,2
int 21H
pop ax
and al,0fh ;显示低4位
cmp al,9
ja hex1
add al,30h
jmp next1
hex1: add al,37h
next1: mov dl,al
mov ah,2
int 21h
mov dl,13 ;向屏幕送回车符
mov ah,2
int 21h
mov dl,10 ;向屏幕送换行符
mov ah,2
int 21h
call main
over: mov al,0ch ; 关PC6=0,关闭8253的GATE2
mov dx,ctrl55
out dx,al
jmp begin ;继续采集
quit: mov ax,4c00h ;程序退出
int 21h
a_dpo endp
;*------------------------------------------------------*
;* Aexp10s.asm 串行接口应用实验-发送端程序 *
;* 串行通信发送程序source file *
;* Copyright (c) 2002 by HUST *
;*------------------------------------------------------*
init51 proc near ;8251A初始化子程序
mov dx,ctrl51 ;8251A命令口
xor ax,ax ;空操作
out dx,al
mov al,40h ;8251A内部复位
call charout
mov al,4ah ;8251A方式命令
call charout
mov al,23h ;8251A工作命令
call charout
ret ;返回
init51 endp
charout proc near ;送数据子程序
out dx,al
push cx
mov cx,100 ;延时
gg: loop gg
pop cx
ret
charout endp
set_bps proc near ;8253-5计数初值计算与装入子程序
mov dx,clk00 ;取8253-5输入时钟频率clk做被除数
mov ax,clk01
mov bx,bps00 ;所选波特率做第一个除数
div bx ;除法运算,商数送ax
mov dx,0 ;余数清零
mov bx,factor ;取波特率因子做第二个除数
div bx ;除法运算,的计数初值(商数)送ax
mov bx,ax ;保存计数初值至bx
mov dx,timctl ;8253-5命令口
mov al,0b6h ;8253-5初始化命令
out dx,al
mov dx,timer2 ;8253-5计数器2的端口
mov ax,bx ;取计数初值
out dx,al ;取计数初值低字节
mov al,ah ;取计数初值高字节
out dx,al
ret ;返回
set_bps endp
main proc near
begin1:
push ax
push bx
push cx
push dx
mov dx,dseg
mov ds,dx
mov bps00,1200 ;送传输率
call set_bps
call init51
mov dx,ctrl55 ;初始化8255A
mov al,80h
out dx,al
mov al,0dh ;置PC6=1,打开8253的GATE2输出方波
out dx,al
mov dx,seg input1_message ;提示输入信息
mov ds,dx
mov dx,offset input1_message
; mov ah,09h
; int 21h
m0: mov cx,0f00h
bb: loop bb
;mov ah,0bh ;读取键盘
; int 21h
; cmp al,0 ;有键按下?
; je m0 ;无键按下等待
;mov ah,01h ;将字符在CRT上等待
;int 21h
push dx
mov dx,dseg
mov ds,dx
pop dx
mov ax,[ds]:control
mov bl,al ;保存键值
;cmp al,1bh ;是否为ESC
;jz over ;是,则退出
mov dx,ctrl51
;不是,则发送数据
m1: in al,dx
test al,01 ;发送准备好?RxRDY=1?
jz m1 ;未准备好,则等待
mov dx,data51 ;已准备好,则将键入的字符发出去
mov al,bl
out dx,al
push dx
mov dx,08ffh
deng:mov cx,0ff00h
aa: loop aa
dec dx
jnz deng
pop dx
;mov cx,0ff00h
;aac: loop aac
;mov cx,0ff00h
;aacd: loop aacd
;mov cx,0ff00h
;aacde: loop aacde
;jmp m0 ;发送完,在转按键发送
;over: mov al,0ch ; 关PC6=0,关闭8253的GATE2
; mov dx,ctrl55
; out dx,al
pop dx
pop cx
pop bx
pop ax
ret
main endp
cseg ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -