实验三使用8251A的串行接口应用实验一、实验目的1) 掌握串行通信原理及半双工和全双工的编程方法。
2) 掌握用8251A 接口芯片实现微机间的同步和异步通信。
3) 掌握8251A 芯片与微机的接口技术和编程方法。
二、实验原理和内容8251A 是一种可编程的同步/异步串行通信接口芯片,具有独立的接收器和发送器,能实现单工、半双工、双工通信。
1)8251A 内部结构8251A 通过引脚D0~D7 和系统数据总线直接接口,用于和CPU 传递命令、数据、状态信息。
读写控制逻辑用来接收CPU 的控制信号、控制数据传送方向。
CPU 对8251A 的读写操作控制表如表3-4 所示。
方式控制字确定8251A 的通信方式(同步/异步)、校验方式(奇校/偶校/不校)、字符长度及波特率等,格式如图3-10 所示。
命令控制字使8251A 处于规定的状态以准备收发数据,格式如图3-11 所示。
方式控制字和命令控制字无独立的端口地址,8251A 根据写入的次序来区分。
CPU 对8251A 初始化时先写方式控制字,后写命令控制字3)状态寄存器8251 状态寄存器用于寄存8251A 的状态信息,供CPU 查询,定义如图3-12 所示。
TXRDY位:当数据缓冲器空时置位,而TXRDY引脚只有当条件( 数据缓冲器空•/CTS•TXE)成立时才置位。
溢出错误:CPU 没读走前一个字符,下一个字符又接收到,称为溢出错误。
帧错误:在字符结尾没检测到停止位,称为帧错误。
4)PC 机寄存器的端口地址其中:线路控制寄存器第七位:DLAB=0;线路控制寄存器第七位:DLAB=1。
5)波特率和除数因子对照表232标准的机械、电气规范。
6)实验连接方法按图连接好电路,其中8254 计数器用于产生8251 的发送和接收时钟,TXD 和RXD 连在一起。
1) 8254/CLK0 连接时钟/1MHz;2) 8254/CS 连接I/O 译码/Y0(280H---287H);3) 8254/OUT0 连接8251/TX/RXCLK;4) 8254/GATE0 连接+5V;5) 8251/TXD 连接8251/RXD;6) 8251/CS 连接I/O 译码/Y7(2B8H---2BFH。
7)编程提示8251 的控制口地址为2B9H,数据口地址为2B8H。
8254 计数器的计数初值=时钟频率/(波特率X 波特率因子),这里的时钟频率接1MHz,波特率若选1200,波特率因子16,则计数器初值52。
基于8251 芯片实现异步串行通信一般有两种方式,一种是查询方式,另一种是中断方式,使用哪种方式取决于进行初始化时寄存器的设置。
8254 计数器的计数初值=时钟频率/(波特率×波特率因子),这里的时钟频率接1MHz,波特率若选1200,波特率因子若选16,则计数器初值为52。
本实验采用8251A 异步方式发送,利用8086 汇编语言实验计算机点到点的串口通信,设置:波特率为1200bps、数据位7 位、停止位1 位、偶校验方式,利用查询方式或中断方式实现双机通信,能够传输多个字符。
三、实验流程图四、实验代码(1)收发字符data segmentio8254a equ 280hio8254b equ 283hio8251a equ 2b8hio8251b equ 2b9hmes1 db 'you can play a key on the keybord!',0dh,0ah,24hmes2 dd mes1data endscode segmentassume cs:code,ds:datastart: mov ax,datamov ds,axmov dx,io8254b ;设置8254计数器0工作方式mov al,16hout dx,almov dx,io8254amov al,52 ;给8254计数器0送初值out dx,almov dx,io8251b ;初始化8251xor al,almov cx,03 ;向8251控制端口送3个0delay: call out1loop delaymov al,40h ;向8251控制端口送40H,使其复位call out1mov al,4eh ; 1个停止位,8个数据位,波特率因子为16call out1mov al,27h ;向8251送控制字允许其发送和接收call out1lds dx,mes2 ;显示提示信息mov ah,09int 21hwaiti: mov dx,io8251bin al,dxtest al,01 ;发送是否准备好jz waitimov ah,01 ;是,从键盘上读一字符int 21hcmp al,27 ;若为ESC,结束jz exitmov dx,io8251aout dx,al ;发送mov cx,40hs51: loop s51 ;延时next: mov dx,io8251bin al,dxtest al,02 ;检查接收是否准备好jz next ;没有,等待mov dx,io8251ain al,dx ;准备好,接收mov dl,almov ah,02 ;将接收到的字符显示在屏幕上int 21hjmp waitiexit: mov ah,4ch ;退出int 21hout1 proc near ;向外发送一字节的子程序out dx,alpush cxmov cx,40hgg: loop gg ;延时pop cxretout1 endpcode endsend start(2)收发文件DATA SEGMENTFILE1 DB 'C:\1.txt',0FCODE1 DW 0BUF1 DB 2000H DUP(0)FILE2 DB 'C:\2.txt',0FCODE2 DW 0BUF2 DB 2000H DUP(0)IO8254A EQU280HIO8254B EQU 283HIO8251A EQU 2b8HIO8251B EQU 2b9HDATA ENDSSTACK SEGMENT PARA STACKDB 256 DUP(0)CODE SEGMENTASSUME CS: CODE,DS:DATA,SS:STACKSTART:MOV A X,DATAMOV D S,AXMOV AL,16hOUT DX,ALMOV DX,IO8254BMOV AL,52 ;给8254计数器0送初值OUT DX,ALMOV DX,IO8251B ;初始化8251XOR AL,ALMOV CX,03 ;向8251控制端口送3个0MOV DX,IO8251B ;传输线路控制寄存器LCR,最高位为DLAB=1MOV AX,80HOUT DX,ALMOV DX,IO8251B ; DLAB=1,除数锁存器(低字节)DLLMOV AX,60HOUT DX,ALMOV DX,IO8251B ;DLAB=1,除数锁存器(高字节)DLHMOV AX,0OUT DX,AL ;高字节DLH:00H,低字节:60H,设置波特率为1200MOV DX,IO8251B ;传输线路控制寄存器LCR,最高位为DLAB=0MOV AX,0AH ;DLAB=0,0=禁止中断,0=无附加奇偶标志位,0=奇校验,1=有奇偶校验,;0=1位停止位,10=7位OUT DX,ALMOV DX,IO8251B;MOV AX,03H;正常工作状态,rts引脚为低电平,DTR引脚低电平OUT DX,ALMOV DX,IO8251B ;DLAB =0,禁止中断MOV AX,0OUT DX,ALMOV AH,3CH ;文件新建LEA DX,FILE2MOV CX,0INT 21HMOV AH,3DH ;文件操作LEA DX,FILE2MOV AL,2INT 21HMOV FCODE2,AXMOV AH,3DH ;文件操作LEA DX,FILE1INT 21HMOV FCODE1,AXMOV SI,0MOV DI,0FOREVER:MOV DX,IO8251B ;从线路状态寄存器读状态IN AL,DXTEST AL,1EH ;检测是否为00011110,即BI=1,检测中断,FE=1,帧错,PE=1,奇偶错,OE=1,溢出错JNZ ERROR ;传输线状态寄存器全部都是0TEST AL,01H ;检测接受数据是否准备好了JNZ RECEIVE ;等于0则表示数据没有准备好TEST AL,20H ;数据没有准备好JNZ send ;没有,则跳转等待JMP FOREVERsend:MOV AH,3FH ;从文件中读取发送LEA DX,BUF1ADD DX,SIMOV BX,FCODE1MOV CX,1INT 21HCMP AX,0JE FOREVERMOV DX,IO8251AMOV AL,BUF1[SI]OUT DX,ALINC SIJMP FOREVERRECEIVE:MOV DX,IO8251A ;接收数据IN AL,DXAND AL,7FH ;最高位为停止位CMP AL,03H;JNZ CHARJMP DONECHAR:MOV DL,ALMOV AH,02HINT 21HCMP AL,0DHJNZ SAVE_FILEMOV DL,0AHINT 21HSAVE_FILE:MOV BUF2[DI],DLMOV AH,40H ;接收到的字符写入文件LEA DX,BUF2ADD DX,DIMOV BX,FCODE2MOV CX,1INT 21HINC DIJMP FOREVERERROR:MOV DX,IO8251AIN AL,DXMOV DL,0AHMOV AH,02HINT 21HJMP FOREVERDONE:MOV BX,FCODE1MOV AH,3EHINT 21HMOV BX,FCODE2INT 21HMOV AH,4CHINT 21HCODE ENDSEND START五、实验结果(1)收发字符(2)收发文件六、实验心得通过本次实验,与课本知识相结合,我学会了串行通信及半双工和全双工的编程方法。
和组员一起编写代码让我对8251A芯片与微机接口的编程方法有了更清楚的认识,通过编写代码加深了课本中控制字、命令字等的认知,灵活应用,不再局限于课本的死记硬背。
通过对硬件电路的连接也让我对各个芯片之间的联系有了更深刻的认识。