⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aexp7.asm

📁 查询方式全双工串行通信程序 Source File
💻 ASM
字号:
;*------------------------------------------------------*/
;*    Aexp7.asm(查询方式全双工串行通信接口实验)           */
;*    查询方式全双工串行通信程序 Source File              */
;*    Copyright (c) 2001 by HUST                        */
;*------------------------------------------------------*/

data51   equ  308h         ;8251A数据口
ctr151   equ  309h         ;8251A命令/状态口
ctr155   equ  303h         ;8255命令口
timer2   equ  306h         ;8253的2号计数器端口
timctl   equ  307h         ;8253命令口
clk00    equ  12h          ;8251输入时钟频率(十六进制表示)
clk01    equ  34deh
factor   equ  16           ;波特率因子16

data     segment 
bps00    dw (?)
mes1     db 'now enter the serial communication',0ah,0dh
         db 'end with esc',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

int51   proc  near                  ;8251A初始化子程
         mov   dx,ctr151             ;8251A命令口
         xor   ax,ax                 ;空操作
         call  charout               ;送数子程
       ll:loop ll
         mov   al,40h                ;内部复位
         call  charout
         mov   al,4ah                ;8251A方式命令
         call  charout
         mov   al,27h                ;8251A工作命令
         call  charout
         ret
int51	 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  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                   ;跳转开始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                   ;若波特率选择有错,则重新输入 
         mov  bps00,9600              ;’7’表示9600b/s 
         jmp  begin 
error:  
         mov  ah,9                    ;提示波特率选择出错,则重新输入 
         mov  dx,seg error_message 
         mov  ds,dx
         mov  dx,offset error_message
         int  21h
         jmp  input 
begin:   call set_bps                ;调用8253-5的set_bps子程序,设置所选波特率的8253-5
;计算初初值
         call int51                  ;调用8251A子程序,初始化8251A 
         lea  dx,mes1
         mov  ah,09
         int  21h
         mov  dx,303h                ;初始化8255A 
         mov  al,80h
         out  dx,al
         mov  al,0dh                ;置PC6=1,打开8253-5的GATE2,开始输出方波 
         out  dx,al
checkkey:mov  ah,0bh                ;按键发送 
         int  21h
         cmp  al,0                  ;有键按下? 
         Je   receiv            	   ;若无键按下,则转接收 
         mov  ah,01             	   ;若有键按下,则从KB读入,并在CRT上显示 
         int  21h  
         mov  bl,al                 ;保存键值,以备发送 
         cmp  al,1bh                ;是ESC? 
         je   over                  ;是,则退出,并返回DOS 
         mov  dx,ctr151             ;不是,则发送数据 
transm:  in   al,dx
         test al,01                 ;发送准备好?TXRDY=1? 
         jz   transm                ;未准备好,则等待 
         mov  dx,data51             ;已准备好,则将键入的字符发送出去 
         mov  al,bl
         out  dx,al
         jmp  checkkey              ;发送1个字符后,再转按键发送 
receiv:   mov  dx,ctr151             ;接收数据 
         in   al,dx
         test al,02                 ;接收数据准备好?RXRDY=1? 
         jz   checkkey              ;未准备好,即无数据接收,则转按键发送 
         mov  dx,data51             ;已准备好,即有数据传送过来,则接收1个字符 
         in   al,dx
         mov  dl,al                ;显示接收的字符 
         mov  ah,02h
         int  21h
         mov  ah,0bh
         int  21h
         cmp  al,00h
         je   checkkey
         mov  ah,08h
         int  21h
         cmp  al,1bh              ;是ESC?  
         je   over                ;是,则退出,返回DOS 
         jmp  checkkey            ;不是,则接收1个字符后,再转按键发送 
over:    mov  al,0ch              ;置PC6=0,关闭8253-5的GATE2,停止输出方波 
         mov  dx,303h
         out  dx,al
         mov  ax,4c00h            ;程序退出 
         int  21h
main   endp
code   ends
       end  main

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -