8251A串行通信实验.docx
《8251A串行通信实验.docx》由会员分享,可在线阅读,更多相关《8251A串行通信实验.docx(10页珍藏版)》请在冰豆网上搜索。
8251A串行通信实验
8251A串行通信实验
8251A串行通信实验
xxxxxxxxxxx
一、实验目的
1.理解一部串行通信的基本原理;
2.掌握可编程串行接口芯片8251的工作原理和编程方法。
二、实验内容
1.异步串行自发自收实验
(1)使用8251A发送固定二进制数再接收回来,将收到的数加1后显示在LED上。
(2) 通信协议:
异步,波特率为4800bps,波特因子为16,8位数据位,1位停止位,无奇偶校验;
(3)采用查询方式实现。
2. RS-232通信实验:
(1)PC机与试验箱通过串行进行通信,PC机向实验箱发送字符,实验箱上的8521A接收到字符后再原样发回PC机;
(2)通讯协议自定;
(3)采用中断方式实现。
三、实验环境
1.硬件:
GX-8000实验箱,USB电缆,自锁
(3)在对8251A进行初始化操作前必须确保其可靠复位,方法是:
向8251A控制口连续写入三个0,然后再写入复位命令字40H。
注意:
对8251A的控制口进行一次写操作,需要16个时钟信号的写恢复时间。
参考代码如下:
其中,DELAY用于实现延时,其定义如下:
(4)在程序设计过程中,可以使用单步调试,通过观察程序运行过程中寄存器值的变化调试程序错误,也可以进一步理解8251A 的控制原理。
(5)程序如下:
DATA SEGMENT ;数据段
DATA ENDS
CODE SEGMENT ;代码段
ASSUME CS:
CODE,DS:
DATA
START:
MOV DX,28BH ;初始化8253
MOV AL,00010110B
OUT DX,AL
MOV DX,288H
MOV AX,13
OUT DX,AL
MOV AL,80H ;初始化8255
MOV DX,283H
OUT DX,AL
MOV DX,299H ;8251A的控制口地址
MOV AL,0
OUT DX,AL ;想8251A的控制口写0
CALL DELAY ;延时
MOV AL,0
OUT DX,AL ;想8251A的控制口写0
CALL DELAY
MOV AL,0
OUT DX,AL ;向8251A的控制口写0
CALL DELAY
MOV AL,40H 写复位命令
OUT DX,AL
CALL DELAY
MOV DX,299H ;初始化8251
MOV AL,01001110B
OUT DX,AL
CALL DELAY
MOV DX,299H
MOV AL,00010111B
OUT DX,AL
CALL DELAY
MOV DI,3000H ;指针初值
MOV CX,000AH ;接收数据个数
A1:
MOV DX,299H
IN AL,DX ;TxRDY=1?
TEST AL,01H
JZ A1
MOV DX,298H
IN AL,DX ;8251数据口读入数据
MOV DX,CX
MOV CL,9 ;发送数
MOV AL,CL
OUT DX,AL
MOV DX,299H
A2:
IN AL,DX ;RxRDY=1?
TEST AL,02H
JZ A2
MOV DX,298H
IN AL,DX
INC CL
MOV DX,280H
MOV AL,CL
OUT DX,AL
JMP A1
DELAY PROC
MOV CX,02H
LOOP $
RET DELAY
ENDP
CODE ENDS
END START
2. RS-232通信试验
(1)8251A要实现与PC通信,需要通过RS-232模块将TTL电平信号转换为RS-232电平信号。
部分参考连线如图所示。
(2)本实验要求8251A采用中断方式与CPU交换数据,因而需要将8251A的RxRDY(第十四脚)信号连接到8259A的中断请求输入引脚上。
当8251A接收到PC串口发来的字符时,RxRDY有效,向CPU发出中断请求。
(3) PC端对串口的发送和接收操作可使用超级中断实现,其操作方法如下。
a.依次点击“开始” “所有程序” “附件” “通讯” “超级终端”,弹出如图3.21所示窗口,在新建链接对话框中输入链接的名称,点击“确定”。
b.在“连接到”对话框选择连接时使用的端口“COM1”,点击“确定”,如图3.22所示。
c.设置COM1端口属性,如图3.23所示。
d.参考图3.20连线,下载并运行通信程序,可以看到如图3.24所示的运行结果,键盘输入的字符经串口发出去后又成功地接收回来,并显示在了窗口中。
(4) 由于程序需要用中断方式实现收发两种功能,建议编程调试时由易到难,先在上一个实验的基础上实现查询方式下的串口收发,然后再修改为中断方式。
(5) 程序如下所示:
STACKS SEGMENT STACK ;堆栈段
STA DW 128 DUP(?
)
STACKS ENDS
DATA SEGMENT ;数据段
DATA ENDS
CODE SEGMENT ;代码段
ASSUME CS:
CODE,DS:
DATA,SS:
STACKS
START:
MOV AX,DATA
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
CLI ;关中断
MOV AL,00010011B 中断请求高有效,一片8259A,ICW1
MOV DX,290H
OUT DX,AL
MOV AL,18H ;ICW2
MOV DX,291H
OUT DX,AL
MOV AL,0DH ;ICW4
MOV DX,291H
OUT DX,AL
MOV DX,291H
IN AL,DX ;初始化主片,读OCW1,中断屏蔽控制字,奇地址
MOV AL,11111110B
MOV DX,291H
OUT DX,AL ;OCW1
MOV AX,0
MOV ES,AX
MOV DI,00011000B
SHL DI,1
SHL DI,1
MOV BX,SEG ISR ;设置中断向量
MOV DS,AX
MOV AX,OFFSET ISR
MOV ES:
[DI],AX
MOV ES:
[DI+2],BX
MOV DX,28BH ;初始化8253
MOV AL,00010110B
OUT DX,AL
MOV DX,288H
MOV AX,13
OUT DX,AL
MOV DX,299H ;8251A的控制口地址
MOV AL,0
OUT DX,AL ;想8251A的控制口写0
CALL DELAY ;延时 MOV AL,0
OUT DX,AL ;想8251A的控制口写0
CALL DELAY
MOV AL,0
OUT DX,AL ;向8251A的控制口写0
CALL DELAY
MOV AL,40H ;写复位命令
OUT DX,AL
CALL DELAY
MOV DX,299H ;初始化8251
MOV AL,01001110B
OUT DX,AL
CALL DELAY
MOV DX,299H
MOV AL,00010111B
OUT DX,AL
CALL DELAY
MOV DI,3000H ;指针初值
CX,000AH ;接收数据个数
MOV DX,298H
IN AL,DX ;8251数据口读入数据
MOV DX,CX
MOV CL,123 ;发送数
MOV AL,CL
OUT DX,AL
STI
A2:
JMP A2
DELAY PROC
MOV CX,02H
LOOP $
RET
DELAY ENDP
ISR PROC ;中断服务子程序
PUSH AX
PUSH DX
STI ;开中断
MOV DX,298H
IN AL,DX
MOV CL,AL
A1:
MOV DX,299H
IN AL,DX ;TxRDY=1?
TEST AL,01H
JZ A1
MOV DX,298H
MOV AL,CL
OUT DX,AL
CLI ;关中断
MOV DX,290H ;写OCW2,送中断结束命令EOI
MOV AL,20H
OUT DX,AL
POP DX
POP AX
IRET ;中断返回
ISR ENDP
CODE ENDS
END START