?? serialr.asm
字號(hào):
;*------------------------------------------------------*/
;* SerialR.asm(查詢方式半雙工串行通信接口實(shí)驗(yàn)-接收端程序) */
;* 查詢方式半雙工串行通信接收程序 Source File */
;* Copyright (c) 2001 by HUST */
;* Modify Date 2005.4.10 */
;*------------------------------------------------------*/
stack1 segment para 'stack'
dw 200 dup(?)
stack1 ends
data51 equ 308h ;8251A數(shù)據(jù)口
ctr151 equ 309h ;8251A命令/狀態(tài)口
ctr155 equ 303h ;8255命令口
timer2 equ 306h ;8253的2號(hào)計(jì)數(shù)器端口
timctl equ 307h ;8253命令口
clk00 equ 12h ;8251輸入時(shí)鐘頻率(十六進(jìn)制表示)這是多少?
clk01 equ 34deh
factor equ 16 ;波特率因子16
data segment para public 'data'
int0a_off dw(?)
int0a_seg dw(?)
bps00 dw (?)
receive db 100 dup(?) ;緩沖區(qū)
resize dw (?) ;緩沖區(qū)長(zhǎng)度
data51 equ 308h ;8251A數(shù)據(jù)口
ctr151 equ 309h ;8251A命令/狀態(tài)口
ctr155 equ 303h ;8255命令口
timer2 equ 306h ;8253的2號(hào)計(jì)數(shù)器端口
timctl equ 307h ;8253命令口
clk00 equ 12h ;8251輸入時(shí)鐘頻率(十六進(jìn)制表示)這是多少?
clk01 equ 34deh
factor equ 16 ;波特率因子16
mes1 db 'now enter the serial communication(receive)',0ah,0dh
db 'end with q/Q',0ah,0dh,'$'
input_message db '0:110 1:150 2:300 3:600'
db 0dh,0ah
db '4:1200 5:2400 6:4800 7:9600'
db 0dh,0ah
db 'please take a choice(0~7)of baud_rate:'
db 0dh,0ah,'$'
error_message db 'input error! try again'
db 0dh,0ah,'$'
data ends
code segment
assume cs:code, ds:data, ss:stack1
charout proc near ;送數(shù)子程
out dx,al
push cx
mov cx,100 ;延時(shí)
gg: loop gg
pop cx
ret
charout endp
int51 proc near ;8251A初始化子程
mov dx,ctr151 ;8251A命令口
xor ax,ax ;空操作
call charout ;送數(shù)子程
mov al,40h ;內(nèi)部復(fù)位
call charout
mov al,4ah ;8251A方式命令
call charout
mov al,27h ;8251A工作命令
call charout
ret
int51 endp
set_bps proc near ;8253-5計(jì)數(shù)初值計(jì)算與裝入子程
mov dx,clk00 ;取8253-5輸入時(shí)鐘頻率clk作被除數(shù)
mov ax,clk01
mov bx,bps00 ;取所選波特率作第一個(gè)除數(shù)
div bx ;除法運(yùn)算,商數(shù)送ax
mov dx,0 ;余數(shù)清零
mov bx,factor ;取波特率因子作第二個(gè)除數(shù)
div bx ;除法運(yùn)算,得計(jì)數(shù)初值(商數(shù))送ax
mov bx,ax ;保存計(jì)數(shù)初值至bx
mov dx,timctl ;8253-5命令口
mov al,0b6h ;8253-5初始化命令
out dx,al
mov dx,timer2 ;8253-5計(jì)數(shù)器2的端口
mov ax,bx ;取計(jì)數(shù)初值
out dx,al ;裝計(jì)數(shù)初值低字節(jié)
mov al,ah ;裝計(jì)數(shù)初值高字節(jié)
out dx,al
ret ;返回
set_bps endp
serv_int proc far ;中斷服務(wù)程序
push bx
push ax
push dx
push di
push ds
mov ax,data ;載入數(shù)據(jù)段
mov ds,ax
cli
mov dx,data51 ;已準(zhǔn)備好,即有數(shù)據(jù)傳送過(guò)來(lái),則接收1個(gè)字符
in al,dx
mov di,resize ;載入緩沖區(qū)指針
mov [di],al ;將數(shù)據(jù)放入緩沖區(qū)
inc di ;緩沖區(qū)指針加1
mov resize,di ;保存緩沖區(qū)指針
mov al,62h ;發(fā)中斷結(jié)束命令(OCW2)
mov dx,0a0h
out dx,al ;向從片8259發(fā)EOI命令
mov al,20h
out 020h,al ;向主片8259發(fā)EOI命令
sti
pop ds
pop di
pop dx
pop ax
pop bx
iret
serv_int endp
main proc far ;通信(接收)主程序
mov ax,data
mov ds,ax
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' ;輸入’0’,表示選擇110baud
jne next1
mov bps00,110 ;存入bps00
jmp begin ;跳轉(zhuǎn)開(kāi)始begin處
next1:cmp al,'1'
jne next2
mov bps00,150 ;’1’表示150b/s
jmp begin
next2:cmp al,'2'
jne next3
mov bps00,300 ;’2’表示300b/s
jmp begin
next3:cmp al,'3'
jne next4
mov bps00,600 ;’3’表示600b/s
jmp begin
next4:cmp al,'4'
jne next5
mov bps00,1200 ;’4’表示1200b/s
jmp begin
next5:cmp al,'5'
jne next6
mov bps00,2400 ;’5’表示2400b/s
jmp begin
next6:cmp al,'6'
jne next7
mov bps00,4800 ;’6’表示150b/s
jmp begin
next7:cmp al,'7'
jne error ;若波特率選擇有錯(cuò),則重新輸入
mov bps00,9600 ;’7’表示9600b/s
jmp begin
error:
mov ah,9 ;提示波特率選擇出錯(cuò),則重新輸入
mov dx,seg error_message
mov ds,dx
mov dx,offset error_message
int 21h
jmp input
begin:call set_bps ;調(diào)用set_bps子程序,設(shè)置所選波特率的計(jì)算初初值
call int51 ;調(diào)用int51子程序,初始化8251A
mov ax,offset receive
mov resize,ax
lea dx,mes1
mov ah,09
int 21h
mov dx,303h ;初始化8255A
mov al,80h
out dx,al
mov al,0dh ;置PC6=1,打開(kāi)8253-5的GATE2,開(kāi)始輸出方波
out dx,al
mov ax,3572h ;獲取原中斷向量
int 21h
mov int0a_off,bx ;保存原中斷向量
mov bx,es
mov int0a_seg,bx
cli ;關(guān)中斷
mov ax,2572h ;設(shè)置新中斷向量
mov dx,seg serv_int
push ds
mov ds,dx
mov dx,offset serv_int
int 21h
pop ds
in al,0a1h ;打開(kāi)IRQ10(OCW1)
and al,0fbh
out 0a1h,al
in al,21h ;打開(kāi)IRQ2
and al,0fbh
out 21h,al
sti ;開(kāi)中斷
hlt ;等待中斷
isq: mov ah,0bh ;是否有鍵按下
int 21h
inc al
jnz show
mov ah,08h ;是q/Q鍵就退出
int 21h
cmp al,071h
je over
cmp al,051h
je over
show: mov ax,offset receive ;獲取緩沖區(qū)首位地址偏移量
mov di,ax
cmp di,resize ;比較,若相等,就循環(huán)等待;不相等,就顯示接收的數(shù)據(jù)
je isq
snext:mov dl,[di]
mov ah,02h
int 21h
inc di
cmp di,resize
jne snext
mov ax,offset receive ;緩沖區(qū)指針復(fù)位為首地址偏移量,為下次接收準(zhǔn)備好緩沖區(qū)
mov resize,ax
jmp isq
over: mov ax,2572h ;恢復(fù)原中斷向量
mov dx,int0a_seg
push ds
mov ds,dx
mov dx,int0a_off
int 21h
pop ds
in al,0a1h ;屏蔽IRQ10(OCW1)
or al,04h
out 0a1h,al
in al,21h ;屏蔽IRQ2
or al,04h
out 21h,al
mov al,0ch ;置PC6=0,關(guān)閉8253-5的GATE2,停止輸出方波
mov dx,303h
out dx,al
mov ax,4c00h ;程序退出
int 21h
main endp
code ends
end main
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -