您好,欢迎访问三七文档
1实验三串行通信一、实验目的1.了解串行通信的基本原理。2.掌握串行接口芯片8251的工作原理和编程方法。3.掌握串行接口芯片8250的工作原理和编程方法。4.掌握对串行接口芯片的初始化编程,学会串行通信半双工和全双工的编程技巧。二、实验内容及步骤1、利用PC机系统的串行通信接口实现与实验系统的双机通信,PC机的串行通信接口的端口地址为3F8H,并画出三线连接,七线连线通信接口的连线图,接口为标准RS-232(25芯)插座。2、按图1连接好电路,其中8254计数器用于产生8251的发送和接收时钟,TXD和RXD连在九针接口处。图1串口通信电路3、接线(参考):CLK0/8254接1M时钟CLK/8251接1M时钟GATE0/8254接+5VOUT0/8254接TX/RXCLK/8251CS/8254接Y0/IO地址CS/8251接Y7/IO地址RXD/8251接TXD/九针接口TXD/8251接RXD/九针接口4、8254计数器的计数初值=时钟频率/(波特率X波特率因子),这里的时钟频率接1MHz,波特率若选1200,波特率因子若选16,则计数器初值为52.5、设串行通信的波特率为1200、偶校验、数据位为7位、一位停止位,利用查询方式实现单工通信。要求发送方将任一文件传送到收方,收方收到后将源程序写入磁盘。分别编2写收方和发方的通信程序。6、上述参数不变,用中断方式实现半双工通信,编写程序。7、PC机寄存器的端口地址如表1所示:表1PC机寄存器的端口地址I/O端口IN/OUT寄存器名称3F8*OUT发送保持寄存器3F8*IN接收数据寄存器3F8**OUT波特率因子(LSB)3F9**OUT波特率因子(MSB)3FBOUT线路控制寄存器3FAIN中断标志寄存器3FCOUTMODEM控制寄存器3FDIN线路状态寄存器3FEINMODEM状态寄存器*线路控制寄存器第七位DLAB=0**线路控制寄存器第七位DLAB=1波特率和除数因子对应关系如表2所示:表2波特率和除数因子对照表波特率单位/Hz因子值波特率单位/Hz因子值MSBLSBMSBLSB500900180000407506002000003A110041724000030134.503593600002015003004800001830001807200001060000C09600000C12000060三、编程提示1.可以首先采用查询方式,实现单工PC机系统与实验系统的双机通信,之后再实现双工方式通信;2.再尝试实现利用中断方式,实现单工PC机系统与实验系统的双机通信,之后再实现双工方式通信;3.要求能够实现字符和文件的传输。四、实验流程图3双工收发实验代码的主流程图,如图3所示:开始打开文件读文件到Buf关闭文件设置波特率设置数据格式选择发送和接收方式判断是否为文件结束符结束发送和接收数据YN图3双工收发实验代码主程序流程图4PC机串行通讯初始化参考流程:五、实验代码;PC端程序代码STACKSEGMENTPARASTACKDB256DUP(0)STACKENDSCODESEGMENTASSUMECS:CODE,SS:STACKSTART:MOVDX,3FBH;传输线路控制寄存器LCR,最高位为DLAB=1MOVAX,80HOUTDX,ALMOVDX,3F8H;DLAB=1,除数锁存器(低字节)DLLMOVAX,60HOUTDX,ALMOVDX,3F9H;DLAB=1,除数锁存器(高字节)DLHMOVAX,0OUTDX,AL;高字节DLH:00H,低字节:60H,设置波特率为12005MOVDX,3FBH;传输线路控制寄存器LCR,最高位为DLAB=0MOVAX,0AH;DLAB=0,0=禁止中断,0=无附加奇偶标志位,0=奇校验,1=有奇偶校验,0=1位停止位,10=7位OUTDX,ALMOVDX,3FCH;MOVAX,03H;正常工作状态,rts引脚为低电平,DTR引脚低电平OUTDX,ALMOVDX,3F9H;DLAB=0,禁止中断MOVAX,0OUTDX,ALFOREVER:MOVDX,3FDH;从线路状态寄存器读状态INAL,DXTESTAL,1EH;检测是否为00011110,即BI=1,检测中断,FE=1,帧错,PE=1,奇偶错,OE=1,溢出错JNZERROR;传输线状态寄存器全部都是0TESTAL,01H;检测接受数据是否准备好了JNZRECEIVE;等于0则表示数据没有准备好TESTAL,20H;数据没有准备好JNZsend;没有,则跳转等待JMPFOREVERsend:MOVAH,1;检测键盘按下INT16HJZFOREVER;有键盘按下MOVAH,0;读键盘INT16HMOVDX,3F8H;将键盘的数据输出发送到缓冲器OUTDX,ALCMPAL,03HJZDONEMOVDL,ALMOVAH,02HINT21HCMPAL,0DHJNZFOREVERMOVDL,0AHMOVAH,02HINT21HJMPFOREVERRECEIVE:MOVDX,3F8H;接收数据INAL,DX6ANDAL,7FH;最高位为停止位CMPAL,03H;JZDONEMOVDL,ALMOVAH,02HINT21HCMPAL,0DHJNZFOREVERMOVDL,0AHMOVAH,02HINT21HJMPFOREVERERROR:MOVDX,3F8HINAL,DXMOVDL,0AHMOVAH,02HINT21HJMPFOREVERDONE:MOVAH,4CHINT21HCODEENDSENDSTART;试验箱程序代码DATASEGMENTIO8254AEQU280HIO8251AEQU2B8HIO8251BEQU2B9HDATAENDSSTACKSEGMENTPARASTACKDB256DUP(0)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVDX,IO8254A+3MOVAL,00010110B;设置8254计数器0工作方式,低字节,8位,方式3,二进制OUTDX,AL7MOVDX,IO8254AMOVAL,52;给8254计数器0送初值(波特率1200,因子16,计数初值52)OUTDX,ALMOVDX,IO8251B;对8251进行初始化,输入3遍0MOVAX,0MOVCX,3reset8251:OUTDX,ALPUSHCXMOVCX,40H;向8251控制端口送40H,使其复位LOOP$POPCXLOOPreset8251MOVAL,40HOUTDX,ALMOVCX,40HLOOP$MOVAL,5AHOUTDX,ALMOVAL,27HOUTDX,ALFOREVER:MOVDX,IO8251B;从线路状态寄存器读状态INAL,DXTESTAL,38H;检测是否为00111000,即FE=1,帧格式错,OE=1,超越错,PE=1,奇偶错JNZERROR;传输线状态寄存器全部都是0TESTAL,02H;检测接受数据是否准备好了JNZRECEIVE;等于0则表示数据没有准备好TESTAL,01H;数据没有准备好JNZsend;没有,则跳转等待JMPFOREVERsend:MOVAH,1;检测键盘按下INT16HJZFOREVER;有键盘按下MOVAH,0;读键盘INT16HMOVDX,IO8251A;将键盘的数据输出发送到缓冲器OUTDX,ALCMPAL,03HJZDONEMOVDL,ALMOVAH,02H8INT21HCMPAL,0DHJNZFOREVERMOVDL,0AHMOVAH,02HINT21HJMPFOREVERRECEIVE:MOVDX,IO8251A;接收数据INAL,DXANDAL,7FH;最高位为停止位CMPAL,03H;JZDONEMOVDL,ALMOVAH,02HINT21HCMPAL,0DHJNZFOREVERMOVDL,0AHMOVAH,02HINT21HJMPFOREVERCMPAL,0DHJNZFOREVERERROR:MOVDX,IO8251AINAL,DXMOVDL,'?'MOVAH,02HINT21HJMPFOREVERDONE:MOVAH,4CHINT21HCODEENDSENDSTART六、实验心得本次实验应该算是这几次实验中最为复杂的一次了,涉及的汇编语言操作也最多,还有很多小障碍。比如说,8251芯片在做实验之前压根就没有听说过,在微机原理课上,老师没有提到有8251这个存在,于是在简单的预习了讲义后,自信满满的拿查询方式把8250的双工通信写了一下,当然中间复习了一下汇编语言。感谢同组同学的合作和帮助;感谢张笈老师微机原理与接口技术课理论课程的讲解;感谢高平老师的实验讲解以及在实验过程中给予的帮助和指导。
本文标题:北理工微机实验三
链接地址:https://www.777doc.com/doc-2624387 .html