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

📄 pc8251.asm

📁 此程序是微机与接口技术的课程设计源程序
💻 ASM
字号:
;FILENAME: PC8251.asm    
;内容:8251串行通信
DATA 	SEGMENT
TEXT  	DB  'THE QUICK BROWN FOX JUMPS OVER LAZY DOG', 0DH, 0AH
LENS  	EQU  $-TEXT
ERROR 	DB   0DH,0AH,'8251 BAD ! $ '
OLD0A 	DD   ?
C_8251      EQU      211H       	;8251控制口地址
D_8251      EQU      210H       	;8251数据口地址
C_8253      EQU      20BH       	;8253控制口地址
D_8253      EQU      20AH       	;8253_2号计数器口地址
DATA  	ENDS
CODE  	SEGMENT
FLAG  	DB   ?
       	ASSUME  CS: CODE, DS: DATA
BEG:  	MOV  AX, DATA
      	MOV  DS, AX
       	CLI
       	CALL  I8253             	;8253初始化
       	CALL  I8251              	;8251初始化
       	CALL  I8259              	;开放用户中断
       	CALL  RW0A               	;置换0AH型中断向量
       	STI
LAST1:	MOV   BX, OFFSET TEXT
       	MOV   CX,LENS            	;电文长度→CX
TSCAN:	MOV  AH, 1
       	INT  16H                	;有键入?
       	JNZ  RETURN             	;有,转恢复0AH中断向量
       	MOV  DX,C_8251
       	IN    AL,DX              	;8251状态字→AL
       	TEST  AL,01H             	;TXRDY位=1 ?
       	JZ   TSCAN                	;否,转键盘输入检测
       	MOV   DX, D_8251
       	MOV   AL, [BX]           	;取字符→A
       	OUT   DX,AL              	;发送数据
       	MOV   CS: FLAG, 0       	;接收标志置0
       	MOV   SI,100             	;设置外循环计数次数
LLL:  	MOV   DI,0                	;设置内循环计数次数
LAST2:	CMP   CS: FLAG, -1      	;收到?
       	JE   NEXT                 	;是,转电文记数
       	DEC  DI                   	;内循环计数
       	JNZ  LAST2
       	DEC  SI                   	;外循环计数
       	JNZ  LLL
       	JMP  ERR                  	;超时,转出错处理
NEXT: 	INC  BX
       	LOOP TSCAN               	;电文计数
       	JMP  LAST1
ERR:  	MOV  AH, 9
       	MOV  DX, OFFSET ERROR
       	INT  21H                  	;显示错误信息
RETURN:      
CALL     RESET            		;恢复0AH型中断向量
     	MOV     AH, 4CH
     	INT         21H
RECEIVE   PROC
       	PUSH  AX                  	;保护现场
       	PUSH  DX                 	;保护现场
       	MOV   DX,D_8251         	;从数据口
       	IN  AL,DX                	;读取数据→AL
       	MOV  AH,0EH
       	INT  10H                  	;AL→屏幕显示
       	MOV  AL,20H              	;中断结束命令
       	OUT  20H,AL              	;送主8259
       	MOV  CS:FLAG, -1        	;设置接收标志
        POP  DX                   	;恢复现场
       	POP  AX                  	;恢复现场
       	IRET                      	;中断返回
RECEIVE  ENDP
I8253	PROC                     	;2号计数器初始化
      	MOV  DX,C_8253
       	MOV  AL,96H               	;控制字
       	OUT  DX,AL                	;送控制寄存器
       	MOV  DX, D_8253
       	MOV  AL,104              	;计数初值104
       	OUT  DX,AL              	;波特率1200
       	RET
I8253  ENDP
I8251  PROC                     	;8251初始化
        MOV  CX, 3
        MOV  AL, 0
       	MOV  DX,C_8251
AGA:   OUT  DX,AL             		;向控制口写入3个0
       	LOOP  AGA
       	MOV  AL,40H
      	OUT  DX,AL               	;写入复位命令字
       	CALL  DELAY              	;延时
       	MOV  DX, C_8251
       	MOV  AL,01001110B       	;写入方式选择命令字
       	OUT  DX,AL               	;选择波特率系数为16
       	MOV  AL, 00010101B
       	OUT  DX,AL               	;写入工作命令字
       	RET
I8251  ENDP
DELAY  PROC                      	;延时10us
       	MOV  AH, 86H
       	MOV  CX, 0
       	MOV  DX, 10
       	INT  15H
       	RET
DELAY 	ENDP
I8259  PROC
       	IN AL,21H
       	AND  AL, 11111011B
       	OUT  21H,AL             	;开放从8259中断
       	IN   AL, 0A1H
       	AND  AL,11111101B
       	OUT  0A1H,AL             	;开放用户中断
       	RET
I8259  ENDP
RW0A   PROC                      	;置换0AH型中断向量
      	MOV  AX,350AH
       	INT  21H
    	MOV  WORD PTR OLD0A, BX
       	MOV  WORD PTR OLD0A + 2, ES
       	PUSH DS
       	MOV  AX, CODE
       	MOV  DS, AX
       	MOV  DX, OFFSET  RECEIVE
       	MOV  AX,250AH
       	INT  21H
       	POP  DS
       	RET
RW0A  	ENDP
RESET 	PROC                     	;恢复0AH型中断向量
       	MOV  DX, WORD PTR OLD0A
       	MOV  DS, WORD PTR OLD0A + 2
       	MOV  AX,250AH
        INT  21H
       	RET
RESET 	ENDP
CODE  	ENDS
       	END  BEG

⌨️ 快捷键说明

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