?? bjdj1.asm
字號:
;*************************
;本程序為步進電機測速程序
;前部為步進電機轉速控制
;后部為速度測量
;************************* data segment
ioport equ 0ec00h-0280h
io8255k equ ioport+28bh ;8255控制口
io8255a equ ioport+288h ;8255 A口
io8255c equ ioport+28ah ;8255 C
io8253k equ ioport+283h ;8253控制
io82532 equ ioport+282h ;8253計數器2
io82531 equ ioport+281h ;8253計數器1
io82530 equ ioport+280h ;8253計數器0
iot8253k equ ioport+293h ;通用插座8253控制
iot82530 equ ioport+290h ;通用插座8253計數器0
mess db 'Strike any key,return to DOS!',0AH,0DH,'$'
cou db 0
cou1 db 0
count db 0
count1 db 0
count2 db 0
count3 db 0
count4 db 0
buf dw 0
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov dx,offset mess
mov ah,09h
int 21h ;顯示提示信息
int82531: mov dx,io8253k
mov al,36h ;計數器0,方式3,先讀寫低8位,再讀寫高8位
out dx,al ;輸入時鐘,1MHZ
mov dx,io82530
mov ax,50000 ;初值50000,輸出時鐘周期50ms
out dx,al
mov al,ah
out dx,al
mov dx,io8253k
mov al,96h
out dx,al ;計數器2,方式3,只讀寫低8位
mov dx,io82532
mov al,200
out dx,al ;初值200,10秒檢測一次,檢測5秒
int8255: mov dx,io8255k ;8255,A通道輸入,C低位輸出,高位輸入
mov al,98h
out dx,al
mov al,00
out dx,al ;C0(GATE1)低電平,停止計數
readc: mov dx,io8255c
in al,dx ;讀C口
and al,0f0h
test al,10h ;高速
jnz k4
test al,20h
jnz k5
test al,40h
jnz k6
test al,80h ;低速
jnz k7
jmp readc
k4: mov buf,4000
jmp int8253
k5: mov buf,5000
jmp int8253
k6: mov buf,6000
jmp int8253
k7: mov buf,8000
int8253: mov dx,iot8253k ;向擴展8253寫控制字
mov al,36h ;使0通道為工作方式3
out dx,al
mov ax,buf ;寫入循環計數初值buf
mov dx,iot82530
out dx,al ;先寫入低字節
mov al,ah out dx,al ;后寫入高字節
mov dx,io8255k
mov al,03h
out dx,al ;開始輸出移位脈沖
mov dx,io8255k
mov al,04h
out dx,al ;預置195
mov cx,0a000h
loop2: nop
loop loop2 ;延時,保證預置成功
mov dx,io8255k
mov al,05h
out dx,al ;啟動電機
ll: mov ah,01h ;有無鍵入
int 16h
jnz quit1 ;有鍵,返回
jmp a0
quit1: jmp quit
a0: mov dx,io8253k
mov al,70h
out dx,al ;計數器1,方式0,先讀寫低8位,再讀寫高8位。
mov dx,io82531 ;輸入時鐘為光電開關輸出。
mov ax,0ffffh
out dx,al
mov al,ah
out dx,al
mov dx,io8255a
a1: in al,dx
and al,01h
cmp al,00h
jnz a1 ;8255 PA0是否為0
a2: in al,dx
and al,01h
cmp al,00h
jz a2 ;8255 PA0是否為1
mov dx,io8255k
mov al,01h
out dx,al ;開始計數
mov dx,io8255a
a3: in al,dx
and al,01h
cmp al,00h
jnz a3 ;8255 PA0是否為1
mov dx,io8255k
mov al,00h
out dx,al ;停止計數
mov dx,io82531
in al,dx
mov bl,al
in al,dx
mov bh,al ;計數值送bx
mov ax,0ffffh
sub ax,bx ;計算脈沖個數
call disp ;顯示
mov dl,0dh
mov ah,02
int 21h
mov dl,0ah
mov ah,02
int 21h
jmp int8255 ;無鍵,測量
;------------------------------------------------------------
disp PROC NEAR ;BCD轉換并顯示子程序
mov dx,0000h
mov cx,1000
div cx
mov count1,al
mov ax,dx
mov cl,100
div cl
mov count2,al
mov al,ah
mov ah,00h
mov cl,10
div cl
mov count3,al
mov count4,ah
mov al,count1
call disp1
mov al,count2
call disp1
mov al,count3
call disp1
mov al,count4
call disp1
ret DISP
ENDP
;--------------------------------------------------------------------
disp1 PROC NEAR ;顯示一個字符
and al,0fh
add al,30h
mov dl,al
mov ah,02
int 21h
ret disp1
endp
;-------------------------------------------------------------
quit: mov dx,io8255k
mov al,02h
out dx,al
mov ah,4ch ;返回DOS
int 21h
code ends
end start
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -